☰
LAMMPS fix neighbor/swap 命令深度解析:基于 Voronoi 邻居的 MD-kMC 加速扩散模拟
2026/10/16 5:54:31 网站建设 项目流程
  • 科研
  • 科学计算
  • 高性能计算

【免费下载链接】lammps

Public development project of the LAMMPS MD software package

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

导读:本文围绕 LAMMPS 的fix neighbor/swap命令(MC 包,版本 22Jul2025 引入)展开,讲解如何通过 Monte-Carlo 原子交换实现 MD 与 kinetic Monte Carlo(kMC)混合的加速扩散模拟。读者将掌握该命令的完整语法、types/diff/ke/region/rates各关键字的语义与配置方法、与compute voronoi/atom的配合方式、源码级实现原理与性能注意事项,并能直接运行仓库中附带的真实测试脚本。

1. 命令是什么:让 MD 模拟"跑得更快"的邻居原子交换

传统 MD 的时间尺度通常在纳秒量级,对于依赖稀有事件(如固体中的原子扩散)的动力学过程,天然难以在合理时间内采样到足够多的跃迁事件。fix neighbor/swap的出发点正是解耦两条时间尺度:

  • MD 原子振动时间尺度(由常规时间积分推进);
  • 原子跳跃(kMC 事件)时间尺度(由蒙特卡洛交换推进)。

该 fix 会在每N步 MD 之后暂停积分,执行X次"邻居原子位置交换"尝试,并用 Metropolis 判据决定接受与否,从而以 kMC 的方式加速稀有跳跃事件的采样,近似模拟扩散过程。相关算法细节可参考 (Tavenner 2023)(Computational Materials Science, 218, 111929),源码中也通过citeme机制自动写入该文献引用(见 src/MC/fix_neighbor_swap.cpp)。

与 fix atom/swap(在全域任意位置随机配对交换)不同,fix neighbor/swap将交换候选限制为Voronoi 拓扑邻居,从而天然贴合"近邻跳跃"的物理图像,构成混合 MD/kMC 模拟。

2. 完整语法与参数总览

fix ID group-ID neighbor/swap N X seed T R0 voro-ID keyword values ...
参数含义约束
ID、group-IDfix 标识符与作用原子组见 fix 命令
N每隔 N 步执行一次 MC 交换正整数(源码要求nevery > 0)
X每次执行时尝试交换的次数非负整数(源码要求ncycles >= 0)
seed随机数种子正整数
TMC 交换的缩放温度(温度单位)> 0,用于 Metropolis 判据beta = 1/(k_B·T)
R0交换概率的距离缩放半径(距离单位)> 0,概率权重exp(-(r/R0)²)中的r_0
voro-IDcompute voronoi/atom的 compute-ID必须存在且输出合法邻居列表

关键字(keyword = types | diff | ke | region | rates):

  • types与diff互斥,且必须指定其一;
  • types值 = 两个及以上原子类型([1, Ntypes]整数或类型标签);
  • diff值 = 单个原子类型;
  • ke值 =yes(默认)或no:交换后是否缩放速度以守恒动能;
  • region值 = region-ID:将交换限制在几何区域内;
  • rates值 =V1 V2 ... Vntypes(无量纲):为不同原子类型的 J 原子设置扩散速率权重。

仓库文档 fix_neighbor_swap.rst 给出的标准示例:

compute voroN all voronoi/atom neighbors yes fix mc all neighbor/swap 10 160 15238 1000.0 3.0 voroN diff 2 fix myFix all neighbor/swap 100 1 12345 298.0 3.0 voroN region my_swap_region types 5 6 fix kmc all neighbor/swap 1 100 345 1.0 3.0 voroN diff 3 rates 3 1 6

3. 工作原理与算法流程

3.1 邻居如何定义

邻居关系由 compute voronoi/atom 产生的 Voronoi 剖分定义:两个原子是邻居,当且仅当它们的 Voronoi 胞共享一个公共面(3d)或公共边(2d)。因此该 fix 强制要求compute voronoi/atom使用neighbors yes选项:

compute compute-ID group-ID voronoi/atom neighbors yes

neighbors yes会让 compute 额外输出一个 3 列的 local 数组(每行对应每个胞的每个面):胞归属原子 ID、邻居原子 ID(外表面为 0)、面面积。源码在构造函数中严格校验:c_voro->local_flag必须开启,且size_local_cols == 3(见 fix_neighbor_swap.cpp)。

3.2 每次调用执行的完整流程

