news 2026/10/17 6:07:27

LAMMPS `pair_style morse` 系列对势完全指南:语法、系数、变体与源码实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LAMMPS `pair_style morse` 系列对势完全指南:语法、系数、变体与源码实现
  • 科研
  • 科学计算
  • 高性能计算

【免费下载链接】lammps

Public development project of the LAMMPS MD software package

项目地址:https://gitcode.com/gh_mirrors/la/lammps
点击查看免费下载

导读

本文以 LAMMPS 官方文档 doc/src/pair_morse.rst 为核心骨架,系统讲解pair_style morse、morse/smooth/linear与morse/soft三种 Morse 对势的使用方法、势能公式、系数定义与加速变体,并结合仓库源码(src/pair_morse.cpp、src/EXTRA-PAIR/pair_morse_smooth_linear.cpp、src/FEP/pair_morse_soft.cpp)与单元测试剖析其底层实现。读完本文,你将能够正确地在输入脚本中配置 Morse 势、理解三个参数D0 / α / r0的物理含义与截断处理方式,并掌握自由能计算(FEP)所需的软核变体及各类硬件加速后缀的适用条件。

Morse 势概述与适用场景

Morse 势是经典分子动力学中最常用的键级/对势模型之一,由物理学家 Philip Morse 提出,其函数形式能较好描述共价键的"排斥-吸引"平衡:当原子间距小于平衡距离时快速排斥,大于平衡距离时缓慢吸引,并在平衡距离处达到能量最小值-D0。在 LAMMPS 中,pair_style morse被广泛用于金属键、分子内成键对以及各类粗粒化模型。

与 Lennard-Jones 12-6 势相比,Morse 势的优势在于:指数形式的排斥项比r^-12更"柔和",且在较宽的参数区间内可更精确地拟合材料弹性性质与键合曲线。由于 Morse 势默认不包含长程静电项,它通常与pair_style hybrid组合使用,或仅用于描述纯共价/金属体系。

语法与全局参数

三种相关样式的命令语法统一为:

pair_style style args

其中style可为:

  • morse:标准 Morse 势(核心包内置);
  • morse/smooth/linear:在截断处同时将能量与力修正为零的平滑变体(需 EXTRA-PAIR 包);
  • morse/soft:带软核的 Morse 势,用于自由能计算(需 FEP 包)。

morse与morse/smooth/linear的 args 相同:

morse args = cutoff cutoff = Morse 相互作用的全局截断距离(距离单位)

即:

pair_style morse 2.5 pair_style morse/smooth/linear 2.5

而morse/soft需要三个参数(见 doc/src/pair_fep_soft.rst):

morse/soft args = n lf cutoff n = 软核参数(soft-core parameter) lf = 变换区间,即 lf < lambda < 1 cutoff = 全局截断距离(距离单位)

例如:

pair_style morse/soft 4 0.9 10.0

从源码看,参数解析逻辑非常严格:src/pair_morse.cpp#L158-L172 中PairMorse::settings()要求morse恰好传入 1 个参数,否则报错"Illegal pair_style command";而 src/FEP/pair_morse_soft.cpp#L207-L223 中PairMorseSoft::settings()则要求恰好 3 个参数,依次解析为nlambda、shift_range、cut_global。

势能公式与系数定义

标准 Morse 势(morse)

morse样式按以下公式计算对势能:

$$ E = D_0 \left[ e^{- 2 \alpha (r - r_0)} - 2 e^{- \alpha (r - r_0)} \right] \qquad r < r_c $$

其中 $r_c$ 为截断距离。当 $r = r_0$ 时,$E = -D_0$,即平衡位置势阱深度为 $D_0$;$\alpha$ 控制势阱的"宽度"(曲率),$\alpha$ 越大势阱越窄越陡。

每个原子类型对(I, J)都必须通过 pair_coeff 命令定义以下系数(也可以在read_data/read_restart读入的数据文件或重启文件中指定):

系数含义单位
$D_0$势阱深度能量单位
$\alpha$势阱宽度(曲率)参数1/距离单位
$r_0$平衡键长距离单位
cutoff(可选)该类型对的截断距离距离单位

