☰
LAMMPS pair_style pace 全解析:Atomic Cluster Expansion(ACE)势能的高效实现与使用指南
2026/10/17 2:11:56 网站建设 项目流程
  • 科研
  • 科学计算
  • 高性能计算

【免费下载链接】lammps

Public development project of the LAMMPS MD software package

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

本文以 LAMMPS 官方文档 doc/src/pair_pace.rst 为骨架,结合 ML-PACE 包源码与示例深入剖析pair_style pace/pair_style pace/extrapolation的完整用法:从 ACE 势能的物理背景、参数解析、元素映射到外推等级(extrapolation grade)与核排斥(core repulsion)的实战配置。读完本文,你将掌握如何在 LAMMPS 中加载 ACE 系数文件、选择基函数计算算法、在 GPU(KOKKOS)上规避显存溢出,并利用外推等级自动筛选训练集外的外推构型。

一、什么是 PACE:ACE 势能的高效 LAMMPS 实现

pair_style pace计算基于Atomic Cluster Expansion(ACE)的相互作用。ACE 是一种将原子能量在多变体基函数(multi-body basis functions)上进行一般性展开的方法,其理论基础见 Drautz, Phys Rev B, 99, 014104 (2019)。而pace风格在 LAMMPS 中的高效实现细节见 Lysogorskiy 等人, npj Comp Mat, 7, 97 (2021)。

从物理模型上看,ACE 将体系总能量分解为各原子能量之和:原子i的能量被表达为一个或多个密度函数(density functions)的线性或非线性函数。通过把密度投影到局部原子基组(local atomic base)上,能量的最低阶贡献可以表示为基函数贡献对邻居原子求和的一组标量多项式。

在 LAMMPS 源码中,该 pair style 位于 src/ML-PACE/pair_pace.cpp,其类声明为PairPACE : public Pair,通过宏PairStyle(pace,PairPACE)注册(见 src/ML-PACE/pair_pace.h);pair_style pace/extrapolation则由 src/ML-PACE/pair_pace_extrapolation.cpp 实现,注册名为PairStyle(pace/extrapolation,PairPACEExtrapolation)。

二、语法与关键字详解

pair_style pace的基本语法为:

pair_style pace ... keyword values ...

可选的 keyword/value 组合包括:

keyword取值含义
product无使用 product 算法计算基函数
recursive无使用 recursive 算法计算基函数(默认)
chunksize整数每次 pass 处理的原子数(仅 KOKKOS + GPU 生效)
neighauto/shared/global选择构建短邻居列表所用的 Kokkos team scratch 内存级别(默认auto)

其中:

  • auto:自动选择 scratch 内存级别;
  • shared:强制使用 level 0(片上共享内存);
  • global:强制使用 level 1(全局内存)scratch。

pair_style pace/extrapolation的语法更简单:

pair_style pace/extrapolation

它在 KOKKOS GPU 后端同样支持chunksize与neigh关键字。

1.product与recursive:两种基函数求值算法

product和recursive二选一,决定基函数及其导数的计算算法,默认是recursive。从源码 src/ML-PACE/pair_pace.cpp 可以看到,settings()中初始化recursive = true,遇到product关键字则置为false,并将选择传给ACERecursiveEvaluator::set_recursive():

recursive = true; // default evaluator style: RECURSIVE ... if (strcmp(arg[iarg], "recursive") == 0) { recursive = true; } else if (strcmp(arg[iarg], "product") == 0) { recursive = false; }

两种算法在计算基函数与导数上的数值路径不同,对同一势能应给出等价结果,但性能特征有差异。settings()还会在日志中打印当前使用的求值器类型(Recursive evaluator is used或Product evaluator is used)。

2.chunksize:GPU 上的分块计算

chunksize仅在使用 KOKKOS 包且后端为 GPU 时生效,其他情况下被忽略。它控制每次 pass 中用于计算原子簇展开的原子数量,目的是避免显存耗尽。例如:模拟共有 8192 个原子,若chunksize设为 4096,则 ACE 计算会在单个 GPU 上分成两次 pass 完成。

源码中默认值chunksize = 4096(见 src/ML-PACE/pair_pace.cpp),可通过关键字覆盖:

pair_style pace product chunksize 2048

3.neigh:KOKKOS team scratch 内存级别控制

neigh关键字(versionadded:: 2Sep2026)仅在使用 KOKKOS 包的pace和pace/extrapolationGPU 后端时生效,其他情况下被忽略——这样同一个输入脚本可以在有无 KOKKOS 包时通用。它控制构建短邻居列表所用的 Kokkos team scratch 内存级别:

  • Level 0:片上共享内存,访问快,但容量有限。当原子邻居数很多或原子种类很多时可能超限,导致类似"Requested too much scratch memory on level 0"的报错中止运行;
  • Level 1:全局内存,容量(远)更大,可避免上限问题,但访问较慢。