对应文档描述,算法步骤如下:

  1. 暂停 MD:MD 每运行N步,fix 在pre_exchange()中触发(源码setmask()仅注册PRE_EXCHANGE,见 fix_neighbor_swap.cpp);
  2. 执行 Voronoi 剖分:对当前构型调用c_voro->compute_local()获取邻居列表;
  3. 尝试 X 次交换:依次执行attempt_swap();
  4. 随机选 I:从types第一个类型(或diff指定类型)的原子中均匀随机选一个中心原子 I(全局范围内按MPI_Allreduce+ 序号偏移选择,见 pick_i_swap_atom);
  5. 距离加权选 J:在 I 的 Voronoi 邻居中,按距离加权概率选择交换伙伴 J;
  6. 全局能量评估:将 I、J 原子 ID 通信到所有处理器,对交换后的系统做全局能量计算;
  7. Metropolis 判据:依据能量变化与温度 T 决定接受或拒绝。

3.3 距离加权概率与 R0 的物理含义

J 被选中的概率由以下公式给出:

p_ij = exp( -(r_ij / r_0)² )

其中r_ij是原子 I、J 的距离,r_0即参数R0。源码中实现为exp(-square(r * inv_r_0))(见 fix_neighbor_swap.cpp)。距离越近的邻居被选中的概率越高,这与 kMC"按相对概率挑选下一事件"的思路一致。通常取R0为平均最近邻间距量级即可;由于它只是概率加权,交换行为对R0的精确取值并不敏感。

文档同时强调该加权还隐含一种限制作用:在自由表面附近的 Voronoi 剖分可能出现不合理的远距离"邻居",距离加权会天然压低这类配对被选中的概率,避免交换超出合理截断范围。

3.4 Metropolis 判据与动能守恒

接受概率由能量差驱动:

accept 当 random_uniform < exp( beta × (E_before - E_after) )

其中beta = 1/(k_B·T),E_before/E_after为交换前后的全局总势能(见 attempt_swap 中的energy_full()计算)。若ke yes(默认),交换后按两原子类型质量比sqrt(m_i/m_j)缩放各自速度,确保系统动能守恒;若ke no则不缩放。一个值得注意的实现细节:当被选中的 I、J 类型相同(典型于diff模式下的自扩散),系统状态无变化,交换直接计为成功(源码中if (itype == jtype) return 1,见 fix_neighbor_swap.cpp),此时不需要能量评估。

4. 构建与运行前置条件

  • MC 包:该 fix 属于 MC 包,必须启用PKG_MC编译;同时依赖 VORONOI 包(PKG_VORONOI,需要系统装有 Voro++ 库),否则 fix 无法编译。仓库中 Packages_details.rst 的 MC 包条目列出了本命令。
  • compute voronoi/atom 前置声明:voro-ID必须引用一个已定义的、neighbors yes的 voronoi compute。
  • group 范围匹配:voronoi compute 的 group 应覆盖该 fix 可能选择的所有原子——使用types时,group 应包含与types关键字一致的原子;使用diff时,group 应包含模拟中所有类型的原子(因为 J 可以是任意类型,包括与 I 同类型以覆盖自扩散)。
  • 与 /intel 后缀不兼容:init()中显式检查,若 pair style 带/intel后缀会报错(见 fix_neighbor_swap.cpp)。

5. 关键字的语义与配置要点

5.1types:定向交换

types接收两个及以上原子类型。只有第一个类型的原子会被选为 I;其余类型的原子才作为候选交换伙伴 J。例如types 5 6表示只选类型 5 原子为 I,类型 6 原子为 J。源码要求至少两个类型(nswaptypes < 2时报错)。

5.2diff:扩散模式

diff只接收一个原子类型。I 仅从该类型原子中选出;而J 可以是所有剩余类型,包括与 I 相同的类型——这一设定专门用于覆盖同种原子间的自扩散跳跃(self-diffusive hops)。它比types更贴合"扩散"的物理场景,也是示例脚本采用的形式。

5.3ke:动能守恒开关

  • yes(默认):交换的两个原子质量不同时,按质量比sqrt(m_i/m_j)缩放各自速度,守恒系统动能;
  • no:不做缩放,动能不守恒。

限制:对于没有 per-type 质量体系的 atom style(如sphere),必须设ke off,否则算法无法正确重缩放速度。源码init()中还会校验:开启ke时若使用 per-atom 质量,同一类型的原子质量必须一致,否则报错;若体系带电荷(q_flag),同一交换类型的原子电荷也须一致(分别见 fix_neighbor_swap.cpp)。