最后一个系数是可选的。若省略,则使用pair_style命令中设置的全局 Morse 截断。

平滑线性变体(morse/smooth/linear)

morse/smooth/linear与 LAMMPS 中的lj/smooth/linear思路一致:在标准 Morse 势上额外叠加一个平移项和一个线性项,使得在截断处势能和力同时精确归零:

$$ \begin{aligned} \phi\left(r\right) & = D_0 \left[ e^{- 2 \alpha (r - r_0)} - 2 e^{- \alpha (r - r_0)} \right] \qquad r < r_c \ E\left(r\right) & = \phi\left(r\right) - \phi\left(r_c\right) - \left(r - r_c\right) \left.\frac{d\phi}{d r} \right|_{r=r_c} \qquad r < r_c \end{aligned} $$

也就是说,在 $r_c$ 处不仅能量被平移为 0,且因为减去了 $\phi$ 在 $r_c$ 处的导数项,力也在 $r_c$ 处连续归零。这对于需要严格能量/力连续性的场景(如热流计算、能量最小化、某些 NEMD 模拟)非常有利。该样式的pair_style与pair_coeff语法与morse完全相同。

软核变体(morse/soft)

morse/soft属于 FEP 包,专门用于自由能微扰计算(alchemical free energy calculations),配合 fix adapt/fep 与 compute fep 使用。其核心思想是通过一个可调的激活参数 $\lambda$(0 到 1 之间)在"关断"与"全开"之间平滑过渡相互作用,并在 $\lambda \to 0$ 时保留一个软排斥核,从而避免位点创建/湮灭(sites created or annihilated)时出现能量与力的奇点(引用文献:Beutler et al., Chem Phys Lett, 222, 529 (1994))。

其函数形式与 LJ 软核系列不同,具体为:

$$ \begin{split} s(\lambda) & = (1 - \lambda) / (1 - \lambda_f) \ B & = -2D e^{-2 \alpha r_0} (e^{\alpha r_0} - 1) / 3 \ E & = D_0 \left[ e^{- 2 \alpha (r - r_0)} - 2 e^{- \alpha (r - r_0)} \right] + s(\lambda) B e^{-3\alpha(r-r_0)}, \qquad \lambda \geq \lambda_f,\quad r < r_c \ E & = \left( D_0 \left[ e^{- 2 \alpha (r - r_0)} - 2 e^{- \alpha (r - r_0)} \right] + B e^{-3\alpha(r-r_0)} \right)(\lambda/\lambda_f)^n, \qquad \lambda < \lambda_f,\quad r < r_c \end{split} $$

morse/soft要求以下 pair 系数:

系数含义单位
$D_0$势阱深度能量单位
$\alpha$势阱宽度参数1/距离单位
$r_0$平衡键长距离单位
$\lambda$激活参数无量纲,取值 0.0~1.0
cutoff(可选)截断距离距离单位

最后一个系数可选;若省略则使用全局 Morse 截断。morse/soft同样不支持 mixing,所有类型对的系数必须显式给出。

完整配置示例

以下示例节选自 pair_morse.rst 的 Examples 部分,可直接放入输入脚本运行:

pair_style morse 2.5 pair_coeff * * 100.0 2.0 1.5 pair_coeff 1 1 100.0 2.0 1.5 3.0
  • 第一行设置全局截断 $r_c = 2.5$;
  • pair_coeff * *将 $D_0 = 100.0$、$\alpha = 2.0$、$r_0 = 1.5$ 赋给所有类型对,截断用全局值 2.5;
  • pair_coeff 1 1仅覆盖类型 1-1 对,并显式给出该对的截断 3.0(覆盖全局值)。

smooth/linear与soft变体的示例:

pair_style morse/smooth/linear 2.5 pair_coeff * * 100.0 2.0 1.5 pair_style morse/soft 4 0.9 10.0 pair_coeff * * 100.0 2.0 1.5 1.0 pair_coeff 1 1 100.0 2.0 1.5 1.0 3.0

