LAMMPS pair_style lj/smooth 完全指南:双截断力平滑 Lennard-Jones 势的原理、配置与源码解析
科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载本指南系统讲解 LAMMPS 中pair_style lj/smooth的完整用法它通过在内外双截断之间施加三次多项式力平滑从根源上消除经典 LJ 势在截断处力不连续的数值伪影。读完本文你将掌握该势函数的语法与参数、平滑系数的数学构造与源码实现、pair_coeff配置、混合规则、能量不连续问题的处理pair_modify shift与pair_write验证以及 GPU/KOKKOS/OpenMP 加速变体、restart 与 rRESPA 集成等实战要点。一、lj/smooth 是什么从截断伪影到力平滑经典的 12/6 Lennard-Jones 势在有限截断距离处直接截断时虽然能量被强制归零但力在截断处会发生跳变——这是一个常见且棘手的数值伪影原子跨越截断边界时受力突变会向体系注入能量导致能量漂移、温度失衡尤其在截断较小如 2.5σ 量级的粗粒化模型中影响明显。pair_style lj/smooth正是为解决这一问题而设计它在内截断Rin与 外截断Rc之间用一段三次多项式替代原始 LJ 力使力及其一阶导数在两个截断边界上都连续过渡在Rin处平滑力与未平滑的 LJ 公式的力、力的一阶导数精确匹配在Rc处力与其一阶导数平滑归零条件约束Rin不能为 0且必须满足Rin Rc源码在settings()与coeff()中均有校验。该样式由 Craig MaloneyUCSB贡献属于EXTRA-PAIR包完整实现在 src/EXTRA-PAIR/pair_lj_smooth.cpp 与其头文件 src/EXTRA-PAIR/pair_lj_smooth.h 中。注意它平滑的是力而不是能量——这一取舍正是本样式所有特性能量不连续、shift 支持、不支持 tail 修正的根源。二、命令语法与参数pair_style lj/smooth Rin Rc参数含义单位约束Rin内截断力平滑施加的起始距离距离单位必须 0且 RcRc外截断lj/smooth 相互作用的截止距离距离单位必须 Rin文档给出的标准示例pair_style lj/smooth 8.0 10.0 pair_coeff * * 10.0 1.5 pair_coeff 1 1 20.0 1.3 7.0 9.0从源码 settings() 实现 可以看到两个参数的确切校验逻辑pair_style必须恰好接收 2 个参数narg ! 2时报错随后cut_inner_global与cut_global被解析为全局内外截断若cut_inner_global 0.0 || cut_inner_global cut_global直接报Illegal pair_style command。当后续pair_coeff显式设置了某对类型的截断时settings()会把这些显式截断重置为新的全局值——也就是说修改 pair_style 的全局截断会覆盖所有已通过 pair_coeff 设置但未在 coeff 中给出第 5、6 参数的配对。三、平滑的数学原理与源码级系数构造3.1 两段式的势能与力定义文档给出了势能/力的分段定义当r Rin时使用标准 LJ 势能$$E 4\epsilon\left[\left(\frac{\sigma}{r}\right)^{12} - \left(\frac{\sigma}{r}\right)^6\right]$$当Rin r Rc时力被替换为关于t r - Rin的三次多项式$$F C_1 C_2(r-r_{in}) C_3(r-r_{in})^2 C_4(r-r_{in})^3$$系数C1~C4由 LAMMPS 自动计算使力在内截断处与标准 LJ 公式的值及一阶导数匹配、在外截断处力与一阶导数均为 0。系数及截断处能量不连续量的显式表达式见文末参考文献 (Leoni_1) 与 (Leoni_2)。3.2 源码中的平滑系数在init_one()src/EXTRA-PAIR/pair_lj_smooth.cpp#L267-L324中LAMMPS 首先按类型对预计算标准 LJ 常量lj1[i][j] 48.0 * epsilon[i][j] * pow(sigma[i][j],12.0); lj2[i][j] 24.0 * epsilon[i][j] * pow(sigma[i][j],6.0); lj3[i][j] 4.0 * epsilon[i][j] * pow(sigma[i][j],12.0); lj4[i][j] 4.0 * epsilon[i][j] * pow(sigma[i][j],6.0);当cut_inner ! cut即存在平滑区时再以r6inv 1/rin^6、t rc - rin、tsq t^2、ratio sigma/rin构造 5 个平滑常量ljsw0 4.0*epsilon*(pow(ratio,12.0) - pow(ratio,6.0)); // 内截断处的 LJ 能量值 ljsw1 r6inv*(lj1*r6inv - lj2) / rin; // 内截断处 f(r)/r 的值 ljsw2 -r6inv * (13.0*lj1*r6inv - 7.0*lj2) / (rin*rin); ljsw3 -(3.0/tsq) * (ljsw1 2.0/3.0*ljsw2*t); ljsw4 -1.0/(3.0*tsq) * (ljsw2 2.0*ljsw3*t);其中ljsw1 ~ ljsw4正是文档公式中C1 ~ C4的数值化身按力/距离的形式组织。特别地ljsw0是内截断处 LJ 势能值它是平滑区能量积分的起点。若cut_inner cut平滑区退化为 0所有ljsw*常量清零行为退化为普通截断 LJ。3.3 compute() 中的力与能量求值在 compute() 实现 中核心求值逻辑是当rsq cut_inner_sq时用标准 LJ 力r6inv*(lj1*r6inv - lj2)否则计算t sqrt(rsq) - cut_inner用三次多项式fskin ljsw1 ljsw2*t ljsw3*tsq ljsw4*tsq*t; forcelj fskin*r;能量则对力做积分得到平滑区内evdwl ljsw0 - ljsw1*t - ljsw2*tsq/2.0 - ljsw3*tsq*t/3.0 - ljsw4*tsq*tsq/4.0 - offset;即内截断处能量 − 平滑力从 Rin 到 r 的积分。注意力的三次平滑意味着能量的四次形态因此能量值在Rc处不会归零——这正是下一节要处理的不连续问题。四、pair_coeff 系数设置每个原子类型对必须通过pair_coeff命令或在 data 文件 / restart 文件由read_data、read_restart读取定义以下系数系数含义单位epsilon势阱深度能量单位sigma零势能距离距离单位rin可选内截断距离单位rc可选外截断距离单位最后两个系数为可选。若不指定则使用pair_style命令给定的全局Rin、Rc值。源码 coeff() 实现 约束pair_coeff只能接收 4 个或 6 个参数且类型范围arg[0]、arg[1]按utils::bounds()解析支持1*3、*等通配写法。若cut_inner_one 0.0 || cut_inner_one cut_one报Incorrect args for pair coefficients并附带errorurl(21)指向文档说明。PairLJSmooth还通过extract()向外界暴露epsilon与sigma二维数组src/EXTRA-PAIR/pair_lj_smooth.cpp#L463-L469供其他命令如compute类查询当前势参数使用。五、混合规则与 pair_modify 交互对于I ! J的类型对epsilon、sigma、Rin与外截断均可通过混合规则自动生成Rin本质是截断距离按截断距离的方式混合即mix_distance默认几何平均其余系数按pair_modify mix选项混合默认混合方式为geometric几何平均也可设置为arithmetic、sixthpower等。混合逻辑在 init_one() 前半段 中清晰可见当setflag[i][j] 0未显式设置时epsilon用mix_energy混合sigma、cut_inner、cut用mix_distance混合。单元测试 unittest/force-styles/tests/mol-pair-lj_smooth.yaml 中就用到了pair_modify mix arithmetic来验证算术混合下的数值基准。此外该样式与pair_modify的交互总结如下pair_modify 选项支持情况说明shift✅ 支持可消除能量在截断处的不连续见下节table不相关该样式为解析表达式无需查表tail❌ 不支持平滑能量在截断处归零长程尾部修正无意义六、能量不连续问题与 pair_write 验证6.1 问题根源文档特别警告力平滑会导致能量在数值上与一阶导数上均不连续。具体而言平滑区能量在Rc处一般不为 0能量曲线在Rc处出现台阶跳变这可能导致能量守恒变差必要时需要配合恒温器如fix nvt使用。6.2 消除方案pair_modify shift能量值的不连续可以通过pair_modify shift yes消除LAMMPS 计算外截断处的平滑能量值作为offset从能量中整体减去使能量在Rc处归零。源码中 offset 的构造 正是把平滑能量多项式的完整形式在t rc - rin处求值if (offset_flag) offset[i][j] ljsw0 - ljsw1*t - ljsw2*tsq/2.0 - ljsw3*tsq*t/3.0 - ljsw4*tsq*tsq/4.0;offset_flag即由pair_modify shift yes置位。注意 shift 只修复能量值的跳变一阶导数力的不连续在 shift 下依然存在因为平滑区外没有力。6.3 用 pair_write 可视化验证文档建议使用pair_write命令绘制实际的能量与力曲线来直观观察效果。例如针对类型 1-1 对在 1.0 到 10.0 距离上输出 500 个采样点pair_style lj/smooth 8.0 10.0 pair_coeff 1 1 10.0 1.5 pair_write 1 1 500 r 1.0 10.0 table.txt LJ_smoothpair_write会按距离均匀采样style r或按 r² 均匀采样style rsq每行输出序号、距离、能量与力pair_write 命令说明。将 shift 前后两组输出画在同一张图上可以清楚看到Rc处能量台阶被消除、力平滑过渡到零的效果。由于lj/smooth实现了Pair::single()函数src/EXTRA-PAIR/pair_lj_smooth.cpp#L432-L459它满足pair_write的使用前提该命令要求势函数实现single()。七、加速器变体gpu / kk / omplj/smooth提供三个加速器变体lj/smooth/gpuGPU 加速版实现在 src/GPU/pair_lj_smooth_gpu.cpp 与lib/gpu中的配套 kernel。它支持两种 GPU 模式通过内置邻居列表构建的GPU_FORCE模式以及由 GPU 包自建邻居表的模式ljsmt_gpu_compute_n并在 GPU 显存不足时报错提示src/GPU/pair_lj_smooth_gpu.cpp#L56-L96。使用时需在输入脚本中加suffix gpu并在run前用package gpu配置设备。lj/smooth/kkKOKKOS 加速版实现在 src/KOKKOS/pair_lj_smooth_kokkos.cpp支持 CUDA/OpenMP/SYCL/HIP 等多种后端通过-k on开关与suffix kk启用。lj/smooth/ompOpenMP 线程版实现在 src/OPENMP/pair_lj_smooth_omp.cpp由-sf omp启用将邻居遍历按线程分块loop_setup_thr物理公式与基础版完全一致。这三个变体都继承自PairLJSmooth基类数学与系数构造完全相同仅加速路径不同因此加速前后数值结果一致便于结果交叉校验。八、restart、rRESPA 与其他限制8.1 二进制 restart 支持该样式将自身信息写入二进制 restart 文件write_restart()会写出每个类型对的epsilon、sigma、cut_inner、cutwrite_restart_settings()额外写出全局cut_inner_global、cut_global、offset_flag与mix_flag。因此读取 restart 文件后无需再写 pair_style / pair_coeff 命令src/EXTRA-PAIR/pair_lj_smooth.cpp#L330-L406。同样write_data()/write_data_all()支持把系数导出到 data 文件。8.2 rRESPA 多时间步支持与多数 pair 样式不同lj/smooth只能通过run_style respa的pair关键字使用不支持inner、middle、outer关键字。这意味着它无法把力拆分为近程/中程/远程三段分别分配时间步——这是因为平滑多项式跨越整个双截断区间难以安全分段。加速变体的构造函数中respa_enable 0也印证了这一限制见 src/OPENMP/pair_lj_smooth_omp.cpp#L31-L36。8.3 构建要求EXTRA-PAIR 包lj/smooth属于EXTRA-PAIR包只有启用该包构建的 LAMMPS 才能使用。用 CMake 构建时该包在 cmake/CMakeLists.txt#L352 的包清单中注册并可被其他包依赖如pkg_depends(DIELECTRIC EXTRA-PAIR)cmake/CMakeLists.txt#L507。启用方式cmake -D PKG_EXTRA-PAIRon ../cmake传统 make 方式则在src目录执行make yes-extra-pair。构建细节参见 Build package 文档。九、相关命令与 lj/smooth/linear 对比相关命令为pair_coeff与pair lj/smooth/linear文档见 pair_lj_smooth_linear.rst。两者都追求截断处平滑但思路截然不同特性lj/smoothlj/smooth/linear语法pair_style lj/smooth Rin Rcpair_style lj/smooth/linear cutoff平滑方式Rin~Rc之间三次多项式平滑力势能减去 φ(rc) 与线性项 (r−rc)·φ′(rc)即 Shifted Force LJ截断处行为力与力的一阶导数为 0能量不连续能量与力同时连续归零构造保证pair_modify shift支持消除能量台阶不支持能量本就归零平滑区双截断内外两段无平滑区全域用修正后的 LJ加速变体gpu / kk / ompkk / omp参考文献Leoni et al., PRL 134, 128201 (2025)Toxvaerd Dyre, JCP 134, 081102 (2011)若应用对能量守恒要求苛刻且不需要双截断平滑区lj/smooth/linear通常是更稳妥的选择而lj/smooth的价值在于保留标准 LJ 形式到Rin为止此区域内力与标准 LJ 完全一致适合那些希望只在最外缘抹平力的场景。二者在run_style respa下同样只支持pair关键字且均不支持tail修正。十、测试与真实示例仓库为lj/smooth提供了完整的数值回归测试单元测试基准 unittest/force-styles/tests/mol-pair-lj_smooth.yaml 使用pair_style lj/smooth 8.0 10.0、5 种原子类型、29 个原子记录了初始化与运行后的势能init_vdwl: 749.235...、run_vdwl: 719.441...、应力张量与逐原子力作为各加速变体与不同构建的一致性基准。对应的线性变体基准见 mol-pair-lj_smooth_linear.yaml。实战示例中examples/PACKAGES/relres目录的 in.22DMH.real 展示了典型用法——用lj/smooth 12.0 14.0作为参考体系、以pair_modify shift yes消除能量台阶、配合fix nvt恒温运行该目录 README 明确说明其目的是演示带 lj/smooth 参考体系的分子模拟。这些示例连同数据文件如 Data.22DMH.in.relres均可直接作为上手模板。参考资料官方命令文档pair_lj_smooth.rst本文主体来源核心实现src/EXTRA-PAIR/pair_lj_smooth.cpp、src/EXTRA-PAIR/pair_lj_smooth.h相关命令pair_coeffdoc/src/pair_coeff.rst、pair_modifydoc/src/pair_modify.rst、pair_writedoc/src/pair_write.rst、run_styledoc/src/run_style.rst(Leoni_1) F. Leoni et al., Phys Rev Lett, 134, 128201 (2025)(Leoni_2) F. Leoni et al., Phys Rev Lett, 134, Supplementary Material (2025)赞分享科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载相关推荐LAMMPS 改进型 Lennard-JonesILJ势 pair_style lj/pirani原理、参数与源码级用法解析LAMMPS 改进型 Lennard JonesILJ势 pair_style lj/pirani 原理、参数与源码级用法解析 导读 本文围绕 LAMMP科研科学计算高性能计算LAMMPS pair_style lj/expand 详解位移 Lennard-Jones 势与异径粒子模拟LAMMPS pair_style lj/expand 详解位移 Lennard Jones 势与异径粒子模拟 导读 pair_style lj/expand科研科学计算高性能计算LAMMPS pair_style lj/expand/sphere面向多分散球形粒子的平移 Lennard-Jones 势完整指南LAMMPS pair_style lj/expand/sphere面向多分散球形粒子的平移 Lennard Jones 势完整指南 pair_style l科研科学计算高性能计算上一篇终极Koodo Reader使用指南从零开始掌握跨平台电子书管理下一篇终极指南如何使用libui库在Go中创建专业级表格控件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考