☰
LAMMPS fix deform 命令详解:仿真盒变形与 NEMD 形变模拟实战指南
2026/10/16 9:05:27 网站建设 项目流程
  • 科研
  • 科学计算
  • 高性能计算

【免费下载链接】lammps

Public development project of the LAMMPS MD software package

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

导读

fix deform是 LAMMPS 中用于在动力学模拟过程中动态改变仿真盒(simulation box)体积与形状的核心命令,广泛应用于单轴拉伸/压缩、剪切流(shear flow)、振荡应变等非平衡分子动力学(NEMD)模拟。本文以 doc/src/fix_deform.rst 为骨架,结合 src/fix_deform.cpp、examples/nemd/in.nemd 与 unittest 中的测试用例,完整讲解命令语法、全部样式(style)的数学含义、关键字选项、盒翻转(box flip)机制,并给出可直接复制的实战输入文件。


1. 命令总览与语法

fix deform的基本语法为:

fix ID group-ID deform N parameter style args ... keyword value ...
  • ID、group-ID:与所有fix命令一致(参见 fix 命令文档)。
  • N:每隔多少个时间步更新一次仿真盒。N > 0时在每个时间步结束时更新;N = 0时在每次位置更新之后立即更新,这是精确 NEMD 模拟(配合fix nvt/sllod)所要求的,但与variable样式不兼容。
  • parameter/args:一个或多个形变参数序列,可同时、独立地控制多个方向。
  • keyword value:零个或多个可选关键字。

1.1 可调节参数

正交(orthogonal)仿真盒有 3 个可调参数(x、y、z);三斜(triclinic,非正交)仿真盒有 6 个可调参数(x、y、z、xy、xz、yz)。任意多个参数可以同时、独立地设置。

三斜盒前提:从源码看,当解析到xy/xz/yz参数时,fix_deform.cpp 会直接检查domain->triclinic,若当前盒为正交盒则报错:Fix {} tilt factors require triclinic box。即使初始倾斜因子(tilt factor)全为 0,只要 fix deform 改变了 xy/xz/yz,仿真盒就必须是 triclinic。

1.2 加速器变体

本命令提供 KOKKOS 加速变体deform/kk。在 src/KOKKOS/fix_deform_kokkos.h 中注册了三种风格:

  • deform/kk(按设备自动选择)
  • deform/kk/device(强制设备端)
  • deform/kk/host(强制主机端)

在构建了 KOKKOS 包的 LAMMPS 中,把命令中的deform换成deform/kk即可使用。

1.3 官方示例(Syntax 小节)

fix 1 all deform 1 x final 0.0 9.0 z final 0.0 5.0 units box fix 1 all deform 1 x trate 0.1 y volume z volume fix 1 all deform 1 xy erate 0.001 remap v fix 1 all deform 10 y delta -0.5 0.5 xz vel 1.0

2. 参数样式(parameter/style)完整说明

2.1 x、y、z 维度支持的样式

样式参数含义
finallo hi运行结束时盒边界 lo/hi(距离单位)
deltadlo dhi运行结束时盒边界的变化量(距离单位)
scalefactor盒长的乘性因子(factor < 1 为压缩)
velV盒长变化速度(距离/时间),等价于工程应变率
erateR工程应变率(1/时间)
trateR真应变率(1/时间)
volume无调整该维以保持体系体积不变
wiggleA Tp正弦振荡的振幅 A 与周期 Tp
variablev_name1 v_name2用 equal 样式变量定义盒长变化量及变化率

pressure与pressure/mean样式仅存在于扩展命令 fix deform/pressure 中,不在本页范围内。

2.2 xy、xz、yz 倾斜因子支持的样式

样式参数含义
finaltilt运行结束时倾斜因子(距离单位)
deltadtilt运行结束时倾斜因子的变化量
velV倾斜因子变化速度,等价于工程剪切应变率
erateR工程剪切应变率(1/时间)
erate/rescaleR按当前垂直方向盒长重新标度的剪切应变率
trateR真剪切应变率(1/时间)
wiggleA Tp正弦振荡振幅与周期
variablev_name1 v_name2变量驱动的倾斜因子变化

注意:改变三斜盒的倾斜因子不会改变盒体积。