其中morse/soft的pair_coeff第 5 个参数是 $\lambda$(上例为 1.0,即"全开"状态),第 6 个参数为可选截断。需要注意morse/soft的pair_coeff至少需要 6 个参数(I、J、$D_0$、$\alpha$、$r_0$、$\lambda$),源码 src/FEP/pair_morse_soft.cpp#L170-L173 中检查narg < 6 || narg > 7即报错。

在单元测试 unittest/force-styles/tests/mol-pair-morse.yaml 中可以看到更接近实战的多类型对写法(5 种原子类型、29 个原子,pair_style morse 8.0):

pair_style morse 8.0 pair_coeff 1 1 0.0202798941614106 2.78203488021395 2.725417159299 pair_coeff 1 2 0.0101167811264648 3.9793050302425 1.90749569018897 ...

而 unittest/force-styles/tests/mol-pair-morse_soft.yaml 则演示了morse/soft 4 0.1 8.0结合逐对 $\lambda$ 值的写法。

源码实现原理

力与能量的计算(morse)

标准 Morse 势的内核循环位于 src/pair_morse.cpp#L92-L126。对每个邻居对,先计算距离平方rsq,若小于cutsq[itype][jtype]则:

dr = r - r0[itype][jtype]; dexp = exp(-alpha[itype][jtype] * dr); fpair = factor_lj * morse1[itype][jtype] * (dexp * dexp - dexp) / r;

