LAMMPS 能量力与压力检查
从三个实际能量条件计算原子力和压力,含单位、CPU/GPU差异、映射检查和完整终端步骤。
阅读本篇目录
下载完整输入、势文件、实际结果与绘图脚本,在一个新目录解压后,先查看已有结果:
bash run.sh
得到 analysis/ 和 figures/。重新计算时先核对 submit.slurm 的分区适合自己的账户,然后:
sbatch submit.slurm
模板申请1个CPU核、1个P100,顺序计算76个小体系条件,再分析自己的结果。直接运行 bash run.sh compute 或文中的 lmp 命令时,必须已经处于分配好的计算资源中。已有 work/analysis/figures 时请另解压一份;只有 work 而没有分析/图目录时可用 bash run.sh analyze 继续后处理。
本例使用LAMMPS 30Sep2026,GCC 13.3、OpenMPI 5.0.10、CUDA 12.8;GPU包Mixed Precision,Kokkos 5.2.1双精度。已链接PLUMED 2.9.4,本文没有施加偏置。后处理使用ASE 3.29环境的NumPy与Matplotlib。普通CPU计算路径在同一P100计算资源上完成,不是Intel Xeon 8173M性能测试。
1. 先跑完整流程,再定位数据#
下载包的76个条件覆盖Cu–Ni、Al–Cu、Ni MEAM的实际输入。reference/为已有计算输出,work/为自己的重算结果,analysis/为从选定数据重新提取的表格。
head analysis/forces.csv
head analysis/pressures.csv
head analysis/backend-errors.csv
脚本检查总能与逐原子能量求和、元素数、质量、坐标和全胞净力,也检查后端实际启动方式。下面重点说明如何读力与压力,而不是只看程序是否正常退出。
2. 用能量差分检查原子受力#
每个模型都先把1号原子沿x移动0.03 Å,然后在该位置左右各偏移 h=0.0001 Å:
F_x ≈ −[E(x+h)−E(x−h)]/(2h)。
能量用全胞势能eV,位移用Å,因此得到eV/Å。不能把每原子能量直接代入后又与一个原子的受力比较。
例如Cu–Ni的三个输入是 inputs/cuni-force--1-cpu/、inputs/cuni-force-0-cpu/ 和 inputs/cuni-force-1-cpu/;三次都按同一势、同一元素分配,只改变这个原子的坐标。整套脚本已依次运行它们。原生受力在中心条件的 final.dump 中。
| 模型/后端 | 原生Fx eV/Å | 能量差分Fx eV/Å | 绝对差 eV/Å |
|---|---|---|---|
| cuni/cpu | -0.2533927995 | -0.2533927989 | 6.591e-10 |
| cuni/kk | -0.2533927995 | -0.2533928026 | 3.036e-09 |
| alcu/cpu | -0.1938040031 | -0.1938040006 | 2.532e-09 |
| alcu/kk | -0.1938040031 | -0.1938040006 | 2.532e-09 |
| meamni/cpu | -0.3420080618 | -0.3420080637 | 1.840e-09 |
| meamni/kk | -0.3420080618 | -0.3420080640 | 2.124e-09 |

右图中低于10⁻¹² eV/Å的误差显示在明确标注的绘图下限,原始数据保留真实数值。GPU包采用混合精度;与普通CPU/Kokkos的最后几位差异不能解释为材料物性改变。本例GPU包的最大受力差约2.35×10⁻⁶ eV/Å。
在包根目录,不重新计算也能用已有原生输出独立取一次Cu–Ni差分:
module purge
module load ase/3.29.0
python - <<'PY'
import numpy as np
from pathlib import Path
root = Path('reference/cases')
em = np.loadtxt(root/'cuni-force--1-cpu/energy.dat')[0]
ep = np.loadtxt(root/'cuni-force-1-cpu/energy.dat')[0]
print('Fx =', -(ep-em)/0.0002, 'eV/Angstrom')
PY
得到约−0.25339280 eV/Å。分析自己的新结果时把 reference/cases 改成 work/cases。
3. 用体积差分检查压力#
在相同组成下保持分数坐标,对晶胞做三个均匀体积条件:V−=V0(1−10⁻⁴)、V0、V+=V0(1+10⁻⁴)。三个轴的长度乘相应体积比例的立方根,不能把线尺度变化直接当成体积变化。
P ≈ −[E(V+)−E(V−)]/(V+−V−)。
eV/ų乘1,602,176.634换成bar;LAMMPS units metal原生日志压力也是bar,除10,000为GPa。这些是静态0K的 run 0 条件,没有速度动能项;有限温度MD的瞬时压力不能直接和这个静态公式机械比较。
| 模型/后端 | 原生压力 bar | 体积差分 bar | 绝对差 bar |
|---|---|---|---|
| cuni/cpu | 12147.358093 | 12147.402489 | 0.044396 |
| cuni/kk | 12147.358093 | 12147.402791 | 0.044698 |
| alcu/cpu | -305708.972366 | -305708.972656 | 0.000289 |
| alcu/kk | -305708.972366 | -305708.972492 | 0.000126 |
| meamni/cpu | -0.012998 | 0.003017 | 0.016014 |
| meamni/kk | -0.012998 | 0.003084 | 0.016081 |
Ni MEAM在参照晶胞附近压力几乎为零,差分可能给出很小的不同符号,必须结合绝对差与单位判断,不能只算相对百分比。这里最大压力差约0.045 bar,约4.5×10⁻⁶ GPa。
Al–Cu的约−30.57 GPa则是固定晶胞未优化产生的真实大应力,不能把它和差分舍入误差混为一谈。
4. 元素映射反转检查#
原子类型编号只是标签。包中的 mapping 条件把type 1/2互换,同时反转 pair_coeff 的元素列表;元素实际位置和质量保持相同,因此能量、力、压力应保持一致。CPU与GPU/Kokkos分别执行了这个实际操作。
不同势之间的绝对能量零点、元素质量或参数化范围可能不同,不要求互相等价。只在同一势和同一物理输入下比较后端或标签变更。
5. 最终得到什么#
完整流程按准备输入→分配资源→普通与加速路径计算→读取原生日志/dump→检查能量与导数→输出CSV和结构/数据图进行。已有结果只需 bash run.sh;自己的重算用 sbatch submit.slurm。
本篇涉及的模型均为108原子小体系,组成结构按ID确定且未松弛,不提供随机合金平衡、混合自由能或相图结论。继续操作可分别看Cu–Ni元素映射和ADP/MEAM Kokkos输入;势函数命令依据LAMMPS官方文档,实际数值来自下载包原生输出。