pymatgen:NEB样条、切向力和极值单位
用实际三图像路径说明默认C²三次样条、端点零斜率和get_extrema的meV输出。
阅读本篇目录
本篇接着NEB原始结果读取,仍使用同一条已完成的Al(100)直接跳跃路径。学会读曲线之外,还要知道曲线按什么条件画出来。
unzip pymatgen-NEB-wave666-*.zip
cd pymatgen-NEB
bash results.sh
bash plot.sh
reference-data/保存实际计算的数值,figures/reference.png为重绘图;读取和绘图不会启动VASP。若要运行本篇全部后处理,普通账号提交sbatch job.slurm。脚本申请cpu-8173m独占整节点1任务×56核,小例内部单线程,计费仍按整节点;不要在管理节点启动计算。
1. 原生默认曲线用了什么#
import numpy as np
from monty.serialization import loadfn
from pymatgen.analysis.transition_state import NEBAnalysis
d = loadfn('reference-data/p100-NEB-numeric-input.json')
a = NEBAnalysis(d['r_A'],d['energies_eV'],
d['tangent_forces_eV_A'],d['structures'])
r = np.linspace(0, a.r[-1], 501)
energy_eV = a.spline(r)
slope_eV_A = a.spline(r, 1)
当前2026.9.24的默认setup_spline使用能量点和两端一阶导数为0的C²三次样条。内部图像的切向力保存在a.forces,但没有作为内部导数条件直接传入这条默认曲线。因此,传入切向力数组不等于程序已经使用力约束了每段插值。
本例从实际数据独立解出两段三次多项式的8个系数,核对默认曲线。样条经过全部真实图像,端点斜率为0;内部导数由曲线的连续性条件确定。
2. 力与导数的符号#
物理切向力是F_parallel=-dE/dr。画比较图时,应该把原始切向力取负后与导数比较,不应把同一个量的相反号解释成两种算法不一致。
print('raw tangent force:', a.forces)
print('spline derivative at images:', a.spline(a.r, 1))
本例CI图像输出切向力为数值零,但这个事实来自实际CI收敛;不是所有中间图像都应为零。多图像或未收敛路径更要区分存储的力和默认样条导数。

3. get_extrema返回meV,不是eV#
minimums, maximums = a.get_extrema(normalize_rxn_coordinate=False)
print('position / A, energy / meV:', maximums)
normalize_rxn_coordinate=False时横轴为配置路径Å;设为True则除以全路径长度,成为0–1坐标。无论横轴是否归一化,这个方法的极值能量都以meV返回,而a.energies、a.relative_energies和a.spline(r)为eV。
当前方法以0.01 Å步长扫描样条找局部极值。本例P100给出的峰约为(1.50 Å, 947.771629 meV);真实中间图像相对能量为947.797720 meV。微小差异反映扫描网格,不是额外DFT得到的新鞍点。
head reference-data/Al100-pymatgen-NEB-summary.csv
head reference-data/Al100-pymatgen-NEB-curve.csv
zero_slope_saddle=True可以在最高离散图像额外施加零斜率;这是另一种样条设定,本篇数值表采用默认False。改变样条设定不能替代更多真实图像、端点/路径收敛及真正的鞍点检查。
对速率或振动前因子的研究,还需进一步计算相关振动模式;不能只靠这条三点曲线给出材料扩散率。