atomscf.hf.slater

Slater 径向积分模块

本模块实现 HF 非局域交换所需的 Slater 径向积分核计算。

核心算法:两段累积(Y^k/Z^k)

Slater 径向积分定义:

\[R^k_{ij}(r) = \int_0^\infty \frac{r_<^k}{r_>^{k+1}} u_i(r') u_j(r') \, dr'\]

其中 \(r_< = \min(r, r')\), \(r_> = \max(r, r')\)

分解为向前/向后累积:

\[\begin{split}Y^k(r) &= \int_0^r r'^k u_i(r') u_j(r') \, dr' \\ Z^k(r) &= \int_r^\infty r'^{-k-1} u_i(r') u_j(r') \, dr' \\ R^k(r) &= \frac{Y^k(r)}{r^{k+1}} + Z^k(r) \cdot r^k\end{split}\]

数值稳定性

  • r→0 处理: 使用 \(r_{\mathrm{safe}} = \max(r, \epsilon)\) 避免除零

  • r→∞ 处理: 边界显式设极限值(通常为零,因波函数衰减)

  • 权重一致性: 使用项目梯形权重 w

引用

[SlaterHF]

Herman, F. & Skillman, S. (1963) "Atomic Structure Calculations" Prentice-Hall

[KoellingHarmon]

Koelling, D. D. & Harmon, B. N. (1977) "A technique for relativistic spin-polarised calculations" J. Phys. C: Solid State Phys. 10, 3107

Functions

slater_integral_k0(r, w, u_i, u_j[, eps])

计算 k=0 Slater 积分(库仑积分,s-s 交换)。

slater_integral_radial(r, w, u_i, u_j, k[, eps])

计算 Slater 径向积分 \(R^k_{ij}(r)\)

Classes

SlaterIntegralCache()

Slater 积分缓存管理器。

atomscf.hf.slater.slater_integral_radial(r, w, u_i, u_j, k, eps=1e-30)[源代码]

计算 Slater 径向积分 \(R^k_{ij}(r)\)

使用两段累积算法(向前 Y^k + 向后 Z^k)计算非局域交换核。

参数:
  • r (numpy.ndarray) -- 径向网格 (shape: [n])

  • w (numpy.ndarray) -- 积分权重(梯形权重,shape: [n])

  • u_i (numpy.ndarray) -- 第一个径向波函数 (shape: [n])

  • u_j (numpy.ndarray) -- 第二个径向波函数 (shape: [n])

  • k (int) -- 多极指标 (k ≥ 0)

  • eps (float, optional) -- 数值安全常数(避免除零),默认 1e-30

返回:

Slater 积分 \(R^k_{ij}(r)\) (shape: [n])

返回类型:

numpy.ndarray

备注

算法复杂度: \(O(n)\) 时间,\(O(n)\) 空间

数值稳定性:
  • r→0: 使用 r_safe = max(r, eps) 避免 \(r^{-k-1}\) 发散

  • r→∞: 边界条件由波函数衰减自然满足

物理意义:
  • k=0: 库仑积分(s-s 交换)

  • k=1: s-p 交叉项

  • k=2: p-p 交换

示例

>>> r = np.linspace(1e-6, 50, 1000)
>>> w = trapezoid_weights(r)
>>> u_1s = ... # 氢样 1s 波函数
>>> R0 = slater_integral_radial(r, w, u_1s, u_1s, k=0)
atomscf.hf.slater.slater_integral_k0(r, w, u_i, u_j, eps=1e-30)[源代码]

计算 k=0 Slater 积分(库仑积分,s-s 交换)。

k=0 特化版本,物理意义为库仑相互作用:

\[\begin{split}R^0(r) = \\frac{1}{r} \\int_0^r u_i u_j r'^2 \\, dr' + r \\int_r^\\infty u_i u_j \\, dr'\end{split}\]
参数:
返回:

k=0 Slater 积分

返回类型:

numpy.ndarray

备注

此函数是 slater_integral_radial(r, w, u_i, u_j, k=0) 的等价实现, 但公式更清晰地表达了库仑积分的物理意义。

示例

>>> # 氢原子 1s 态自交换
>>> r = radial_grid_linear(1000, 1e-6, 50.0)[0]
>>> w = trapezoid_weights(r)
>>> u_1s = 2 * np.exp(-r) / np.sqrt(4*np.pi)  # 归一化 1s
>>> R0 = slater_integral_k0(r, w, u_1s, u_1s)
>>> # 验证: 对 r→∞, R0 → 1/r (总电荷为1)
class atomscf.hf.slater.SlaterIntegralCache[源代码]

Slater 积分缓存管理器。

用于缓存占据态之间的 Slater 积分,避免重复计算。

cache

缓存字典,键为 (i, j, k) 三元组

Type:

dict

备注

缓存策略:
  • 缓存占据态之间的 R^k_{ij}(r)(数量有限)

  • 不缓存涉及目标态 u 的积分(每次 SCF 迭代都变)

内存估计:
  • 对 C 原子(6 个占据态),k_max=2

  • 最多 6×6×3 = 108 个积分

  • 每个积分 ~8KB(1000 点网格),总计 ~1MB

示例

>>> cache = SlaterIntegralCache()
>>> # 第一次计算并缓存
>>> R0 = cache.get(r, w, u_1s, u_2s, k=0)
>>> # 第二次直接从缓存读取
>>> R0_cached = cache.get(r, w, u_1s, u_2s, k=0)  # 快速
__init__()[源代码]

初始化空缓存。

get(r, w, u_i, u_j, k, i_index=None, j_index=None)[源代码]

获取 Slater 积分(自动缓存)。

参数:
  • r (ndarray) -- 同 slater_integral_radial 参数

  • w (ndarray) -- 同 slater_integral_radial 参数

  • u_i (ndarray) -- 同 slater_integral_radial 参数

  • u_j (ndarray) -- 同 slater_integral_radial 参数

  • k (int) -- 同 slater_integral_radial 参数

  • i_index (int, optional) -- 轨道 i 的索引(用于缓存键)

  • j_index (int, optional) -- 轨道 j 的索引(用于缓存键)

返回:

Slater 积分

返回类型:

numpy.ndarray

备注

若 i_index 和 j_index 均提供,则启用缓存;否则直接计算。

clear()[源代码]

清空缓存。

__len__()[源代码]

返回缓存项数量。