☰
LAMMPS bond_style mm3 键伸缩势详解:YAFF 包的 MM3 非谐势实现、参数配置与实战应用
2026/10/15 3:33:40 网站建设 项目流程
  • 科研
  • 科学计算
  • 高性能计算

【免费下载链接】lammps

Public development project of the LAMMPS MD software package

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

导读

bond_style mm3是 LAMMPS 中用于描述键伸缩运动的非谐势模型,源自 Allinger 等人在 1989 年提出的 MM3 分子力学力场,其能量表达式中包含对键长的三次方与四次方修正项,比简单的简谐(harmonic)键势更接近真实分子的键伸缩行为。本文以 doc/src/bond_mm3.rst 为骨架,结合 src/YAFF/bond_mm3.cpp 源码实现、单元测试与 MOF 模拟示例,完整讲解该势函数的数学形式、系数设定方法、底层实现原理(含单位换算与 MM3 论文勘误)、加速变体及适用场景。读完本文,你将能够在金属有机框架(MOF)等分子体系的 LAMMPS 输入脚本中正确配置并使用bond_style mm3,并理解其能量/力的推导细节。

MM3 键伸缩势概述与所属包

bond_style mm3定义的是一个在键长方向上非谐的键伸缩势,其势函数由 Allinger 等人的 MM3 力场论文提出(见 doc/src/bond_mm3.rst 末尾的参考文献 Allinger, Yuh, Lii, JACS, 111(23), 8551-8566 (1989))。

该样式属于YAFF 包。从 src/YAFF/README 可以看到,YAFF 包实现了使用 QuickFF 工具为金属有机框架(MOF)模拟生成的典型力场所需要的各类样式。包内除bond_mm3外,还包含angle_mm3(MM3 角势)、pair_mm3_switch3_coulgauss_long(MM3 静电/短程相互作用)、improper_distharm等配套样式,以及 src/YAFF/angle_mm3.cpp、src/YAFF/pair_mm3_switch3_coulgauss_long.cpp 等实现文件。也就是说,bond_style mm3通常作为 MOF 全力场中键伸缩部分的一员,与角势、二面角势、非键势共同工作。

限制说明:该样式只有在 LAMMPS 编译时启用了 YAFF 包(CMake 选项PKG_YAFF,见 cmake/CMakeLists.txt)之后才可用。

势函数数学形式与单位约定

能量公式

bond_style mm3的势能表达式为:

E = K (r - r0)^2 [ 1 - 2.55(r - r0) + (7/12) * 2.55^2 * (r - r0)^2 ]

其中:

  • r0:键的平衡长度(equilibrium bond length);
  • K:键伸缩力常数(prefactor,即bond_coeff中的第一个系数k2);
  • r:当前键长。

该式本质上是在简谐项K(r-r0)^2的基础上,叠加上键长偏差(r-r0)的三次方、四次方修正,从而描述非谐(anharmonic)键伸缩行为:当键被拉长或压缩到远离平衡位置时,势能曲线不再关于r0对称,这符合真实化学键在压缩时"变硬"、在拉伸时"变软"的物理特性。

系数量纲与单位换算

非谐修正项的前置因子带有 Å 量纲:

  • -2.55的单位是Å⁻¹;
  • (7/12) * 2.55²的单位是Å⁻²。

代码内部会自动完成这些因子到当前单位体系的换算。以 src/YAFF/bond_mm3.cpp 为例,实现中先根据force->angstrom换算出 K3、K4:

K3 = -2.55/force->angstrom; K4 = 7.0/12.0*2.55*2.55/force->angstrom/force->angstrom;

force->angstrom是 LAMMPS 内部维护的"1 Å 在当前单位制下对应的长度数值":在real、metal等单位下其值为 1.0,在 SI 单位制下为1.0e-10。因此换算对用户完全透明,用户在bond_coeff中只需按当前单位给出 K 与 r0 即可。KOKKOS 加速版本在 src/KOKKOS/bond_mm3_kokkos.cpp 中同样在主机端预计算d_K3、d_K4后传入设备端。

