news 2026/10/16 2:57:54

LAMMPS `fix wall` 命令族完全指南:从 LJ 硬墙到 Lepton 表达式与插值表格

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LAMMPS `fix wall` 命令族完全指南:从 LJ 硬墙到 Lepton 表达式与插值表格
  • 科研
  • 科学计算
  • 高性能计算

【免费下载链接】lammps

Public development project of the LAMMPS MD software package

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

导读

本文围绕 LAMMPS 官方文档 fix_wall.rst 展开,系统讲解fix wall/*九个平面壁(wall)样式的语法、势能公式、参数语义与源码级实现。你将掌握:如何在模拟盒的任意面上布置与原子相互作用的有力壁、如何用variable让壁随时间移动(压紧/振荡)、如何用 Lepton 表达式自由定义壁势能、如何用插值表格驱动任意形式的壁势能,以及如何把壁的能量与法向力纳入热力学输出与可视化。全文以当前 LAMMPS 仓库的源码(src/)与示例(examples/wall)为证据支撑,可直接照搬到实际输入脚本。

命令概览:在模拟域边界布置相互作用壁

fix wall/*系列命令在模拟域的一个或多个面上放置一个平面壁,对组(group)内原子产生垂直于壁面的力,其能量形式取决于所选 style。通用语法为:

fix ID group-ID style [tabstyle] [N] face args ... keyword value ...
  • ID、group-ID的语义与其他 fix 命令一致;
  • style可为wall/lj93、wall/lj126、wall/lj1043、wall/colloid、wall/harmonic、wall/harmonic/outside、wall/lepton、wall/morse、wall/table;
  • tabstyle(linear或spline)与N(插值点数)仅适用于wall/table;
  • face为xlo、xhi、ylo、yhi、zlo、zhi,一条命令最多可同时定义6 个壁面;lo面作用于该维度靠近盒子下侧的粒子,hi面作用于靠近上侧的粒子;
  • 可选keyword为units、fld、pbc。

官方示例:

fix wallhi all wall/lj93 xlo -1.0 1.0 1.0 2.5 units box fix wallhi all wall/lj93 xhi EDGE 1.0 1.0 2.5 fix wallhi all wall/harmonic xhi EDGE 100.0 0.0 4.0 units box fix wallhi all wall/morse xhi EDGE 1.0 1.0 1.0 2.5 units box fix wallhi all wall/lj126 v_wiggle 23.2 1.0 1.0 2.5 fix zwalls all wall/colloid zlo 0.0 1.0 1.0 0.858 zhi 40.0 1.0 1.0 0.858 fix xwall mobile wall/table spline 200 EDGE -5.0 walltab.dat HARMONIC 4.0 fix xwalls mobile wall/lepton xlo -5.0 "k*(r-rc)^2;k=100.0" 4.0 xhi 5.0 "k*(r-rc)^2;k=100.0" 4.0

从源码看,fix_wall.cpp 的基类构造函数负责统一解析参数:常规样式每个壁需要 5 个参数(coord epsilon sigma cutoff),wall/lepton为 4 个(coord expression cutoff),wall/morse为 6 个(coord D_0 alpha r_0 cutoff);同一个面被重复定义会报错,未定义任何壁、cutoff <= 0.0都会直接终止运行。

壁位置的三种指定方式:EDGE / 常数 / 变量

coord是壁在对应维度上的位置,可按下述三种方式给出:

  1. EDGE:取当前模拟盒对应维度的 lo/hi 边界,壁固定不动;
  2. 常数:如0.0或-30.0,单位是距离单位,壁固定不动;
  3. 变量:写作v_name,其中name必须是 equal-style 变量。变量每个时间步被重新求值,结果即壁的当前位置,因此可以方便地实现随时间变化的壁位置(见下文专节)。

wall/lj93、wall/lj126与wall/lj1043中,epsilon、sigma是常规 Lennard-Jones 参数,分别决定壁-粒子相互作用的强度与尺寸(epsilon为能量单位)。注意:这里的 epsilon/sigma 可以与 pair style 中粒子-粒子相互作用所用的 epsilon/sigma 不同。

九种壁势能的物理含义与公式

所有样式中,r均为粒子到壁面(位置coord)的距离,r_c为cutoff(超出后粒子与壁不再相互作用)。所有壁势能在 cutoff 处都被平移为零(能量 shift)。

1.wall/lj93:9-3 Lennard-Jones 壁

E = \epsilon \left[ \frac{2}{15} \left(\frac{\sigma}{r}\right)^{9} - \left(\frac{\sigma}{r}\right)^3 \right] \qquad r < r_c

该势能通过对3d 半晶格上的 12/6 LJ 粒子积分导出,是软壁模型,广泛用于模拟受限流体。源码 fix_wall_lj93.cpp 中precompute()预计算了coeff1 = 6/5·ε·σ⁹、coeff2 = 3·ε·σ³及能量 offset;wall_particle()中若粒子落在壁面上或壁后方(delta <= 0),会触发Particle on or inside fix wall surface错误——因为该势能随r → 0发散。

2.wall/lj126:12-6 Lennard-Jones 壁

E = 4 \epsilon \left[ \left(\frac{\sigma}{r}\right)^{12} - \left(\frac{\sigma}{r}\right)^6 \right] \qquad r < r_c

较lj93更"硬"、排斥性更强的壁,实现见 fix_wall_lj126.cpp。

3.wall/lj1043:10-4-3 壁

E = 2 \pi \epsilon \left[ \frac{2}{5} \left(\frac{\sigma}{r}\right)^{10} - \left(\frac{\sigma}{r}\right)^4 - \frac{\sqrt{2}\,\sigma^3}{3\left(r+\left(0.61/\sqrt{2}\right)\sigma\right)^3}\right] \qquad r < r_c

这一形式来自 Magda 等人的工作(文献出处),第三项是对半空间晶格近似更精细的修正,实现见 fix_wall_lj1043.cpp。

4.wall/colloid:胶体粒子-壁相互作用

E = \epsilon \left[ \frac{\sigma^{6}}{7560} \left(\frac{6R-D}{D^{7}} + \frac{D+8R}{(D+2R)^{7}} \right) - \frac{1}{6} \left(\frac{2R(D+R) + D(D+2R) \left[ \ln D - \ln (D+2R) \right]}{D(D+2R)} \right) \right] \qquad r < r_c

这是 pair_style colloid 势能对平面壁的积分形式。这里R是胶体粒子半径,D = r - R是胶体表面到壁的距离,sigma是构成胶体与壁的组成 LJ 粒子尺寸,epsilon前缀因子可理解为有效 Hamaker 常数(能量单位),更具体地epsilon = 4π²·ρ_wall·ρ_colloid·ε·σ⁶,其中 ρ 为壁/胶体中组成粒子的数密度。此处的 cutoffRc指胶体粒子中心到壁的距离。

源码 fix_wall_colloid.cpp 在init()中强制要求原子带radius属性(atom_style sphere等),且组内粒子必须全部是扩展粒子(radius > 0)。能量在 cutoff 处的 offset 依赖粒子尺寸,因此在wall_particle()内逐粒子计算。

5.wall/harmonic:纯排斥简谐振子壁

E = \epsilon \, (r - r_c)^2 \qquad r < r_c

epsilon本质是弹簧常数 K,单位为 能量/距离²;输入参数sigma被忽略。谐振子的能量极小值点位于cutoff处,由于相互作用在cutoff处截断,这是一个纯排斥弹簧。源码 fix_wall_harmonic.cpp 中dr = cutoff - delta、fwall = 2·ε·dr,线性弹簧力。

6.wall/harmonic/outside:仅对"跑出"控制体积的粒子施加引力

E = \epsilon \, (r - w_0)^2 \qquad r < r_c

该样式(28Mar2023 版本加入,曾用名wall/harmonic/returned,源码会给出改名警告,见 fix_wall_harmonic_outside.cpp)与wall/harmonic相反:只对越过壁面w0跑到控制体积外侧、且距离小于rc的粒子施加吸回性的谐波力,而控制体积内部的粒子完全不受力(源码中dr <= 0直接continue)。其动机是:普通排斥壁会在受控体积内部形成"排斥带",妨碍精确的体积浓度定义;允许粒子少量外溢再拉回,可以得到更精细的体积内浓度,该方案被用于 Barraud 等人对临界胶束浓度(CMC)的粗粒化研究(Langmuir 41, 7272–7282 (2025),文献与 DOI 记录在 fix_wall_harmonic_outside.cpp 的 citeme 条目中)。2D 可视化示例见 examples/wall/in.wall.harmonic.outside.2d。

7.wall/morse:Morse 壁

E = D_0 \left[ e^{- 2 \alpha (r - r_0)} - 2 e^{- \alpha (r - r_0)} \right] \qquad r < r_c

三个参数按顺序为:D_0(势阱深度,能量单位)、alpha(宽度因子,1/距离单位)、r_0(势能极小值到壁面的距离,距离单位),三者均可写成变量。实现见 fix_wall_morse.cpp。

8.wall/lepton:用 Lepton 表达式自由定义壁势能

wall/lepton(28Mar2023 加入,属 LEPTON 包)把势能写成以r(粒子-壁距离)为自变量的 Lepton 表达式字符串。运行时,LAMMPS 通过 Lepton 库求值该表达式得到能量,并自动解析出表达式对r的一阶导数用于计算力(见 fix_wall_lepton.cpp:parsed.differentiate("r"))。表达式必须用引号括起、或整体不含空白,以便 LAMMPS 将其识别为单个参数。可选地在表达式中使用rc引用该壁的 cutoff;更多的常数可用分号分隔的附加表达式在同一个字符串内定义。例如"k*(r-rc)^2;k=100.0"等价于力常数为 100(能量单位)的wall/harmonic排斥弹簧。

在 post_constructor 阶段,LAMMPS 会先对表达式做合法性检查(去空白、解析、编译、试算);若表达式不依赖r(能量或力恒为零),会给出警告。precompute()把rc与r均设为cutoff计算能量 offset,实现 cutoff 处能量归零。

Lepton 表达式语法要点(完整说明见 lepton_expression.rst,被 fix_wall.rst 直接 include):

  • 运算符:+(加)、-(减)、*(乘)、/(除)、^(幂);
  • 数学函数:sqrt、exp、log、sin、cos、sec、csc、tan、cot、asin、acos、atan、sinh、cosh、tanh、erf、erfc、abs、min(x,y)、max(x,y)、delta(x)、step(x);
  • 数字支持十进制与指数形式:5、-3.1、1e6、3.12e-2;
  • 扩展语法中可直接引用 LAMMPS 变量v_name(限标量变量),求值前会被替换为变量值;
  • 可用分号定义中间值,如a^2+a*b+b^2; a=a1+a2; b=b1+b2,中间值可嵌套引用,但所有使用必须出现在其定义之前。

一个完整的对比验证示例见 examples/wall/in.wall.lepton:它分别用wall/harmonic、wall/lepton("k*(r-rc)^2;k=100.0")、bond_style harmonic、pair_style harmonic/cut实现同一谐波相互作用并对比能量;还用 Lepton 表达式重写了 lj126 与 Morse 势(如"4.0*epsilon*((sigma/r)^12 - (sigma/r)^6);epsilon=v_eps;sigma=v_sig"),通过run 5 post no验证一致性。注意 Lepton 求值通常比编译后的 C++ 代码慢 2.5–5 倍,追求性能时可改用wall/table。

9.wall/table:表格插值壁

wall/table的能量与力完全由表格插值决定,文件格式见下文专节。其实现位于 fix_wall_table.cpp:

  • tabstyle仅接受linear或spline,tablength(命令中的N)不得小于 2(L32-L46);
  • post_constructor()中主进程(proc 0)读取表格文件,随后bcast_table()通过 MPI 广播给所有进程(L50-L75);表格距离必须单调递增,且壁的cutoff不得大于表格外端距离,否则报错;
  • 读取数据后先spline_table()(对文件中的 Nfile 个节点做三次样条拟合),再compute_table()在 Ntable 个等距点上重采样(L279-L321)——这就是文档所说的"以 Nfile 为节点做预备插值、再在 Ntable 个点上生成最终表格"的两阶段流程;
  • 运行时uf_lookup()按linear(两节点线性插值)或spline(三次样条系数求值)查表(L448-L472);
  • 读取表格后还会用割线法校验表中力是否与-dE/dr自洽,不一致的点会给出警告(拐点处允许出现)。

参数详解:units / fld / pbc

units:壁位置的单位

units决定常数或变量壁位置的距离单位含义(用EDGE时无关,变量情形下变量值被视为与units设置兼容):

  • box:标准距离单位,即由 units 命令定义的单位(如real/metal下的埃);
  • lattice:晶格常数单位,要求此前已用 lattice 命令定义晶格间距。

在源码 fix_wall.cpp 中,scaleflag(units lattice时为 1)会把常数壁坐标乘以对应维度的晶格间距xlattice/ylattice/zlattice;变量位置的求值结果在post_force()中同样按此缩放(L484-L491)。默认值为units lattice。

fld:配合隐式 FLD 模型

fld yes让壁约束在pair 相互作用之前生效,从而使隐式 FLD 模型(pair_style lubricateU)能把壁力计入其计算;fld no(默认)则按常规在 pair 相互作用之后施加壁力。对应源码中setmask()的选择:fldflag置位时注册PRE_FORCE,否则注册POST_FORCE(fix_wall.cpp)。

pbc:允许在周期维度布置壁

默认pbc no要求使用壁的维度必须是非周期的,否则报错(源码 fix_wall.cpp 逐壁检查domain->xperiodic等)。若设为pbc yes,则允许在周期维度放壁,例如让组内部分粒子受壁约束、其余粒子穿过壁并在周期盒中绕回;此时务必让壁远离盒边界,否则粒子可能同时与壁及其周期镜像相互作用。相关边界设置见 boundary 命令。

让壁动起来:时间相关的壁位置与相互作用参数

壁位置(以及部分样式的epsilon/sigma/alpha)支持 equal-style 变量,每个时间步重新求值。官方文档给出的典型例子:

variable ramp equal ramp(0,10) fix 1 all wall xlo v_ramp 1.0 1.0 2.5 variable linear equal vdisplace(0,20) fix 1 all wall xlo v_linear 1.0 1.0 2.5 variable wiggle equal swiggle(0.0,5.0,3.0) fix 1 all wall xlo v_wiggle 1.0 1.0 2.5 variable wiggle equal cwiggle(0.0,5.0,3.0) fix 1 all wall xlo v_wiggle 1.0 1.0 2.5

各内置函数的语义:

  • ramp(lo,hi):在运行期间把壁位置从lo线性变化到hi(可用于压缩/拉伸模拟);
  • vdisplace(c0,velocity):position = c0 + velocity·delta,delta为已流逝时间;
  • swiggle(c0,A,period):position = c0 + A·sin(ω·delta),其中ω = 2π/period,壁做正弦振荡;
  • cwiggle(c0,A,period):position = c0 + A·(1 − cos(ω·delta)),初始壁速率为 0,对粒子的扰动更平缓。

这些变量可引用 thermo_style 的盒子参数、时间步与流逝时间等关键词,因此可以构造任意复杂的运动规律。同理,epsilon/sigma(及 Morse 的alpha)也可用v_name指定,实现随时间变化的壁相互作用强度。源码中post_force()会先modify->clearstep_compute(),对每个壁求值位置与参数变量,参数变化时重新调用precompute()更新力系数(fix_wall.cpp)。

注意:除wall/harmonic/outside外,所有样式都必须保证组内所有粒子始终满足r > 0,否则 LAMMPS 报错。即:不能在coord处(r=0)或壁的错误一侧(r<0)启动粒子;lj93/lj126的能量在r→0时发散;wall/colloid更严格,能量在D = r − R → 0时发散,半径为 R 的有限尺寸粒子必须离壁面超过 R;harmonic虽不发散,但需用足够大的epsilon保证粒子始终留在壁的正确一侧。

wall/table 表格文件格式与生成工具

文件结构

suitable的表格可用tools/tabulate目录下的 Python 脚本生成(如 wall_harmonic_tabulate.py、wall_multi_tabulate.py)。仓库自带示例文件 examples/wall/walltab.dat,其格式如下(括号内为注释):

# Tabulated wall potential UNITS: real HARMONIC (keyword 是行首第一个文本) N 100 FP 200 200 (空行) 1 0.04 1568.16 792.00 (序号、到壁距离、能量、力) 2 0.08 1536.64 784.00 3 0.12 1505.44 776.00 ... 99 3.96 0.16 8.00 100 4.00 0 0

规则如下:

  • 一个 section 以首个字符非#的非空行开始;空行与#开头的行为注释,可放在 section 之间;
  • section 首行以关键字开头,可附带其他文本,但开头文本必须与fix wall/table命令中的keyword参数精确匹配;
  • 下一行列出表格参数,每个参数是"关键字 + 一个或多个数值":N为必填,值是后续表格条目数;可选FP给出力的一阶导边界(fplo fphi),源码param_extract()中未识别关键字会报错(fix_wall_table.cpp);
  • 数据行依次为:序号、距离、能量、力。

Ntable 与 Nfile 的关系

设Ntable= fix 命令中的N,Nfile= 表格文件中的N。LAMMPS 先以 Nfile 个文件值为节点构造样条,再在其上插值生成 Ntable 个点上的能量与力,最终以 Ntable 长度的表格做运行时插值。因此若想让运行时表格精确等于文件值(几乎不经过预备插值),应令Ntable = Nfile。完整示例见 examples/wall/in.wall.table:同一walltab.dat文件被分别以linear 1000与spline 200使用,并与wall/harmonic、bond_style harmonic、pair_style harmonic/cut做数值对比。walltab.dat中同时包含HARMONIC、LJ126、MORSE等多个 section,供不同壁样式复用。

输出、fix_modify 与 dump image 集成

能量与法向力输出

这些 fix 计算一个全局标量能量(与所有壁相互作用之和)和一个全局向量力(长度等于壁的数量,每个元素为某面壁的法向力),可通过各类 输出命令 访问。注意:

  • 标量能量是所有壁之和;若需逐壁能量,需对每面墙单独发一条fix wall命令;
  • 法向力符号约定:对lo壁,向外的力为负值;对hi壁,向外的力为正值;
  • 标量与向量均为extensive(广延量);
  • 这些 fix不向二进制 restart 文件写入任何信息;
  • 无参数可与 run 的start/stop关键字配合;
  • 能量最小化(minimize)期间壁力会被施加。

源码层面,能量与力在wall_particle()内累加到ewall[0](总能量)与ewall[m+1](第 m 面壁的法向力),compute_scalar()/compute_vector()通过一次MPI_Allreduce跨进程归约(fix_wall.cpp)。

fix_modify 选项

  • energy:把壁-原子相互作用能加入系统全局势能(thermo_style 输出)。默认energy no。若要该能量参与最小化目标量,必须开启(见 fix_modify);
  • virial:把壁相互作用对全局压力与逐原子应力的贡献加入 compute pressure 与 compute stress/atom。默认virial no;
  • respa:设置 r-RESPA 积分器中该 fix 施加力的层级,默认最外层。源码在init()中自动探测respa积分器并设置ilevel_respa(fix_wall.cpp)。

dump image 渲染壁

自 11Feb2026 版本起,这些壁 fix 支持 dump image 的fix关键字,把壁的几何信息传给渲染器,使壁出现在输出图像中:

  • 2D 系统中,壁按平面渲染会不可见,因此渲染为圆柱(壁面几何在update_image_plane()中生成,见 fix_wall.cpp);
  • 3D 系统中每面壁用两个三角形渲染;
  • 颜色默认取第一个原子类型色(type/element色彩样式);const色彩样式默认白色,可用 dump_modify fcolor 修改;透明度默认完全不透明,可用dump_modify ftrans修改;
  • 2D 下fflag1决定圆柱两端是否加球冠:0 无端帽、1 下端、2 上端、3 两端;fflag2调整渲染圆柱半径,必须 > 0,否则圆柱不可见(内部默认直径为 0,无法对所有壁类型推断合理直径);
  • 3D 下fflag1与fflag2均被忽略。

源码中的统一机制与限制

统一的运行时循环

所有样式的执行都复用基类FixWall::post_force()(fix_wall.cpp):对每面壁求值当前位置 → 若 epsilon/sigma 为变量则求值并重算precompute()→ 调用各子类实现的虚函数wall_particle(m, which, coord)→ 更新图像几何。子类只需实现precompute()(预计算系数与能量 offset)和wall_particle()(对组内本进程拥有的粒子算力、算能量、v_tally()累计维里)。因此新增一种壁样式的工作量集中在力/能量公式本身。

加速器变体

文档中标注了如下 KOKKOS 加速变体,均位于src/KOKKOS/:wall/lj93/kk、wall/lj126/kk、wall/lj1043/kk、wall/harmonic/kk、wall/harmonic/outside/kk、wall/morse/kk(对应 fix_wall_lj93_kokkos.cpp 等文件),可在 GPU/Intel 等设备上运行。

限制与默认值

  • wall/lepton属于LEPTON 包,仅在以该包构建的 LAMMPS 中可用,构建方法见 Build package;
  • 2D 模拟(dimension 2)中不允许使用zlo/zhi壁,源码会直接报错(fix_wall.cpp);
  • 各可选关键字默认值:units = lattice、fld = no、pbc = no。

相关命令

与壁约束相关的其他命令包括:

  • fix wall/reflect:壁面反射粒子(纯几何约束,无势能);
  • fix wall/gran:颗粒接触壁,用于颗粒体系;
  • fix wall/region:在任意 region 表面上的壁。

对于压缩、受限流体、胶体吸附、界面张力与 CMC 测定等场景,fix wall/*家族的九种样式覆盖了从解析势(9-3、12-6、10-4-3、Morse、谐振子、colloid)到任意表达式(Lepton)再到任意数值势(table)的全部需求,配合变量驱动的动态壁面与 KOKKOS 加速,是 LAMMPS 中功能最完整的平面边界约束工具集。

参考文献

  • Magda, Tirrell, Davis, J Chem Phys, 83, 1888-1901 (1985);erratum in JCP 84, 2901 (1986)(wall/lj1043势的来源)。
  • Barraud, Dalmazzone, Moureta, De Bruin, Creton, Pasquier, Lachet, Nieto-Draghi, Langmuir, 41 (11), 7272-7282 (2025)(wall/harmonic/outside用于 CMC 测定,DOI 见 fix_wall_harmonic_outside.cpp)。
  • 科研
  • 科学计算
  • 高性能计算

【免费下载链接】lammps

Public development project of the LAMMPS MD software package

项目地址:https://gitcode.com/gh_mirrors/la/lammps
点击查看免费下载
上一篇:dio_web_adapter 演进全解析:从 Web 适配器拆分到 CORS 预警与浏览器下载
下一篇:ZCode Agent 浏览器自动化实战指南:基于 agent-browser 技能驱动的网页交互、表单与登录自动化

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/16 2:57:24

Go语言命名管道实战:从原理到高性能IPC实现

1. 为什么要在Go里折腾命名管道第一次接触命名管道是在做一个日志采集模块的时候。当时的需求很直接&#xff1a;一个常驻的采集进程负责从多个来源收数据&#xff0c;另一个分析进程需要实时拿到这些数据做统计。最直觉的方案是上消息队列&#xff0c;但部署环境里没有现成的中…

作者头像 李华
网站建设 2026/10/16 2:56:57

ESP-IDF 安装指南:EIM 4 种方式,断网机器也能装

ESP-IDF 安装指南&#xff1a;EIM 4 种方式&#xff0c;断网机器也能装 【免费下载链接】esp-idf Espressif IoT Development Framework. Official development framework for Espressif SoCs. 项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf ESP-IDF 是乐鑫…

作者头像 李华
网站建设 2026/10/16 2:56:01

独立开发者的赚钱方法论:从接单到产品化与被动收入的完整路径

独立开发这行&#xff0c;说起来光鲜&#xff0c;做起来真的是一个人活成一支队伍。我在这个圈子里摸爬滚打了好几年&#xff0c;从最早接几百块的小单子&#xff0c;到现在能有稳定的被动收入流&#xff0c;中间踩过的坑、撞过的墙&#xff0c;估计比不少人写过的代码都多。经…

作者头像 李华