默认值auto的行为:pair style 会查询设备上实际的共享内存大小(而非假定固定值如 48 KiB,因此能自动利用较新版本 Kokkos 库提供的更大限制),当请求放不进 level 0 时自动回退到 level 1,并在首次回退时打印警告。

  • shared:强制使用 level 0(片上)scratch;
  • global:强制使用 level 1(全局)scratch;可用于消除回退警告,或在自动启发式过于保守时强制使用全局内存。

在源码中该关键字由settings()解析为NEIGH_SCRATCH_AUTO / NEIGH_SCRATCH_SHARED / NEIGH_SCRATCH_GLOBAL枚举(见 src/ML-PACE/pair_pace.cpp),并注明"由非 KOKKOS 风格解析但忽略,以便同一输入在非 KOKKOS 构建下也能运行"。

4.versionchanged:: 2Sep2026:CPU 后端的 KOKKOS 行为变化

当pace/kk在 CPU 后端(KOKKOS 以 OpenMP 或 Serial 后端构建)配合product关键字使用时,现在计算会在 KOKKOS kernel 中运行并使用所有可用线程;此前pace/kk在 CPU 上使用超过一个线程时会直接报错。而当使用recursive关键字、或势能的关联阶(correlation order)超出 CPU kernel 支持范围时,pace/kk会打印警告并回退到未加速的求值器(单线程);此时改用product关键字即可获得多线程计算。

三、pair_coeff:ACE 势文件与元素映射

pace风格只使用一条 pair_coeff 命令,其参数格式为:

pair_coeff * * ACE系数文件 元素1 元素2 ... 元素N

其中:

  • ACE 系数文件:.yaml或.yace/.ace格式;
  • N 个元素名:将 ACE 元素映射到 LAMMPS 原子类型,N 等于 LAMMPS 原子类型数。

与多数势能不同,截断半径(cutoff)不在 pair_style 或 pair_coeff 中设置,而是定义在 ACE 文件内部。源码 src/ML-PACE/pair_pace.cpp 的coeff()流程清晰地体现了这一点:

  1. 通过map_element2type(narg - 3, arg + 3)解析元素映射参数;
  2. 用utils::get_potential_file_path(arg[2])定位势文件(支持-L路径搜索,详见 pair_coeff 文档 中关于路径的说明);
  3. 若文件后缀为.yaml,则先用ACEBBasisSet读取,再自动转换为ACECTildeBasisSet;否则直接以ACECTildeBasisSet读取;
  4. 打印每种元素的总基函数数量(区分 rank=1 与 rank>1);
  5. 逐类型映射:NULL表示跳过该类型,元素名必须是 ACE 文件中支持的元素(内部维护一张从 "H"、"He"…"Lr" 的元素周期表,见elements_pace[]数组),否则报错'{}' is not a valid element或Element {} is not supported by ACE-potential from file {};
  6. 初始化 scale 因子为 1.0 并set_basis()。

从仓库自带的势文件 potentials/Cu-PBE-core-rep.ace 可以看到 .ace 格式的内容结构:文件头声明UNITS: metal、nelements=1、elements: Cu、lmax=6、嵌入函数类型与参数、径向基函数名ChebPow、nradbase=16、cutoffmax=7.4以及核心排斥参数(core repulsion parameters: 400.0 7.0)——所有截断信息都内嵌于势文件。

基础用法示例

最简用法(recursive 算法、默认 chunksize):

pair_style pace pair_coeff * * Cu-PBE-core-rep.ace Cu

指定 product 算法与分块:

pair_style pace product chunksize 2048 pair_coeff * * Cu-PBE-core-rep.ace Cu

YAML 格式的系数文件:

pair_style pace pair_coeff * * Cu.yaml Cu

外推等级模式:

pair_style pace/extrapolation pair_coeff * * Cu.yaml Cu.asi Cu

仓库 examples/PACKAGES/pace 目录下有可直接运行的最小示例 in.pace.recursive 与 in.pace.product,两者都使用 fcc Cu 单晶、units metal、pair_coeff * * Cu-PBE-core-rep.ace Cu,并对比了thermo_style custom输出中能量/压力相对参考值的偏差,适合作为自检脚本。

四、单元制与邻居列表要求(源码级约束)