2.3 可选关键字

  • remap=x(默认)|v|none:盒形变时原子坐标/速度的重映射方式。
  • flip=yes(默认)|no:允许/禁止盒在高度倾斜时发生盒翻转。
  • units=lattice(默认)|box:距离参数的单位(晶格单位或盒单位)。
  • couple、vol/balance/p、max/rate、normalize/pressure:这四个关键字仅属于fix deform/pressure,详见 fix_deform_pressure.rst。

源码层面,参数解析与关键字解析分别对应FixDeform构造函数(fix_deform.cpp)与options()方法(fix_deform.cpp)。内部每种样式用一个Set结构体记录(见 fix_deform.h),其中枚举了全部样式:NONE, FINAL, DELTA, SCALE, VEL, ERATE, TRATE, VOLUME, WIGGLE, VARIABLE, PRESSURE, PMEAN, ERATERS。


3. 盒长样式:工程应变率与真应变率

3.1 final / delta / scale:恒定位移

final、delta、scale、vel、erate都属于"恒定位移"型变化,等价于"恒定工程应变率"——盒维度随时间线性地从初始值过渡到最终值。

  • final:直接给出最终 lo/hi 边界。
  • delta:给出 lo/hi 边界各自的变化量(正/负均可)。
  • scale:给出乘性因子。例如初始盒长 10、因子 1.1,则最终盒长为 11;因子小于 1.0 表示压缩。

3.2 vel:以速度定义盒长变化

vel指定盒长变化速度 V(距离/时间单位),等价于"恒定工程应变率",其中 rate = V/L0,L0 为初始盒长。官方示例:初始盒长 100 Å,V = 10 Å/ps,则 10 ps 后盒长翻倍,20 ps 后变为三倍。

3.3 erate:恒定工程应变率

盒长随时间按以下规律变化:

L(t) = L0 (1 + erate*dt)

其中 dt 为流逝时间。若 R = 0.1、时间单位为皮秒,意味着盒长每个皮秒增加其初始长度的 10%:1 ps 后应变 0.1,2 ps 后 0.2……R = -0.01 则表示每 ps 缩短初始长度的 1%。由于工程应变率基于原始盒长计算,以 R = 1 运行 10 ps 会把盒长放大 11 倍(应变为 10),这与trate的行为有本质区别。

3.4 trate:恒定真应变率

盒长随时间按指数规律变化:

L(t) = L0 exp(trate*dt)

真应变率的"率"恒定,盒长变化非线性。若 R = ln(1.1),盒长每 ps 增加其当前长度的 10%:1 ps 后应变 0.1,2 ps 后 0.21……以 R = ln(2) 运行 10 ps,盒长不是放大 11 倍而是放大 2^10 = 1024 倍(每 ps 翻倍)。

组合技巧:若要以恒定速率改变盒体积(或横截面积),可同时对多个维度施加erate或trate。例如要在 1 ps 内盒体积翻倍:令 x、y、z 均为erate M,M = pow(2,1/3) - 1 ≈ 0.26(每个维度增长 26%,体积翻倍);或三者均为trate M,M = ln(1.26) ≈ 0.231。

3.5 volume:保持体积/横截面积不变

volume样式在其它维度被显式改变时,反算本维度的长度以维持体积(或仅两维时的横截面积乘积)恒定。源码中的三种子模式可见于apply_volume()(fix_deform.cpp)与Set结构体的substyle字段(fix_deform.h):

  • ONE_FROM_ONE:一维固定(fixed)、一维动态(dynamic1),本维随之调整,保持"固定维 × 动态维"乘积不变(即横截面积守恒)。
  • ONE_FROM_TWO:两维均动态,本维调整为两维动态长度的反比,保持体积不变。
  • TWO_FROM_ONE:多维共同压缩,y、z 按比例收缩以保持相对纵横比不变。

官方示例:x scale 1.1 y scale 1.1 z volume在 x、y 增长时收缩 z,保持 x·y·z 体积恒定;x scale 1.1 y volume z volume则同时收缩 y、z。

物理提醒:对固体或液体,单维拉伸而其它两维恒定会隐含密度变化。用volume保持体积虽然更合理,但对泊松比非 0.5 的材料/势函数可能不正确;替代方案是对未被 fix deform 控制的两维使用零外压的fix npt aniso,让它们动态响应。

