LAMMPS improper_style 完全指南:四大原子离面势函数体系与 improper_coeff 配置详解

原创2026-10-15 19:56:241,942 阅读
文章标签:科学计算高性能计算科研

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 系数仍需在续跑脚本中重新指定。

系数可以在三种位置给出:

  1. 输入脚本中通过 improper_coeff 命令;
  2. data 文件(由 read_data 读入)的 "Improper Coeffs" 段;
  3. 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)。

distance 势中中心原子到平面的距离 d

系数:

  • 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,势在平面结构处有单一极小值;否则在 ±ω₀ 处有两个极小值,中间存在势垒。

umbrella / inversion-harmonic / fourier 共用的 ω 角定义

系数:

  • 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 为例,计算管线为:

  1. coeff() 解析类型范围(支持通配符,经 utils::bounds 展开)与 K、χ₀ 数值,χ₀ 经 DEG2RAD 转为弧度并写入 chi[] 数组;
  2. compute() 中构造三个键向量,通过叉积与点积求平面夹角余弦 c,并对数值误差做截断(c > 1.0 时钳制为 1.0);
  3. 由 domega = acos(c) - chi[type] 计算偏离量,能量 eimproper = k * domega²;
  4. 解析推导四个原子上的力,借助 newton_bond 决定是否累加 ghost 原子受力;
  5. 若开启能量/维里标志(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/omp
  • cvff/intel、cvff/kk、cvff/omp
  • class2/kk、class2/omp
  • hybrid/kk
  • ring/kk、ring/omp、umbrella/kk、umbrella/omp
  • distance/kk、distance/omp、fourier/kk、fourier/omp
  • cossq/kk、cossq/omp、inversion/harmonic/kk、inversion/harmonic/omp
  • distharm/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 仓库中的真实用法

仓库示例脚本可作为实战参考:

八、限制与最佳实践小结

  1. atom_style 限制:只有允许定义 improper 的原子样式才能设置 improper 样式。
  2. 包依赖:大多数样式依赖 MOLECULE 包,个别依赖 CLASS2、EXTRA-MOLECULE、AMOEBA、MOFFF、YAFF 包,构建前请确认。
  3. 原子排序即定义:四元组 I,J,K,L 的写入顺序决定 improper 角含义,务必与所选势函数约定的中心/对称原子对应(参考第五节对称性汇总表)。
  4. special_bonds 配合:同时存在 pair 势时,用 special_bonds 关闭或加权四元组内部的成对相互作用,避免重复计算。
  5. hybrid 续跑:使用 hybrid 时 restart 文件不保存子样式系数,续跑脚本必须重写 improper_coeff。
  6. 默认值:improper_style 默认值为 none;improper_coeff 默认无任何设置,运行前必须补齐全部类型的系数,否则 LAMMPS 会在初始化时报错。
登录后查看全文
lammps