LAMMPS硅SNAP与ML-IAP势实操
用64原子硅结构完成线性与二次SNAP推断,理解模型文件、元素映射及Kokkos的必要设置。
阅读本篇目录
本篇从已经训练好的公开硅势开始,完成建模、读取势文件、提交求能量与力,再查看结果。模型来自 LAMMPS 随附的 Si_Zuo_JPCA2020 线性和二次 SNAP 文件;这是已有模型推断,没有重新训练,也没有将本例与 DFT 的材料精度做比较。
1 下载并看参考结果#
下载完整输入、两种GPU参考结果、模型文件和分析脚本,将 ZIP 放到自己的登录目录。执行:
mkdir Si-SNAP
python3 -m zipfile -e lammps-Si-SNAP-MLIAP-*.zip Si-SNAP
cd Si-SNAP
bash analyze.sh
这一步只读取包内结果,生成 tables/energies-forces.csv 与 figures/,不会提交作业。
head -n 10 tables/energies-forces.csv
模型是金刚石常规胞沿三个方向各复制2次,共64个Si,基准晶格常数5.43 Å。三个均匀缩放条件为0.98、1.00、1.02;另一个条件给所有坐标施加标准差0.03 Å的随机扰动,并按周期边界回卷。

图是实际坐标的xy投影,部分原子会沿z方向重合;颜色用于区分z位置。基准盒长10.86 Å,三维周期边界,没有做结构松弛。
2 提交自己的计算#
默认申请核时P100分区的1张GPU、2个CPU核额度,依次完成32个小条件。计算包括线性/二次模型、四种结构、SNAP/ML-IAP接口、普通/Kokkos路径。普通路径作为CPU求力对照,仍在同一个GPU作业的计算节点上运行;本例不提供CPU性能结论。
bash run.sh
有V100 16G分区权限时,将上面的命令换为 bash run.sh v100。脚本使用所选分区,并等待已提交的作业;可在另一个终端用 squeue -u "$USER" 查看状态。不要因为排队再次运行。续查现有提交号可读取 new-work/SUBMISSIONS.json;重做计算请另建目录解压,保留已有结果。
完成后查看自己的结果:
head -n 10 tables-new/your-energies-forces.csv
reference/ 是随包的64个参考条件,包含P100和V10016G;new-work/ 是本次选择硬件的32个新条件。不要混用这两个目录的输出。
3 先读懂输入和模型文件#
cat input-example.lmp
下面是实际使用的“线性SNAP、扰动硅、Kokkos”输入。后半段只对三个坐标分别作±0.00001 Å微移并重新求能量,用于能量差分检查原子力;run 0 不推进MD时间。
units metal
atom_style atomic
boundary p p p
read_data ../models/perturbed.data
pair_style snap
pair_coeff * * ../potentials/Si_Zuo_JPCA2020.snapcoeff ../potentials/Si_Zuo_JPCA2020.snapparam Si
neighbor 1.0 bin
neigh_modify every 1 delay 0 check yes
compute e all pe/atom
compute b all sna/atom 4.9 0.99363 8 0.5 1 rmin0 0 bzeroflag 0 quadraticflag 0
thermo 1
thermo_style custom step atoms pe pxx pyy pzz pxy pxz pyz
thermo_modify norm no format float %.16g
dump d all custom 1 base.dump id type x y z fx fy fz c_e c_b[*]
dump_modify d sort id format float %.16g
run 0
undump d
print "base $(pe:%.16g) $(pxx:%.16g) $(pyy:%.16g) $(pzz:%.16g) $(pxy:%.16g) $(pxz:%.16g) $(pyz:%.16g)" append properties.dat screen no
group probe id 1
displace_atoms probe move 1e-05 0 0 units box
run 0
print "FD 1 0 plus $(pe:%.16g)" append properties.dat screen no
displace_atoms probe move -2e-05 0 0 units box
run 0
print "FD 1 0 minus $(pe:%.16g)" append properties.dat screen no
displace_atoms probe move 1e-05 0 0 units box
group probe delete
group probe id 17
displace_atoms probe move 0 1e-05 0 units box
run 0
print "FD 17 1 plus $(pe:%.16g)" append properties.dat screen no
displace_atoms probe move 0 -2e-05 0 units box
run 0
print "FD 17 1 minus $(pe:%.16g)" append properties.dat screen no
displace_atoms probe move 0 1e-05 0 units box
group probe delete
group probe id 43
displace_atoms probe move 0 0 1e-05 units box
run 0
print "FD 43 2 plus $(pe:%.16g)" append properties.dat screen no
displace_atoms probe move 0 0 -2e-05 units box
run 0
print "FD 43 2 minus $(pe:%.16g)" append properties.dat screen no
displace_atoms probe move 0 0 1e-05 units box
group probe delete
配套求解命令为 mpirun -np 1 --bind-to none lmp -k on g 1 -sf kk -pk kokkos newton on neigh half gpu/aware off -in in.lmp,由提交脚本在计算节点执行。SNAP的Kokkos路径需要Newton on;不要删去 newton on neigh half。-sf kk 选择可用Kokkos样式,compute sna/atom 描述符仍走普通主机计算,不能把本例说成所有步骤都在GPU上。
pair_coeff 的最后一个 Si 将LAMMPS原子类型1映射为模型中的Si。系数、参数、半径、邻居权重和元素映射须相互匹配,不能把线性模型系数与二次模型参数混在一起。二次模型使用 Si_Zuo_JPCA2020.quadratic.snapcoeff 与同名 .snapparam。
ML-IAP将模型和描述符分开保存。对应线性输入为:
pair_style mliap model linear ../potentials/linear.mliap.model descriptor sna ../potentials/linear.mliap.descriptor
pair_coeff * * Si
本包的转换保留每一个系数字符串,将SNAP系数文件中的元素半径与权重移入描述符文件。二次模型改用 model quadratic 及其两份配套文件;不需要重新训练。
4 本例得到什么#
P100普通SNAP路径的实际每原子能量如下,单位eV/atom:
| 结构 | 线性模型 | 二次模型 |
|---|---|---|
| 均匀缩放0.98 | -5.374621586 | -5.385287466 |
| 基准1.00 | -5.414834302 | -5.422856531 |
| 均匀缩放1.02 | -5.411155088 | -5.416076849 |
| 随机扰动 | -5.398132731 | -5.405365865 |

三点折线仅连接实际结果,不是EOS拟合,也不足以确定平衡晶格常数或体积模量。两个势是分别训练的模型,能量不同并不说明接口出错。替换自己的材料时,先确认模型元素和训练范围,再检查缺陷、应变、温度及液态结构是否属于可用范围。
本例使用LAMMPS 30 Sep 2026的Kokkos构建,GCC13.3、CUDA12.8、OpenMPI5.0.10和Kokkos5.2.1;分析使用ASE3.29.0环境中的NumPy和Matplotlib。继续看描述符与原子力分析。模型输入说明见LAMMPS SNAP文档和ML-IAP文档。