MM3 论文勘误提示

官方文档特别提醒:MM3 原始论文中的 Eq.(1) 存在一处笔误——式中(7/12) * 2.55应为(7/12) * 2.55²。LAMMPS 采用修正后的正确形式,即本文上述公式。这一点在使用其它工具导出 MM3 参数时值得留意,避免参数含义与 LAMMPS 实现不一致。

语法与系数设置

命令语法

bond_style mm3

语法极其简洁,没有任何额外参数,所需系数全部通过bond_coeff命令或数据文件给出。

支持的键类型系数

对每一种键类型(bond type),必须通过bond_coeff命令(或read_data/read_restart读入的 data 文件 / 重启文件)定义两个系数:

系数符号量纲/单位含义
1Kenergy/distance²键伸缩力常数(源码中记为k2)
2r0distance键的平衡长度

官方文档示例:

bond_style mm3 bond_coeff 1 100.0 107.0

即对键类型 1 设置K = 100.0、r0 = 107.0(单位取决于units设置,例如real单位下能量为 kcal/mol、距离为 Å)。

多类型体系的系数设定(来自单元测试)

unittest/force-styles/tests/bond-mm3.yaml 展示了含 5 种键类型的多键型体系如何配置:

bond_style mm3 bond_coeff 1 250.0 1.5 bond_coeff 2 300.0 1.1 bond_coeff 3 350.0 1.3 bond_coeff 4 650.0 1.2 bond_coeff 5 450.0 1.0

该测试同时声明了extract: k2 1与extract: r0 1,对应源码中 bond_mm3.cpp 的extract()接口——它允许其它模块(如 MC 移动、fix命令)按名称提取内部系数数组k2与r0。

在 data 文件 / 重启文件中读写系数

从源码可以看到系数在各类文件中的读写格式:

  • data 文件写入(bond_mm3.cpp):按type k2 r0的列格式输出"1 %g %g\n";
  • 重启文件读写(bond_mm3.cpp):分别将k2[1..nbondtypes]与r0[1..nbondtypes]写入,读回后由 0 号进程广播(MPI_Bcast)到所有进程,并把setflag全部置 1。

因此,系数既可以在输入脚本中通过bond_coeff设定,也可以预先写在 data 文件的Bond Coeffs段,或在重启后直接延续。

源码级实现原理

compute:能量与力的计算

核心计算在 src/YAFF/bond_mm3.cpp 的compute()中完成,遍历neighbor->bondlist中的每条键:

  1. 由两原子坐标差delx/dely/delz求出键长r = sqrt(rsq),偏差dr = r - r0[type];
  2. 计算能量(仅当需要能量时):
    ebond = k2[type] * dr^2 * (1 + K3*dr + K4*dr^2)
  3. 计算力:
    de_bond = 2*k2[type]*dr * (1 + 1.5*K3*dr + 2*K4*dr^2) fbond = -de_bond / r

    即F = -dE/dr,再沿键方向向量分配到两端原子(f[i1] += delx*fbond,f[i2] -= delx*fbond),并遵循newton_bond标志与局部原子归属判断。

力表达式中1.5*K3*dr + 2.0*K4*dr^2正是对(1+K3*dr+K4*dr²)求导(乘以 2 来自dr²的导数)的结果,体现了能量表达式与力的自洽性。

single:单键能量查询

single() 用于计算单条键的能量与力(供compute bond/local等输出原子级/键级量时调用),逻辑与compute完全一致,返回k2[type]*dr²*(1+K3*dr+K4*dr²)并通过引用参数fforce输出力值。

born_matrix:弹性张量接口

bond_mm3声明了born_matrix_enable = 1(bond_mm3.cpp),并在 born_matrix() 中提供键势对键长的一阶、二阶导数du、du2:

du = 2*k2*dr + 3*K3*dr² + 4*K4*dr³ du2 = 2*k2 + 6*K3*dr + 12*K4*dr²

该接口服务于基于 Hessian/弹性矩阵的后续计算(如声子、弹性常数类分析),说明bond_style mm3在 LAMMPS 内部被当作"可提供解析二阶导"的完整力场组件来对待。

头文件中的类结构

src/YAFF/bond_mm3.h 中通过BondStyle(mm3,BondMM3)宏注册样式名,BondMM3继承自基类Bond,内部仅维护两个系数数组double *r0, *k2,并重写compute、coeff、equilibrium_distance、write_restart/read_restart、write_data、single、born_matrix、extract等虚函数。其中equilibrium_distance()返回r0[i],可被需要平衡键长的模块直接调用。

加速变体:mm3/kk 与 mm3/omp

与其它键样式一样,bond_style mm3提供两种加速变体(Accelerator Variants):mm3/kk(KOKKOS)与mm3/omp(OPENMP)。根据 doc/src/accel_styles.rst 的通用说明,加速样式在功能上与普通样式完全一致,只是针对不同硬件做了优化,结果除浮点舍入误差外应当相同。

  • mm3/omp:见 src/OPENMP/bond_mm3_omp.cpp,继承BondMM3,在compute()中通过#pragma omp parallel将键列表按线程切分(loop_setup_thr),并使用ThrData做线程级累加与归约(reduce_thr),适用于多核 CPU 共享内存并行。
  • mm3/kk:见 src/KOKKOS/bond_mm3_kokkos.cpp,使用 Kokkos 的parallel_for/parallel_reduce在设备端(GPU/众核)执行键遍历,k_r0、k_k2等系数数组通过sync/modify在主机与设备间同步。

使用方式有三种:在输入脚本中显式写bond_style mm3/omp(或mm3/kk)、通过-suffix命令行开关、或输入脚本内的suffix命令。注意加速变体只有在 LAMMPS 相应编译进 OPENMP / KOKKOS 包时才可用。

单元测试验证

LAMMPS 自带的力样式回归测试 unittest/force-styles/tests/bond-mm3.yaml 对bond_style mm3做了完整的数值验证:

  • 前置条件:atom full、bond mm3;
  • 使用 29 个原子的测试体系(in.fourmol,对应 unittest/force-styles/tests/in.fourmol),真实单位制(units real);
  • 给出 5 组bond_coeff、平衡键长校验(equilibrium: 5 1.5 1.1 1.3 1.2 1)、初始能量init_energy: 4.247265008273143、运行后能量run_energy: 4.190444665774225,以及 29 个原子逐项的init_forces/run_forces/init_stress/run_stress参考值;
  • 测试容差epsilon: 2.5e-13,用于验证实现与参考值的严格一致。

这说明bond_style mm3的能量、力、应力张量输出都有自动化的数值基准,用户若改动实现或怀疑结果,可直接运行该测试套件复核。

实战应用:MOF 体系中的完整力场配置

YAFF 包的核心应用场景是用 QuickFF 生成 MOF 力场。仓库自带的示例 examples/PACKAGES/yaff/mof5/in.mof5 给出了一个完整的、使用bond_style mm3的 NPT 模拟输入脚本,值得逐段解读:

units real atom_style full boundary p p p dielectric 1 special_bonds lj 0.000000 0.000000 1.000000 coul 1.000000 1.000000 1.000000 pair_style mm3/switch3/coulgauss/long 12.0000 4.0000 pair_modify table 16 # Accuracy of the table used for real space electrostatics pair_modify mix arithmetic pair_modify tail no bond_style mm3 angle_style hybrid cross mm3 dihedral_style fourier improper_style distharm read_data lammps.data # Data file location kspace_style pppm 0.0000001 # Ewald accuracy neighbor 2.0 bin neigh_modify every 2 delay 4 check yes thermo 10 thermo_style custom step etotal ke temp pe emol evdwl ecoul elong etail vol press timestep 0.5 # in femtosecond velocity all create 0.0 5 fix 1 all npt temp 300.0 300.0 100.0 tri 1.0 1.0 1000.0 tchain 3 mtk yes nreset 1000 run 100

