☰
LAMMPS compute cluster/atom、fragment/atom 与 aggregate/atom:三种原子聚团分析方法详解
2026/10/15 3:05:28 网站建设 项目流程
  • 科研
  • 科学计算
  • 高性能计算

【免费下载链接】lammps

Public development project of the LAMMPS MD software package

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

在分子动力学模拟中,"哪些原子属于同一个团簇/片段/聚集体"是理解核化成核、胶体组装、分子碎片化等过程的基础问题。LAMMPS 通过compute cluster/atom、compute fragment/atom和compute aggregate/atom三个计算风格为每个原子分配一个聚团 ID(per-atom vector),可直接接入dump、compute chunk/atom、variable等输出体系进行统计。本文完整讲解三者的语法、参数与语义差异,并结合 compute_cluster_atom.cpp、compute_fragment_atom.cpp、compute_aggregate_atom.cpp 的源码剖析其并行合并算法与收敛机制,最后给出微区膜自组装示例与单元测试的验证方式,帮助你在真实模拟中正确设置 cutoff、规避special_bonds陷阱并高效统计聚团尺寸分布。

一、命令语法与参数

三个风格共用同一条文档页,其完整语法为:

compute ID group-ID cluster/atom cutoff compute ID group-ID fragment/atom keyword value ... compute ID group-ID aggregate/atom cutoff

参数说明:

  • ID、group-ID:compute 命令的通用参数,见 compute 文档;

  • cluster/atom/fragment/atom/aggregate/atom:风格名,三者按不同的"连接规则"定义聚团;

  • cutoff:将原子判定为同一聚团的距离阈值(距离单位,须小于等于 pair 样式的截断半径);

  • fragment/atom后可追加零个或多个 keyword/value 对,目前仅支持一个关键字:

    single value

    其中value = yes或no,控制没有成键的孤立原子是否被视为一个单原子片段;默认no。

官方文档给出的示例:

compute 1 all cluster/atom 3.5 compute 1 all fragment/atom compute 1 all fragment/atom single no compute 1 all aggregate/atom 3.5

三个风格的语义定义(来自文档 Description 部分):

  1. cluster(距离连通):一组原子,其中每个原子与组内至少一个其他原子的距离不超过 cutoff;若某原子在 cutoff 内没有任何邻居,它就是一个 1 原子的簇。
  2. fragment(化学键连通):与 cluster 类似,但连通关系换成化学键。化学键可来自 data 文件、create_bonds 命令,或运行时动态增删键的 fix bond/react、fix bond/create、fix bond/swap、fix bond/break。
  3. aggregate(距离 + 化学键混合连通):结合 cluster 与 fragment 两条规则——每个原子须在 cutoff 距离内与同一 cluster 中某个 fragment 的原子相连。该度量适合追踪胶束(micelle)等分子聚集体。

对于以上三者,聚团内所有原子的 ID 值统一取该聚团中最小的原子 ID(tag);不属于 group-ID 的原子 ID 恒为 0。

二、源码中的参数解析与前置条件

cluster/atom

构造函数要求恰好 4 个参数,并直接把 cutoff 平方存入cutsq(后续比较用平方距离,避免开方):

if (narg != 4) error->all(FLERR, "Illegal compute cluster/atom command"); double cutoff = utils::numeric(FLERR, arg[3], false, lmp); cutsq = cutoff * cutoff;

init()阶段做三项检查(compute_cluster_atom.cpp):

  • 原子必须带有 tag(atom->tag_enable非 0),否则报Cannot use compute cluster/atom unless atoms have IDs;

  • 必须已定义 pair style(force->pair == nullptr时报错);

  • cutoff 不得超过 pair 样式的力截断半径force->pair->cutforce,否则报错:

    Compute cluster/atom cutoff {} is longer than pairwise cutoff {}

    这是因为聚团判定复用了 pair 邻域列表,列表只保证 cutoff 以内的对齐全。

fragment/atom

构造函数检查atom->avec->bonds_allow(原子向量必须支持成键),并解析可选关键字single:

singleflag = 0; int iarg = 3; while (iarg < narg) { if (strcmp(arg[iarg],"single") == 0) { ... singleflag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; } else error->all(FLERR, iarg, "Unknown compute fragment/atom keyword {}", arg[iarg]); }

init()额外要求系统为分子系统(atom->molecular == Atom::MOLECULAR)。single默认no:nspecial[i][0] == 0(该原子无键)时其 fragmentID 被置 0,不视为片段;设为yes时孤立原子保留自己的原子 ID 作为单原子片段。

