LAMMPS 专题

LAMMPS长程静电与精度选择

实际比较Ewald、PPPM、stagger、cg和MSM,检查容差、显式网格、总能与逐原子力。

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

带电周期体系通常需要长程静电算法。本篇固定一个16个点电荷的小周期模型,用相同几何比较Ewald、PPPM及相关路径,再检查手动网格与求力容差对实际结果的影响。

下载12组长程静电完整输入、原始能量与力、CSV及绘图工具,解压进入run.sh目录。

1 提交并读取结果#

sbatch submit.slurm

模板为核时P100分区1GPU1CPU,顺序完成12个固定结构单点;使用P100构建中的CPU执行路径,没有GPU后缀,不作GPU性能结论。LAMMPS30Sep2026、GNU C++13.3.0/C++17、Open MPI5.0.10、双精度MKL FFT;分析ASE3.29.0。

套餐用户用yskit生成所属分区脚本,在分配资源中执行bash run.sh;不要在登录节点模拟。inputs为新输入,reference为本文实算输出,work为新结果,已有work请重新解压。脚本完成后自动提取和画图。

2 模型与完整PPPM输入#

8Å立方盒中放入8个+1e和8个−1e电荷,采用CsCl型两子格排布,并把1号原子移动(0.12,0.03,0.04)Å,使受力不再完全由对称性抵消。只计算固定结构的静电能,不包含真实晶体所需的短程排斥或完整材料势。

units real
atom_style charge
atom_modify map array
boundary p p p
region box block 0 8 0 8 0 8 units box
create_box 2 box
mass 1 23.0
mass 2 35.45
create_atoms 1 single 0 0 0 units box
create_atoms 2 single 2 2 2 units box
create_atoms 1 single 0 0 4 units box
create_atoms 2 single 2 2 6 units box
create_atoms 1 single 0 4 0 units box
create_atoms 2 single 2 6 2 units box
create_atoms 1 single 0 4 4 units box
create_atoms 2 single 2 6 6 units box
create_atoms 1 single 4 0 0 units box
create_atoms 2 single 6 2 2 units box
create_atoms 1 single 4 0 4 units box
create_atoms 2 single 6 2 6 units box
create_atoms 1 single 4 4 0 units box
create_atoms 2 single 6 6 2 units box
create_atoms 1 single 4 4 4 units box
create_atoms 2 single 6 6 6 units box
set type 1 charge 1.0
set type 2 charge -1.0
group probe id 1
displace_atoms probe move 0.12 0.03 0.04 units box
pair_style coul/long 3.8
pair_coeff * *
pair_modify table 0
kspace_style pppm 1e-6
neighbor 0.3 bin
thermo_style custom step atoms pe ecoul elong press
thermo_modify norm no format float %.16g
run 0
write_data structure.data
write_dump all custom atoms.dump id type q x y z fx fy fz modify sort id format float %.16g

pair_style coul/long处理与长程算法配套的实空间项,kspace_style处理倒空间部分,两者共同组成静电能。thermo_modify norm no使输出为整盒能量,没有除以16个原子。

pair_modify table 0关闭实空间库仑查表。本例要对照较紧的力容差,先消除默认有限位数表带来的额外精度限制;不能只把kspace容差写得很小,而忽略其他数值设置。

3 本包八个周期条件#

目录 设置
bulk-ewald-1e10 Ewald,目标相对力精度1E-10,作为同一模型数值参照
bulk-pppm-1e4/1e6/1e8 PPPM,三种目标相对力精度,自动选择网格
bulk-pppm-mesh12 PPPM 1E-6,但显式指定12³网格、5阶映射
bulk-pppm-stagger 交错网格PPPM/stagger,1E-6
bulk-pppm-cg PPPM/cg,1E-6,本例所有粒子均带非零电荷
bulk-msm coul/msm配MSM,1E-6,保留3.8Å实空间截断

MSM目录同时使用:

pair_style coul/msm 3.8
pair_coeff * *
pair_modify table 0
kspace_style msm 1e-6
kspace_modify cutoff/adjust no

MSM默认可能为平衡网格工作量而调整实空间截断;对很小的周期盒,增长后的邻居列表会明显变大。本例显式保留既定截断,让网格处理精度要求。更大体系应重新权衡,不把这个设置视为通用性能最优值。

4 在终端查看原生精度和能量#

grep -E 'grid =|estimated relative force accuracy|G vector|Step.*Atoms.*PotEng' work/cases/bulk-pppm-1e6/log.lammps
grep -E 'grid =|estimated relative force accuracy' work/cases/bulk-pppm-mesh12/log.lammps
cat work/analysis/kspace-comparison.csv
目录 整盒能量/kcal·mol⁻¹ 相对Ewald能量差/kcal·mol⁻¹ 力分量RMS差/kcal·mol⁻¹·Å⁻¹
bulk-ewald-1e10 -1351.762049818 0.000E+00 0.000E+00
bulk-pppm-1e4 -1351.832437089 -7.039E-02 1.910E-03
bulk-pppm-1e6 -1351.759300522 2.749E-03 4.321E-05
bulk-pppm-1e8 -1351.762038436 1.138E-05 5.164E-07
bulk-pppm-mesh12 -1351.248183916 5.139E-01 4.164E-03
bulk-pppm-stagger -1351.765261001 -3.211E-03 4.625E-05
bulk-pppm-cg -1351.759300522 2.749E-03 4.321E-05
bulk-msm -1351.762021051 2.877E-05 1.192E-04

同一实际几何下,各路径相对高精度Ewald的能量差绝对值与逐分量力RMS差

自动PPPM的1E-4→1E-6→1E-8对照中,力差随精度要求收紧而降低;最紧条件的RMS差约5.16E-7 kcal/mol/Å。不同算法和参数的能量差不一定按同样规律变化,kspace_style的accuracy是目标相对力误差,不是总能收敛阈值。

显式12³网格条件保留在表中作为参数对照。它的原生估计相对力误差约1.57E-4,大于输入的1E-6目标;手动固定过粗的网格会改变自动精度选择,不能只看输入中的容差数字。

PPPM/cg在本模型中与普通PPPM结果相同,不代表任意稀疏电荷体系都无差别。MSM本例总力残余约7.73E-4 kcal/mol/Å,保留这一有限网格误差;用于敏感响应时继续收敛网格与参数,不把输出正常结束当作所有力都已达到需求。

实际周期点电荷与薄层点电荷结构,红色+1e、蓝色−1e;不是实际材料的完整力场模型

提取与重画#

module load ase/3.29.0
python analyze.py work
python plot_results.py work
python check_results.py work
cat work/analysis/kspace-comparison.csv
ls work/figures

CSV列出方法、目标容差、显式修正、整盒总能、相对同几何Ewald参照的能量差、全部3N个笛卡尔力分量的RMS差、原生估计精度及总力残余。查看本文参考数据时将work改为reference。

参数:kspace_style、kspace_modify、库仑pair样式。薄层边界继续看slab修正实操。

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

查看配图

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

100%查看原图 ↗