LAMMPS距离平移与GPU精度
实际比较lj/expand与lj/cut的势阱和截断位置,汇总八种势的普通与GPU误差。
阅读本篇目录
lj/expand对相互作用距离作平移,改变的效果与单纯修改LJ的σ不同。本篇实际比较两种LJ形式,并汇总八种势在普通和GPU路径中的真实能量、力差。
下载八种势函数的普通/GPU输入、336个实际距离采样、原子力与绘图脚本,解压进入run.sh目录。
1 提交完整扫描#
sbatch submit.slurm
模板申请核时P100分区1GPU1CPU,每种势先普通路径、再GPU路径,各扫描1–5Å的21个距离点。八种势组成八个配对工作流,共16次原生程序运行。程序只改变原子位置后run 0,没有动力学或结构松弛。
套餐用户用yskit生成所属分区脚本,在已分配资源中执行bash run.sh。多卡时仅使用已分配的CUDA可见设备与CPU亲和范围,每卡一个配对工作流,每个程序1MPI1OMP,空闲卡继续下一种势;不要在登录节点模拟。已有work请重新解压。
版本LAMMPS30Sep2026、GNU C++13.3.0/C++17、Open MPI5.0.10、CUDA GPU包混合精度;分析ASE3.29.0。普通路径是P100节点上同一构建的CPU计算,不是CPU专用节点的性能数据。inputs为新输入,reference为本文实算,work为新结果。
2 lj/expand的GPU完整输入#
package gpu 1 neigh no
suffix gpu
units real
atom_style atomic
atom_modify map array
newton off
boundary f f f
region box block -10 10 -10 10 -10 10 units box
create_box 2 box
mass 1 1.0
mass 2 1.0
create_atoms 1 single 0 0 0 units box
create_atoms 2 single 1 0 0 units box
pair_style lj/expand 4.5
pair_coeff * * 0.5 1.0 0.25
neighbor 0.3 bin
thermo_style custom step atoms pe
thermo_modify norm no format float %.16g
variable distance index 1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 3.0 3.2 3.4 3.6 3.8 4.0 4.2 4.4 4.6 4.8 5.0
label scan
set atom 2 x ${distance}
run 0
print "SCAN ${distance} $(pe:%.16g) $(fx[1]:%.16g) $(fx[2]:%.16g)" append scan.dat screen no
write_dump all custom atoms-${distance}.dump id type x y z fx fy fz modify sort id format float %.16g
next distance
jump SELF scan
LJ系数ε=0.5kcal/mol、σ=1Å;lj/expand额外使用Δ=0.25Å,以r−Δ代替标准LJ表达式里的r。它的实际作用截断为rc+Δ,本例为4.75Å,而不是输入pair_style后的4.5Å。
普通lj/cut对照输入只需使用:
pair_style lj/cut 4.5
pair_coeff * * 0.5 1.0
同一ε和σ下,标准LJ连续势阱位置为2^(1/6)σ≈1.12246Å,平移后约1.37246Å;这批离散采样最低点分别落在附近的1.2和1.4Å。采样最小值与连续函数最低点需要区分。
3 原生数据与实际截断#
tail -n 5 work/cases/lj-cut-cpu/scan.dat
tail -n 5 work/cases/lj-expand-cpu/scan.dat
普通LJ在4.6Å已为0;lj/expand在4.6Å仍有相互作用,4.8Å才超出4.75Å的实际截断。图中没有默认进行额外的势能平移或力平滑,修改shift或势样式后应重新核对。

4 八种势的实际后端差值#
| 势 | 21点最大能量差/kcal·mol⁻¹ | 21点最大力差/kcal·mol⁻¹·Å⁻¹ |
|---|---|---|
| born | 1.401E-07 | 9.537E-07 |
| buck | 2.631E-08 | 1.182E-07 |
| gauss | 6.986E-08 | 6.410E-08 |
| lj/cut | 3.214E-08 | 1.090E-07 |
| lj/expand | 5.778E-07 | 1.083E-05 |
| morse | 7.859E-07 | 3.292E-06 |
| soft | 4.074E-07 | 3.590E-07 |
| yukawa | 5.156E-08 | 8.383E-08 |

普通路径使用双精度CPU求力;此GPU构建为混合精度,两者存在表中小差异。本例最大力差约1.08E-5kcal/mol/Å,但不能把这一数值当作任意材料、规模或势函数的通用误差上限。
检查后端时,先固定同一结构、参数、单位、截断、邻居与Newton设置,再比较能量和逐原子力;不要只看总能打印位数或曲线肉眼重合。敏感任务还应按目标误差继续验证精度与后续轨迹性质。
提取与重画#
module load ase/3.29.0
python analyze.py work
python plot_results.py work
python check_results.py work
cat work/analysis/backend-comparison.csv
head -n 12 work/analysis/potential-scans.csv
potential-scans.csv逐点记录势、后端、距离、能量和两个原子的Fx;backend-comparison.csv汇总每种势在21点上的最大能量和力差。查看本文数据时将work改为reference。
这些系数是解释势函数形式与命令的合成教学参数,没有拟合为具体材料,也不用于比较不同势的真实材料准确度。