LAMMPS improper_style 完全指南:四大原子离面势函数体系与 improper_coeff 配置详解
LAMMPS improper_style 完全指南:四大原子离面势函数体系与 improper_coeff 配置详解
LAMMPS 通过 improper_style 命令定义原子四元组(quadruplet)之间的非正常(improper / 离面)相互作用势,用于保持分子几何构型中的平面性、手性等局部拓扑约束。本文以 doc/src/improper_style.rst 为主干,系统梳理命令语法、15 种 improper 势函数的公式与系数、improper_coeff 的赋值规则,并结合仓库源码与示例文件给出可直接落地的配置方案。读完本文,你将能够为常见力场(CVFF、COMPASS、DREIDING、AMOEBA 等)正确选择 improper 势、书写数据文件与输入脚本,并理解 LAMMPS 底层如何计算离面角度与力。
一、命令概览:语法、语义与适用前提
1.1 命令语法
improper_style style
style 的合法取值包括:
| style | 含义 |
|---|---|
none |
关闭 improper 相互作用 |
hybrid |
为不同 improper 类型混合使用多种势函数 |
class2 |
COMPASS(class 2)势 |
cvff |
CVFF 势 |
harmonic |
谐振 improper 势 |
除此之外,LAMMPS 还内置了 amoeba、cossq、distance、distharm、fourier、inversion/harmonic、ring、umbrella、sqdistharm、zero 等更多风格,完整列表见下文第五节。
典型示例:
improper_style harmonic
improper_style cvff
improper_style hybrid cvff harmonic
1.2 语义要点
improper_style设置 LAMMPS 用于计算原子四元组之间 improper 相互作用的公式,该公式在模拟全程保持有效。- improper 四元组列表由 read_data 或 read_restart 命令从 data / restart 文件中读入。
- 四元组内 4 个原子的排列顺序决定了 improper 角的定义,不同势函数对 I、J、K、L 的解读不同,详见各风格文档页。
- 各风格对应的系数可通过 improper_coeff 命令、data 文件或 restart 文件指定。
1.3 与 pair 势的配合(重要注意事项)
文档特别提醒:当同时定义了 improper 与 pair 样式时,通常需要用 special_bonds 命令关闭(或加权)本应存在于 4 个成键原子之间的成对相互作用。否则同一组原子会同时受到 improper 与 pair 势的作用,导致能量重复计算。
二、coefficients 的三种指定途径与 restart 行为
所有 improper 势都将系数数据保存在二进制 restart 文件中,这意味着通过 restart 文件续跑模拟时,improper_style 与 improper_coeff 命令不需要重新指定。
唯一的例外是 improper_style hybrid:它只把子风格列表存入 restart 文件,各子风格的 improper 系数仍需在续跑脚本中重新指定。
系数可以在三种位置给出:
- 输入脚本中通过
improper_coeff命令; - data 文件(由
read_data读入)的 "Improper Coeffs" 段; - restart 文件(由
read_restart读入)。
三、improper_coeff 命令详解:通配符、类型标签与 data 文件格式
3.1 语法
improper_coeff N args
N= 数字 improper 类型号,或类型标签(type label);args= 一个或多个 improper 类型的系数。
示例:
improper_coeff 1 300.0 0.0
improper_coeff * 80.2 -1 2
improper_coeff *4 80.2 -1 2
labelmap improper 1 benzene
improper_coeff benzene 300.0 0.0
N 的两种写法:
- 显式数字:如
improper_coeff 1 300.0 0.0; - 类型标签:由 labelmap 命令或 data 文件中的标签段定义的字母数字字符串,如
improper_coeff benzene 300.0 0.0。
3.2 通配符(仅限数字类型)
星号通配符支持 *、*n、n*、m*n 四种形式。设 N 为 improper 类型总数:
| 写法 | 含义 |
|---|---|
* |
所有类型 1 到 N |
*n |
类型 1 到 n(含) |
n* |
类型 n 到 N(含) |
m*n |
类型 m 到 n(含) |
后一次设置会覆盖前一次。例如先设置全部类型,再单独覆盖类型 2:
improper_coeff * 300.0 0.0
improper_coeff 2 50.0 0.0
3.3 data 文件中的 "Improper Coeffs" 段
data 文件中指定 improper 系数的行,其格式与输入脚本中 improper_coeff 的参数完全一致,但不得使用星号通配符,因为文件中必须列出全部 N 个类型。例如:
Improper Coeffs
1 300.0 0.0
对应输入脚本中的 improper_coeff 1 300.0 0.0。
例外:
improper_style class2额外使用一个参数来指定交叉项(angle-angle)系数,详见第五节 class2 小节。
3.4 使用前提(Restrictions)
improper_coeff必须位于read_data、read_restart或 create_box 定义模拟盒子之后;- 必须先定义 improper 样式,才能设置其系数(无论是在输入脚本中还是在 data 文件中)。
四、最常用的三种基础样式:none、zero 与 hybrid
4.1 improper_style none
improper_style none
即使 data 文件中列出了 improper 四元组,LAMMPS 也不计算 improper 力与能量。这是 improper_style 命令的默认值。若只想统计 improper 几何量但不计算相互作用,应改用 zero 样式。
4.2 improper_style zero [nocoeff]
improper_style zero
improper_style zero nocoeff
improper_coeff *
zero 同样不计算 improper 力与能量,但四元组几何信息仍可供其他命令访问。典型用途:配合 compute improper/local 计算 data 文件中四元组的 χ 值;若未定义任何 improper 样式,该 compute 无法使用。
可选参数 nocoeff 允许读取带有 ImproperCoeff 段的任何 improper 样式的 data 文件;此时 improper_coeff 命令仅校验类型号,其余内容被忽略。注意:使用 zero 样式时仍须为所有 improper 类型调用 improper_coeff(无需额外数值)。
4.3 improper_style hybrid:多势混用
improper_style hybrid style1 style2 ...
hybrid 允许在一个模拟中使用多种 improper 势,每个 improper 类型各自分配一种风格。文档给出的经典场景:聚合物流动区(类型 1)用 harmonic,边界墙区(类型 2)用 cvff。
improper_style hybrid harmonic cvff
improper_coeff 1 harmonic 120.0 30
improper_coeff 2 cvff 20.0 -1 2
improper_coeff 命令中,第一个系数用于指定 improper 样式,其余系数是该样式对应的参数。上例中类型 1 采用 harmonic(K=120.0,χ₀=30),类型 2 采用 cvff(K=20.0,d=-1,n=2)。
data 文件中同样适用此规则,"Improper Coeffs" 段每行在类型号后附加样式名:
Improper Coeffs
1 harmonic 120.0 30
2 cvff 20.0 -1 2
若 hybrid 中包含 class2,angle-angle 系数的指定规则相同:输入脚本每行以 aa 开头;data 文件的 "AngleAngle Coeffs" 段中,对于非 class2 类型须使用 skip 占位:
AngleAngle Coeffs
1 skip
2 class2 0.0 0.0 0.0 115.06 130.01 115.06
注意:非 class2 的 improper 类型在输入脚本中完全不需要指定 angle-angle 系数。此外,若想关闭某些 improper 类型,可对 improper_coeff 传入 none 作为第二参数。
restart 限制:与普通样式不同,hybrid 不把各子风格的系数存入二进制 restart 文件或 data 文件,续跑时必须重新指定 improper_coeff 命令。
从源码看,hybrid 的实现位于 src/improper_hybrid.cpp,其构造函数将 writedata 置 0(第 34 行),即 hybrid 不会把子样式系数写入 data 文件;compute() 中对每个四元组按类型映射到对应子样式分别计算能量与力。
五、15 种 improper 势函数全解析(公式、系数与所属包)
下表汇总 LAMMPS 内置 improper 样式;点击样式名可查看对应公式与 improper_coeff 系数说明。
5.1 harmonic(MOLECULE 包)
improper_style harmonic
improper_coeff 1 100.0 0
势函数:
E = K (χ - χ₀)²
- χ 为 improper 角,χ₀ 为其平衡值,K 为力常数(通常的 1/2 因子已包含在 K 内);
- 四元组按 I,J,K,L 排列时,χ 为平面 IJK 与平面 JKL 之间的夹角;等价地,可理解为 J,K,L 位于一平面内,I 偏离该平面的程度;
- 与线性二面角不同,定义 improper 并不要求 I-J、J-K、K-L 之间必然存在键;通常 I-J、I-K、I-L 成键即可定义 improper。
系数(每个 improper 类型):
- K(能量)
- χ₀(度)
χ₀ 以度指定,LAMMPS 内部转换为弧度,因此 K 的量纲等效为能量/弧度²。对称性约定:四元组第 1 个原子为对称原子,其余原子可互换。
源码实现位于 src/MOLECULE/improper_harmonic.cpp:coeff() 通过 utils::numeric 解析 K 与 χ₀,并用 DEG2RAD * chi_one(第 236 行)完成度→弧度转换;compute() 中先由三个向量叉积构造平面法向量,经 acos 求得 χ 后计算能量与四个原子的力,并利用 newton_bond 判断是否在本进程累加远端原子受力,最后通过 ev_tally 汇总能量/维里。
5.2 cvff(MOLECULE 包)
improper_style cvff
improper_coeff 1 80.0 -1 4
势函数:
E = K [1 + d·cos(n·φ)]
- φ 为 improper 二面角;四元组按 I,J,K,L 排列时,φ 为平面 IJK 与平面 JKL 的夹角;
- 因为本质上是二面角,该公式与 dihedral_style harmonic 相同;
- 同样地,定义 improper 不要求 I-J、J-K、K-L 成键,通常 I-J、I-K、I-L 成键即可。
系数:
- K(能量)
- d(+1 或 -1)
- n(0, 1, 2, 3, 4, 6)
对称性约定:第 1 个原子为对称原子。
5.3 class2 / COMPASS(CLASS2 包)
improper_style class2
improper_coeff 1 100.0 0
improper_coeff * aa 0.0 0.0 0.0 115.06 130.01 115.06
势函数包含 improper 项与 angle-angle 交叉项两部分:
E = E_i + E_aa
E_i = K [ (χ_ijkl + χ_kjli + χ_ljik)/3 - χ₀ ]²
E_aa = M₁(θ_ijk - θ₁)(θ_kjl - θ₃)
+ M₂(θ_ijk - θ₁)(θ_ijl - θ₂)
+ M₃(θ_ijl - θ₂)(θ_kjl - θ₃)
- E_i 中的 3 个 χ 项是对 3 个离面角的平均;χ_ijkl 为平面 IJK 与 JKL 的夹角(键 JK 位于两平面内),χ_kjli、χ_ljik 同理;
- 第 2 个原子 J 出现在所有公共键(JI、JK、JL)中,是 3 个 χ 角与所有 θ 角的对称原子;
- 各 θ 的下标表示参与构成该角的三原子组合,如 θ_ijl 是以 J 为中心的 I、J、L 夹角;θ₁、θ₂、θ₃ 为相应平衡角。
E_i 的 2 个系数:
- K(能量)
- χ₀(度)
E_aa 的 7 个系数(输入脚本以 aa 开头):
aa- M₁(能量)、M₂(能量)、M₃(能量)
- θ₁(度)、θ₂(度)、θ₃(度)
data 文件中这些系数列于 AngleAngle Coeffs 段,且必须省略 aa,即在 improper 类型号后只列 6 个系数。θ 值以度指定、内部转换为弧度,因此各 M 的量纲等效为能量/弧度²。理论依据见 COMPASS 力场文献(Sun, J Phys Chem B 102, 7338-7364 (1998))。
对称性约定:第 2 个原子为对称原子。
5.4 amoeba(AMOEBA 包)
improper_style amoeba
improper_coeff 1 49.6
势函数:
E = K·χ²
- 公式形式上像是 χ₀=0 的 harmonic 简化版,但 χ 的计算方式不同,为匹配 Tinker MD 代码对 AMOEBA / HIPPO 力场离面 improper 的处理;
- 四元组按 I,J,K,L 排列时,I、K、L 视为处于同一平面,J 偏离平面;χ 为 Allinger 角,即平面 IKL 与向量 I→J 的夹角。
系数:
- K(能量)
χ 以弧度计算,因此 K 量纲为能量/弧度²。对称性约定:第 2 个原子为对称原子。AMOEBA/HIPPO 在 LAMMPS 中的实现细节参见 Howto amoeba。
5.5 cossq(EXTRA-MOLECULE 包)
improper_style cossq
improper_coeff 1 4.0 0.0
势函数:
E = (1/2)·K·cos²(χ - χ₀)
χ 定义与 harmonic 相同(平面 IJK 与 JKL 的夹角,或 I 相对 J,K,L 平面的离面程度)。
系数:
- K(能量)
- χ₀(度)
对称性约定:第 1 个原子为对称原子。
5.6 distance(EXTRA-MOLECULE 包)
improper_style distance
improper_coeff 1 80.0 100.0
势函数:
E = K₂·d² + K₄·d⁴
d 为中心原子到其余三原子所成平面的距离。四元组按 I,J,K,L 排列时,I 原子被假定为中心原子(几何示意见 doc/src/JPG/improper_distance.png)。
系数:
- K₂(能量/距离²)
- K₄(能量/距离⁴)
对称性约定:第 1 个原子为对称原子。
5.7 distharm(YAFF 包)
improper_style distharm
improper_coeff 1 25.0 0.5
势函数:
E = K (d - d₀)²
- d 为中心原子到其余三原子平面的有向距离(可正可负);
- 注意约定与
distance不同:四元组按 I,J,K,L 排列时,L 原子被假定为中心原子; - 由于 d 是有向距离,当 d₀ ≠ 0 时可能产生预期之外的行为,需谨慎使用。
系数:
- K(能量/距离²)
- d₀(距离)
对称性约定:第 4 个原子为对称原子。源码实现位于 src/YAFF/improper_distharm.cpp。
5.8 sqdistharm(YAFF 包)
improper_style sqdistharm
improper_coeff 1 50.0 0.1
势函数:
E = K (d² - d₀²)²
d 定义同 distance(L 原子为中心原子)。
系数:
- K(能量/距离⁴)
- d₀²(距离²)
注意:第二个系数必须提供 d₀²(距离平方)而非 d₀。对称性约定:第 4 个原子为对称原子。源码实现位于 src/YAFF/improper_sqdistharm.cpp。
5.9 fourier(EXTRA-MOLECULE 包)
improper_style fourier
improper_coeff 1 100.0 0.0 1.0 0.5 1
势函数:
E = K [C₀ + C₁·cos(ω) + C₂·cos(2ω)]
- K 为力常数,C₀、C₁、C₂ 为无量纲系数;
- ω 为 IL 轴与 IJK 平面之间的夹角(几何定义同 umbrella,见 doc/src/JPG/umbrella.png);
- 可选的最后一个参数
all不为 0 时,将同时计入全部三种可能的 ω 角。
系数:
- K(能量)
- C₀(无量纲)
- C₁(无量纲)
- C₂(无量纲)
- all(0 或 1,可选)
对称性约定:第 1 与第 4 个原子为对称原子,仅第 2、3 个原子可互换。
5.10 inversion/harmonic(MOFFF 包)
improper_style inversion/harmonic
improper_coeff 1 18.776340 0.000000
势函数:
E = K (ω - ω₀)²
- 采用 Wilson-Decius 离面角定义,ω 围绕原子 I 对全部三种轴-平面组合求值(IL 轴与 IJK 平面示意见 doc/src/JPG/umbrella.png);
- 与
umbrella的区别在于:本风格循环求值所有可能的 ω 角; - 若 ω₀ = 0,势在平面结构处有单一极小值;否则在 ±ω₀ 处有两个极小值,中间存在势垒。
系数:
- K(能量)
- ω₀(度)
对称性约定:第 1 个原子为对称原子。
5.11 ring(EXTRA-MOLECULE 包)
improper_style ring
improper_coeff 1 8000 70.5
势函数:
E = (1/6)·K·(Δ_ijl + Δ_ijk + Δ_kjl)⁶
Δ_ijl = cos(θ_ijl) - cos(θ₀)
Δ_ijk = cos(θ_ijk) - cos(θ₀)
Δ_kjl = cos(θ_kjl) - cos(θ₀)
- θ_ijl 为原子 i、j、l 的夹角,θ_ijk 为 i、j、k 的夹角,θ_kjl 为 j、k、l 的夹角;
- 该势由 Destree 等人提出(J Chem Phys, 112, 9632 (2000)),不影响小幅振动,专用于阻止 i-j、j-k、j-l 三条键出现大幅波动导致的平面构象——即次甲基碳手性反转的中间构象;
- data 文件的 "Impropers" 段中,i、j、l 位于链骨架,k 决定 j 的手性。
系数:
- K(能量)
- θ₀(度)
对称性约定:第 2 个原子为对称原子。
5.12 umbrella / DREIDING(MOLECULE 包)
improper_style umbrella
improper_coeff 1 100.0 180.0
势函数(经典 inversion 形式,用于 DREIDING 力场):
ω₀ ≠ 0°: E = (1/2)·K·(1/sin ω₀)²·(cos ω - cos ω₀)²
ω₀ = 0°: E = K·(1 - cos ω)
- ω 为 IL 轴与 IJK 平面之间的夹角(示意见上节图);
- ω₀ = 0 时势在平面结构处有单一极小值;否则在 ω ± ω₀ 处有两个极小值,中间存在势垒;
- 理论依据:Mayo 等的 DREIDING 力场论文(J Phys Chem, 94, 8897-8909 (1990))。
系数:
- K(能量)
- ω₀(度)
对称性约定:第 1 与第 4 个原子为对称原子,仅第 2、3 个原子可互换。
5.13 各样式对称性约定汇总
下表直接决定 fix bond/react 等需要感知原子排序的操作如何自动分配新 improper 类型:
| 样式 | 对称原子 |
|---|---|
| none / harmonic / cvff / cossq / distance / inversion/harmonic | 第 1 个原子 |
| class2 / amoeba / ring | 第 2 个原子 |
| distharm / sqdistharm | 第 4 个原子 |
| umbrella / fourier | 第 1 与第 4 个原子(仅第 2、3 个可互换) |
六、源码级机制:Improper 基类与计算管线
6.1 基类与初始化检查
所有 improper 样式均继承自 Improper 基类(src/improper.cpp)。其 init() 方法(第 70-82 行)执行两项关键检查:
- 若存在 improper 类型但尚未分配系数数组,则报错 "Improper coeffs are not set";
- 若任一类型的
setflag[i] == 0,则报错 "All improper coeffs are not set",并通过Info::get_improper_coeff_status输出哪些类型的系数缺失。
这解释了为何运行前必须为每个 improper 类型设置系数。基类 Improper::settings() 默认拒绝任何多余参数(第 88-92 行),带参数的样式(如 zero nocoeff)会自行覆写。
6.2 harmonic 的实现细节
以 src/MOLECULE/improper_harmonic.cpp 为例,计算管线为:
coeff()解析类型范围(支持通配符,经utils::bounds展开)与 K、χ₀ 数值,χ₀ 经DEG2RAD转为弧度并写入chi[]数组;compute()中构造三个键向量,通过叉积与点积求平面夹角余弦 c,并对数值误差做截断(c > 1.0时钳制为 1.0);- 由
domega = acos(c) - chi[type]计算偏离量,能量eimproper = k * domega²; - 解析推导四个原子上的力,借助
newton_bond决定是否累加 ghost 原子受力; - 若开启能量/维里标志(eflag/vflag),调用
ev_tally做全局/按原子统计。
6.3 加速变体
文档中的各样式名后带有 (g,i,k,o,t) 后缀标记,表示存在加速版本:g = GPU、i = INTEL、k = KOKKOS、o = OPENMP、t = OPT。例如:
harmonic/intel、harmonic/kk、harmonic/ompcvff/intel、cvff/kk、cvff/ompclass2/kk、class2/omphybrid/kkring/kk、ring/omp、umbrella/kk、umbrella/ompdistance/kk、distance/omp、fourier/kk、fourier/ompcossq/kk、cossq/omp、inversion/harmonic/kk、inversion/harmonic/ompdistharm/kk、distharm/omp、sqdistharm/kk、sqdistharm/omp
对应源码分别位于 src/INTEL、src/KOKKOS、src/OPENMP 等目录。启用包后,用户可直接使用带后缀的样式名,或依赖后缀匹配机制自动选择加速版本。
6.4 包归属与构建
多数 improper 样式属于 MOLECULE 包(none、zero、hybrid、cvff、harmonic、umbrella、sqdistharm),另有 class2 属于 CLASS2 包、ring/distance/fourier/cossq 属于 EXTRA-MOLECULE 包、amoeba 属于 AMOEBA 包、inversion/harmonic 属于 MOFFF 包、distham 属于 YAFF 包。只有以对应包构建的 LAMMPS 才启用这些样式,详见 Build package。
七、实战:从输入脚本到数据文件
7.1 完整示例(harmonic + cvff 混用)
units real
atom_style molecular
read_data system.data
improper_style hybrid harmonic cvff
improper_coeff 1 harmonic 120.0 30
improper_coeff 2 cvff 20.0 -1 2
special_bonds lj/coul 0.0 0.0 0.0
对应 data 文件:
Improper Coeffs
1 harmonic 120.0 30
2 cvff 20.0 -1 2
7.2 仓库中的真实用法
仓库示例脚本可作为实战参考:
- examples/cmap/in.cmap(第 13 行)与 examples/charmmfsw/in.charmmfsw(第 20 行)均使用
improper_style harmonic; - examples/replicate/in.replicate.cnt(第 21 行)使用
improper_style class2; - examples/PACKAGES/mbx/mof_ff_lammps+1_h2o_mbx/in.mof_1h2o(第 18 行)使用
improper_style cvff; - examples/PACKAGES/yaff/mof5/in.mof5(第 20 行)使用
improper_style distharm; - examples/nb3b/in.nb3b(第 9 行)使用
improper_style none。
八、限制与最佳实践小结
- atom_style 限制:只有允许定义 improper 的原子样式才能设置 improper 样式。
- 包依赖:大多数样式依赖 MOLECULE 包,个别依赖 CLASS2、EXTRA-MOLECULE、AMOEBA、MOFFF、YAFF 包,构建前请确认。
- 原子排序即定义:四元组 I,J,K,L 的写入顺序决定 improper 角含义,务必与所选势函数约定的中心/对称原子对应(参考第五节对称性汇总表)。
- special_bonds 配合:同时存在 pair 势时,用
special_bonds关闭或加权四元组内部的成对相互作用,避免重复计算。 - hybrid 续跑:使用 hybrid 时 restart 文件不保存子样式系数,续跑脚本必须重写
improper_coeff。 - 默认值:
improper_style默认值为none;improper_coeff默认无任何设置,运行前必须补齐全部类型的系数,否则 LAMMPS 会在初始化时报错。

