DeePMD专题

DeePMD与LAMMPS的能量力及virial对照

逐项比较同一冻结模型的Python与LAMMPS能量、力、张量和压缩结果,避免混淆模型误差与接口误差。

更新于 2026-11-11约 3 分钟阅读按任务与环境选择适用配置
阅读本篇目录

进入模型接入教程的完整包目录后,先整理参考数据:

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 逐原子力与总能量#

同一冻结模型在Python和LAMMPS中给出的实际原子力

每个点对应相同原子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、压力与应力的单位和符号#

同一模型的能量与完整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

PyTorch原模型与压缩模型在实际数组上的最大差异

本图只比较 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接入文档。

需要根据你的体系选择资源?联系讨论计算需求。实际可用软件与权限,以当前账户和运行环境为准。

查看配图

放大后可滚动查看细节,按 Esc 关闭。

100%查看原图 ↗