atomscf.operator

Functions

build_transformed_hamiltonian(r, l, v_of_r, ...)

构造变量变换的 Hamiltonian 和质量矩阵(HF 复用)。

radial_hamiltonian_matrix(r, l, v_of_r)

构造径向 Hamiltonian(内部点)并返回矩阵与内部网格坐标。

radial_hamiltonian_matrix_linear_fd5(r, l, ...)

在等间距线性网格上构造五点有限差分的径向 Hamiltonian。

solve_bound_states_fd(r, l, v_of_r[, k])

基于有限差分 Hamiltonian 的径向束缚态求解(取低端 \(k\) 个本征对)。

solve_bound_states_fd5(r, l, v_of_r[, k])

在等间距线性网格上使用五点有限差分求解径向束缚态(取低端 \(k\) 个本征对)。

solve_bound_states_fd5_auxlinear(r, l, v_of_r)

在非等间距网格上,使用辅助等间距线性网格(FD5)求解本征,再插值回原网格。

solve_bound_states_transformed(r, l, v_of_r, ...)

使用变量变换方法求解径向束缚态(适用于指数网格)。

atomscf.operator.radial_hamiltonian_matrix(r, l, v_of_r)[源代码]

构造径向 Hamiltonian(内部点)并返回矩阵与内部网格坐标。

径向方程(原子单位)在 \(u(r)\) 表示下为:

\[\left[-\frac{1}{2}\frac{d^2}{dr^2}+\frac{\ell(\ell+1)}{2r^2}+v(r)\right]u(r)=\varepsilon\,u(r),\]

本函数在非均匀网格上采用二阶差分对 \(\tfrac{d^2}{dr^2}\) 离散,并以 Dirichlet 边界 \(u(r_0)=u(r_{N-1})=0\) 构造内部点的对称三对角矩阵。

参数:
  • r (numpy.ndarray) -- 单调递增的径向网格 \((r_0,\dots,r_{N-1})\)

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

  • v_of_r (numpy.ndarray) -- 势能数组 \(v(r_i)\),长度与 r 一致。

返回类型:

tuple[ndarray, ndarray]

返回:

  • H (numpy.ndarray) -- 内部点上的 Hamiltonian 矩阵,形状 \((N-2, N-2)\)

  • r_inner (numpy.ndarray) -- 内部网格坐标 \((r_1,\dots,r_{N-2})\)

备注

  • 矩阵是对称实矩阵,适用于标准本征求解器。

  • 若需得到完整长度的 \(u(r)\),可在内部解向量两端补零以满足 Dirichlet 边界。

atomscf.operator.solve_bound_states_fd(r, l, v_of_r, k=4)[源代码]

基于有限差分 Hamiltonian 的径向束缚态求解(取低端 \(k\) 个本征对)。

该方法将径向 Hamiltonian 离散为内部点的对称矩阵,调用密集线性代数本征求解。 适合教学验证(例如氢样势下的 1s 能级),在网格较大时可能较慢。

参数:
  • r (numpy.ndarray) -- 单调递增的径向网格 \((r_0,\dots,r_{N-1})\)

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

  • v_of_r (numpy.ndarray) -- 势能数组 \(v(r_i)\),长度与 r 一致。

  • k (int, optional) -- 返回最低能的本征态个数(默认 4)。

返回类型:

tuple[ndarray, ndarray]

返回:

  • eps (numpy.ndarray) -- 低端 \(k\) 个本征值(按升序)。

  • U (numpy.ndarray) -- 对应的径向函数矩阵 \(U\),形状 \((k, N)\),已在 \([r_0,r_{N-1}]\) 上按 \(\int u^2\,dr=1\) 归一,并在两端补零以满足 Dirichlet 边界。

备注

  • 实际内部计算在 \((r_1,\dots,r_{N-2})\) 上进行,端点边界条件 \(u=0\)

  • 若只需氢样势 1s 态,建议选择较大的 :math:`r_max`(如 50–100)与足够细的网格以降低边界误差。

  • 使用 scipy.linalg.eigh 的 subset_by_index 只求前 k 个本征值以提升性能。