使用pair_style pace前必须了解以下硬性约束(均在源码中强制检查):

  1. 必须使用units metal。settings()中:

    if (strcmp("metal", update->unit_style) != 0) error->all(FLERR, "ACE potentials require 'metal' units");

    ACE 势能系数以 metal 单位参数化,其他单位制直接报错。

  2. 必须开启原子 ID 与 newton pair on(init_style()):

    • Pair style pace requires atom IDs(atom->tag_enable == 0时报错);
    • Pair style pace requires newton pair on(force->newton_pair == 0时报错);
    • 需要完整邻居列表(Neighbor::REQ_FULL)。
  3. cutoff 来自势文件:init_one()返回basis_set->radial_functions->cut(map[i], map[j]),即截断半径完全由 ACE 势文件的径向函数设置决定。

  4. scale 因子机制:计算能量与力时乘以scale[itype][itype](同类型)或scale[itype][jtype](异类型),默认全为 1.0;extract()方法支持外部通过pair_modify scale之类的机制访问scale二维数组。

五、extrapolation grade(外推等级):主动学习与构型筛选

1. 原理

pair_style pace/extrapolation实现了 PACE 中**外推等级(extrapolation grade)**的计算。它基于与 Moment Tensor Potential(MTP,Shapeev 等人)类似的MaxVol 算法,理论描述见 Lysogorskiy 等人, Phys Rev Mater, 7, 043801 (2023)。

要计算外推等级,需要提供两个文件:

  1. B-basis 形式的 ACE 势能(.yaml格式);
  2. 对应势能的Active Set Inverted(ASI)文件(.asi格式)。

从源码 src/ML-PACE/pair_pace_extrapolation.cpp 看,coeff()中同时加载了ACEBBasisSet(YAML)与 ASI 文件,并打印LINEAR ASI is loaded或FULL ASI is loaded以标识 ASI 类型。内部同时维护两个求值器:ACEBEvaluator(用于外推等级计算)和ACERecursiveEvaluator(用于常规力/能量计算)。

2. 为什么默认不计算

计算外推等级需要对每个原子做矩阵-向量乘法,比常规的pair_style pace recursive慢得多,因此默认不计算。它由fix pair命令按需触发——fix pair会请求计算gamma。

3. 完整工作流示例

以下是文档给出的外推构型检测脚本:

pair_style pace/extrapolation pair_coeff * * Cu.yaml Cu.asi Cu fix pace_gamma all pair 10 pace/extrapolation gamma 1 compute max_pace_gamma all reduce max f_pace_gamma variable dump_skip equal "c_max_pace_gamma < 5" dump pace_dump all custom 20 extrapolative_structures.dump id type x y z f_pace_gamma dump_modify pace_dump skip v_dump_skip variable max_pace_gamma equal c_max_pace_gamma fix extreme_extrapolation all halt 10 v_max_pace_gamma > 25

其语义为:

  • fix pace_gamma all pair 10 pace/extrapolation gamma 1:每 10 步触发一次外推等级计算,结果存入每原子变量f_pace_gamma;
  • compute max_pace_gamma all reduce max f_pace_gamma:将结构内所有原子的最大外推等级归约为c_max_pace_gamma;
  • 只有当c_max_pace_gamma >= 5时,才将结构写入extrapolative_structures.dump(且不早于每 20 步一次);
  • fix extreme_extrapolation all halt 10 v_max_pace_gamma > 25:若最大外推等级超过 25,则在后续第 10 步强制终止模拟——这是主动学习(active learning)中"遇到训练集外构型立即停止"的标准做法。

关键设计:其余所有时间步,计算仍由快速的pair_style pace recursive完成——即外推等级检测的开销被隔离在"每 N 步"的触发点上,不影响常规分子动力学的吞吐。

4. KOKKOS GPU 限制

当pace/extrapolation与 KOKKOS 包在 GPU 上使用时,总是使用 product B-basis 求值器,且只支持 linear ASI(FULL ASI 不支持 GPU 后端)。

5.fix pair机制源码佐证

fix pair命令(文档见 doc/src/fix_pair.rst)从 pair style 中提取每原子量并存储,供 dump、compute、variable、fix 使用。其flag参数决定是否触发 pair style 计算该量:gamma 1表示外推等级开销大、需要按需触发。对应地,PairPACEExtrapolation::extract()提供gamma_flag开关(返回&flag_compute_extrapolation_grade),extract_peratom()提供gamma数据(每原子extrapolation_grade_gamma[i] = aceimpl->ace->max_gamma_grade,见 src/ML-PACE/pair_pace_extrapolation.cpp)。同一机制也支持以pace/extrapolation作为pair_style hybrid的子风格(pstyle可写为"pace/extrapolation"或带实例编号的形式)。

六、Core repulsion(核排斥):ACE 到 ZBL 的无缝过渡

ACE 势能可以配置为从内截断(inner cutoff)起启动核心排斥,实现 ACE 到 ZBL 势的平滑过渡。核排斥因子可以作为每原子量访问:

pair_style pace pair_coeff * * CuNi.yaml Cu Ni fix pace_corerep all pair 1 pace corerep 1

此时每原子量f_pace_corerep表示每个原子 ZBL 核心排斥的占比(fraction)。

