资讯详情

LAMMPS fix set 命令详解:用 per-atom 变量在模拟过程中动态重置原子属性

📅 2026/10/16 6:18:27 | 华诺云谱 👁 阅读
LAMMPS fix set 命令详解:用 per-atom 变量在模拟过程中动态重置原子属性
科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载fix set是 LAMMPS自 2025 年 6 月 12 日版本引入提供的一种运行时属性控制机制它允许你在模拟进行的每个Nfreq时间步末尾依据 per-atom 变量的计算结果批量重置指定原子的属性位置、速度、电荷、自定义属性等。本文将围绕该命令的语法、rnflag重邻居化语义、必须配合 per-atom 变量的约束以及速度阈值跨越检测这一官方完整实战示例展开并结合 src/fix_set.cpp、src/set.cpp 的源码实现说明其底层工作原理。读完本文你将能够独立编写基于fix set的事件检测、条件标记与动态属性注入脚本。语法与参数fix ID group-ID set Nfreq rnflag set-args各参数含义如下参数说明ID、group-ID与所有fix命令相同的通用参数见 fix 命令文档set该 fix 的 style 名称Nfreq每间隔多少个时间步重置一次 per-atom 属性rnflag1 在下一个时间步触发重新邻居化reneighbor0 不触发set-args与 set 命令完全一致的参数序列选择方式 关键字/值对官方文档给出的最简示例fix 10 all set 1 0 group all i_dump v_new fix 10 all set 1 0 group all i_dump v_turnoff上面两条命令的含义是每个时间步Nfreq 1都执行一次重置不主动触发重邻居化rnflag 0对所有原子把自定义属性i_dump更新为 per-atom 变量v_new/v_turnoff的当前计算值。底层实现它如何工作从源码看fix set是FixSet类的一个实例通过 src/fix_set.h 中的宏注册为 style 名setFixStyle(set,FixSet);FixSet的构造流程见 src/fix_set.cpp值得注意参数校验要求参数个数narg 8否则报missing_cmd_args错误Nfreq必须大于 0Nevery must be 0rnflag必须是 0 或 1rnflag must be 0/1。复用 Set 类它新建一个Set实例并把Nfreq、rnflag之后的所有参数narg-5个直接转交给Set::process_args(Set::FIXSET, ...)处理。也就是说fix set的set-args语法与独立set命令是同一套参数解析逻辑只是调用者身份标记为FIXSET。只注册 END_OF_STEP 回调setmask()仅返回END_OF_STEP因此该 fix 在每个时间步结束时被调用而不会干扰力计算等其他阶段。每个时间步末尾执行的核心逻辑在FixSet::end_of_step()src/fix_set.cppvoid FixSet::end_of_step() { // select which atoms to act on set-selection(atom-nlocal); // loop over list of actions to reset atom attributes set-invoke_actions(); // trigger reneighboring on next timestep if requested if (reneighbor) next_reneighbor update-ntimestep 1; }其中Set::selection()负责按atom / mol / type / group / region五种选择方式筛选原子src/set.cppSet::invoke_actions()则按process_args阶段构建的 action 列表逐一执行重置src/set.cpp 起。invoke_actions()内部还会先调用atom-sync_host_arrays(ALL_MASK)同步宿主端数据这是为了在启用 KOKKOS 加速时保证数据一致性未启用 KOKKOS 时该调用为空操作。rnflag 与重邻居化何时必须设为 1由于fix set的属性重置发生在当前时间步结束之后如果被修改的属性需要同步给 ghost 原子相邻处理器/子域边界的镜像原子就必须在下个时间步触发一次重邻居化让通信随之发生。这正是rnflag 1的作用源码中它会将next_reneighbor设置为update-ntimestep 1。文档明确指出两类必须使用rnflag 1的典型场景修改自定义 per-atom 属性且该属性由 fix property/atom 命令创建时使用了ghost yes关键字——此时 ghost 原子也需要持有最新值修改原子电荷charge——所有计算库仑相互作用的 pair style 都要求 ghost 原子拥有正确的电荷值。反之若修改的属性不依赖 ghost 原子通信rnflag 0即可重邻居化仍会由常规的邻居列表判据在后续时间步自动触发参见 neigh_modify 命令文档。三条重要约束1. group-ID 会被忽略。虽然命令写法上保留了group-ID位置但该 fix 并不会以它作为作用域真正决定重置哪些原子的是set-args中显式的选择方式如group all、region xxx、type 1、atom 100、mol 3等。这与 set 命令的语法保持一致也意味着每次调用都可以切换选择范围。2. 必须使用 per-atom 变量。fix set只能借助 per-atom 变量variable ... atom定义的变量来重置属性。源码 src/set.cpp 对此做了强制校验if (caller FIXSET) { for (int i 0; i naction; i) { action actions[i]; if (!action-varflag) error-all(FLERR,Fix set command keyword {} does not invoke a per-atom variable, ...); } }原因很直接如果没有 per-atom 变量参与每次重置写入的都是常量模拟过程中属性不会发生动态变化fix set就成了空操作。需要注意的是set 命令支持的关键字/值对中只有一部分允许传入 per-atom 变量文档表述为 many, but not all。3. 与set命令的分工。静态的一次性属性设置模拟开始前或两次模拟之间应继续使用set命令需要模拟过程中反复更新时才使用fix set。两者语法高度一致可以互相迁移。官方实战示例一速度阈值首次跨越检测文档给出了一个完整、可直接运行的输入脚本用于实现仅当原子的 x 方向速度首次超过阈值vthresh时把该原子写入 dump 文件并持续输出twindow个时间步。这是fix setdump threshdump_modify thresh组合驱动的典型事件检测工作流variable vthresh equal 2 # threshold velocity variable twindow equal 10 # dump for this many steps # # define custom property i_dump to store timestep threshold is crossed # fix 2 all property/atom i_dump set group all i_dump -1 # # fix set command checks for threshold crossings every step # resets i_dump from -1 to current timestep when crossing occurs # variable start atom vx v_vthresh i_dump -1 variable new atom ternary(v_start,step,i_dump) fix 3 all set 1 0 group all i_dump v_new # # dump command with thresh which enforces twindow # dump 1 all custom 1 tmp.dump id x y vx i_dump variable dumpflag atom i_dump 0 (step-i_dump) v_twindow dump_modify 1 thresh v_dumpflag 1 # # run the simulation # final dump with all atom IDs which crossed threshold on which timestep # run 1000 write_dump all custom tmp.dump.final id i_dump modify thresh i_dump 0脚本的执行逻辑拆解如下fix 2 all property/atom i_dump创建自定义整数属性i_dump初始值通过set group all i_dump -1设为 -1表示尚未跨越阈值per-atom 变量v_start判定当前步是否首次跨越速度大于阈值且i_dump -1per-atom 变量v_new用ternary()函数把跨越发生的时间步号写入i_dump未跨越则保持原值fix 3 all set 1 0 group all i_dump v_new每个时间步更新一次i_dumpdump 文件每步输出但dump_modify 1 thresh v_dumpflag 1只保留跨越发生后的twindow步窗口模拟结束后write_dump把所有曾跨越阈值的原子 ID 及其跨越时间步一次性写入tmp.dump.final。检查某个特定原子示例中为 ID 104被写入tmp.dump的时间步可直接使用grep ^104 tmp.dump官方实战示例二支持多次跨越的变体如果希望同一原子可以多次跨越阈值、每次跨越都输出twindow步只需把状态机改为开启-关闭两态切换但此时write_dump的最终汇总功能不再适用variable vthresh equal 2 # threshold velocity variable twindow equal 10 # dump for this many steps # # define custom property i_dump to store timestep threshold is crossed # fix 2 all property/atom i_dump set group all i_dump -1 # # fix set command checks for threshold crossings every step # resets i_dump from -1 to current timestep when crossing occurs # variable start atom vx v_vthresh i_dump -1 variable turnon atom ternary(v_start,step,i_dump) variable stop atom v_turnon 0 (step-v_turnon) v_twindow variable turnoff atom ternary(v_stop,v_turnon,-1) fix 3 all set 1 0 group all i_dump v_turnoff # # dump command with thresh which enforces twindow # dump 1 all custom 1 tmp.dump id x y vx i_dump variable dumpflag atom i_dump 0 (step-i_dump) v_twindow dump_modify 1 thresh v_dumpflag 1 # # run the simulation # run 1000两个变体的区别在于i_dump的翻转逻辑第一个版本一旦跨越就永久记录首次跨越时刻第二个版本通过v_turnon/v_turnoff在跨越态与关闭态之间切换从而捕捉每一次跨越事件。仓库中的真实应用冲击波前端检测fix set并非只能用于教学示例仓库自带的 NEMD 冲击波算例examples/PACKAGES/shock/nemd/in.nemd就大量使用了它。该算例用fix set检测冲击波前沿是否扫过某个原子并记录冲击波到达时刻与位置variable istart atom f_vxave v_vxthresh i_tshock -1 variable tshock equal step-${nevery} variable inew atom ternary(v_istart,v_tshock,i_tshock) variable dnew atom ternary(v_istart,x,d_xshock) fix setshock all set ${nevery} 0 group all d_xshock v_dnew i_tshock v_inew这里一次fix set同时更新两个属性d_xshock冲击波到达时的 x 坐标和i_tshock冲击波到达时的时间步并通过ternary()保证只在首次跨越时写入、其余时间保持原值。此外脚本还用循环批量构造了 200 个 per-atom 变量与fix sethist在冲击波扫过后按时间窗保存 x 速度历史用于计算速度自相关函数CVCF充分展示了fix set与variable atom、ternary()、jump循环等机制组合后的表达能力。该命令相关的回归测试可参见 unittest/commands/test_set_property.cpp。与重启、输出、能量最小化的交互fix set在 LAMMPS 标准 fix 生命周期中的行为非常轻量见 fix_set.rst 的对应章节二进制重启文件不向 restart 文件写入任何信息每次模拟重启后需重新配置该 fixfix_modify该 fix 不支持任何 fix_modify 选项输出不存储任何全局量或 per-atom 量因此无法被 输出命令如thermo、compute直接读取run start/stopNfreq参数不能用 run 命令的 start/stop 关键字控制能量最小化该 fix 在 minimize 过程中不会被调用setmask()只注册了END_OF_STEP而最小化不经过常规时间步推进。使用建议小结需要每 N 步持续刷新某类 per-atom 属性标记、时间戳、坐标快照、速度历史时优先选择fix set一次性初始化仍用 set 命令。修改了会被 ghost 原子使用的属性ghost yes自定义属性、电荷等务必设置rnflag 1。每个被重置的属性都必须绑定一个 per-atom 变量否则启动阶段即报错终止。Nfreq 1表示每个时间步都执行配合ternary()条件变量可以实现只在条件成立的那一步写入、其余步骤保持的事件锁存模式这正是两个官方示例的核心技巧。赞分享科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载相关推荐LAMMPS fix property/atom 命令详解为任意 atom_style 动态扩展 per-atom 自定义属性LAMMPS fix property/atom 命令详解为任意 atom_style 动态扩展 per atom 自定义属性 fix property/at科研科学计算高性能计算LAMMPS 中 compute dilatation/atom 命令详解Peridynamics 模型的逐原子膨胀量计算LAMMPS 中 compute dilatation/atom 命令详解Peridynamics 模型的逐原子膨胀量计算 本篇介绍 LAMMPS PERI科研科学计算高性能计算LAMMPS compute property/atom 命令详解原子级属性的统一抽取与输出LAMMPS compute property/atom 命令详解原子级属性的统一抽取与输出 compute property/atom 是 LAMMPS 中科研科学计算高性能计算上一篇CPython 3.8.0a2 变更日志深度解析从 __debug__ 赋值防护到 gc.get_objects 代际参数读懂一次 Alpha 版本的 Core 与 Library 演进下一篇mise ls-remote 完全实战枚举可安装工具版本、按发布年龄过滤与 JSON 输出机制详解创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