LAMMPS 专题

LAMMPS 能量力与压力检查

从三个实际能量条件计算原子力和压力,含单位、CPU/GPU差异、映射检查和完整终端步骤。

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

下载完整输入、势文件、实际结果与绘图脚本,在一个新目录解压后,先查看已有结果:

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

实际原子力差分与CPU/GPU后端差异

右图中低于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官方文档,实际数值来自下载包原生输出。

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

查看配图

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

100%查看原图 ↗