恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
LAMMPS `fix nve/noforce` 完全指南:仅更新位置、忽略力的时间积分技巧
首页
资讯中心
/
LAMMPS `fix nve/noforce` 完全指南:仅更新位置、忽略力的时间积分技巧
LAMMPS `fix nve/noforce` 完全指南:仅更新位置、忽略力的时间积分技巧
发布时间:2026/10/16 7:32:42
科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载fix nve/noforce是 LAMMPS 中一类特殊的时间积分命令它在每个时间步只更新组内原子的位置而完全忽略作用在这些原子上的力、不更新其速度。本指南以官方文档 doc/src/fix_nve_noforce.rst 为核心结合 src/fix_nve_noforce.cpp 等源码实现与单元测试完整讲解它的语法、底层原理、典型应用如按预设轨迹运动的壁原子、与fix setforce的差异、输出与集成限制以及 KOKKOS 加速变体的用法。读完本文你将掌握如何用一条命令实现物体按既定速度匀速平移/静止的运动学控制并知道如何输出、监测该过程中壁原子真实受到的力。命令语法与参数fix nve/noforce的语法与标准 fix 命令一致属于三参数形式没有任何额外的关键字或取值fix ID group-ID nve/noforceID该 fix 的标识符由用户自定义供其他命令引用group-ID作用的原子组只有组内原子会受到此 fix 的影响nve/noforce本 fix 的 style 名称不可省略。官方文档给出的示例是fix 3 wall nve/noforce这表示对名为wall的原子组施加fix 3使组内原子只做位置更新。从源码 src/fix_nve_noforce.cpp 可以看到构造函数中有一行关键校验if (narg ! 3) utils::missing_cmd_args(FLERR, fix nve/noforce, error);也就是说该 fix 恰好接受 3 个参数ID、group-ID、style 名不接收任何额外参数也不像fix setforce那样可以追加region等关键字。如果参数个数不对LAMMPS 会直接报错避免用户误用。工作原理一个时间步内只做半件事理解fix nve/noforce最快的方式是与标准 fix nve 对比。fix nve实现的是速度形式的 Stoermer-Verletvelocity-Verlet积分每个时间步既要更新位置也要更新速度而fix nve/noforce每时间步只更新位置不更新速度作用在原子上的力被完全忽略。更准确地说它的行为是原子当前位置 上一位置 时间步长 × 当前速度速度则原封不动。这等价于让组内原子按给定的恒定速度做匀速直线运动或速度为零时保持静止仿佛它们不受任何相互作用力的影响。源码级的证据在 src/fix_nve_noforce.cpp 中核心积分逻辑initial_integrate()一目了然void FixNVENoforce::initial_integrate(int /*vflag*/) { double **x atom-x; double **v atom-v; int *mask atom-mask; int nlocal atom-nlocal; if (igroup atom-firstgroup) nlocal atom-nfirst; for (int i 0; i nlocal; i) { if (mask[i] groupbit) { x[i][0] dtv * v[i][0]; x[i][1] dtv * v[i][1]; x[i][2] dtv * v[i][2]; } } }要点如下循环遍历本地进程上的全部原子nlocal用位掩码mask[i] groupbit过滤出组内原子三个分量执行x dtv * v其中dtv在init()中被赋值为当前时间步长update-dtsrc/fix_nve_noforce.cpp整个循环不触碰v速度数组也不读取任何力数组——这正是noforce的含义。此外setmask()返回INITIAL_INTEGRATE | INITIAL_INTEGRATE_RESPAsrc/fix_nve_noforce.cpptime_integrate 1src/fix_nve_noforce.cpp表明这是一个真正的时间积分 fix会参与到run的积分流程中。速度从何而来由于该 fix 不更新速度速度必须由其他手段预先设定并保持常见来源包括velocity命令为组内原子赋初速在read_data/create_atoms时写入速度其他 fix如fix setforce与标准积分 fix 组合维持速度不变。如果组内原子初速为零它们就会一直静止如果给定某一方向的恒定速度它们就会沿该方向匀速移动——这正是构造活塞、压头、移动壁面等刚性运动体的基础。典型应用按预设方式运动的壁原子官方文档明确指出该 fix 最有价值的场景是壁原子wall atoms当你为壁原子设定了速度并希望壁按照指定的方式移动或保持静止时使用fix nve/noforce即可。一个典型的组合用法是group wall type 1 # 将壁原子划为独立组 velocity wall set 0.0 0.0 1.0 # 给壁一个 z 方向的恒定速度 fix 3 wall nve/noforce # 壁只更新位置速度不被任何力改变这样壁面会以恒定速率平移同时依然作为几何体参与与其他原子的碰撞或相互作用力会真实计算并作用于被撞原子但壁自身的速度不受这些反作用力的影响。与fix setforce的关键差异力到底变不变对于让一组原子不受力影响的需求LAMMPS 还提供 fix setforce。官方文档专门对比了两者差异非常关键fix setforce会主动把力改写为指定值通常是 0根据 doc/src/fix_setforce.rst 的说明它erases all previously computed forces on the atom擦除先前算出的全部力因此你无法再得知壁原子原本受到的真实作用力fix nve/noforce不修改任何力它只是不去使用力来更新速度力数组保持原样。因此壁原子上的真实受力仍然存在可以通过 dump 命令输出也可以用 equal-style variable 的组函数fcm(group,dim)查询。如何用变量读取壁上的总力fcm(group,dim)是 LAMMPS 内置的组函数见 doc/src/variable.rst返回指定组在某个维度上的合力。配合该 fix可以随时监测壁面真实承受的载荷variable fz equal fcm(wall,3) # wall 组 z 方向总力 fix 1 wall nve/noforce thermo_style custom step temp v_fz # 每个热力学输出步打印壁面总力这个能力在压痕indentation、摩擦、纳米切削等场景中非常实用壁面作为刚性驱动体移动同时v_fz给出压头受到的反作用力从而直接得到力-位移曲线。若改用fix setforce力被置零后就无法这样监测了。与其他机制的兼容性与限制官方文档的Restart, fix_modify, output, run start/stop, minimize info一节给出了该 fix 的完整集成特性这里逐一说明机制行为二进制重启文件 restart不写入任何与该 fix 相关的信息fix_modify所有选项均不适用该 fix 没有可修改的参数输出Howto_output不存储任何全局量或逐原子量供输出命令访问run 的start/stop关键字不支持没有可随时间变化的参数能量最小化 minimize最小化期间不调用此 fix因此使用时要特别注意fix nve/noforce不会把速度状态写进重启文件重启后需要重新设置速度它在能量最小化时是隐身的不会阻碍minimize对力与能量求极值。与 r-RESPA 多时间步积分的关系从setmask()的返回值看该 fix 同时注册了INITIAL_INTEGRATE_RESPA。在 r-RESPArun_style respa模式下位置更新仅在**最外层级别ilevel 0**执行一次内层级别不做任何事src/fix_nve_noforce.cppvoid FixNVENoforce::initial_integrate_respa(int vflag, int ilevel, int flag) { if (flag) return; // only used by NPT,NPH dtv step_respa[ilevel]; if (ilevel 0) initial_integrate(vflag); }这一点在文档中并未明说属于从源码结构可以推断出的实现细节即便使用了多时间步积分壁原子的位置更新仍然只发生在最粗的时间尺度上。KOKKOS 加速变体fix nve/noforce/kk文档首页标注了该 fix 的加速器变体nve/noforce/kk适用于安装了 KOKKOS 包的 LAMMPS 构建。其实现位于 src/KOKKOS/fix_nve_noforce_kokkos.cpp与基础版本共享全部逻辑继承FixNVENoforce数据同步方面读取掩码为X_MASK | V_MASK | MASK_MASK修改掩码仅为X_MASKsrc/KOKKOS/fix_nve_noforce_kokkos.cpp——再次印证只改位置、只读速度的数据访问模式核心循环通过Kokkos::parallel_for在设备端并行执行同样的x dtv * vsrc/KOKKOS/fix_nve_noforce_kokkos.cpp支持kk/device与kk/host两种细分风格见 src/KOKKOS/fix_nve_noforce_kokkos.h。一个重要限制KOKKOS 变体目前不能与 r-RESPA 同时使用。其init()中明确检查if (utils::strmatch(update-integrate_style, ^respa)) error-all(FLERR, Cannot (yet) use respa with fix nve/noforce/kk);因此若构建开启了 KOKKOS 且计划使用 respa请改用普通版本nve/noforce。单元测试行为验证LAMMPS 自带针对本 fix 的回归测试unittest/force-styles/tests/fix-timestep-nve_noforce.yaml。该测试声明前提条件为atom full与fix nve/noforce通过post_commands: fix test solute nve/noforce在标准测试体系in.fourmol上施加该 fix记录了 29 个原子在运行后的精确位置run_pos与速度run_vel参考值并设置epsilon: 2e-14的误差容限用于校验数值积分结果与参考实现完全一致。这份测试从侧面验证了位置按x dtv * v精确推进、速度保持初值不变的行为是理解该命令语义的权威佐证。实战小结何时用想让一组原子典型如壁、压头按给定速度匀速运动或静止同时希望保留并输出它们受到的真实力怎么用fix ID group-ID nve/noforce配合velocity预设初速配合dump/variable fcm()读取真实受力不要与什么混用不要在期望速度也冻结时误用它不冻结速度只冻结速度更新也不要用 fix nve 代替那会同时更新速度破坏壁面的刚性运动限制速查不写重启信息、不支持fix_modify、不参与minimize、不支持run的 start/stopKOKKOS 变体暂不支持 r-RESPA。相关命令fix nve标准的 NVEvelocity-Verlet时间积分同时更新位置与速度fix setforce将力直接置为指定值会擦除原力适用于冻结原子而非保留受力的场景dump 与 variable输出、查询壁原子真实受力含fcm()组函数run_style切换时间积分器含 r-RESPA 多时间步方案。赞分享科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载相关推荐Illustrator脚本终极指南18个免费工具彻底解放设计师生产力Illustrator脚本终极指南18个免费工具彻底解放设计师生产力 你是否每天在Adobe Illustrator中重复着枯燥的机械操作调整数十个画板尺寸科研科学计算高性能计算MKS Monster8 8轴主板完整配置实战30分钟搞定接线、固件刷写与调优MKS Monster8 8轴主板完整配置实战30分钟搞定接线、固件刷写与调优 主板明明通了电电机却像没睡醒一样狂抖驱动也装好了屏幕上却永远显示高温警科研科学计算高性能计算lint-staged 10个实战示例ESLint、Prettier、Stylelint、Flow完美组合套路lint staged 10个实战示例ESLint、Prettier、Stylelint、Flow完美组合套路 lint staged 是一款流行的 Git科研科学计算高性能计算上一篇drawio-skill 形状索引shape-index.json.gz从 10,446 个官方 draw.io 形状中解析精确 style 字符串的机制与实战下一篇使用 .NET 与 Amazon SES v2 构建优惠券新闻通讯工作流SESv2 NewsLetterWorkflow 实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考