3.6 wiggle:正弦振荡

盒长随时间按正弦规律变化:

L(t) = L0 + A sin(2π t/Tp)

A > 0 时盒先膨胀后收缩;A < 0 时先收缩后膨胀。振幅可指定为晶格单位或盒单位。

3.7 variable:任意函数驱动

variable样式通过两个 equal 样式变量控制盒长:

  • v_name1:盒长变化量(距离单位,注意是 box 单位而非 lattice 单位),应返回 0.0 作为起始值,> 0 膨胀、< 0 压缩。公式中可以引用当前时间步。
  • v_name2:盒长变化率(距离/时间),即 v_name1 的时间导数。此量被 LAMMPS 内部用于在原子跨越周期边界时重置速度;其它样式由程序内部计算,而variable样式必须由用户提供。

官方示例——用变量复现wiggle的振荡形变:

variable A equal 5.0 variable Tp equal 10.0 variable displace equal "v_A * sin(2*PI * step*dt/v_Tp)" variable rate equal "2*PI*v_A/v_Tp * cos(2*PI * step*dt/v_Tp)" fix 2 all deform 1 x variable v_displace v_rate remap v

同样的变量方式也适用于倾斜因子(把x换成xy即可)。源码中variable样式在init()里校验变量存在且为 equal 样式(fix_deform.cpp),在apply_strain()中通过compute_equal()求值并更新 h_rate(fix_deform.cpp)。

除final外,scale、vel、erate、trate、volume、wiggle、variable样式都以盒中点为中心进行膨胀/压缩(源码中可见 lo/hi 的对称 shift 处理,如 fix_deform.cpp)。


4. 倾斜因子样式:剪切变形详解

4.1 final / delta / vel / erate:恒定工程剪切应变率

这四个样式使倾斜因子随时间线性变化。

  • vel:指定倾斜因子变化速度 V(距离/时间),rate = V/L0,L0 为剪切方向垂直的初始盒长。官方示例:初始倾斜因子 5 Å,V = 10 Å/ps,1 ps 后倾斜因子为 15 Å,2 ps 后为 25 Å。
  • erate:倾斜因子随时间变化为
T(t) = T0 + L0*erate*dt

剪切应变 = 偏移/长度(如 xy 变形中,偏移沿 x 方向、垂直长度取 y 盒长)。R = 0.1 时剪切应变每 ps 增加 0.1;R = 1 或 2 时倾斜因子每 ps 增加 1 或 2 个垂直盒长;R = -0.01 表示剪切应变每 ps 减少 0.01。

4.2 erate/rescale:随当前盒长重新标度(新版特性)

erate/rescale与erate类似,但倾斜因子变化依赖当前(而非初始)的垂直盒长 L,并计入其它方向的伸长与剪切耦合。其演化方程为:

d T_αβ(t)/dt = L_β * erate + (1/L_α) * (dL_α/dt) * T_αβ(t)

其中 α、β 为两个方向(如 x 与 y、y 与 z)。xz 倾斜因子额外包含 xy 剪切与 yz 倾斜的耦合项:

d T_xz(t)/dt = L_z * erate + (1/L_x) * (dL_x/dt) * T_xz(t) + (1/L_y) * (dT_xy/dt) * T_yz(t)

当 x/y/z 使用trate、xy/xz/yz 使用erate/rescale时,等价于按恒定流张量演化晶格矢量:

∇u = [ trate_x 0 0 ] [ erate_xy trate_y 0 ] [ erate_xz erate_yz trate_z ]

倾斜因子在 x/y/z 盒长变化前后分两个半步积分,顺序分别为 xz、yz、xy 与逆序,保证全步可逆。该选项在 L 随时间变化时非常有用,fix nvt/sllod计算混合流粘度时要求使用它。混合 xy 与 yz 剪切时,可将 xz 设为erate/rescale 0.0以维持恒定 ∇u。

源码佐证:ERATERS样式在 fix_deform.h 中定义,其半步步进、xz 修正项与翻转后 h_rate 重算逻辑分布在apply_strain()、update_domain()、pre_exchange()中(如 fix_deform.cpp 与 fix_deform.cpp)。注意该样式要求盒为 triclinic,且与 KOKKOS/OPENMP 等加速变体的兼容性以当前仓库源码为准。

