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

发布时间:2026/10/16 2:44:48
LAMMPS fix mol/swap 命令详解:分子内原子类型 Monte Carlo 互换的实现原理与实战
科研科学计算高性能计算【免费下载链接】lammpsPublic 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若使用按原子质量的massatom-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也可以直接使用类型标签需要先定义labelmaplabelmap atom 1 A 2 B fix mySwap fluid mol/swap 500 10 A B 482798 1.0其中 labelmap 命令将数字类型映射为A/B等符号名使脚本可读性更好。2. 两大典型应用场景文档明确了两种用途都是用 MC 加速动力学难以完成的构型采样分子混合性miscibility判定体系中含一类分子的原子为 itype、另一类分子的原子为 jtype。fix 会随机选一个分子尝试把其中所有 itype 换成 jtype或反向。由于交换只有在能量上有利时才被接受因此可以比纯动力学更快地判断两种分子是否互溶。双嵌段共聚物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。每次尝试时在该闭区间内均匀随机取一个 molIDtagint molID minmol static_casttagint(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/swapsrc/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 ! ATOMICkspace长程静电若定义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_cutoffssrc/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_EXCHANGEsrc/MC/fix_mol_swap.cpp#L153-L158即每次时间步的 Verlet 主循环中在交换原子数据之前被调用。pre_exchange()的流程为src/MC/fix_mol_swap.cpp#L260-L306若非预定步next_reneighbor ! update-ntimestep直接返回——注意该 fix 借用next_reneighbor字段记录下一次 MC 交换步步长即nevery若为 triclinic 做 x2lamda 变换、domain-pbc()、comm-exchange()、comm-borders()随后neighbor-build(1)确保邻表就绪energy_stored energy_full()缓存当前态能量循环ncycles次调用attempt_swap()并累加接受数更新累计统计nswap_attempt/nswap_accept并把next_reneighbor推进nevery步若启用可视化对vizatoms中已记录的原子做老化高亮剩余步数减nevery过期删除。随机数使用RanParkrandom_park.h 风格的全进程同步 RNG所有 rank 生成相同随机序列保证 MC 决策跨进程一致。4.2 幽灵原子同步由于交换修改了 type/charge 这些参与力计算的字段需要把改动同步到 ghost 原子。fix 声明了comm_forward有电荷时为 2 个双精度字段否则 1 个并实现pack_forward_comm/unpack_forward_commsrc/MC/fix_mol_swap.cpp#L462-L508无邻表重建时仅走这条轻量通信路径。4.3 与 /intel pair 的兼容性限制init()中显式检查若 pair style 带/intel后缀则直接报错 Fix mol/swap is not compatible with /intel pair stylessrc/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.0LJ 单位f_3[1]/f_3[2]正是本 fix 的全局向量两项交换尝试数/接受数可直接进thermo_style输出脚本用动态 group count变量跟踪两类原子数量观察体系是保持混合还是分相。运行日志印证了两种物理图景日志文件 examples/mc/log.13Oct21.mixed.g.4、examples/mc/log.13Oct21.pure.g.4in.mixedepsilon12 1.02交叉作用与同种作用近似相等50000 步时 500 次尝试、468 次接受两类原子数停留在 2240/1760 附近的混合态——体系本应保持混合MC 加速其在该混合态内弛豫in.pureepsilon12 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_paramsrc/MC/fix_mol_swap.cpp#L140-L149若原子参与多次交换则以其最后一次交换的步数为准前提条件必须存在 atom mapatom_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_PACKAGESmc ..具体选项见 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。赞分享科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载相关推荐LAMMPS fix settorque/atom 命令详解逐原子设定有限尺寸粒子扭矩的原理与实战LAMMPS fix settorque/atom 命令详解逐原子设定有限尺寸粒子扭矩的原理与实战 fix settorque/atom 是 LAMMPS G科研科学计算高性能计算LAMMPS fix atom/swap 蒙特卡洛原子交换详解语法、参数与源码原理LAMMPS fix atom/swap 蒙特卡洛原子交换详解语法、参数与源码原理 本指南系统讲解 LAMMPS MC 包中的 fix atom/swap 命科研科学计算高性能计算LAMMPS fix drude 命令全解析热化 Drude 振子极化模型的三类原子标记与实战配置LAMMPS fix drude 命令全解析热化 Drude 振子极化模型的三类原子标记与实战配置 fix drude 是 LAMMPS DRUDE 包th科研科学计算高性能计算上一篇抖音批量下载终极指南douyin-downloader 从安装到全量抓取的一站式实战手册下一篇IronClaw 文档工程实战基于 Mintlify 的站点配置、MDX 写作与发布规范创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考