DeePMD与LAMMPS的能量力及virial对照
逐项比较同一冻结模型的Python与LAMMPS能量、力、张量和压缩结果,避免混淆模型误差与接口误差。
阅读本篇目录
bash analyze.sh
head -n 12 tables/interface-errors.csv
表中每行名称包含模型、结构和比较量。能量、virial的单位为eV,力为eV/Å。比较时必须使用同一模型文件、同一结构、同一元素映射和相同边界,不能把两个分别训练的模型之间的差异解释成接口误差。
1 Python接口实际计算什么#
作业脚本调用 code/api_worker.py,核心操作如下:
from deepmd.infer import DeepPot
model = DeepPot(model_file)
atom_types = [model.get_type_map().index('Si')] * 64
energy, force, virial, atomic_energy, atomic_virial = model.eval(
coordinates, cells, atom_types, atomic=True
)
这里 coordinates 是四种结构各自按原子顺序展平的坐标,cells 是对应的3×3晶胞展平数组。代码分别在CUDA可见和隐藏CUDA设备的进程中求值;原始数组保存在 reference/original/API-硬件-模型-gpu/ 与同名 -cpu/ 下的 native.npz。
2 逐原子力与总能量#

每个点对应相同原子ID的相同笛卡尔分量,虚线表示相等。四个模型分开画,P100和V100分别标记;它们是同模型接口对照,不是DFT标签拟合图。
全部32个参考条件中,Python与LAMMPS的整盒能量最大差约1.71×10⁻¹³ eV,力分量最大差约3.01×10⁻¹³ eV/Å。分析还对原子1的x、17的y、43的z作±10⁻⁵ Å位移,以能量中心差分核对原生力;这些预选分量满足本例10⁻⁵ eV/Å的绝对参考容差,不代表所有坐标和所有构型均已核对。
3 virial、压力与应力的单位和符号#

DeePMD输出的全局virial W单位为eV;本例没有速度,LAMMPS压力张量由W除以体积得到。metal单位下,eV/ų乘以1.6021765×10⁶换算为bar。压力以压缩为正,与ASE常用的拉伸为正的应力符号相反。
| 输出 | 分量顺序 |
|---|---|
| DeePMD展平3×3张量 | xx、xy、xz、yx、yy、yz、zx、zy、zz |
| LAMMPS六分量压力 | xx、yy、zz、xy、xz、yz |
分析按明确顺序重建张量,再做逐分量比较,没有凭图像方向自动选择符号或转置。参考条件中,virial最大差约2.17×10⁻¹² eV。Python接口输出的逐原子能量和virial求和也分别与全局量对照。
有温度的MD压力还包含动能项;不要把这组零速度结构的换算式直接当成完整有限温度压力。计算压力和应力前,先统一单位、符号、体积和温度项。
4 同权重模型的压缩对照#
head -n 12 tables/compression-errors.csv

本图只比较 pt_se_e2_a 与 pt_compressed,包括CPU/GPU模式及四种结构。最大差约为:能量1.14×10⁻¹³ eV,力1.4×10⁻¹⁴ eV/Å,virial6.9×10⁻¹² eV。误差保持原始数值,不为对数坐标人为设置下限。
压缩后的适用范围仍要用自己的结构和近邻距离重新检查;小体系的加载时间不能据此当成压缩加速比。冻结、压缩与转换命令见模型导出教程。本包没有使用此前已记录不等价的跨后端转换产物。
重新生成本篇参考图:
bash plot.sh
模型能量和力的一致性只回答“接口是否在计算同一个势”。材料精度、训练覆盖与MD稳定性需要独立参考数据和相应测试。接口详细设置见官方LAMMPS接入文档。