aggregate/atom

构造函数同时要求 pair style 与 bond style(force->bond == nullptr时报错),cutoff 同样受force->pair->cutforce限制。

此外,三个 compute 在init()中都会检查同风格是否定义了多于一个,并在进程 0 上给出警告("More than one compute {}"),对应文档中"不要频繁/多次使用该 compute"的性能提示。

三、核心算法:迭代 ID 合并与并行收敛

三个风格输出 per-atom vector(peratom_flag = 1,size_peratom_cols = 0),值为> 0的聚团 ID。其底层算法在源码中高度一致:每个原子先自成一团(ID = 自身原子 tag),然后在"连通对"上反复执行ID[i] = ID[j] = min(ID[i], ID[j]),直到全局不再变化。

cluster/atom 的距离合并

compute_cluster_atom.cpp 的compute_peratom()流程:

  1. 若盒子可能变化(如fix deform),先comm->forward_comm()刷新 ghost 原子坐标;

  2. 通过neighbor->build_one(list)请求一份完整邻域列表(REQ_FULL | REQ_OCCASIONAL,请求在init()中注册,neighbor.h 定义了REQ_FULL标志位);

  3. 初始化:group 内原子clusterID[i] = tag[i],其余为 0;

  4. 双层循环收敛:外层每轮先执行comm->forward_comm(this)交换各进程上的clusterID(ghost 原子的 ID 通过 pack/unpack_forward_comm 传递);内层遍历每个原子与其邻居,对rsq < cutsq且 ID 不同的对执行:

    clusterID[i] = clusterID[j] = MIN(clusterID[i], clusterID[j]); done = 0;
  5. 内层扫到无变化后,用MPI_Allreduce(&change, &anychange, 1, MPI_INT, MPI_MAX, world)检查所有进程是否都收敛,任一进程仍有变化就继续。

文档中"每次调用都要构建一次邻域列表,因此频繁 compute/dump 该量或同时挂多个 cluster/atom 会很低效"的说法,正对应REQ_OCCASIONAL请求 +build_one()的实现路径。

fragment/atom 的成键拓扑遍历

compute_fragment_atom.cpp 不依赖邻域列表,而是直接沿化学键走图:

  1. 初始化fragmentID[i] = tag[i](group 内)或 0;
  2. 对每个未标记且属于 group 的 owned 原子,用栈(stack)做深度优先搜索,经atom->special[j](成键邻居表)与atom->map()(tag→本地索引)把整个键连通分量收进clist;
  3. singleflag == 0且无键的原子直接置fragmentID[i] = 0.0并跳过;
  4. 分量的新 ID 取分量内(含 ghost 原子)的最小fragmentID,写回全部成员;
  5. ghost 原子 ID 的变化通过pack/unpack_forward_comm在进程间传播(unpack 时只接受更小的值:fragmentID[i] = MIN(x, fragmentID[i])),再用MPI_Allreduce(..., MPI_MIN, world)判断全局收敛。

动态 group 场景下会先commflag = 0广播 ghost 原子的 mask,保证跨进程 group 判定一致。

aggregate/atom 的混合连通

compute_aggregate_atom.cpp 在一轮内先后执行两次合并:

  • 成键合并:遍历每个原子的num_bond/bond_atom,对成键对取最小 ID;若force->newton_bond为真(键未在每个进程冗余存储),额外调用comm->reverse_comm(this)补齐键端点信息;
  • 距离合并:与 cluster/atom 相同的rsq < cutsq遍历。

两条规则叠加,恰好实现文档中"距离 + fragment 组合"的 aggregate 定义。

收敛上限 MAXLOOP

三个实现都有硬上限static constexpr int MAXLOOP = 100:外层并行合并循环最多 100 轮,超时后在进程 0 上打印警告:

Compute cluster/atom did not converge after {} iterations

该警告不终止计算,但意味着结果可能不收敛,需要检查 cutoff、拓扑或系统规模。另外fragment/atom的memory_usage()统计为nmax*sizeof(double) + 3*nmax*sizeof(int)(stack、clist、markflag 三张工作表),cluster/atom与aggregate/atom仅为nmax*sizeof(double)。

四、重要注意事项(陷阱与规避)

1. special_bonds 会污染邻域列表

