atomppgen.tm

Troullier-Martins (TM) 伪化器

实现 TM 方法生成赝轨道,满足范数守恒和连续性约束。

主要功能

tm_pseudize : 对给定 AE 轨道进行 TM 伪化 TMResult : 存储伪化结果的数据类

参考文献

Troullier & Martins, PRB 43, 1993 (1991)

算法文档

详见 docs/source/algorithm/tm_method.rst

Functions

eval_derivatives_at(r, u, x0[, max_order, ...])

在指定点 x0 处计算导数(使用局部三次样条)

tm_pseudize(r, w, u_ae, eps, l, rc[, ...])

使用 Troullier-Martins 方法构造伪轨道

Classes

TMResult(u_ps, a_coeff, rc, eps, l, ...)

TM 伪化结果

class atomppgen.tm.TMResult(u_ps, a_coeff, rc, eps, l, norm_error, continuity_orders, continuity_check, solver_info)[源代码]

TM 伪化结果

参数:
u_ps

伪轨道 u(r)(径向波函数,已拼接内外区)

Type:

np.ndarray

a_coeff

TM 多项式系数 [a_0, a_2, a_4, ...] 内区形式:u = r^{l+1} exp(Σ a_{2i} r^{2i})

Type:

np.ndarray

rc

伪化半径(Bohr)

Type:

float

eps

伪化能量(Hartree)

Type:

float

l

角动量量子数

Type:

int

norm_error

范数守恒相对误差 |Q_PS - Q_AE| / Q_AE

Type:

float

continuity_orders

连续性阶数(匹配到几阶导数,2 或 4)

Type:

int

continuity_check

rc 处的连续性检查结果 {'u': {...}, 'du': {...}, 'd2u': {...}}

Type:

Dict

solver_info

求解器收敛信息 {'ier': int, 'nfev': int, 'mesg': str, 'fallback': bool}

Type:

Dict

u_ps: ndarray
a_coeff: ndarray
rc: float
eps: float
l: int
norm_error: float
continuity_orders: int
continuity_check: Dict
solver_info: Dict
__init__(u_ps, a_coeff, rc, eps, l, norm_error, continuity_orders, continuity_check, solver_info)
参数:
返回类型:

None

atomppgen.tm.tm_pseudize(r, w, u_ae, eps, l, rc, continuity_orders=2)[源代码]

使用 Troullier-Martins 方法构造伪轨道

在 r ≤ rc 内区,伪轨道形式为:

u(r) = r^{l+1} · exp(Σ_{i=0}^{N} a_{2i} r^{2i})

约束条件: 1. 在 r = rc 处,u 及其导数(到 continuity_orders 阶)与 AE 轨道连续 2. 内区范数守恒:∫_0^{rc} |u|^2 dr = ∫_0^{rc} |u_ae|^2 dr

参数:
  • r (np.ndarray) -- 径向网格(Bohr)

  • w (np.ndarray) -- 积分权重

  • u_ae (np.ndarray) -- 全电子径向波函数 u(r)(已归一化)

  • eps (float) -- 伪化能量(Hartree)

  • l (int) -- 角动量量子数

  • rc (float) -- 伪化半径(Bohr)

  • continuity_orders (int, optional) -- 导数连续性阶数,默认 2(匹配 u, u', u'' + 范数) 可选 4(匹配到 u'''' + 范数)

返回:

包含伪轨道、系数、范数误差等信息

返回类型:

TMResult

抛出:

ValueError -- 如果 rc 不在网格范围内 如果 continuity_orders 不是 2 或 4

备注

TM 方法关键点: 1. 系数数量由连续性条件决定:

  • continuity_orders = 2: 需要 4 个系数 [a_0, a_2, a_4, a_6]

  • continuity_orders = 4: 需要 6 个系数 [a_0, ..., a_10]

  1. 数值稳定性:使用对数形式避免指数溢出

  2. 范数守恒通过非线性方程组保证(scipy.optimize.fsolve)

  3. 网格推荐:强烈建议使用 exp_transformedlog 网格类型。 linear 网格的导数精度不足,可能导致 TM 非线性方程组不收敛。

引用

Troullier & Martins, PRB 43, 1993 (1991), 方程 (14)-(18)