atomscf.operator.radial_hamiltonian_matrix_linear_fd5(r, l, v_of_r)[源代码]

在等间距线性网格上构造五点有限差分的径向 Hamiltonian。

使用五点中心差分格式近似二阶导数:

\[\frac{d^2 u}{dr^2}\bigg|_{r_i} \approx \frac{-u_{i+2} + 16u_{i+1} - 30u_i + 16u_{i-1} - u_{i-2}}{12h^2}.\]

精度:\(\mathcal{O}(h^4)\),在等间距网格上比二点/三点差分精度更高。

参数:
  • r (numpy.ndarray) -- 必须为等间距 线性网格 \((r_0,\dots,r_{N-1})\),否则抛出异常。

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

  • v_of_r (numpy.ndarray) -- 势能数组 \(v(r_i)\),长度与 r 一致。

返回类型:

tuple[ndarray, ndarray]

返回:

  • H (numpy.ndarray) -- 内部点上的 Hamiltonian 矩阵,形状 \((N-4, N-4)\)。由于五点模板需要两侧各两点, 实际对应网格索引 \(i=2,\dots,N-3\),即去掉首尾各两个点。

  • r_inner (numpy.ndarray) -- 内部网格坐标 \((r_2,\dots,r_{N-3})\)

atomscf.operator.solve_bound_states_fd5(r, l, v_of_r, k=4)[源代码]

在等间距线性网格上使用五点有限差分求解径向束缚态(取低端 \(k\) 个本征对)。

相比二阶差分(solve_bound_states_fd),五点格式精度更高(\(\mathcal{O}(h^4)\)), 但要求网格**必须为等间距**,且去掉首尾各两个点以满足五点模板要求。

参数:
  • r (numpy.ndarray) -- 必须为等间距 线性网格 \((r_0,\dots,r_{N-1})\)

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

  • v_of_r (numpy.ndarray) -- 势能数组 \(v(r_i)\),长度与 r 一致。

  • k (int, optional) -- 返回最低能的本征态个数(默认 4)。

返回类型:

tuple[ndarray, ndarray]

返回:

  • eps (numpy.ndarray) -- 低端 \(k\) 个本征值(按升序)。

  • U (numpy.ndarray) -- 对应的径向函数矩阵 \(U\),形状 \((k, N)\),已在 \([r_0,r_{N-1}]\) 上按 \(\int u^2\,dr=1\) 归一,并在两端补零(首尾各两个点为 0)。

备注

  • 实际内部计算在 \((r_2,\dots,r_{N-3})\) 上进行,首尾各两点作为边界条件设为 0。

  • 使用 scipy.linalg.eigh 的 subset_by_index 只求前 k 个本征值以提升性能。

atomscf.operator.solve_bound_states_fd5_auxlinear(r, l, v_of_r, k=4, n_aux=None)[源代码]

在非等间距网格上,使用辅助等间距线性网格(FD5)求解本征,再插值回原网格。

步骤: 1) 构造线性等间距网格 \(r_{\text{lin}} \in [r_0, r_{N-1}]\),点数 \(n_{\text{aux}}`(默认与原网格同级别但限制上限2500以平衡精度和速度)。 2) 将势 :math:`v(r)\) 插值到线性网格上; 3) 用五点格式 solve_bound_states_fd5 在线性网格上求低端本征; 4) 将解插值回原网格,并在原网格上归一化(∫ u^2 dr = 1)。

性能优化:使用 scipy.linalg.eigh subset_by_index 只求前 k 个本征值,即使 n_aux 较大也能快速求解。

返回类型:

tuple[ndarray, ndarray]

参数:
atomscf.operator.solve_bound_states_transformed(r, l, v_of_r, delta, Rp, k=4, use_sparse=True)[源代码]

