- 科研
- 科学计算
- 高性能计算
【免费下载链接】lammps
Public development project of the LAMMPS MD software package
导读
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 文件 / 重启文件)定义两个系数:
| 系数 | 符号 | 量纲/单位 | 含义 |
|---|---|---|---|
| 1 | K | energy/distance² | 键伸缩力常数(源码中记为k2) |
| 2 | r0 | distance | 键的平衡长度 |
官方文档示例:
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中的每条键:
- 由两原子坐标差
delx/dely/delz求出键长r = sqrt(rsq),偏差dr = r - r0[type]; - 计算能量(仅当需要能量时):
ebond = k2[type] * dr^2 * (1 + K3*dr + K4*dr^2) - 计算力:
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 数据文件),可用作对照学习。
构建要求与注意事项
- 必须启用 YAFF 包。CMake 构建时设置
-D PKG_YAFF=on(YAFF 是 cmake/CMakeLists.txt 中列出的标准包,默认关闭),或用传统 make 方式make yes-yaff后重新编译;可参考Build package相关文档页。 - 系数缺失会报错。bond_mm3.cpp 中
coeff()要求恰好 3 个参数(type、K、r0),参数个数不符或类型范围无效时 LAMMPS 会终止并提示Incorrect args for bond coefficients;未被bond_coeff或 data 文件覆盖的键类型在运行时将产生未定义行为,因此务必确保所有键类型都被赋值。 - 默认值:该样式没有额外的默认系数(文档 "Default: none"),所有系数必须显式给出。
- 与其它键势的区分:
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
相关推荐
LAMMPS 的 angle_style mm3 角度势详解:公式、系数配置与加速变体实战
LAMMPS 的 angle_style mm3 角度势详解:公式、系数配置与加速变体实战 angle_style mm3 是 LAMMPS 中实现 MM3 分
科研科学计算高性能计算LAMMPS bond_style harmonic/shift/cut 详解:位移截断谐振键势的参数、原理与实现
LAMMPS bond_style harmonic/shift/cut 详解:位移截断谐振键势的参数、原理与实现 导读 bond_style harmonic
科研科学计算高性能计算LAMMPS bond_style harmonic 详解:谐振键势的参数配置、源码原理与加速变体
LAMMPS bond_style harmonic 详解:谐振键势的参数配置、源码原理与加速变体 bond_style harmonic 是 LAMMPS 中
科研科学计算高性能计算
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考