☰
LAMMPS pair_style lambda/zone/apip 完全指南:APIP 自适应精度势的空间过渡区计算
2026/10/16 2:39:58 网站建设 项目流程
  • 科研
  • 科学计算
  • 高性能计算

【免费下载链接】lammps

Public development project of the LAMMPS MD software package

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

pair_style lambda/zone/apip是 LAMMPS APIP(Adaptive-Precision Interatomic Potentials,自适应精度原子间势)包中的关键组件,负责在力计算阶段为每个原子计算空间过渡区切换参数 λ_min,i。本指南围绕该 pair style 的语法、配置、源码实现与配套生态展开,帮助读者理解如何用 EAM+ACE 等"快慢势组合"构建可在仿真中动态切换精度的高效原子模拟。

1. 概述:APIP 与空间过渡区

1.1 APIP 方法背景

机器学习势(如 ACE)虽能接近 DFT 精度,但其力计算开销远超传统经验势(如 EAM)。APIP 的核心思想是:在模拟中只对部分原子使用高精度(但昂贵)的 ML 势,其余原子使用快速势,从而在精度与计算规模之间取得平衡。

原子 i 的势能由切换参数 λ_i ∈ [0,1] 加权:

E_i = λ_i · E_i^(fast) + (1 - λ_i) · E_i^(precise)

其中 E_i^(fast) 为快速势(如 EAM),E_i^(precise) 为精确势(如 ACE)。当多数原子 λ_i = 1 时,即可节省大量计算时间。

1.2 空间过渡区的必要性

若仅根据某个输入信号(如 CSP 中心对称参数)直接决定每个原子的精度,会导致快/慢势分区边界过于突兀。为平滑过渡,LAMMPS 引入空间过渡区:一个原子的切换参数不仅取决于自身的输入信号,还受其近邻原子影响——即pair_style lambda/zone/apip计算的 λ_min,i。

λ_min,i 的定义为:

λ_min,i(t) = min{ 1 - (1 - λ_0,j(t)) · f^(cut)((r_ij(t) - r_λ,lo) / (r_λ,hi - r_λ,lo)) : j ∈ Ω_λ,i }

其中 r_λ,lo 与 r_λ,hi 是径向过渡区阈值,Ω_λ,i 是原子 i 的近邻集合,f^(cut) 为在 [0,1] 上从 1 衰减到 0 的截止函数。

2. 命令语法与基本用法

2.1 语法

pair_style lambda/zone/apip cutoff
  • lambda/zone/apip:该 pair style 的名称
  • cutoff:全局截断距离(距离单位)

2.2 示例

pair_style lambda/zone/apip 12.0

2.3 关键设计:只接受一个参数

该 pair style 仅接受全局 cutoff 一个参数。计算 λ_min,i 所需的其他量(r_λ,lo、r_λ,hi、λ_non_group 等)均从fix lambda/apip中提取,无需在此处重复传入。

⚠️ 重要提示:本 pair style 的 cutoff 参数只影响邻居列表的构建。定义 r_λ,hi 和 r_λ,lo 的半径由fix lambda/apip的time_averaged_zone参数决定。若r_λ,hi > cutoff,初始化时会直接报错(详见 pair_lambda_zone_apip.cpp 的init_style检查)。

2.4 为什么由 pair style 而不是 fix 计算

计算 λ_min,i 需要遍历近邻列表,耗时较大。将该计算放在 pair style 中,可以纳入fix atom_weight/apip的负载均衡体系——即用extract("lambda/zone/apip:time_per_atom")接口报告每个原子的平均计算耗时,供负载均衡使用(见 fix_atom_weight_apip.cpp)。

3. 与 APIP 生态的组合用法

3.1 组件总览

一个完整的"动态切换参数+修正"APIP 模拟需要以下组件:

组件作用
atom_style apip存储切换参数 λ_i 等原子属性
快速势:eam/apip或pace/fast/apip计算 E_i^(fast)
精确势:pace/precise/apip计算 E_i^(precise)
pair_style lambda/input/apip(或其 CSP 变体)计算输入信号 λ_i^input
fix lambda/apip根据输入计算切换参数 λ_i
pair_style lambda/zone/apip计算空间过渡区 λ_min,i
pair_style hybrid/overlay组合上述各 pair style
fix lambda_thermostat/apip切换参数变化时的能量守恒修正
fix atom_weight/apip+fix balance原子负载估计与动态负载均衡