4.3 trate:恒定真剪切应变率

倾斜因子按指数变化:

T(t) = T0 exp(trate*dt)

若 R = ln(1.1),剪切应变(或倾斜因子)每 ps 增加 10%;R = ln(2) 每 ps 翻倍。使用trate时初始倾斜因子必须非零——源码在init()中强制检查(fix_deform.cpp)。

注意:erate/trate控制倾斜因子时假设垂直盒长恒定;若垂直盒长同时被其它参数改变,其对剪切应变的影响会被忽略。

4.4 wiggle 与 variable:倾斜因子的振荡与变量驱动

倾斜因子的wiggle遵循T(t) = T0 + A sin(2π t/Tp);variable样式同样要求 v_name1 返回倾斜因子变化量、v_name2 返回变化率(距离/时间)。官方变量示例(把x换为xy):

variable A equal 5.0 variable Tp equal 10.0 variable displace equal "v_A * sin(2*PI * step*dt/v_Tp)" variable rate equal "2*PI*v_A/v_Tp * cos(2*PI * step*dt/v_Tp)" fix 2 all deform 1 xy variable v_displace v_rate remap v

5. 盒翻转(box flip)机制

5.1 倾斜因子的界限

LAMMPS 中 triclinic 盒的倾斜因子(xy、xz、yz)通常被限制在平行方向盒长的一半以内。例如 xlo = 2、xhi = 12(盒长 10),则 xy 倾斜因子必须处于 -5 到 5 之间;xz、yz 同理。这并非限制,因为倾斜因子 = ..., -15, -5, 5, 15, 25, ... 的构型彼此等价。

5.2 翻转算法

若倾斜因子在模拟中超过该范围,盒会"翻转"到另一个等价极限并继续模拟。官方例子:初始 xy = 0.0、指定xy final 100.0,则模拟过程中 xy 从 0 涨到 5、翻转为 -5、再涨到 5、再翻转……共翻转 10 次,最终倾斜因子为 0.0。每次翻转时原子被按适当方式重映射进新盒。

翻转算法在源码update_domain()中实现(fix_deform.cpp):先检查各倾斜因子与垂直长度的比值是否超过 ±0.5,再按 yz → xz → xy 的优先级对tilt_flip做 ±一个周期长度的调整,并通过domain->image_flip()修正镜像标志(image flags)。

唯一例外:倾斜因子的第一维(如 xy 中的 x)为非周期时,界限不被强制——因为该维非周期使翻转不改变原子位置;但极端倾斜会让通信子域畸变,模拟效率下降。

5.3 flip 关键字

  • flip yes(默认):强制界限,超出即翻转。
  • flip no:倾斜继续增大而不翻转。大幅形变下盒形会严重倾斜,幽灵原子通信量剧增、运行效率下降;极端倾斜下 LAMMPS 可能丢失原子并报错。

6. remap 关键字:原子坐标/速度的重映射

每次盒尺寸或形状改变时,remap决定原子如何适应新盒:

  • remap x(默认):对 fix 组内的原子坐标做仿射重映射,使其"跟随"盒的仿射变形。适用于固体——原子并非因速度追踪盒变化,而是仅因重映射而移动。
  • remap v:组内原子跨越周期边界时,其速度加上 lo/hi 边界的速度差(该差可含倾斜分量,如原子跨 y 周期边界时 x 速度的增量)。适用于流体——原子自行响应盒形变并获得匹配盒变化的速度。
  • remap none:两者都不做。

源码实现:remap x时对组内原子执行domain->x2lamda()/lamda2x()转换(fix_deform.cpp);remap v的边界速度差处理由 Domain 层完成。remap选项在options()中映射为Domain::X_REMAP / V_REMAP / NO_REMAP三个枚举(fix_deform.cpp)。

