LAMMPS 逐原子力矩施加指南:深入解析 fix addtorque/atom 命令的语法、变量机制与 GRANULAR 包实现 科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载导读fix addtorque/atom是 LAMMPSLarge-scale Atomic/Molecular Massively Parallel Simulator中用于对组内每个有限尺寸finite-size原子逐原子施加额外力矩的命令典型应用场景包括布朗粒子、颗粒体系granular中施加旋转驱动、时变/空间变化的力矩场以及能量最小化过程中的力矩约束。读完本文你将掌握该命令的完整语法、every/region关键字用法、equal-style 与 atom-style 变量驱动的时变与空间变化力矩场构建方法并能从源码层面理解其在 POST_FORCE 阶段的实现机制与 r-RESPA、minimize 集成方式。本文主体内容基于 fix_addtorque_atom 官方文档并结合 GRANULAR 包源码实现、KOKKOS 加速变体 与 单元测试用例 进行深入佐证。命令语法总览fix addtorque/atom的完整语法如下fix ID group-ID addtorque/atom tx ty tz keyword value ...各参数含义为参数说明IDfix 的标识符命名规则与 fix 命令 相同group-ID施加力矩的原子组 IDaddtorque/atom该 fix 的 style 名称tx, ty, tz力矩分量数值使用力矩单位任意一个分量都可以是变量见下文keyword/value可选的 0 或多个关键字/值对关键字为every或region可选关键字说明every Nevery每隔Nevery个时间步施加一次力矩默认值为 1即每个时间步都施加。region region-ID原子必须处于指定几何区域 region 之内才会被施加力矩。从源码角度看构造函数的参数解析位于 fix_addtorque_atom.cpp前三个参数arg[3]、arg[4]、arg[5]依次对应tx、ty、tz若参数以v_前缀开头则被识别为变量名存为字符串指针xstr/ystr/zstr否则按常量数值解析并标记为CONSTANT风格every关键字要求Nevery 0源码中明确if (nevery 0) error-all(...)报错region关键字要求区域必须已存在否则直接终止运行。典型用法示例文档给出的三个标准示例fix kick flow addtorque/atom 1.0 0.0 0.0 fix kick flow addtorque/atom 1.0 0.0 v_oscillate fix ff boundary addtorque/atom 0.0 0.0 v_push第一个示例对组flow的每个原子施加恒定的(1.0, 0.0, 0.0)力矩第二、三个示例的某个分量使用变量v_oscillate、v_push如振荡力矩、推入力矩变量写法为v_name其中name是 variable 命令中定义的变量名。与 fix addtorque/group 的定位差异文档开篇即强调本命令与 fix addtorque/group 的本质区别fix addtorque/atom对组内每一个有限尺寸原子分别施加指定的逐原子peratom力矩fix addtorque/group不直接施加逐原子力矩而是通过往组内原子添加一组力使得整个组获得一个围绕其质心的集体力矩(Tx, Ty, Tz)在无其他力时组近似作刚体运动适用于驱动一组点粒子整体旋转。从文档历史记录fix_addtorque_group.rst中versionchanged:: 10Dec2025可知原fix addtorque已更名为fix addtorque/group目的是明确其对组集体施力的语义与对单个有限尺寸原子逐原子施矩的fix addtorque/atom区分开。两个命令分属不同包addtorque/group位于 EXTRA-FIX 包而addtorque/atom位于 GRANULAR 包。fix addtorque/atom的另一对偶命令是 fix settorque/atom区别在于addtorque/atom是在原子已有力矩上**累加指定的增量而settorque/atom是直接设置**力矩值还会抹掉之前算得的力矩且支持NULL表示该分量不改动常被用来冻结某些原子的旋转。变量驱动的时变与空间变化力矩场文档明确指出tx、ty、tz三个分量均可指定为equal-style或atom-style变量写法均为v_name。变量在每个时间步都会被重新求值其值决定该时间步的力矩分量。equal-style 变量时变力矩场equal-style 变量可以包含各类数学函数并可引用 thermo_style 命令输出的模拟盒参数、时间步、已流逝时间等关键字。因此可以非常方便地构造时间依赖的力矩场例如variable push equal 0.5*sin(2.0*PI*step*dt) fix ff boundary addtorque/atom 0.0 0.0 v_pushstep当前时间步与dt时间步长都是 thermo 关键字二者组合即可实现随时间振荡的力矩。atom-style 变量空间变化力矩场atom-style 变量支持 equal-style 变量可用的所有公式此外还能引用逐原子量如原子坐标x、y、z。因此可以构造空间依赖并可同时具有时间依赖的力矩场例如对 z 坐标线性变化的力矩variable tz atom 20.0*z fix test sub addtorque/atom 12.0 -8.0 v_tz every 2这个例子直接取自仓库的单元测试 fix-timestep-addtorque_atom.yaml测试中定义了variable tz atom 20.0*z并把v_tz作为 z 方向力矩分量配合every 2每两个时间步施加一次。变量在源码中的处理逻辑在 fix_addtorque_atom.cpp 的构造函数中凡以^v_匹配的参数都被剥离前缀v_后保存为变量名。init()阶段同文件 L129-L162会校验变量必须存在否则报错Variable {} for fix addtorque/atom does not exist变量风格必须是 equal-style 或 atom-style 之一否则报错is invalid style只要任一分量是 atom-style整体标记varflag ATOM否则若任一分量是 equal-style标记varflag EQUAL全为常量则为CONSTANT。在实际施力阶段post_force()同文件 L209-L287变量求值被包裹在modify-clearstep_compute()/modify-addstep_compute(update-ntimestep 1)之间确保引用 thermo 数据或 compute 数据时按本时间步的一致性求值atom-style 变量通过input-variable-compute_atom(...)逐原子求值到临时数组storque中。这是理解变量在每个时间步重新求值这一文档描述的底层机制。every 与 region 关键字every控制施加频率fix kick flow addtorque/atom 1.0 0.0 0.0 every 5表示每 5 个时间步才施加一次力矩。源码中通过update-ntimestep % nevery判断当前时间步是否满足施力条件fix_addtorque_atom.cpp。默认nevery 1即每个时间步都施加且构造时校验nevery必须为正整数nevery 0直接报错。region空间限制region upper block INF INF INF INF 0.0 INF units box fix test sub addtorque/atom 12.0 -8.0 5.0 every 2 region upperregion关键字要求原子必须位于指定几何 region 内才施加力矩。上述命令直接取自单元测试 fix-timestep-addtorque_atom_region.yaml其中region upper是 z 0 的半空间区域。源码中post_force()每步先调用region-prematch()更新区域状态再对每个候选原子用region-match(x[i][0], x[i][1], x[i][2])判断其坐标是否落在区域内fix_addtorque_atom.cppinit()阶段也会按 ID 重新校验区域存在性同文件 L166-L169。every与region可以组合使用如上例二者无顺序要求可叠加实现按时间步 按空间的双重筛选。输出全局三分量力矩向量该 fix 会计算一个全局 3 分量向量可被各类 输出命令 访问。该向量表示施加额外力矩之前组内原子的总力矩即post_force()中先累加toriginal[0..2]每个原子当前的力矩之和再去修改单个原子的力矩。该向量的值被标记为extensive广延量。在源码中vector_flag 1、size_vector 3、extvector 1声明了该输出向量compute_vector(int n)fix_addtorque_atom.cpp在首次访问时通过MPI_Allreduce跨进程归约得到全局总和。测试用例中的global_vector即验证了该输出例如 fix-timestep-addtorque_atom.yaml 中记录的3 5.749...e00 -8.989...e01 6.353...e01。r-RESPA、run start/stop 与 minimize 集成重启文件该 fix 不向 二进制重启文件 写入任何信息。fix_modify respa支持 fix_modify 的respa选项可指定在 r-RESPA 积分器 的哪一层上施加力矩默认是最外层。源码中respa_level_support 1init()里通过dynamic_castRespa *(update-integrate)计算默认层级nlevels - 1若用户用fix_modify respa指定了层级则取两者较小值fix_addtorque_atom.cpp。run start/stop该 fix 的任何参数都不能配合 run 命令的start/stop关键字使用。minimize该 fix 的力矩在 minimize 命令触发能量最小化期间同样会被施加。文档特别警告不要为最小化使用含时间依赖的变量作为力矩分量因为最小化器会把迭代计数当作时间步增量来推进时间步导致变量求值结果失真。源码中setmask()同时注册了POST_FORCE、POST_FORCE_RESPA与MIN_POST_FORCEfix_addtorque_atom.cpp正是普通积分与最小化都要施力这一行为的实现依据。与 rigid fixes 的兼容性注意文档给出了明确的注意事项该 fix 目前not currently不设计为与 rigid fixes刚体 fix一起使用。虽然它会对刚体中的所有原子按上述方式施加额外力矩但逐原子力矩与刚体整体所受力矩之间并不总是存在简单的映射关系因此结果可能不符合物理预期。源码对此有对应的防御性设计init()阶段调用modify-check_rigid_group_overlap(groupbit)若发现 fix 组与刚体组存在重叠则在 rank 0 上发出警告Adding torques to atoms in rigid bodies with fix addtorque/atom may not work as expectedfix_addtorque_atom.cpp。不过settorque/atom文档中提到一种例外情形配合 fix setforce 同时清零力与力矩来冻结刚体时可能可用。相关命令还包括 fix addforce对点粒子逐原子加力与 fix freeze冻结原子旋转和平移自由度。KOKKOS 加速变体 addtorque/atom/kk文档声明该命令存在加速变体addtorque/atom/kk实现位于 src/KOKKOS/fix_addtorque_atom_kokkos.cpp。从源码可以观察到该变体的几个关键实现特征继承基类FixAddTorqueAtom将普通storque数组替换为 Kokkos 双视图k_storque同文件 L44-L51并设置datamask_read TORQUE_MASK | MASK_MASK、datamask_modify TORQUE_MASK常量力矩分支使用Kokkos::parallel_reduce在设备端并行累加toriginal并施加力矩L113-L117、L168-L183变量力矩分支中equal-style/atom-style 变量仍在 host 端求值atom-style 结果再同步到设备端供 kernel 使用L123-L148与 region 组合时要求区域必须实现 Kokkos 接口KokkosBase否则报错Cannot (yet) use {}-style region with fix addtorque/atom/kkL89-L93与基类不同KOKKOS 变体目前不能与 r-RESPA 联用init()中检测到 respa 积分风格会直接报错L69-L70。使用 KOKKOS 变体需要 LAMMPS 以 KOKKOS 加速方式构建命令名后自动选择addtorque/atom/kk若已启用 KOKKOS 包加速详见 Build package。限制所属包与构建要求fix addtorque/atom属于GRANULAR 包只有 LAMMPS 以该包构建时才可用CMake 下默认启用大部分可自动构建的包传统 make 方式下需确认 GRANULAR 包已安装。使用前请参考 Build package 页面 确认构建配置。测试用例的prerequisites字段也印证了这一点atom dipole、atom sphere、fix addtorque/atom、fix nve/sphere、fix viscous/sphere缺一不可见 fix-timestep-addtorque_atom.yaml其中atom sphere表明其作用于有限尺寸球体/粒子对应 fix nve/sphere 与 fix viscous/sphere 这类刚体旋转/黏性阻尼积分类 fix这也解释了它位于 GRANULAR 包并主要用于颗粒体系的原因。测试与验证仓库中为fix addtorque/atom提供了三组单元测试均位于 unittest/force-styles/tests测试文件覆盖场景fix-timestep-addtorque_atom.yaml常量atom-style 变量组合、every 2fix-timestep-addtorque_atom_variable.yaml三个分量全部为 equal-style 变量含step时间依赖fix-timestep-addtorque_atom_region.yamleveryregion组合这些测试以布朗粒子输入in.brownian为基础记录运行结束后的位置、速度、力矩及global_vector输出并以epsilon 5e-14的精度做回归比对可作为用户验证自己安装的 LAMMPS 构建是否正常实现该 fix 的参考基准。总结fix addtorque/atom为颗粒/有限尺寸粒子体系的逐原子旋转驱动提供了简洁而灵活的接口常量力矩适合恒定驱动equal-style 变量适合时变力矩场atom-style 变量适合空间可叠加时间变化的力矩场every与region则分别从时间频率与空间范围两个维度裁剪施加对象。其源码实现位于 src/GRANULAR/fix_addtorque_atom.cppKOKKOS 设备端加速版本位于 src/KOKKOS/fix_addtorque_atom_kokkos.cpp配套回归测试见 unittest/force-styles/tests 目录。使用时需注意其 GRANULAR 包依赖、与 rigid fixes 的兼容性限制、minimize 场景下禁用时间依赖变量以及 KOKKOS 变体暂不支持 r-RESPA 与任意风格 region 等约束。赞分享科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载相关推荐LAMMPS fix addtorque/group 命令详解为原子组施加绕质心的刚体式旋转力矩LAMMPS fix addtorque/group 命令详解为原子组施加绕质心的刚体式旋转力矩 fix addtorque/group 是 LAMMPS 中科研科学计算高性能计算LAMMPS fix settorque/atom 命令详解逐原子设定有限尺寸粒子扭矩的原理与实战LAMMPS fix settorque/atom 命令详解逐原子设定有限尺寸粒子扭矩的原理与实战 fix settorque/atom 是 LAMMPS G科研科学计算高性能计算LAMMPS compute pe/atom 命令深度指南逐原子势能的计算原理与实战用法LAMMPS compute pe/atom 命令深度指南逐原子势能的计算原理与实战用法 compute pe/atom 是 LAMMPS 中计算 逐原子势能科研科学计算高性能计算上一篇如何让旧款Mac焕发新生OpenCore Legacy Patcher完整指南下一篇YaeAchievement终极指南3分钟完成原神成就数据导出的完整解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考