3.2 完整代码示例

以下是 Howto_apip.rst 与 pair_lambda_zone_apip.rst 给出的标准配置(EAM 快势 + ACE 精确势 + CSP 输入 + 空间过渡区):

pair_style hybrid/overlay eam/fs/apip pace/precise/apip lambda/input/csp/apip fcc cutoff 5.0 lambda/zone/apip 12.0 pair_coeff * * eam/fs/apip Cu.eam.fs Cu pair_coeff * * pace/precise/apip Cu_precise.yace Cu pair_coeff * * lambda/input/csp/apip pair_coeff * * lambda/zone/apip fix 2 all lambda/apip 3.0 3.5 time_averaged_zone 4.0 12.0 110 110 min_delta_lambda 0.01

各行解析:

  • pair_style hybrid/overlay ...:用 overlay 方式叠加 4 个 pair style(快势、精确势、输入计算、空间过渡区)。
  • pair_coeff * * eam/fs/apip Cu.eam.fs Cu:指定 EAM 快势文件与元素。
  • pair_coeff * * pace/precise/apip Cu_precise.yace Cu:指定 ACE 精确势文件与元素。
  • pair_coeff * * lambda/input/csp/apip:无系数文件,仅需声明。
  • pair_coeff * * lambda/zone/apip:同样无需系数文件。
  • fix 2 all lambda/apip 3.0 3.5 ...:thr_lo=3.0、thr_hi=3.5 定义 CSP 输入到切换参数的阈值区间;time_averaged_zone 4.0 12.0 110 110定义空间过渡区半径 r_λ,lo=4.0、r_λ,hi=12.0 及两段时间平均的历史长度(各 110 步);min_delta_lambda 0.01抑制数值波动。

注意:lambda/input/csp/apip的cutoff 5.0是 CSP 近邻搜索半径(默认 5.0),与lambda/zone/apip 12.0的邻居列表截断是两个不同概念。

3.3 真实示例:Cu 空位模拟

仓库 examples/PACKAGES/apip/in.vacancy.dynamic.lambda 提供了可运行的完整示例,关键片段:

units metal atom_style apip read_data data.vacancy fix nve all nve pair_style hybrid/overlay eam/fs/apip pace/apip lambda/input/csp/apip ${csp_lattice} cutoff ${csp_cutoff} lambda/zone/apip ${r_sw_hi} pair_coeff * * eam/fs/apip ${eamfs_file} Cu pair_coeff * * pace/apip ${ace_file2} Cu pair_coeff * * lambda/input/csp/apip pair_coeff * * lambda/zone/apip fix lambda all lambda/apip ${lambda_input_thr_lo} ${lambda_input_thr_hi} time_averaged_zone ${r_sw_lo} ${r_sw_hi} ${lambda_input_histlen} ${lambda_histlen} min_delta_lambda ${min_delta_lambda} fix weight_atom all atom_weight/apip 100 eam ace lambda/input lambda/zone all

其中变量定义(见该脚本顶部):

  • csp_lattice = fcc,csp_cutoff = 6.0:CSP 检测使用 fcc 晶格 12 个近邻,搜索半径 6.0。
  • r_sw_lo = 2.0,r_sw_hi = 3.0:空间过渡区径向范围。
  • lambda_input_thr_lo = 2.5,lambda_input_thr_hi = 3.0:CSP 输入阈值。
  • lambda_input_histlen = 110,lambda_histlen = 110:两段时间平均长度。
  • min_delta_lambda = 1/110:切换参数最小变化量。

该脚本还演示了:

  • 用compute property/atom apip_lambda与compute reduce sum统计简单(λ=1)、过渡(0<λ<1)、复杂(λ=0)原子数量,直观观察过渡区。
  • 通过write_restart平滑重启:由于 λ_i 与 λ_i^input 的历史被写入二进制重启文件(见下文),重启后无需重新预热时间平均。

4. 源码级原理:pair_lambda_zone_apip 的实现

4.1 类结构与初始化流程