6.1 与 fix nvt/sllod 的配合(NEMD 关键)

  • 使用fix nvt/sllod(默认peculiar no)做 NEMD 时,应使用remap v:SLLOD 算法负责调整原子位置与速度以产生匹配盒形变的速度剖面,因此 fix deform 不应重映射坐标,但应重映射穿越周期边界的速度。若fix nvt/sllod使用peculiar yes,则 fix deform 应使用remap none。LAMMPS 会在两者不匹配时给出警告。
  • 若使用remap v但未加恒温器,则没有驱动力使原子流场与盒形变一致(例如盒底部变形速度为 0、顶部为 10,而原子流剖面可能是 -5 到 +5)。可用fix ave/chunk、compute temp/deform、compute temp/profile监控;用velocity ramp命令施加匹配的初始速度剖面,或用fix nvt/sllod的kick yes选项注入正确流场,可加速平衡并最小化周期边界穿越。
  • 刚性体:若定义了fix rigid且remap x,刚体质心会被重映射到变化后的盒中(无论刚体原子是否在 fix deform 组内);remap v不会重映射质心速度,因为fix nvt/sllod目前不处理刚体粒子。

7. units 关键字与其它可选参数

7.1 units = lattice | box

  • box:距离参数使用units命令定义的标准距离单位(如 real/metal 单位的 Å)。
  • lattice(默认):距离参数以晶格间距为单位,需事先用lattice命令定义晶格间距。

该选择同样影响vel样式(距离/时间单位),但不影响variable样式——若要在变量公式中引用晶格间距,请使用thermo_style的xlat/ylat/zlat关键字。

源码层面,units lattice对应scaleflag = 1,构造函数据此将FINAL/DELTA/VEL/WIGGLE样式的数值乘以domain->lattice->xlattice/ylattice/zlattice(fix_deform.cpp),倾斜因子的缩放映射取第一维晶格常数(map[3..5] = y/x/x 晶格尺度)。

7.2 N 参数、RESPA 与多重 run

  • N > 0:每 N 步的时间步结束时更新盒;N = 0:每次位置更新后立即更新(end_flag = 0,挂接 POST_INTEGRATE 钩子),是fix nvt/sllod精确 NEMD 所需,但不能与variable样式并用。
  • 若N = 0且run_style respa,盒在内层循环更新;rRESPA 下盒翻转推迟到外层时间步执行(源码post_integrate_respa()中通过allow_flip_change/need_flip_change控制,见 fix_deform.cpp)。

7.3 与其它 fix 的协同

未被 fix deform 指定的维度可以保持周期/非周期,也可由fix npt或fix nph控制。盒的初始尺寸/形状来自create_box、read_data或read_restart。

7.4 重启、run start/stop 与 minimize

  • 本 fix 会将初始盒设置写入二进制重启文件(write_restart()/restart(),fix_deform.cpp),配合run的 start/stop 选项可跨多个 run 连续形变。
  • fix_modify选项对本 fix 均不适用;本 fix 不存储任何全局或逐原子量供输出命令使用。
  • 能量最小化(minimize)期间不会调用本 fix。

8. 使用限制与默认值

8.1 限制(Restrictions)

  • x、y、z 维度不能对经boundary命令 shrink-wrapped(收缩包裹)的维度施加形变;xy、yz、xz 的第二维(如 xy 中的 y)也不能是 shrink-wrapped。源码在构造函数中逐项检查并报错(fix_deform.cpp)。
  • 一个模拟中只能定义一个形变命令:fix deform 或 fix deform/pressure。源码init()中若检测到多个 deform fix 直接报错(fix_deform.cpp)。

8.2 默认值

remap = x,flip = yes,units = lattice

8.3 相关命令

  • fix deform/pressure:扩展本命令,额外提供pressure、pressure/mean样式与couple、vol/balance/p、max/rate、normalize/pressure关键字。
  • change_box:静态改变盒的尺寸/形状。
  • fix nvt/sllod 与 compute temp/deform:NEMD 形变模拟配套。
  • fix nh(npt/nph):未指定维度的恒压控制。
  • 持续伸长流(extensional flow)可用 UEF 包 的fix nve/uef等命令建模。

9. 仓库实战案例与验证

9.1 官方 NEMD 剪切示例(examples/nemd/in.nemd)

examples/nemd/in.nemd 是官方 2D NEMD 剪切模拟,展示了fix deform与fix nvt/sllod的标准搭配:

units lj atom_style atomic dimension 2 lattice sq2 0.8442 region box prism 0 10 0 8 -0.5 0.5 0 0 0 create_box 2 box create_atoms 1 box mass * 1.0 velocity all create 1.44 87287 loop geom region slice block 4 6 INF INF INF INF set region slice type 2 pair_style lj/cut 4.0 pair_coeff * * 1.0 1.0 neighbor 0.3 bin neigh_modify delay 0 every 1 fix 1 all nvt/sllod temp 1.0 1.0 1.0 tchain 1 fix 2 all deform 0 xy erate 0.01 remap v thermo 50 run 1000

要点:region box prism ...构建了 triclinic 盒;fix 2 all deform 0 xy erate 0.01 remap v每步更新、以 0.01 工程剪切应变率剪切 xy 并重映射速度,与fix nvt/sllod(恒温器 + SLLOD)严格配套。注意N = 0正是 SLLOD 精确积分所要求的。

9.2 各向同性压缩与剪切的组合示例(examples/srd/tri_srd.in)

examples/srd/tri_srd.in 中同时演示了scale与erate两种用法:

fix 3 all deform 1 x scale 0.6 y scale 0.6 z scale 0.6 fix 3 all deform 1 xy erate 0.05 units box remap v

第一行以scale 0.6对三个维度等比压缩(各向同性收缩 40%);第二行以units box(盒单位)指定 0.05 的工程剪切应变率。

9.3 单元测试验证(unittest)

仓库的 yaml 驱动测试覆盖了 fix deform 的数值正确性:unittest/force-styles/tests/fix-timestep-deform.yaml(fix test solute deform 1 x scale 1.2)、fix-timestep-deform_noremap.yaml与三斜盒版fix-timestep-deform_tri.yaml。这些测试以 5e-13 的 epsilon 对比固定时间步位置,验证盒形变后坐标更新的确定性。此外 unittest/examples/test_examples_elastic.cpp 等示例测试也会运行包含形变命令的弹性算例。

9.4 底层调用链小结

从源码看,一次盒更新的调用链为:end_of_step()/post_integrate()→update_box()→apply_strain()(应变型维度求目标值)→apply_volume()(volume 联动维度)→update_domain()(倾斜因子取整、盒翻转判定、原子重映射、提交新全局/局部盒)→(必要时)force->kspace->setup()重算 KSpace 系数(fix_deform.cpp)。盒翻转发生在pre_exchange()钩子(fix_deform.cpp),先于邻居重建,通过domain->image_flip()+remap_all()+ Irregular 迁移保持原子与盒同步。

9.5 镜像标志溢出提醒

长时间高速剪切模拟中,存储非折叠原子位置的镜像标志可能"回绕":默认编译设置下镜像标志限制在 -512 ≤ i ≤ 511,当原子从零标志开始穿越周期盒超过 512 次即溢出。将 LAMMPS 整数类型改为 "bigbig" 设置可把镜像标志范围扩大到约 -1,048,576 ≤ i ≤ 1,048,575,大幅降低溢出概率。


10. 快速上手清单

  1. 确定是否需要 triclinic 盒:只要用到 xy/xz/yz,就用region box prism ...或create_box指定三斜盒。
  2. 选择参数与样式:单轴拉伸用x erate/trate/scale/final;剪切用xy erate/erate/rescale;保体积拉伸用volume;振荡载荷用wiggle;任意时间函数用variable(同时提供变化量与变化率两个变量)。
  3. 选择N:与fix nvt/sllod搭配时用N = 0;普通形变用N > 0。
  4. 选择remap:固体倾向remap x,NEMD 流体配合 SLLOD 用remap v。
  5. 检查限制:形变维度不能 shrink-wrapped;同一模拟只能定义一个形变 fix。
  6. 验证结果:参考 unittest/force-styles/tests 下的 fix-timestep-deform 系列测试,或直接运行 examples/nemd/in.nemd 复现官方剪切算例。
  • 科研
  • 科学计算
  • 高性能计算

【免费下载链接】lammps

Public development project of the LAMMPS MD software package

项目地址:https://gitcode.com/gh_mirrors/la/lammps
点击查看免费下载
上一篇:50个Dify工作流模板:从零开始构建AI自动化应用的完整指南
下一篇:3分钟快速上手:免费离线OCR软件Umi-OCR文字识别全攻略

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

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

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

立即咨询