5.4region:空间限定

region region-ID将 I、J 限制在几何区域内,需先用region命令定义。此时 voronoi compute 的 group 也只需包含区域内的原子(源码在update_iswap_atoms_list()与build_i_neighbor_list()中对region->match(x)逐原子判定,见 fix_neighbor_swap.cpp)。

5.5rates:按类型差异化扩散速率

rates需要恰好给出Ntypes个值(Ntypes= 体系原子类型总数),每个值缩放对应类型 J 原子的概率权重:

p_ij = V_type(J) × exp( -(r_ij / r_0)² )

以文档示例fix kmc all neighbor/swap 1 100 345 1.0 3.0 voroN diff 3 rates 3 1 6为例:体系有 3 种原子,I 为类型 1;假定 J 原子等距时,类型 1 的 J 被选概率是类型 2 的 3 倍,类型 3 的 J 是类型 2 的 6.5 倍。若不使用rates,所有类型的 J 在选取时概率相等。源码要求rates的值个数必须等于ntypes,否则报错(见 fix_neighbor_swap.cpp)。

6. 实战脚本:仓库自带的 MEAM 加速扩散示例

仓库 examples/PACKAGES/neighbor-swap/ 目录提供了两个真实可运行脚本(由算法作者 Jacob Tavenner 编写),用 2nn MEAM 势模拟 Mo-Co-Ni-V-Fe-Al-Cr 合金中 Ni/Cr 脉冲区域的加速扩散。核心脚本 in.KMC_pulse_center:

units metal dimension 3 boundary p p p atom_style atomic lattice fcc 3.762 region whole block 0 1 0 1 0 1 create_box 2 whole create_atoms 1 region whole replicate 6 16 6 region puck block INF INF 7 9 INF INF set region puck type 2 pair_style meam pair_coeff * * library_2nn.meam Mo Co Ni V Fe Al Cr MoCoNiVFeAlCr_2nn.meam Ni Cr timestep 0.002 thermo 100 compute voroN all voronoi/atom neighbors yes run 0 thermo_style custom step temp press pxx pyy pzz lx ly lz vol pe velocity all create 2400 908124 loop geom fix temp all npt temp 1000 1000 1000 aniso 0 0 1 fix mc all neighbor/swap 50 12 1340723 1000 3.0 voroN diff 2 thermo_style custom step temp press pxx pyy pzz lx ly lz vol pe f_mc[*] run 1000

要点解读:

  • 交换配置:每 50 步执行 12 次交换,种子 1340723,缩放温度 1000 K,R0 = 3.0(约等于最近邻间距量级),diff 2表示类型 2(Cr)原子为扩散主体,J 可为任意类型(含自扩散);
  • 输出:thermo_style中的f_mc[*]输出该 fix 的全局向量——即累计的交换尝试次数与接受次数,可直接观测扩散进程;
  • 姊妹脚本 in.KMC_pulse_edge 将脉冲区域放到盒子边缘(region puck block INF INF INF 2 INF INF),用于对照表面附近的扩散行为。

7. 源码级实现细节与并行机制

7.1 核心调用链

pre_exchange()(fix_neighbor_swap.cpp)是执行入口:

  1. 判断next_reneighbor == ntimestep,否则直接返回;
  2. 确保系统可计算能量:处理 triclinic 坐标变换、pbc()、comm->exchange()、comm->borders()、neighbor->build(1);
  3. energy_stored = energy_full()缓存当前能量;
  4. 循环ncycles次调用attempt_swap(),累计成功数;
  5. 更新nswap_attempts/nswap_successes统计,推进next_reneighbor += nevery。

构造函数中设定了force_reneighbor = 1,强制每次 MC 周期前重建邻居列表。

7.2 全局能量评估energy_full()

能量计算仅求全局标量(ENERGY_GLOBAL | ENERGY_ONLY、VIRIAL_NONE),依次调用 pair(含 kspace)、以及分子体系下的 bond/angle/dihedral/improper 计算,最终从thermo_pecompute 读取标量值(见 fix_neighbor_swap.cpp)。因此即使使用 EAM、多体势、长程静电等复杂势也能正确评估交换能量差。

7.3 全局分布式随机选择

I 的选取采用"全局序号 + MPI 扫描"模式:各处理器统计本地的候选 I 数量(niswap_local),通过MPI_Allreduce得到全局总数niswap,再用MPI_Scan得到本处理器之前的累计数,进而将全局随机序号映射到本地原子(pick_i_swap_atom)。J 的选取同理:所有处理器先各自累加本地概率local_probability,全局求和得global_probability,再生成[0, global_probability)的随机数,通过prev_probability定位到所属处理器并线性搜索命中邻居(pick_j_swap_neighbor)。所有处理器使用同一RanPark随机数发生器、同一种子,保证随机序列一致。