核心类PairLambdaZoneAPIP定义在 src/APIP/pair_lambda_zone_apip.h,继承自 LAMMPS 的Pair基类,并通过PairStyle(lambda/zone/apip, PairLambdaZoneAPIP)注册。它声明了fix lambda/apip为友元类,便于二者协作。

初始化时各参数默认值均为 -1(pair_lambda_zone_apip.cpp):

  • cut_global、cut_lo、cut_hi、cut_hi_sq、cut_width、lambda_non_group
  • 计时变量:timer、n_calculations、time_per_atom

init_style()(pair_lambda_zone_apip.cpp)执行三个关键步骤:

  1. 检查原子风格:要求原子风格支持apip_lambda_input_ta字段,即必须使用atom_style apip。
  2. 定位 fix lambda/apip:用modify->get_fix_by_style("^lambda/apip")查找,要求恰好一个fix lambda/apip存在;随后通过extract("fix_lambda:cut_lo", ...)、extract("fix_lambda:cut_hi", ...)、extract("fix_lambda:cut_hi_sq", ...)、extract("fix_lambda:cut_width", ...)、extract("fix_lambda:lambda_non_group", ...)接口从 fix 中取回空间过渡区参数(这些接口定义于 fix_lambda_apip.cpp)。
  3. 注册邻居列表:neighbor->add_request(this, NeighConst::REQ_FULL | NeighConst::REQ_GHOST),请求包含 ghost 原子的完整邻居列表——因为计算 λ_min,i 需要看到其他处理器的 ghost 原子所携带的 λ 输入。

同时校验cut_hi > cut_global时报错,确保空间过渡区截断不超过邻居列表截断。

4.2 核心算法:calculate_lambda()

calculate_lambda()(pair_lambda_zone_apip.cpp)是空间过渡区计算的真正实现,分为三步:

第一步:初始化本处理器原子(own particles)的 λ 值

for (i = 0; i < nlocal; i++) { lambda_ta[i] = (mask[i] & groupbit) ? lambda_input_ta[i] : lambda_non_group; }

属于fix lambda/apip所指定 group 的原子,取其上一步的时间平均输入 λ_input_ta;不属于 group 的原子则赋固定值 λ_non_group(默认 1,即"fast")。

第二步:遍历非平凡原子(非 λ=1 原子)的近邻

if (lambda_input_ta[i] == 1 || (!(mask[i] & groupbit))) { continue; }

只有 λ_input ≠ 1(即需要精确计算或处于过渡区)且属于 group 的原子,才会影响邻居的 λ。对每个这样的原子 i,遍历其近邻 j:

  • 跳过 ghost 原子和不在 group 中的原子(只需更新本处理器原子的 λ)。
  • 若邻居 j 已经 λ_ta[j] == 0(已是最复杂状态),跳过。
  • 计算距离平方rsq,若rsq >= cut_hi_sq(即超出 r_λ,hi),跳过。
  • 否则计算候选值lambda_new = 1 - (1 - λ_input_ta[i]) · f^(cut)(r_ij),若比邻居当前的 λ_ta[j] 更小,则更新之:
if (lambda_new < lambda_ta[j]) lambda_ta[j] = lambda_new;

这正是"取最小值"语义的邻居级实现——每个原子最终取所有近邻贡献的最小值。

第三步:回写结果

for (i = 0; i < nlocal; i++) lambda_input_ta[i] = lambda_ta[i];

将计算出的 λ_min,i 写回atom->apip_lambda_input_ta,供fix lambda/apip在 post_integrate 阶段使用。

4.3 多项式截止函数

空间过渡区使用 5 次多项式截止函数(pair_lambda_zone_apip.cpp),与fix lambda/apip中阈值切换函数switching_function_poly为同一族函数(后者见 fix_lambda_apip.cpp):

double PairLambdaZoneAPIP::switching_function_poly_distance(double input) { if (input <= cut_lo) return 1; else if (input >= cut_hi) return 0; else { double deltatmp = 1 - 2 * (1 + (input - cut_hi) / cut_width); return 0.5 + 7.5 / 2. * (deltatmp / 4. - pow(deltatmp, 3) / 6. + pow(deltatmp, 5) / 20.); } }
  • 距离 ≤ r_λ,lo 时返回 1(完全保留近邻的"复杂"影响);
  • 距离 ≥ r_λ,hi 时返回 0(近邻完全不影响该原子);
  • 中间区间由多项式平滑过渡,其前两阶导数在过渡区边界处为零(源码注释指出该函数参考 Phys Rev Mat 6, 013804 (2022) 附录 C 的径向截止函数),保证切换参数的平滑性与数值稳定性。

