- 科研
- 科学计算
- 高性能计算
【免费下载链接】lammps
Public development project of the LAMMPS MD software package
导读
本文以 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
相关推荐
LAMMPS `pair_style beck` 完全指南:Beck 势的语法、系数、加速变体与源码实现解析
LAMMPS pair_style beck 完全指南:Beck 势的语法、系数、加速变体与源码实现解析 导读 pair_style beck 是 LAMMPS
科研科学计算高性能计算LAMMPS pair_style buck 系列:Buckingham 势的语法、参数与源码实现解析
LAMMPS pair_style buck 系列:Buckingham 势的语法、参数与源码实现解析 导读 本文基于 LAMMPS 官方文档 doc/src/
科研科学计算高性能计算LAMMPS bond_style morse 键势详解:语法、参数、源码实现与加速变体
LAMMPS bond_style morse 键势详解:语法、参数、源码实现与加速变体 导读 本文围绕 LAMMPS 中的 bond_style morse
科研科学计算高性能计算
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考