ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

LAMMPS fix mol/swap 命令详解:分子内原子类型 Monte Carlo 互换的实现原理与实战

LAMMPS fix mol/swap 命令详解:分子内原子类型 Monte Carlo 互换的实现原理与实战
  • 科研
  • 科学计算
  • 高性能计算

【免费下载链接】lammps

Public development project of the LAMMPS MD software package

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

fix mol/swap是 LAMMPS MC 包中用于加速分子体系 Monte Carlo 平衡的 fix 命令,它每隔 N 步随机选取一个分子,对该分子内指定两类原子(itype/jtype)做整分子互换,并用 Metropolis 准则按能量差决定接受或回滚。本文基于官方文档 doc/src/fix_mol_swap.rst,结合 src/MC/fix_mol_swap.cpp 源码与 examples/mc 中的真实示例,完整讲解其语法、参数、能量计算机制、charge 与 ke 关键字约束、dump image可视化支持、restart 行为以及一份可直接参考的聚合物混合/分相测试脚本。

1. 命令语法与参数说明

完整语法如下:

fix ID group-ID mol/swap N X itype jtype seed T keyword value ...

各参数含义(ID与group-ID遵循 fix 通用语法):

参数类型说明
N正整数每隔 N 步调用一次本 fix 的 Monte Carlo 交换
X非负整数每次调用时尝试的交换次数
itype、jtype原子类型号(1~Ntypes)或类型标签要互换的两类原子;两者必须不同
seed正整数随机数发生器种子
T正实数(温度单位)MC 交换的 Metropolis 判定所用标度温度
ke可选关键字no= 交换后不守恒动能;yes= 交换后守恒动能(默认值)