4.4 计时与负载均衡接口

PairLambdaZoneAPIP通过extract()暴露lambda/zone/apip:time_per_atom接口(pair_lambda_zone_apip.cpp),内部累积timer与n_calculations,由calculate_time_per_atom()计算平均单原子耗时。fix atom_weight/apip通过该接口获取实测耗时(而非硬编码常数),从而为fix balance提供更精确的每原子负载估计。

4.5 计算流程中的调用关系

从fix lambda/apip的setup_pre_force(fix_lambda_apip.cpp)可以看到完整的协同流程:

  1. pair_lambda_input->calculate_lambda_input():计算输入信号 λ_i^input;
  2. update_lambda_input_history():更新输入历史(环形缓冲,见下);
  3. communicate_lambda_input_ta():将时间平均输入发送给 ghost 原子;
  4. pair_lambda_zone->calculate_lambda():即本 pair style 的空间过渡区计算;
  5. post_integrate():更新 λ 历史、施加 min_delta_lambda 抑制、回写;
  6. comm_forward_lambda():把新的 λ 与 λ_const 通信给邻居。

5. 与 fix lambda/apip 的完整数据流

5.1 切换参数计算的完整流水线

fix lambda/apip负责把输入信号转换成最终的切换参数,其完整流程为(详见 fix_lambda_apip.rst):

  1. 输入时间平均:对 λ_i^input 做 N 步时间平均(由time_averaged_zone的history_len_lambda_input控制),得到 λ_avg,i^input;
  2. 阈值切换:用阈值函数把 λ_avg,i^input 映射到 λ_0,i(thr_lo 以下为 1,thr_hi 以上为 0,中间多项式过渡);
  3. 空间过渡区(本 pair style):λ_0,i 结合近邻距离计算 λ_min,i;
  4. 切换参数时间平均:对 λ_min,i 再做 N 步平均(history_len_lambda控制),得到 λ_avg,i;
  5. 波动抑制:只有当 |λ_avg,i(t) - λ_i(t-Δt)| ≥ Δλ_min(或 λ_avg,i ∈ {0,1})时才更新 λ_i,否则沿用上一时间步的值(min_delta_lambda参数控制)。

第 5 步在 fix_lambda_apip.cpp 中实现:

lambda_const[i] = lambda[i]; lambda[i] = lambda_input_ta[i]; if (fabs(lambda[i] - lambda_const[i]) < min_delta_lambda && lambda[i] != 1 && lambda[i] != 0) lambda[i] = lambda_const[i];

其作用正如源码注释所述:"防止切换区中仅由原子热运动引起的无意义波动;0 和 1 始终允许,防止原子永久保持一个 ε 级的 λ 值"。

5.2 历史存储与平滑重启

fix lambda/apip通过内部创建的FixStoreAtom(名为<fix-id>LAMBDA_INPUT_HISTORY与<fix-id>LAMBDA_HISTORY)以环形缓冲方式保存输入与切换参数历史:

  • lambda_input_history[i][0..len-1]:过去各时间步的 λ_i^input;
  • lambda_input_history[i][len]:环形缓冲内所有值的和(增量维护,用于快速求平均);
  • lambda_input_history[i][len+1]:由时间平均输入直接算出的 λ 值;
  • 同理的lambda_history保存 λ_min 序列。

这两段历史连同history_length、history_used、history_last等标量信息都被写入二进制重启文件(fix_lambda_apip.cpp),重启时校验历史长度一致即可恢复时间平均状态,实现平滑重启。与之对照,本 pair style 本身不写任何信息到重启文件——因此,凡读取重启文件的输入脚本,都必须重新给出pair_style lambda/zone/apip与pair_coeff命令。

5.3 逐原子统计输出

若fix lambda/apip使用store_atomic_stats参数,则以逐原子数组输出 5 个量(fix_lambda_apip.cpp):

  1. λ_i^input(t):当前输入信号;
  2. λ_avg,i^input(t):输入的时间平均;
  3. λ_0,i(t):阈值切换后的值;
  4. λ_min,i(t):空间过渡区计算后的值;
  5. λ_i(t):最终切换参数。

