LAMMPS compute inertia 命令详解:计算原子组相对质心的惯量张量
科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载compute inertia是 LAMMPS 中用于计算一个原子组group相对其质心的对称惯量张量的全局向量 compute。它在分子刚体动力学分析、转动动能计算、粒子形状对转动惯量贡献的评估等场景中扮演关键角色并且对跨周期边界的原子采用“unwrapped去包裹”坐标处理。读完本文你将掌握该命令的语法、输出格式、底层实现原理包括有限尺寸粒子的自旋惯量贡献与平行轴定理并能通过热力学输出、variable inertia()函数和单元测试验证结果。命令语法与基本用法compute inertia的语法非常简洁与 LAMMPS 其他compute命令一致compute ID group-ID inertia三个参数的含义ID为这个 compute 指定的唯一标识符group-ID要计算惯量张量的原子组其用法遵循 compute 命令的通用约定inertia该 compute 的样式名称style name。一个典型示例compute 1 molecule inertia这条命令定义了标识符为1的 compute计算名为molecule的原子组相对其质心的惯量张量。若后续需要读取结果可通过c_1[*]或c_1[1]等索引方式引用。该命令在 LAMMPS 2Sep2026 版本中引入versionadded:: 2Sep2026属于较新的全局向量 compute。从源码看其构造函数强制要求参数个数严格为 3否则报错Illegal compute inertia command参见 compute_inertia.cpp即不允许携带额外可选参数。惯量张量的物理定义与数学公式该 compute 计算的是原子组中所有原子相对组质心 $\mathbf{r}_{\text{cm}}$ 的对称惯量张量$$ I \sum_i \left[ m_i \left( (r_i - r_{\text{cm}})^2 \mathbf{1} - (r_i - r_{\text{cm}}) \otimes (r_i - r_{\text{cm}}) \right) I_i \right] $$其中$\mathbf{r}_{\text{cm}}$ 是原子组的质心位置求和覆盖组内所有原子 $i$$m_i$ 是原子 $i$ 的质量对每个原子独立质量rmass与按类型质量mass的原子样式分别取rmass[i]或mass[type[i]]$I_i$ 是原子 $i$ 相对自身中心的惯量。对于点粒子 $I_i 0$对于有限尺寸粒子finite-size particles见 Howto_spherical$I_i$ 为粒子形状自身的惯量并通过平行轴定理叠加到轨道项上。该张量在源代码中通过两项叠加实现详见下文“源码级实现”一节轨道项由Group::inertia()计算有限尺寸粒子的自旋项由Group::inertia_extended()叠加。跨周期边界的正确处理unwrapped 坐标文档特别强调了一个容易出错的细节原子的坐标以“unwrapped”形式参与惯量张量计算即使用每个原子关联的 image flag镜像标记。如果不做这种处理跨过周期边界的原子会被“折叠”回主盒子内部导致惯量张量出现严重错误。具体来说关于 unwrapped 坐标的含义参见 dump custom 命令的讨论关于 image flag 及其设置方式参见 read_data 命令的 Atoms 部分你可以使用 set image 命令在调用该 compute 之前将 image flag 重置例如置为 0。源码中这一行为体现在 group.cpp遍历本进程局部原子时对每个属于目标组的原子先调用domain-unmap(x[i], image[i], unwrap)得到去包裹坐标再以unwrap[] - cm[]计算相对质心的位移从而保证跨周期边界的原子贡献正确。输出信息与数据格式compute inertia输出一个长度为 6 的全局向量global vector可通过索引 1–6 访问。六个分量对应对称惯量张量的独立分量顺序固定为索引分量含义1$I_{xx}$绕 x 轴分量2$I_{yy}$绕 y 轴分量3$I_{zz}$绕 z 轴分量4$I_{xy}$x-y 平面交叉项5$I_{yz}$y-z 平面交叉项6$I_{xz}$x-z 平面交叉项该顺序由源码直接确定compute_inertia.cpp 中将 3×3 对称张量的对应元素依次写入vector[0..5]。由于张量对称$I_{yx}I_{xy}$、$I_{zy}I_{yz}$、$I_{zx}I_{xz}$ 不会重复输出。这些值可以被任何接受 compute 全局向量作为输入的命令使用如thermo_style custom、variable等。关于 LAMMPS 输出选项的综述参见 Howto output。该向量属于intensive强度量性质数值单位是 质量×距离²mass*distance²具体取决于当前 units 设置。例如在metal单位下单位为 g·Å²在real单位下为 g·Å²在lj单位下为约化质量×约化长度²。源码级实现原理轨道项Group::inertia()compute inertia的compute_vector()调用链如下compute_inertia.cpp记录invoked_vector update-ntimestep当前时间步用于缓存判断若组是动态组group-dynamic[igroup]为真重新计算masstotalgroup-xcm(igroup, masstotal, xcm)计算组质心group-inertia(igroup, xcm, itensor)计算轨道项group-inertia_extended(igroup, itensor)叠加有限尺寸粒子的自旋项。Group::inertia()group.cpp的核心是逐原子累加domain-unmap(x[i], image[i], unwrap); dx unwrap[0] - cm[0]; dy unwrap[1] - cm[1]; dz unwrap[2] - cm[2]; ... ione[0][0] massone * (dy*dy dz*dz); ione[1][1] massone * (dx*dx dz*dz); ione[2][2] massone * (dx*dx dy*dy); ione[0][1] - massone * dx*dy; ione[1][2] - massone * dy*dz; ione[0][2] - massone * dx*dz;这正是惯量张量定义 $\sum m(r^2\mathbf{1} - r\otimes r)$ 的逐分量展开最后通过MPI_Allreduce汇总各进程的局部累加结果保证并行环境下结果正确。自旋项Group::inertia_extended() 与平行轴定理Group::inertia_extended()group.cpp负责叠加有限尺寸粒子的“自旋self”惯量。它对不同粒子样式分支处理见add_extended_inertia辅助函数group.cpp有限尺寸球体sphere$I \frac{2}{5} m r^2$源码中SINERTIA * massone * radius^2对角分量相同椭球体 / 超椭球体ellipsoid / superellipsoid由存储的形状、四元数quat旋转主轴惯量到空间坐标系超椭球体读取bonus_super中逐粒子存储的主轴惯量线段line按长度与朝向计算三角形tri按存储的惯量与四元数旋转body 粒子body/nparticle 等使用每个粒子存储的惯量通过四元数旋转到空间坐标系。源码注释明确说明普通球体、椭球体、线段、三角形与 fix rigid 命令的处理方式一致而超椭球体和 body 粒子使用逐粒子存储的惯量这两类粒子本身不被 fix rigid 支持。同时自旋项不依赖质心位置是叠加在轨道项之上的可加项。需要指出的是源码中的检查顺序有讲究椭球体/超椭球体/三角形/body 粒子也带有包围盒半径因此必须先检查形状类 bonus 索引最后才进入球体半径分支避免把有限形状粒子误当作球体处理。KOKKOS 加速变体与并行实现该命令提供 KOKKOS 加速变体inertia/kk以及inertia/kk/device、inertia/kk/host声明于 compute_inertia_kokkos.h。使用方式与普通加速样式一致例如suffix kk compute 1 molecule inertiaKOKKOS 版本在设备端计算轨道项groupKK-inertia_kkDeviceType()但当系统存在有限尺寸粒子radius_flag、ellipsoid_flag、line_flag、tri_flag、body_flag任一为真时会将相关数组同步回 Host通过普通的group-inertia_extended()叠加自旋项compute_inertia_kokkos.cpp。这是为了保证半径、ellipsoid/line/tri/body 的 bonus 数组无设备端副本读取正确对于纯点粒子系统则全程留在设备端避免不必要的内存同步开销。典型应用场景与实战示例结合 thermo 输出转动惯量与转动动能在刚体/有限尺寸粒子模拟中常需要同时监控惯量张量与角速度来评估转动动能。examples/PACKAGES/addtorque_group/in.addtorque提供了完整范例in.addtorquecompute 1 all chunk/atom molecule compute 2 ball omega/chunk 1 compute 3 ball inertia/chunk 1 # 转动动能1/2 * I * omega^2 variable r_ke_x equal c_2[1][1]*c_2[1][1]*c_3[1][1]*0.5 variable r_ke_y equal c_2[1][2]*c_2[1][2]*c_3[1][2]*0.5 variable r_ke_z equal c_2[1][3]*c_2[1][3]*c_3[1][3]*0.5 thermo_style custom step ke pe c_3[1][1] c_3[1][2] c_3[1][3] c_2[1][1] c_2[1][2] c_2[1][3] v_r_ke_x v_r_ke_y v_r_ke_z thermo 500该示例用inertia/chunk计算每个分子 chunk 的惯量分量再结合角速度计算各轴转动动能并通过thermo_style custom周期性输出。作为全局向量compute inertia的输出可同样通过c_ID[1..6]直接放入thermo_style custom或fix ave/time等命令。通过 variable 的 inertia() 函数实时获取分量除了显式定义 computeLAMMPS 的 variable 命令还提供inertia(group,dimdim)组函数返回该组惯量张量的 6 个分量之一顺序同样是 Ixx, Iyy, Izz, Ixy, Iyz, Ixz。用法示例variable ixx equal inertia(all,xx) variable ixy equal inertia(all,xy)从源码注释看inertia()变量函数与compute inertia共享同一条代码路径Group::inertiaGroup::inertia_extended因此两者结果完全一致。此外inertia(group,dimdim,region)变体还支持限定在某个 region 内计算对应Group::inertia(..., Region *)的重载实现group.cpp。单元测试与结果验证仓库的单元测试为本文所述行为提供了直接验证解析式验证test_compute_global.cpp 中的ComputeInertiaTest构建小型独立系统两个有限尺寸椭球体与解析结果对比验证compute inertia输出 $I_{xx}10.4$、$I_{yy}26.75$、$I_{zz}22.75$交叉项为 0同时验证inertia()变量函数与 compute 共享代码路径、结果一致body 粒子分支单个 body/nparticle 粒子位于原点、已知对角惯量张量 (2,3,4)验证compute inertia原样返回超椭球体分支默认 blockiness (2,2) 下超椭球体退化为椭球体验证bonus_super分支解析结果一致组级直接验证test_groups.cpp 的InertiaEllipsoid等测试直接调用Group::inertia()与Group::inertia_extended()校验有限尺寸粒子贡献并测试 region 重载自动化回归compute-inertia.yaml 以 27 个球粒子系统含 18 直径为 5.0、2027 直径为 0.0 的配置记录了参考输出向量6 个分量用于跨版本回归比对验证球体自旋惯量贡献。这些测试的解析值可用于读者自查当你的系统只有点粒子或简单球体时可以手工计算惯量张量并与compute inertia输出对比确认设置尤其是 image flag正确。相关命令与注意事项与该命令相关的其他命令包括compute inertia/chunk按 chunk如分子分别输出惯量张量数组compute gyration计算回转半径gyration radius惯量张量与之密切相关variable inertia() 函数以变量函数形式实时获取组惯量分量。限制文档明确说明该命令无特殊限制Restrictions: none可用于任意原子样式、任意单位与任意组。使用建议若系统跨周期边界较大或原子分布接近边界务必确认 image flag 正确通常由read_data、create_atoms等自动维护必要时用set image重置后再调用该 compute若只关心质心附近的轨道贡献而不关心粒子自身形状如去除整体平动旋转注意底层存在“轨道项”与“自旋项”的区分——诊断类命令compute inertia、compute inertia/chunk、inertia() 变量报告的是二者之和而物理上用于去除体旋转的速度修正例程如 fix momentum、velocity zero angular只使用轨道惯量参见 group.cpp 的注释说明在 GPU/KOKKOS 平台运行包含有限尺寸粒子的系统时inertia/kk会自动在设备与主机间同步必要数据结果与普通版本一致在容差范围内。赞分享科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载相关推荐LAMMPS compute gyration 命令详解计算分子回转半径与回转半径张量LAMMPS compute gyration 命令详解计算分子回转半径与回转半径张量 导读 本文围绕 LAMMPS 官方的 compute gyratio科研科学计算高性能计算LAMMPS 中 compute dilatation/atom 命令详解Peridynamics 模型的逐原子膨胀量计算LAMMPS 中 compute dilatation/atom 命令详解Peridynamics 模型的逐原子膨胀量计算 本篇介绍 LAMMPS PERI科研科学计算高性能计算LAMMPS compute com 命令详解周期性边界下原子团质量中心的计算原理与源码剖析LAMMPS compute com 命令详解周期性边界下原子团质量中心的计算原理与源码剖析 本篇指南围绕 LAMMPS 的 compute com 命令展开科研科学计算高性能计算上一篇G-Helper 深度使用指南一个 exe 完成华硕笔记本性能调校下一篇Archipelago区域连接算法入口随机化与逻辑验证创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考