使用变量变换方法求解径向束缚态(适用于指数网格)。

方法基于文献 [1]_

网格:

\(r(j) = R_p(\exp(j\delta) - 1) + r_{\min}, \quad j=0,1,\ldots,j_{\max}\)

变量变换:

\(u(j) = v(j) \exp(j\delta/2)\)

变换后的方程(没有一阶导数项):

\(v''(j) - \frac{\delta^2}{4}v(j) = 2R_p^2\delta^2 \exp(2j\delta)(E - V_{\text{eff}}(r(j)))v(j)\)

有限差分离散:

\(v(j+1) - 2v(j) + v(j-1) - \frac{\delta^2}{4}v(j) = 2R_p^2\delta^2 \exp(2j\delta)(E - V_{\text{eff}}(j))v(j)\)

广义特征值问题:

\(H v = E B v\)

其中:
  • \(H[i,i] = 2 + \frac{\delta^2}{4} + \text{exp\_factor} \cdot V_{\text{eff}}(i+1)\)

  • \(H[i,i\pm1] = -1\)

  • \(B[i,i] = 2\delta^2 R_p^2 \exp(2\delta(i+1))\)

关键处理:去掉 j=0 点避免奇异性(参考 [1]_ 第54行)

参数:
  • r (numpy.ndarray) -- 指数网格,由 radial_grid_exp_transformed 生成,满足 r[j] = Rp*(exp(j*delta)-1) + rmin。

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

  • v_of_r (numpy.ndarray) -- 势能数组(包含核势能),长度与 r 一致。

  • delta (float) -- 网格参数 δ(从 radial_grid_exp_transformed 返回)。

  • Rp (float) -- 网格参数 R_p(从 radial_grid_exp_transformed 返回)。

  • k (int, optional) -- 返回最低能的本征态个数(默认 4)。

  • use_sparse (bool, optional) -- 是否使用稀疏矩阵求解器(默认 True,适用于大型矩阵)。

返回类型:

tuple[ndarray, ndarray]

返回:

  • eps (numpy.ndarray) -- 低端 k 个本征值(按升序)。

  • U (numpy.ndarray) -- 对应的径向波函数矩阵,形状 (k, N),已归一化。

备注

  • 去掉 j=0 点后,实际求解的网格索引为 j=1,2,...,j_max

  • v[0] 在边界条件下为 0(不参与求解)

  • 求解后变换回 u = v * exp(j*delta/2) 并归一化

引用

[ExpGridTransform]

指数网格变量变换方法 来源:Computational Physics Fall 2024, Assignment 7, Problem 2 https://github.com/bud-primordium/Computational-Physics-Fall-2024/tree/main/Assignment_7/Problem_2 problem_2.tex 第155-235行(矩阵元推导)

atomscf.operator.build_transformed_hamiltonian(r, l, v_of_r, delta, Rp)[源代码]

构造变量变换的 Hamiltonian 和质量矩阵(HF 复用)。

返回广义特征值问题的矩阵形式(但不求解):

H v = E B v

其中 v 是变换后的波函数。

参数:
  • r (np.ndarray) -- 指数变换网格

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

  • v_of_r (np.ndarray) -- 势能(含外势 + Hartree)

  • delta (float) -- 网格参数 δ

  • Rp (float) -- 网格参数 R_p

返回类型:

tuple[ndarray, ndarray, ndarray]

返回:

  • H (np.ndarray) -- Hamiltonian 矩阵(去掉 j=0 后的尺寸 n-1 × n-1)

  • B (np.ndarray) -- 质量矩阵(对角,尺寸 n-1 × n-1)

  • r_inner (np.ndarray) -- 内部网格点(去掉 j=0,长度 n-1)

备注

该函数抽取自 solve_bound_states_transformed, 用于 HF 中构造局域 Hamiltonian 部分。

交换矩阵 K 仍在原始 u(r) 空间构造, 需要在 v 和 u 之间转换:u(j) = v(j) * exp(j*delta/2)