使用dump_atomic_history参数时,还会把完整的输入/切换历史追加到该数组之后(列数相应增加),便于调试。该数组可由dump、compute等输出命令访问。

6. 限制与约束(Restrictions)

以下限制均须在配置脚本中满足,否则运行时报错或行为不符合预期:

  1. 必须启用 APIP 包:本 pair style(及配套 fix)属于 APIP 包,只有 LAMMPS 以该包构建时才可用。构建方式参见 Build_package。
  2. 必须与fix lambda/apip配对使用:本 pair style 仅为fix lambda/apip服务,输入脚本中两者都必须存在,且fix lambda/apip恰好一个;init_style()会强制校验("Exact one fix lambda required")。
  3. 必须使用atom_style apip:原子风格需要提供apip_lambda_input_ta等字段(见 atom_vec_apip.cpp 中MODE_THERMOSTAT分支的字段配置)。
  4. 截断一致性:fix lambda/apip的cut_hi(r_λ,hi)不得超过本 pair style 的邻居列表 cutoff,也不得超过 pair 势能截断;违反时init/init_style会报错。
  5. 邻居列表类型:需要 FULL + GHOST 邻居列表,这会影响通信开销,是"把空间过渡区计算放入 pair style 以便负载均衡"这一设计权衡的一部分。

7. Mixing 与 pair_modify 行为

  • 截断距离混合:本 pair style 的 cutoff 支持混合(mixing),默认混合方式为geometric,可用pair_modify mix修改(参见 pair_modify)。
  • 不支持的 pair_modify 选项:shift、table、tail 均不支持。
  • 重启文件:不写入任何二进制重启信息,因此读取重启文件时必须重新声明pair_style与pair_coeff。
  • rRESPA 不支持:本 pair style 不支持run_style respa的inner、middle、outer关键字。
  • 默认值:无(除继承 fix 的默认参数外,本 pair style 自身无默认参数)。

8. 相关命令与进一步阅读

  • 切换参数计算:fix lambda/apip
  • 输入信号计算:pair_style lambda/input/apip 与 lambda/input/csp/apip
  • 快速势:pair_style eam/apip、pair_style pace/apip
  • 能量守恒修正:fix lambda_thermostat/apip
  • 负载均衡:fix atom_weight/apip
  • 保守(可微)切换参数方案:fix lambda/la/csp/apip
  • 总览与更多示例:Howto_apip、examples/PACKAGES/apip/README

仓库提供的可运行示例还包括:

  • examples/PACKAGES/apip/in.surface.balance:模拟表面,演示fix atom_weight/apip+fix balance对 APIP 的负载均衡收益;
  • examples/PACKAGES/apip/in.vacancy.dynamic.lambda:含空位的 Cu 体系,便于可视化过渡区并直观检验参数选择;
  • 对应的data.vacancy、data.surface.balance数据文件与参考 log 文件均位于 examples/PACKAGES/apip 目录。

9. 小结

pair_style lambda/zone/apip以"只传一个 cutoff、其余参数从 fix 提取"的极简接口,承担了 APIP 流程中最具空间性的计算——近邻驱动的 λ_min,i。它通过与fix lambda/apip的extract()接口解耦参数、通过 FULL+GHOST 邻居列表获取跨处理器信息、通过多项式截止函数保证平滑性,并通过time_per_atom提取接口融入fix atom_weight/apip的负载均衡框架。理解这一 pair style 的实现(pair_lambda_zone_apip.cpp),是正确调优 APIP 模拟、尤其是配置空间过渡区半径与邻居截断的关键。

方法学参考文献:Immel, Drautz and Sutmann,J Chem Phys, 162, 114119 (2025),即fix lambda/apip源码中引用的 doi.org/10.1063/5.0245877;保守可微方案参见 Immel 等 arXiv:2512.07693。

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

【免费下载链接】lammps

Public development project of the LAMMPS MD software package

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

相关推荐

上一篇:emoji-cheat-sheet性能优化:处理大量表情符号数据的技术
下一篇:giffgaff英国SIM卡完整使用指南:激活、保号与实用技巧全解析

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

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

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

立即咨询