atomscf.grid

Functions

radial_grid_exp_transformed(n, rmin, rmax[, ...])

生成用于变量变换方法的指数网格。

radial_grid_linear(n, rmin, rmax)

生成线性(等间隔)径向网格及其梯形积分权重。

radial_grid_log(n, rmin, rmax)

生成对数(几何)径向网格及其梯形积分权重。

radial_grid_mixed(n_inner, n_outer, rmin, ...)

生成混合径向网格:核附近为对数网格,外层为线性网格。

trapezoid_weights(r)

为给定单调递增的径向网格计算梯形积分权重。

atomscf.grid.radial_grid_linear(n, rmin, rmax)[源代码]

生成线性(等间隔)径向网格及其梯形积分权重。

线性网格的定义:

\[r_i = r_\min + i\,\Delta r, \quad i=0,\dots, N-1,\ \ \Delta r = \frac{r_\max - r_\min}{N-1}.\]
参数:
  • n (int) -- 网格点数 \(N\),要求 \(N\ge 2\)

  • rmin (float) -- 径向下限 \(r_\min\),应为非负数(通常取非常小的正数以避免 \(r=0\) 奇点)。

  • rmax (float) -- 径向上限 \(r_\max\),应满足 \(r_\max > r_\min\)

返回类型:

tuple[ndarray, ndarray]

返回:

  • r (numpy.ndarray) -- 线性径向网格坐标 \(r_i\)

  • w (numpy.ndarray) -- 对应的梯形积分权重 \(w_i\)

示例

>>> import numpy as np
>>> from atom_scf.grid import radial_grid_linear
>>> r, w = radial_grid_linear(5, 0.0, 1.0)
>>> np.allclose(np.sum(w), 1.0)
True
atomscf.grid.radial_grid_log(n, rmin, rmax)[源代码]

生成对数(几何)径向网格及其梯形积分权重。

对数网格的定义(对数等差,适用于 Numerov):

\[r_i = r_\min\,\exp\!\left( i\,\Delta x \right),\ \ \Delta x = \frac{\ln(r_\max) - \ln(r_\min)}{N-1}.\]
参数:
  • n (int) -- 网格点数 \(N\),要求 \(N\ge 2\)

  • rmin (float) -- 径向下限 \(r_\min>0\),需严格大于 0 才能取对数。

  • rmax (float) -- 径向上限 \(r_\max\),应满足 \(r_\max > r_\min\)

返回类型:

tuple[ndarray, ndarray]

返回:

  • r (numpy.ndarray) -- 对数径向网格坐标 \(r_i\)

  • w (numpy.ndarray) -- 对应的梯形积分权重 \(w_i\)

备注

  • 对数网格能在小 \(r\) 处加密采样,适合处理库仑势与核附近行为。

  • 该网格满足 ln(r) 等差,适用于 Numerov 方法(参考 codex reply_check_4.md)

  • 若后续采用有限差分离散二阶导数,需使用非均匀网格的差分公式(本包已支持)。

atomscf.grid.radial_grid_exp_transformed(n, rmin, rmax, total_span=6.0)[源代码]

生成用于变量变换方法的指数网格。

网格公式参考文献 [1]_

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

其中 \(R_p\) 由边界条件 \(r(j_{\max}) = r_{\max}\) 确定, \(\delta\)\(j_{\max} \cdot \delta = \text{total\_span}\) 确定(默认6.0)。

该网格配合变量变换 \(v(j) = u(j) / \exp(j\delta/2)\) 使用, 可以消除坐标变换引入的一阶导数项。

参数:
  • n (int) -- 网格点数 \(j_{\max} + 1\),要求 \(n \ge 2\)

  • rmin (float) -- 径向下限 :math:`r_{min} ge 0`(可以为0,物理上核在原点)。

  • rmax (float) -- 径向上限 \(r_{\max}\),应满足 \(r_{\max} > r_{\min}\)

  • total_span (float, optional) -- 控制参数 \(j_{\max} \cdot \delta\),默认6.0。

返回类型:

tuple[ndarray, ndarray, float, float]

返回:

  • r (numpy.ndarray) -- 径向网格坐标,满足 r[0] = rmin, r[-1] = rmax。

  • w (numpy.ndarray) -- 对应的梯形积分权重。

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

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

备注

  • 该网格确保 r[0] = rmin(可以为0,物理上正确)

  • 需配合 operator.py 中的 solve_bound_states_transformed 使用

  • 变量变换后的方程没有一阶导数项,数值稳定性好

引用

[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 第32-46行

atomscf.grid.trapezoid_weights(r)[源代码]

为给定单调递增的径向网格计算梯形积分权重。

使用一维梯形规则近似积分:

\[\int_{r_\min}^{r_\max} f(r)\,\mathrm{d}r \approx \sum_{i=0}^{N-1} w_i f(r_i)\]

其中权重 \(w_i\) 由相邻网格间距确定。端点权重为半步长,内部点为左右间距的平均值。

参数:

r (numpy.ndarray) -- 单调递增的径向坐标数组 \((r_0, r_1, \dots, r_{N-1})\),要求 \(r_i < r_{i+1}\)

返回:

w -- 梯形积分权重 \((w_0, \dots, w_{N-1})\),满足上述积分近似式。

返回类型:

numpy.ndarray

备注

  • 该权重适用于一维径向函数 \(u(r)\) 的普通积分(例如归一化 \(\int u^2\,dr=1\))。

  • 若用于三维体积分(如 \(\int 4\pi r^2 n(r)\,dr\)),需显式将体积因子 \(4\pi r^2\) 乘入被积函数。

atomscf.grid.radial_grid_mixed(n_inner, n_outer, rmin, r_switch, rmax)[源代码]

生成混合径向网格:核附近为对数网格,外层为线性网格。

混合网格旨在在小 \(r\) 处加密,同时控制总点数与外层行为:

  • 内层(对数):\(r_i = r_{\min} e^{i\Delta},\ i=0..n_{\text{inner}}-1\),末点尽量接近 \(r_{\text{switch}}\)

  • 外层(线性):从 \(r_{\text{switch}}\)\(r_{\max}\) 等间距 \(n_{\text{outer}}\) 个点(含端点)。

参数:
  • n_inner (int) -- 内层对数段点数(>=2)。

  • n_outer (int) -- 外层线性段点数(>=2)。

  • rmin (float) -- 最小半径(>0)。

  • r_switch (float) -- 切换半径(满足 rmin < r_switch < rmax)。

  • rmax (float) -- 最大半径(> r_switch)。

返回类型:

tuple[ndarray, ndarray]

返回:

  • r (numpy.ndarray) -- 合并后的单调递增网格,重复点已去重。

  • w (numpy.ndarray) -- 对应梯形积分权重。