其中morse1 = 2.0 * d0 * alpha在初始化阶段预计算(见 src/pair_morse.cpp#L219),从而把每次迭代的开销降到最低——只需一次指数运算和两次乘法。能量项为:

evdwl = d0[itype][jtype] * (dexp * dexp - 2.0 * dexp) - offset[itype][jtype];

factor_lj来自 special_bonds 设置的 1-2、1-3、1-4 排除因子,用于在成键体系中对近邻键对按权重缩放非键作用。

截断位移(offset)

pair_modify shift选项启用时(offset_flag = 1),init_one 会计算截断处的位移量:

double alpha_dr = -alpha[i][j] * (cut[i][j] - r0[i][j]); offset[i][j] = d0[i][j] * (exp(2.0 * alpha_dr) - 2.0 * exp(alpha_dr));

使势能在截断处恰为 0,避免因截断造成能量跳变。这与文档所述"支持pair_modifyshift 选项"一致。

smooth/linear 的导数修正

morse/smooth/linear在 src/EXTRA-PAIR/pair_morse_smooth_linear.cpp#L223-L243 中额外预计算截断处的导数:

der_at_cutoff[i][j] = -2.0 * alpha[i][j] * d0[i][j] * (exp(2.0 * alpha_dr) - exp(alpha_dr));

力与能量分别修正为:

fpair = factor_lj * (fpartial + der_at_cutoff[itype][jtype] / r); evdwl = d0[itype][jtype] * (dexp * dexp - 2.0 * dexp) - offset[itype][jtype] - (r - cut[itype][jtype]) * der_at_cutoff[itype][jtype];

对应文档公式中减去 $\phi(r_c)$ 与 $(r-r_c)\phi'(r_c)$ 的修正项,确保 $r \to r_c$ 时能量与力同时趋于 0。

soft 变体的 lambda 分支

morse/soft在 src/FEP/pair_morse_soft.cpp#L104-L131 中按 $\lambda$ 与shift_range(即 $lf$)的关系分两支计算:$\lambda \geq lf$ 时采用 $s(\lambda) = (\lambda-1)/(lf-1)$ 线性插值项,$\lambda < lf$ 时采用 $(\lambda/lf)^n$ 幂次缩放(nlambda为pair_style的第一个参数 n),并且对 $r=0$ 的情况做了除零保护(fpair = 0.0)。软核项 $B$ 的表达式与文档公式完全一致:

B = -2.0 * D * iea2 * (ea - 1.0) / 3.0; // iea2 = exp(-2*a*x0), ea = exp(a*x0)

该样式由 Stefan Paquay (TU/e) 贡献,并在 src/FEP/pair_morse_soft.cpp 文件头注明。

数据导出接口

三种样式均实现了extract(),允许其他命令(如 compute fep)通过字符串键读取系数:morse与morse/smooth/linear导出d0、r0、alpha(见 src/pair_morse.cpp#L356-L363),morse/soft额外导出lambda(见 src/FEP/pair_morse_soft.cpp#L443-L451)。单元测试 YAML 文件中的extract字段(如d0 2、r0 2、alpha 2、lambda 2)正是对该接口的回归校验。

加速变体

标准morse样式提供以下加速后缀:

  • morse/gpu:GPU 加速,见 src/GPU/pair_morse_gpu.cpp,贡献作者 Mike Brown (SNL);
  • morse/omp:OpenMP 线程加速,见 src/OPENMP/pair_morse_omp.cpp;
  • morse/opt:针对特定硬件/编译器的手工优化版,见 src/OPT/pair_morse_opt.cpp;
  • morse/kk:Kokkos 加速,见 src/KOKKOS/pair_morse_kokkos.cpp。

smooth/linear变体提供:

  • morse/smooth/linear/omp:见 src/OPENMP/pair_morse_smooth_linear_omp.cpp;
  • morse/smooth/linear/kk:见 src/KOKKOS/pair_morse_smooth_linear_kokkos.cpp。

morse/soft同样有morse/soft/kk与morse/soft/omp。

按 doc/src/accel_styles.rst 的说明,带gpu、kk、omp、opt后缀的样式与不带后缀的样式功能完全相同,接受相同参数,仅因硬件不同而在速度上有差异(舍入误差可能略有不同)。这些加速样式分属 GPU、INTEL、KOKKOS、OPENMP、OPT 包,只有用对应包构建 LAMMPS 后才可用。可以在输入脚本中显式写后缀,也可以用-suffix命令行开关或 suffix 命令统一启用。

Mixing、shift、table、tail、restart 与 rRESPA 兼容性

根据官方文档与源码,三个样式在通用特性上的表现如下:

特性morse/morse/smooth/linear/morse/soft
系数 mixing不支持。所有 I,J 对的系数必须显式指定
pair_modify shift支持(能量平移)
pair_modify table不适用(Morse 样式不使用查表)
pair_modify tail不支持(不添加长程尾校正)
二进制重启文件支持。pair_style与pair_coeff无需在读重启文件的脚本中重复指定
rRESPA仅可通过run_style respa的pair关键字使用,不支持inner/middle/outer关键字

"不支持 mixing"意味着:即使原子类型 1 与 2 都单独定义了 Morse 系数,类型对 1-2 的 $D_0$、$\alpha$、$r_0$ 也不会被自动从 1-1、2-2 组合出来,必须显式写pair_coeff 1 2 ...。若遗漏任何类型对,运行时会直接报错——源码 src/pair_morse.cpp#L215-L217 中init_one()检查setflag[i][j] == 0即抛出"All pair coeffs are not set",并打印所有已设置/未设置对的完整状态列表。

重启文件支持体现在 write_restart / read_restart:每对类型的 $D_0$、$\alpha$、$r_0$、cutoff 与全局设置(cut_global、offset_flag、mix_flag)都会被序列化保存,进程 0 负责读写并通过 MPI 广播。morse/soft还会额外保存lambda、nlambda与shift_range。

构建前提与限制

  • morse与morse/gpu、morse/omp、morse/opt、morse/kk位于核心构建中,相应加速变体需构建 GPU / OPENMP / OPT / KOKKOS 包;
  • morse/smooth/linear仅当 LAMMPS 以EXTRA-PAIR包构建时可用,其加速变体还需 OPENMP / KOKKOS 包,详见 doc/src/Build_package.rst;
  • morse/soft仅当以FEP包构建时可用,其加速变体还需 OPENMP / KOKKOS 包;
  • 在自由能计算中使用软核 Coulomb 长程样式时(如lj/cut/coul/long/soft),官方建议同时适配 $\lambda$ 与电荷值(从 0 渐变到终值),以保证 kspace 长程静电项正确;morse/soft本身不涉及静电,但若与带长程静电的样式通过pair_style hybrid叠加使用,仍需遵循该原则。更多示例见 examples/PACKAGES/fep 目录。

相关命令

  • pair_coeff:定义各类型对的 $D_0$、$\alpha$、$r_0$(与可选截断)
  • pair_style */soft系列(见 pair_fep_soft.rst):其他势函数的软核版本(lj/cut/soft、coul/long/soft等)
  • fix adapt/fep 与 compute fep:配合morse/soft完成 alchemical 自由能微扰计算
  • pair_modify:控制 shift、table、tail 等修饰选项
  • run_style respa:多时间尺度积分(仅支持pair关键字)

默认情况下这些样式无特殊默认值(Default: none)。

小结

pair_style morse家族以简洁的指数形式提供了灵活的两体相互作用描述:标准morse适用于常规对势建模,morse/smooth/linear通过平移+线性修正保证截断处能量与力严格连续,morse/soft则以 $\lambda$ 驱动的软核为自由能微扰计算扫清了位点创建/湮灭时的奇点障碍。三者共享同一套系数体系($D_0$、$\alpha$、$r_0$),都不支持 mixing,都支持pair_modify shift与二进制重启文件;选择哪个变体,取决于你的物理模型(是否需要光滑截断、是否做 FEP 计算)以及 LAMMPS 构建时启用的包(EXTRA-PAIR / FEP)和可用硬件(GPU / OpenMP / Kokkos / OPT)。

  • 科研
  • 科学计算
  • 高性能计算

【免费下载链接】lammps

Public development project of the LAMMPS MD software package

项目地址:https://gitcode.com/gh_mirrors/la/lammps
点击查看免费下载
上一篇:TradingView Webhooks Bot事件系统详解:构建复杂交易策略的基石
下一篇:Ralph测试自动化:如何让AI代理编写可靠的测试用例

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/17 6:05:57

MySQL数据可视化实战:从SQL取数到自动化看板

1. 数据可视化这件事&#xff0c;为什么偏要从MySQL讲起很多人一聊到数据可视化&#xff0c;第一反应都是“上BI工具”“接大屏”“搞个炫酷仪表盘”&#xff0c;却忽略了一个最根本的问题&#xff1a;数据到底从哪来、怎么取、怎么保证它是对的。我做了几年数据相关的工作&…

作者头像 李华
网站建设 2026/10/17 6:05:27

用Unity从零开发贪吃蛇2D:完整流程与避坑指南

先别急着到处找教程&#xff0c;也别一上来就啃引擎官方文档。很多人第一次用Unity做小游戏&#xff0c;问我的第一句话通常是“到底做什么才能快速上手”。我一般只推荐一个答案&#xff1a;贪吃蛇2D。原因很简单&#xff0c;它足够小&#xff0c;但该有的东西一样不少。小到你…

作者头像 李华
网站建设 2026/10/17 6:04:20

RSA低加密指数广播攻击:从中国剩余定理到工程防御

很多人学密码学喜欢背攻击点&#xff1a;什么低加密指数、共模攻击、彩虹表、时序侧信道&#xff0c;背得滚瓜烂熟&#xff0c;可一问“为什么低指数广播攻击需要三个密文&#xff1f;”就卡住了。我的观点是&#xff1a;安全的本质是对数学结构的理解&#xff0c;不是背口诀。…

作者头像 李华
网站建设 2026/10/17 6:04:08

金融客户数据服务平台建设复盘:从ID-Mapping到Lambda架构

去年我接到一个内部代号叫 financial-services 的项目。名字很宏大&#xff0c;最初的处境却相当朴素&#xff1a;三个业务部门、六套外围系统&#xff0c;客户信息散落在不同数据库里&#xff0c;连"这个客户在我们这儿到底有多少资产"这种基础问题都答不上来。业务…

作者头像 李华
网站建设 2026/10/17 6:02:21

从零开发简单投票DApp:Solidity合约与Web3.js前端实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华