atomscf.operator
Functions
|
构造变量变换的 Hamiltonian 和质量矩阵(HF 复用)。 |
|
构造径向 Hamiltonian(内部点)并返回矩阵与内部网格坐标。 |
|
在等间距线性网格上构造五点有限差分的径向 Hamiltonian。 |
|
基于有限差分 Hamiltonian 的径向束缚态求解(取低端 \(k\) 个本征对)。 |
|
在等间距线性网格上使用五点有限差分求解径向束缚态(取低端 \(k\) 个本征对)。 |
|
在非等间距网格上,使用辅助等间距线性网格(FD5)求解本征,再插值回原网格。 |
|
使用变量变换方法求解径向束缚态(适用于指数网格)。 |
- 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
一致。
- 返回类型:
- 返回:
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)。
- 返回类型:
- 返回:
eps (numpy.ndarray) -- 低端 \(k\) 个本征值(按升序)。
U (numpy.ndarray) -- 对应的径向函数矩阵 \(U\),形状 \((k, N)\),已在 \([r_0,r_{N-1}]\) 上按 \(\int u^2\,dr=1\) 归一,并在两端补零以满足 Dirichlet 边界。
- 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
一致。
- 返回类型:
- 返回:
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)。
- 返回类型:
- 返回:
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 较大也能快速求解。
- 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,适用于大型矩阵)。
- 返回类型:
- 返回:
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 是变换后的波函数。
- 参数:
- 返回类型:
- 返回:
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)