7.4 交换动作与邻居列表重建

交换不仅改变type,还同步更新电荷q与 per-atom 质量rmass(若存在)。关键优化逻辑在unequal_cutoffs:

  • 若 pair style 对不同类型(或类型对)使用不同截断(init()中通过cutsq矩阵比对得出),交换后必须重新comm->borders()并重建邻居列表,才能保证后交换能量正确;
  • 若所有截断相同,则只需comm->forward_comm(this)通信 ghost 原子的类型/电荷即可,开销小得多。

这解释了文档的性能注意事项第 3 条:不同截断的 pair style 会显著拖慢 MC 部分。

8. 性能与效率注意事项

  1. 单次全局能量评估的成本与一个 MD 步相当——这是 MC 交换的主要开销来源;
  2. 并行效率特点:与其他 LAMMPS MC 算法类似,每个处理器上的原子数比常规 MD 更少时并行效率更高——能量评估成本随原子数增加,而固定步数下的通信成本相对恒定;
  3. 不同截断的惩罚:若 pair style 对不同原子类型使用不同截断,每次交换都需要重建邻居列表,MC 部分会"戏剧性"变慢;
  4. MC-only 模式:若只跑 MC 不跑 MD,应不定义时间积分 fix、thermo 1、N = 1、X取足够小以观察系统 MC 演化;但X太小会导致每个时间步启停 MC 的固定开销拖慢整体。

9. dump image 可视化支持

自 11Feb2026 版本起,该 fix 支持dump image的fix关键字(graphics 测试见 unittest/graphics/tests/fix-image-neighbor-swap.yaml 中的fix nswap用法),可将参与交换的原子以额外球体高亮:

  • 高亮持续时间由vizsteps控制(默认 1000 步),可用fix_modify <fix-name> vizsteps N修改;原子多次参与交换时,按最后一次交换的时间步判断是否继续显示;
  • 颜色:type/element颜色风格下默认使用交换前的原子类型颜色;const风格默认白色,可用dump_modify fcolor修改;透明度默认不透明,可用dump_modify ftrans调整;
  • fflag1设置无效果;fflag2用于设置附加球体的半径(内部半径被置为 0);
  • 可视化需要原子映射(atom_modify map array),无映射时该功能自动禁用(vizsteps = 0),使用时报错提示(见 fix_neighbor_swap.cpp 与image()实现)。

10. 输出、重启与限制

10.1 输出向量

fix 计算长度为 2 的全局向量("intensive"),可通过fix-ID[1]、fix-ID[2]或f_mc[*]访问:

  1. 累计交换尝试次数(swap attempts);
  2. 累计交换接受次数(swap accepts)。

10.2 重启行为

fix 状态会写入二进制重启文件,包括 RNG 种子、下一次 MC 的时间步、尝试/成功次数(write_restart)。read_restart后需在输入脚本中重新指定 fix 以无缝继续;重启后不得用reset_timestep改变时间步,否则报错(restart())。

10.3 其他限制

  • 没有任何fix_modify选项适用于本 fix(vizsteps除外);
  • 参数不可用于run的start/stop;fix 在能量最小化期间不被调用;
  • types与diff互斥且必须二选一;types至少两个类型;
  • 引用文献:(Tavenner 2023) J Tavenner, M Mendelev, J Lawson, Computational Materials Science, 218, 111929 (2023)。

10.4 默认值

ke = yes,所有原子类型rates = 1。

11. 相关命令

  • 时间积分:fix nvt(fix_nh);
  • 邻居计算:compute voronoi/atom;
  • 同类 MC 交换:fix atom/swap、fix mol/swap、fix gcmc、fix sgcmc;
  • 原子操作:delete_atoms。

相比全域配对的fix atom/swap,fix neighbor/swap通过 Voronoi 拓扑限定交换范围、并以距离加权概率选取伙伴,是面向"加速稀有扩散事件"场景的 MD/kMC 混合方案,尤其适用于晶体固体中的原子迁移模拟。

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

【免费下载链接】lammps

Public development project of the LAMMPS MD software package

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

相关推荐

上一篇:Million.js错误处理:常见问题排查与解决方案终极指南
下一篇:多域名邮件服务器终极配置:docker-mailserver虚拟域名管理完全指南

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

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

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

立即咨询