源码实现上,该因子由corerep_factor[i] = 1 - aceimpl->ace->ace_fcut计算(见 src/ML-PACE/pair_pace.cpp),并通过extract("corerep_flag")与extract_peratom("corerep")暴露(src/ML-PACE/pair_pace.h 注释明确corerep_factor即1 - fcut)。pace/extrapolation风格同样支持corerep提取。

七、Mixing、shift、table、tail、restart、rRESPA 相关信息

Mixing

对于原子类型对 I, J(I != J),且 I、J 对应两种不同元素时,LAMMPS 使用用户可指定的参数进行混合。该风格无需也不接受I != J 的 pair_coeff 命令。

不支持的 pair_modify 选项

pace风格不支持pair_modify的shift、table、tail选项。

二进制重启文件

pace风格不把势能信息写入二进制重启文件(势能信息全部存储在势文件中)。因此,读取重启文件继续运行的输入脚本中,必须重新指定 pair_style 与 pair_coeff 命令。这对应源码中restartinfo = 0(src/ML-PACE/pair_pace.cpp)。

rRESPA(多重时间步长)

pace风格只能通过run_style respa命令的pair关键字使用,不支持inner、middle、outer关键字。

八、构建要求:ML-PACE 包与 CMake

pair_style pace属于ML-PACE 包,只有当 LAMMPS 以该包构建时才可用(构建方法参见 Build package 文档;在 CMake 中该包名列于 cmake/CMakeLists.txt 的包列表)。ML-PACE 是 ACE 势能的高效实现,由 ICAMS(德国波鸿鲁尔大学跨学科先进材料模拟中心)的 Yury Lysogorskiy 等人编写(见 src/ML-PACE/README)。

注意:ML-PACE 包不再支持传统 Make 构建系统。其安装脚本 src/ML-PACE/Install.sh 在安装/更新模式下直接输出:

The ML-PACE package no longer supports the legacy build system. Please build LAMMPS with CMake instead.

并退出,因此请使用 CMake 构建 LAMMPS 并启用 ML-PACE 包(以及按需启用 KOKKOS 以使用pace/kk与pace/extrapolation/kk)。

九、相关命令与默认值

相关命令

  • pair_style snap:同样基于原子团簇/描述符拟合的机器学习势(SNAP);
  • fix pair:按需提取 pair style 的每原子量(本文外推等级与核排斥均依赖它)。

默认值

参数默认值
基函数算法recursive
chunksize4096
neighauto

十、从源码看完整调用链:一次 ACE 计算如何完成

综合 src/ML-PACE/pair_pace.cpp 的compute(),一次完整的 ACE 能量/力计算流程为:

  1. 遍历邻居列表,先统计最大邻居数max_jnum,据此resize_neighbours_cache(max_jnum)为 ACE 求值器预留缓存;
  2. 对每个中心原子 i,以坐标数组、类型数组、邻居数、邻居列表调用aceimpl->ace->compute_atom(i, x, type, jnum, jlist)——注意类型到 ACE 物种的映射在compute_atom内部通过element_type_mapping数组完成,截断检查也在内部完成;
  3. 若启用核排斥,则写入corerep_factor[i];
  4. compute_atom更新e_atom与neighbours_forces(jj, alpha),随后逐邻居累加力(f[i] += fij; f[j] -= fij),并统计每原子 virial;
  5. 能量项通过ev_tally_full(i, 2.0 * evdwl, ...)计入(ACE 为多体势,能量计 2 倍以配合 LAMMPS 的 half 列表约定)。

这条链路揭示了 PACE 的工程特性:邻居缓存复用、类型映射内建、完整邻居列表需求,以及势文件驱动的 cutoff——理解这些约束有助于诊断"邻居截断不足导致能量跳变"或"GPU 显存溢出"等常见问题。

结语

pair_style pace为 LAMMPS 提供了生产级的 ACE 机器学习势能支持:recursive/product双算法、KOKKOS GPU 加速(含chunksize分块与neighscratch 内存控制)、pace/extrapolation外推等级主动学习工作流,以及 ACE→ZBL 核排斥过渡。配合 ML-PACE 包的 CMake 构建与 examples/PACKAGES/pace 下的自检脚本,你可以在 metal 单位制下快速验证势能并部署大规模分子动力学计算。使用要点可归纳为:metal 单位、原子 ID、newton pair on、势文件内嵌 cutoff、重启后重写 pair_coeff、rRESPA 仅限 pair 关键字——牢记这五点即可避开绝大多数配置陷阱。

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

【免费下载链接】lammps

Public development project of the LAMMPS MD software package

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

相关推荐

上一篇:茉莉花插件:5分钟打造Zotero中文文献管理终极方案
下一篇:TranslucentTB 技术架构解析:Windows 任务栏透明化的开源实现方案

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

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

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

立即咨询