参数取值在构造函数中有严格校验:最少 9 个参数,N > 0、X >= 0、itype != jtype、类型号在atom->ntypes范围内、seed > 0、T > 0;若使用按原子质量的mass(atom->rmass)则不允许开启动能守恒(报错 "Cannot conserve kinetic energy with fix mol/swap unless per-type masses")。温度参数内部换算为beta = 1/(boltz*T),其中boltz随units风格变化(见 src/MC/fix_mol_swap.cpp#L91-L102)。

文档给出的标准示例:

fix 2 all mol/swap 100 1 2 3 29494 300.0 ke no fix mySwap fluid mol/swap 500 10 1 2 482798 1.0

也可以直接使用类型标签(需要先定义labelmap):

labelmap atom 1 A 2 B fix mySwap fluid mol/swap 500 10 A B 482798 1.0

其中 labelmap 命令将数字类型映射为A/B等符号名,使脚本可读性更好。

2. 两大典型应用场景

文档明确了两种用途,都是"用 MC 加速动力学难以完成的构型采样":

  1. 分子混合性(miscibility)判定:体系中含一类分子的原子为 itype、另一类分子的原子为 jtype。fix 会随机选一个分子,尝试把其中所有 itype 换成 jtype(或反向)。由于交换只有在能量上有利时才被接受,因此可以比纯动力学更快地判断两种分子是否互溶。
  2. 双嵌段共聚物(diblock co-polymer):两条嵌段分别由 itype 和 jtype 单体组成。fix 随机选一个分子并尝试把该分子内所有 itype 与 jtype 单体互换,从而快速找到两种"口味"共聚物能量上有利的配比。

examples/mc/in.mixed 与 examples/mc/in.pure 正是第一类场景的对照实验:初始体系都是 50/50 的 type 1 与 type 2 链,仅改变交叉作用强度epsilon12。

3. 工作机制细节

3.1 随机分子选取:loID/hiID 预计算

分子 ID 的取值范围在每次 run 开始前预计算:minmol/maxmol分别是"含有 itype 或 jtype 原子"的最小/最大 molecule ID(且原子必须属于 fix 组)。源码中通过遍历本进程原子后MPI_Allreduce归并得到全局值(src/MC/fix_mol_swap.cpp#L171-L196)。每次尝试时在该闭区间内均匀随机取一个 molID:

tagint molID = minmol + static_cast<tagint>(random->uniform() * (maxmol - minmol + 1));

由此得到两条实践结论(与文档一致):

  • 若 loID 与 hiID 之间存在大量不含itype/jtype 原子的 molecule ID,随机命中率低,fix 会非常"低效";
  • molecule ID = 0 的原子不被视为分子,fix 默认把它们当作溶剂原子/分子而跳过(源码循环中if (molecule[i] == 0) continue;)。

此外,候选原子必须同时在 fix 的 group 内(mask[i] & groupbit);被选中分子内既非 itype 也非 jtype 的原子不参与交换、被忽略。

3.2 电荷互换的前置条件

若体系定义了电荷(atom->q_flag),原子类型互换时电荷值会一起互换。这要求系统中所有 itype 原子电荷相同、所有 jtype 原子电荷相同。init()中会做全库校验:先MPI_Allreduce求出各类型的代表性电荷iq/jq,再扫描确认无异常值;一旦校验失败,qflag置 0 并发出警告 "Cannot swap charges in fix mol/swap"(src/MC/fix_mol_swap.cpp#L213-L244)。

3.3 ke 关键字:动能守恒的速度重标

默认ke = yes。若 itype 与 jtype 质量不同,交换发生时该原子速度整体乘以质量比的平方根,以守恒其动能:

i2j_vscale = sqrt(mass[itype] / mass[jtype]); j2i_vscale = sqrt(mass[jtype] / mass[itype]);

(src/MC/fix_mol_swap.cpp#L202-L208)。若两类质量相同,ke_flag会被自动关闭(无重标必要)。ke no则完全不动速度。

3.4 Metropolis 准则与能量计算

每次交换尝试都计算整个体系交换前后的势能,用温度 T 做 Metropolis 判定:

if (random->uniform() < exp(beta * (energy_before - energy_after))) { 接受 }

接受则更新缓存能量并(若启用可视化)记录被交换原子;拒绝则把所有交换过的属性原路反转回滚(src/MC/fix_mol_swap.cpp#L384-L429)。

energy_full()的能耗范围由源码直接给出(src/MC/fix_mol_swap.cpp#L436-L458),以ENERGY_GLOBAL | ENERGY_ONLY标志依次调用:

  • 对原子体系:pair、bond、angle、dihedral、improper的 compute(仅当atom->molecular != ATOMIC);
  • kspace长程静电(若定义);
  • modify->pre_force/post_force(把其它 fix 的势能贡献纳入);
  • 最后读取内置thermo_pecompute 的标量值。

因此该 fix 天然支持文档列出的特性:manybody pair(含 EAM)、hybrid pair、kspace 长程静电、triclinic 盒子、以及其它 fix 带来的势能贡献。

注意:若某个 fix 带有势能贡献(如 fix efield、fix gravity、fix addforce、fix langevin、fix restrain、fix temp/berendsen、fix temp/rescale、wall 类 fix),你必须先用 fix_modify 的energy选项启用该 fix 的势能记账,它才会进入交换判据所用的总势能。各 fix 文档页会注明是否应当这样做。

3.5 效率提示:cutoff 不等时的邻域重建

init()会检查pair->cutsq中 itype 与 jtype 对所有第三类原子的 cutoff 是否一致,结果存入unequal_cutoffs(src/MC/fix_mol_swap.cpp#L246-L253)。若不一致,每次尝试交换后必须执行完整的comm->exchange()+comm->borders()+neighbor->build(1)重建邻表;若一致,则只通过comm->forward_comm(this)把 type(及 charge)同步给 ghost 原子,代价小得多。文档据此提醒:当 N 很小或 X 很大且 cutoff 不相等时,每次尝试都重建邻域清单可能相当昂贵。

4. 源码实现剖析

4.1 挂载点:PRE_EXCHANGE 钩子

fix 通过setmask()返回PRE_EXCHANGE(src/MC/fix_mol_swap.cpp#L153-L158),即每次时间步的 Verlet 主循环中在交换原子数据之前被调用。pre_exchange()的流程为(src/MC/fix_mol_swap.cpp#L260-L306):

  1. 若非预定步(next_reneighbor != update->ntimestep)直接返回——注意该 fix 借用next_reneighbor字段记录下一次 MC 交换步,步长即nevery;
  2. 若为 triclinic 做 x2lamda 变换、domain->pbc()、comm->exchange()、comm->borders(),随后neighbor->build(1)确保邻表就绪;
  3. energy_stored = energy_full()缓存当前态能量;
  4. 循环ncycles次调用attempt_swap()并累加接受数;
  5. 更新累计统计nswap_attempt/nswap_accept,并把next_reneighbor推进nevery步;
  6. 若启用可视化,对vizatoms中已记录的原子做"老化"(高亮剩余步数减nevery,过期删除)。

随机数使用RanPark(random_park.h 风格的全进程同步 RNG),所有 rank 生成相同随机序列,保证 MC 决策跨进程一致。

4.2 幽灵原子同步

由于交换修改了 type/charge 这些参与力计算的字段,需要把改动同步到 ghost 原子。fix 声明了comm_forward(有电荷时为 2 个双精度字段,否则 1 个),并实现pack_forward_comm/unpack_forward_comm(src/MC/fix_mol_swap.cpp#L462-L508):无邻表重建时仅走这条轻量通信路径。

4.3 与 /intel pair 的兼容性限制

init()中显式检查:若 pair style 带/intel后缀则直接报错 "Fix mol/swap is not compatible with /intel pair styles"(src/MC/fix_mol_swap.cpp#L164-L165)。使用 Intel 优化内核的 pair 风格时请注意规避。

5. 实战示例:分子混合/分相对照实验

examples/mc/in.mixed 完整展示了典型用法(fene 键 + cosine 角的 LJ 链体系):

units lj atom_style angle neighbor 0.36 bin neigh_modify delay 0 pair_style lj/cut 1.1224620483 bond_style fene angle_style cosine special_bonds lj 0.0 1.0 1.0 read_data data.bead pair_coeff * * 1.0 1.0 1.1224620483 pair_coeff 1 2 1.02 1.0 1.1224620483 bond_coeff 1 30.0 1.5 1.0 1.0 angle_coeff 1 1.500 pair_modify shift yes timestep 0.010 fix 1 all langevin 1.0 1.0 100.0 702547 fix 2 all nve fix 3 all mol/swap 100 1 1 2 482794 1.0 compute p all pressure thermo_temp thermo 1000 thermo_style custom step temp etotal press f_3[1] f_3[2] v_count1 v_count2 run 50000

要点解读:

  • fix 3 all mol/swap 100 1 1 2 482794 1.0:每 100 步尝试 1 次 1↔2 型原子互换,温度 1.0(LJ 单位);
  • f_3[1]/f_3[2]正是本 fix 的全局向量两项(交换尝试数/接受数),可直接进thermo_style输出;
  • 脚本用动态 group +count变量跟踪两类原子数量,观察体系是保持混合还是分相。

运行日志印证了两种物理图景(日志文件 examples/mc/log.13Oct21.mixed.g++.4、examples/mc/log.13Oct21.pure.g++.4):

  • in.mixed(epsilon12 = 1.02,交叉作用与同种作用近似相等):50000 步时 500 次尝试、468 次接受,两类原子数停留在 2240/1760 附近的混合态——体系"本应"保持混合,MC 加速其在该混合态内弛豫;
  • in.pure(epsilon12 = 1.1,交叉作用更强):500 次尝试、192 次接受,最终计数为 3920/80——体系向"几乎单一类型"的平衡态相分离,而纯 MD 达到该状态会非常缓慢。

注意该例中两类原子的 pair cutoff 相同,因此交换走的是轻量 ghost 同步路径而非全量邻表重建。

6. dump image 可视化支持

自 11Feb2026 版起(文档versionadded标注),fix mol/swap支持 dump image 的fix关键字:当某次交换被接受时,fix 会把参与交换的原子几何信息传给dump image,以附加球体(spheres)形式高亮显示这些原子。

关键行为(源码image()与vizatoms机制,src/MC/fix_mol_swap.cpp#L569-L602):

  • 高亮显示时长由vizsteps控制,默认 1000(可通过 fix_modify 的vizsteps选项修改,对应modify_param,src/MC/fix_mol_swap.cpp#L140-L149);若原子参与多次交换,则以其最后一次交换的步数为准;
  • 前提条件:必须存在 atom map(atom_modify map),否则构造时vizsteps置 0,若仍尝试用dump image fix会报错 "Cannot use fix mol/swap in dump image without an atom map";
  • 球体颜色:color style 为 "type" 或 "element" 时默认为原子交换前的类型色;color style 为 "const" 时默认为 white,可用dump_modify fcolor修改;
  • 透明度默认为完全不透明,可用dump_modify ftrans修改;
  • dump image fix的fflag1对本 fix 无效;由于 fix 内部把球体半径置 0,球体半径必须通过fflag2设置。

图形单元测试 unittest/graphics/tests/fix-image-mol-swap.yaml 给出了完整的最小复现配置:

units lj atom_style molecular atom_modify map array lattice fcc 0.8442 region box block 0 2 0 2 0 2 create_box 2 box create_atoms 1 box mass * 1.0 set region box type/fraction 2 0.4 12345 reset_atoms mol all single yes pair_style lj/cut 2.5 pair_coeff 1 1 1.0 1.0 pair_coeff 2 2 0.8 1.0 velocity all create 1.2 43265 fix integrate all nve fix mswap all mol/swap 10 1 1 2 873546 1.2 fix_modify mswap vizsteps 60 dump viz all image 50 ${imagefile} type type size 200 200 zoom 1.4 view 60 30 box yes 0.02 fix mswap const 0 0.7 dump_modify viz backcolor black adiam 1 0.5 adiam 2 0.5 acolor 1 gray acolor 2 red fcolor mswap cyan ftrans mswap 0.6 run 100

其中fix mswap const 0 0.7的第二个数 0.7 即fflag2(附加球体半径),fcolor mswap cyan/ftrans mswap 0.6分别指定高亮球颜色与透明度。

7. 重启、输出与使用限制

7.1 二进制重启

fix 会把完整状态写入 binary restart 文件:随机数发生器状态、下一次 MC 交换步(next_reneighbor)、累计尝试数与接受数、当前时间步(src/MC/fix_mol_swap.cpp#L525-L540)。读取 read_restart 后需在输入脚本中重新声明该 fix,使 MC 过程无缝继续。源码在restart()中显式校验时间步未被改动,若不一致直接报错:

if (ntimestep_restart != update->ntimestep) error->all(FLERR, "Must not reset timestep when restarting fix mol/swap");

即:读 restart 后不得再用 reset_timestep 修改时间步,fix 会检测到并终止运行。

7.2 全局向量输出

fix 计算一个长度为 2 的全局向量("intensive" 量),可通过各类 输出命令 访问:

分量含义
f_?/f_?[1]第 1 项累计 swap attempts(交换尝试次数)
第 2 项累计 swap accepts(交换接受次数)

第 2 项 / 第 1 项即 MC 接受率,是判断交换温度 T 与采样效率的直观指标。

其余使用限制:

  • 本 fix 的任何参数都不支持run 命令的start/stop关键字;
  • 该 fix不会在 minimize 能量最小化期间被调用;
  • 各 fix_modify 通用选项均与本 fix 无关(vizsteps是唯一的例外选项)。

8. 包依赖、构建与相关命令

fix mol/swap属于MC 包(见 Packages 文档),仅当 LAMMPS 构建时启用了 MC 包才可用。源文件 src/MC/fix_mol_swap.cpp / src/MC/fix_mol_swap.h 通过 src/MC/Install.sh 登记安装。以传统构建脚本为例:

cd src make package-mc make mpi # 或 serial 等目标

若使用 CMake 构建,则在 configure 时启用mc包(如cmake -DLAMMPS_PACKAGES="mc" ..),具体选项见 Build package 文档页。

功能相近的相关命令:fix atom/swap(单个原子位置层面的互换)与 fix gcmc(巨正则 Monte Carlo)。

9. 默认值小结

  • ke = yes(唯一可选关键字的默认值);
  • vizsteps = 1000(仅在存在 atom map 时生效,否则为 0,即不启用可视化)。

10. 关键文件索引

路径内容
doc/src/fix_mol_swap.rst本文依据的官方命令文档
src/MC/fix_mol_swap.cpp实现:MC 交换循环、Metropolis 判定、能耗、重启、image 可视化
src/MC/fix_mol_swap.h类定义与成员变量(nevery、ncycles、vizatoms等)
examples/mc/in.mixed、examples/mc/in.pure混合性/分相对照示例脚本
unittest/graphics/tests/fix-image-mol-swap.yamldump image fix可视化图形回归测试

实践建议:优先让 itype/jtype 对所有第三类原子的 cutoff 保持一致以避免逐次邻表重建;molecule ID 尽量连续、少留空洞;若需要把外部 fix 的势能纳入交换判据,记得先fix_modify ... energy yes;重启时保持reset_timestep不变;用thermo_style custom ... f_<ID>[1] f_<ID>[2]持续监控接受率以校准 MC 温度 T 与尝试频率 X/N。

  • 科研
  • 科学计算
  • 高性能计算

【免费下载链接】lammps

Public development project of the LAMMPS MD software package

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

相关推荐

上一篇:抖音批量下载终极指南:douyin-downloader 从安装到全量抓取的一站式实战手册
下一篇:IronClaw 文档工程实战:基于 Mintlify 的站点配置、MDX 写作与发布规范

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进