要点:

  • bond_style mm3与pair_style mm3/switch3/coulgauss/long、angle_style hybrid cross mm3、improper_style distharm等 YAFF 配套样式联合使用,构成完整的 MOF 力场;
  • 键系数由read_data lammps.data读入(data 文件Bond Coeffs段格式为type k2 r0);
  • 配套示例还包括 examples/PACKAGES/yaff/mil53al/in.mil53a(MIL-53(Al) 体系,bond_style harmonic变体)与 examples/PACKAGES/yaff/mof5/lammps.data(MOF-5 数据文件),可用作对照学习。

构建要求与注意事项

  1. 必须启用 YAFF 包。CMake 构建时设置-D PKG_YAFF=on(YAFF 是 cmake/CMakeLists.txt 中列出的标准包,默认关闭),或用传统 make 方式make yes-yaff后重新编译;可参考Build package相关文档页。
  2. 系数缺失会报错。bond_mm3.cpp 中coeff()要求恰好 3 个参数(type、K、r0),参数个数不符或类型范围无效时 LAMMPS 会终止并提示Incorrect args for bond coefficients;未被bond_coeff或 data 文件覆盖的键类型在运行时将产生未定义行为,因此务必确保所有键类型都被赋值。
  3. 默认值:该样式没有额外的默认系数(文档 "Default: none"),所有系数必须显式给出。
  4. 与其它键势的区分:bond_style mm3专指 Allinger MM3 力场中的非谐键伸缩项,与 LAMMPS 默认的bond_style harmonic(简谐势)在数学形式、参数含义上均不同,不可混用系数。

相关命令与进一步阅读

  • bond_coeff:设定键类型系数的核心命令;
  • read_data、read_restart:从 data 文件或重启文件读入系数;
  • angle_mm3:配套的 MM3 角伸缩势(E = K(θ-θ0)²[1-0.014(θ-θ0)+5.6×10⁻⁵(θ-θ0)²-7.0×10⁻⁷(θ-θ0)³+9×10⁻¹⁰(θ-θ0)⁴],θ0 以度为单位、内部换算为弧度);
  • pair_mm3_switch3_coulgauss_long:配套的非键/静电样式;
  • src/YAFF/README:YAFF 包说明与 QuickFF 方法论参考文献(Vanduyfhuys 等,J. Comput. Chem. 36(13):1015-1027 (2015) 及 39(16):999-1011 (2018))。

总结

bond_style mm3以 MM3 力场的非谐键伸缩势为核心,通过两个系数(力常数K与平衡键长r0)即可描述更真实的键伸缩行为。其实现(src/YAFF/bond_mm3.cpp)完整覆盖了能量、力、单键查询、Born 矩阵与系数提取接口,并配套 OPENMP / KOKKOS 加速变体与自动化回归测试。在实际使用中,它主要服务于 QuickFF 导出的 MOF 力场(见 examples/PACKAGES/yaff/mof5/in.mof5),需要以PKG_YAFF编译为前提,并注意 MM3 论文原始公式的勘误以及系数必须逐类型完整定义这两点。掌握上述配置与原理后,你便可以在自己的 MOF / 分子模拟中正确启用并验证这一非谐键势。

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

【免费下载链接】lammps

Public development project of the LAMMPS MD software package

项目地址:https://gitcode.com/gh_mirrors/la/lammps
点击查看免费下载
上一篇:Wand-Enhancer 完整指南:三步解锁 WeMod Pro 功能,免费解除时长限制
下一篇:抖音无水印下载入门指南:douyin-downloader 三分钟跑通批量下载

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询