文档第一条 note 指出:special_bonds命令的默认设置会屏蔽同一 bond/angle/dihedral 内原子对的 pair 交互,这些对不会出现在邻域列表中,因此cluster/atom与aggregate/atom也看不到它们。长程库仑(coul/long、coul/msm、coul/wolf等)不受此限制。两种规避方式:

  • 把 special bond 缩放因子设为极小非零数(如1.0e-50),使这些对被保留在邻域列表中但不参与能量计算;
  • 把构型写成 dump,再用 rerun 命令回放,rerun 脚本中用 special_bonds 设置一个包含所有对的缩放因子。

2. bond_style quartic 的拓扑滞后

第二条 note:fragment/atom依赖当前键拓扑;而 bond_style quartic 断开键时不会更新LAMMPS 内部的完整键拓扑数据结构,因此其断键结果不会被fragment/atom正确反映。

3. 输出与限制

  • 输出为 per-atom vector,可被任何消费 per-atom 数据的命令使用(dump custom的c_ID[c_id]、compute chunk/atom、variable等),输出选项总览见 Howto output;
  • 值恒为> 0(group 内)或 0(group 外);
  • 文档 "Restrictions: none",即无额外限制;
  • 默认值:fragment/atom的single=no。

相关命令:compute coord/atom。

五、实战示例:用 cluster/atom 监控膜自组装

examples/PACKAGES/mesomem/in.selfassembly 是一个使用mesomem/dipolepair 样式的单层膜自组装示例,展示了cluster/atom与 chunk 类 compute 配合统计聚团数、最大聚团尺寸和自由粒子数的完整套路:

# cluster analysis: two particles closer than 1.5 belong to the same cluster compute clus all cluster/atom 1.5 compute cnum all chunk/atom c_clus nchunk every compress yes compute csize all property/chunk cnum count variable maxclus equal max(c_csize) variable isfree vector c_csize==1 variable nfree equal sum(v_isfree) ... thermo_style custom step temp c_Tall pe press c_cnum v_maxclus v_nfree

要点:

  • cutoff(1.5)取自两粒子"属于同一簇"的物理判据,必须不大于pair_coeff中的r_c(本例 2.5),否则会触发第二节的 cutoff 报错;
  • chunk/atom c_clus nchunk按c_clus(即 cluster ID)给每个 chunk 编号,property/chunk ... count统计每簇原子数,从而得到MaxCluster与Nfree(自由粒子数,簇大小 == 1 的个数),用于在 thermo 输出中监控"小聚集体 → 平坦膜片"的合并过程。

对fragment/atom,则无需 cutoff,直接反映键拓扑;对aggregate/atom,如追踪胶束类聚集体,cutoff 应覆盖胶束单体间最大间距且不超过 pair 截断。

六、单元测试与结果验证

仓库内置了针对三种风格的单元测试,均以in.fourmol/coeffs.fourmol(29 个原子的四分子体系)为输入,timestep: 0.25,epsilon: 1e-08:

  • compute-cluster_atom.yaml:compute test all cluster/atom 3.0,断言前 17 个原子的 ID 均为 1(同一大簇,最小原子 ID = 1),第 18–20 原子 ID 为 18、21–23 为 21、24–29 按簇分组;
  • compute-fragment_atom.yaml:compute test all fragment/atom,键拓扑下前 17 原子同片、18–20 一片等,验证 DFS 遍历与最小 ID 规则;
  • compute-aggregate_atom.yaml:compute test all aggregate/atom 3.0,混合规则下聚团划分与参考值逐原子比对。

前置要求均为atom full+ 对应compute风格已编译进 LAMMPS。参考数据的生成方式即"在已知构型上运行 compute 并导出 per-atom 向量",这套 YAML 也说明了如何为自定义体系做回归验证。

七、小结

风格连通规则必需组件关键参数默认/限制
cluster/atom距离 ≤ cutoffpair style + tagcutoffcutoff ≤pair->cutforce
fragment/atom化学键连通分子系统 + 键single yes/no默认single no
aggregate/atom距离 + 化学键pair + bond style + tagcutoffcutoff ≤pair->cutforce

三者均为 per-atom vector、并行安全(forward/reverse communication +MPI_Allreduce收敛判定、100 轮上限)、无特殊限制。正确使用时的检查清单:cutoff 不超过 pair 截断;成键体系留意special_bonds对邻域列表的裁剪;动态断键场景避开bond_style quartic的拓扑滞后;按输出频率控制开销(每次调用都会构建完整邻域列表)。

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

【免费下载链接】lammps

Public development project of the LAMMPS MD software package

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

相关推荐

上一篇:Vant Space 间距组件实战:告别手工 margin 计算
下一篇:抖音批量下载神器:免费无水印视频批量下载完整指南

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

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

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

立即咨询