
科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载change_box是 LAMMPS 中用于在输入脚本运行过程中动态修改模拟盒子simulation box体积、形状与边界条件的核心命令。本文以官方文档 change_box.rst 为骨架结合 change_box.cpp 源码实现与仓库内的示例、单元测试系统讲解该命令的完整语法、每种变换风格的语义、原子坐标重映射机制以及膨胀收缩、剪切变形、正交/三斜盒转换、弹性常数计算等典型工程应用。读完本文你将能精准写出可复现、可运行、可调试的change_box指令序列。一、命令语法总览change_box的通用语法为change_box group-ID parameter args ... keyword args ...group-ID需要进行可选位移的原子组 ID一个或多个parameter/arg参数对可依次追加零个或多个keyword/value键值对可追加在命令末尾。所有可用参数及取值风格如下表所示参数作用取值风格与参数x/y/z修改正交或三斜盒对应方向的尺寸final lo hi、delta dlo dhi、scale factor、volumexy/xz/yz修改三斜盒的倾斜因子tilt factorfinal tilt、delta dtiltboundary修改边界条件x y z 各一维每维一个或两个字母p周期、f固定、s收缩包裹、m带最小值的收缩包裹ortho将盒子转换为正交盒无参数triclinic将盒子转换为三斜盒无参数set保存当前盒子尺寸/形状状态无参数remap将原子坐标从上次保存的盒子状态映射到当前盒子无参数可选关键字关键字取值含义unitslattice默认/box距离参数以晶格间距或仿真盒单位解释官方语法示例change_box all xy final -2.0 z final 0.0 5.0 boundary p p f remap units box change_box all x scale 1.1 y volume z volume remap第一行依次将xy倾斜因子设为 -2.0将z边界改为 0.0~5.0把边界条件改为p p f并按盒子单位重映射原子坐标。第二行将x方向放大 1.1 倍y、z方向做体积守恒补偿。二、命令执行流程与源码级原理从 change_box.cpp 可以看到命令的入口ChangeBox::command()。其核心执行流程如下前置校验若仿真盒尚未定义domain-box_exist 0则报错参数少于 2 个会触发缺失参数错误group-ID通过group-get_bitmask_by_id()解析为位掩码。解析操作序列命令把每一个操作解析成Operation结构见 change_box.h其中style区分XYZ、TILT、BOUNDARY、ORTHO、TRICLINIC、SET、REMAPflavor区分FINAL、DELTA、SCALEvdim1/vdim2用于记录volume风格要补偿的维度。源码注释明确说明volume选项不会增加操作计数nops而是挂载到前一个尺寸操作上。执行前预处理先把原子坐标转换到归一化 λ 坐标、执行周期边界pbc()与盒子重置reset_box()再转换回笛卡尔坐标最后调用save_box_state()保存当前盒子状态供后续remap使用。这解释了文档中“在执行关键字序列之前当前盒子尺寸/形状会被保存”的说明。依次执行每个操作文档明确指出——命令中的关键字按给定顺序、逐个作用到仿真盒与盒内原子上顺序不同结果可能不同。收尾处理所有关键字处理完毕后若存在收缩包裹shrink-wrap边界条件则重新触发reset_box()可能改变盒子边界随后原子迁移到新的所属处理器。从源码看除ORTHO/TRICLINIC之外的任何操作都可能引起原子跨处理器迁移move_atoms标志迁移通过Irregular类完成change_box.cpp。值得注意的是预处理阶段的pbc()与reset_box()意味着你无法用change_box扩大一个收缩包裹的盒子因为命令完成前盒子会被重新收缩包裹。文档给出的失败与正确做法对比# 失败原子 x 方向范围 0~20非周期边界扩大盒子后会被重新收缩包裹 change_box all x final -10 20 create_atoms 1 single -5 5 5 # 此插入会失败 # 正确先用 boundary 关闭收缩包裹再插原子最后恢复 change_box all x final -10 20 boundary f s s create_atoms 1 single -5 5 5 change_box all boundary s s s # 此流程可行三、x / y / z 尺寸修改的四种风格x、y、z参数支持四种风格对应源码中的FINAL、DELTA、SCALE与体积补偿逻辑。3.1final指定最终边界change_box all x final lo hi直接指定某维度位移后的最终下界与上界单位为距离单位具体解释见units关键字。源码中对应 change_box.cpp直接赋值domain-boxlo[dim]、domain-boxhi[dim]随后依次调用set_initial_box()、set_global_box()、set_local_box()重建盒子。3.2delta指定边界增量change_box all z delta dlo dhidlo/dhi是位移后盒子下界/上界的增量可为正扩大或负缩小。源码实现为对boxlo、boxhi做加法change_box.cpp。3.3scale按因子缩放盒长change_box all x scale 1.1factor是该维度盒长位移后的乘法因子。例如初始盒长 10因子 1.1 则最终盒长 11因子小于 1.0 表示压缩。源码揭示了一个容易忽略的实现细节scale风格围绕盒子中点mid point进行对称缩放change_box.cpp即boxlo与boxhi各自以中点为中心按因子移动文档中也有同样说明。3.4volume体积守恒补偿change_box all x scale 1.1 z volume change_box all x scale 1.1 y volume z volumevolume风格使指定维度发生变化从而保证总体积相对前一个关键字执行前的值不变。它只能跟在x/y/z之后且不能与前一关键字重复作用在同一维度。若前一个关键字本身就是volume则当前volume会与前一个共同作用于更早的关键字。三种典型效果原文档示例x scale 1.1 z volumez 盒长按同样 1.1 因子缩短体积不变x scale 1.1 y volume z volumey、z 各自缩短 √1.1且保持相对纵横比不变x scale 1.1 z volume y scale 1.1 z volume最终 x、y 各放大 10%z 缩小 21%总体积守恒。源码中对应volume_preserve()change_box.cpp先重新计算改动维后的新体积newvol得到补偿因子scale oldvol / newvol若只补偿一个维度则直接按scale缩放其中点两侧长度若补偿两个维度则各自按sqrt(scale)缩放以保持纵横比——与文档描述的数学关系完全一致。物理告诫对固体或液体某一维度扩大时保持另两维不变意味着密度变化。对固体而言用volume调整其余维度可能符合物理直觉正如液体但对泊松比不是 0.5 的材料和势函数可能不正确。四、xy / xz / yz 倾斜因子修改三斜盒的xy、xz、yz倾斜因子可通过final或delta风格修改。改变倾斜因子不会改变盒子体积文档明确强调。change_box all xy final tilt # 设置最终倾斜因子 change_box all xz delta dtilt # 倾斜因子增加 dtilt源码中对正交盒使用TILT操作会直接报错change_box.cpp同时二维仿真dimension 2不允许修改xz/yz。关于倾斜因子的取值范围文档给出了严格限制LAMMPS 要求三斜盒的倾斜因子不超过平行盒长的一半。例如xlo 2, xhi 12时 x 盒长为 10xy必须在 -5 到 5 之间xz、yz同理受限于对应平行盒长的一半。这并非缺陷——因为倾斜因子为 …,-15,-5,5,15,25,… 的构型彼此等价。命令指定的任何倾斜因子都必须处于这些限值内。此外三斜盒操作必须注意序列内每一步的倾斜限值文档警示由于关键字逐个应用若中间某一步的倾斜超出限值而最终态未超出可以通过调整序列顺序或将一次大变换拆分为多次小变换解决。详见 Howto triclinic 关于三斜盒允许限值的讨论。五、boundary运行期修改边界条件boundary关键字的参数含义与 boundary 命令 完全相同每维度一个字母表示上下两个面同风格两个字母则分别为下界面、上界面指定风格。p周期边界f非周期、位置固定s非周期、收缩包裹shrink-wrapping无论原子移动多远面都自动包住原子m收缩包裹但有最小值约束盒子在该维度不会收缩到当前边界以内。change_box all boundary p p f # 三维分别x 周期、y 周期、z 固定boundary命令本身只能在仿真盒通过read_data、create_box或read_restart定义之前使用而change_box使你在输入脚本后期也能改变边界条件。另一个重要场景read_restart会把边界条件改为重启文件中存储的值因此若想改变它们应在read_restart之后使用change_box。源码实现中BOUNDARY操作调用domain-set_boundary(3, ...)change_box.cpp并对二维仿真设置了“z 边界不能改为非周期”的保护。注意image flag 重置将周期边界改为非周期边界会把所有原子在该维度的镜像标志image flag重置为 0LAMMPS 会打印警告。当原子参与跨越周期边界的成键相互作用、且不同原子的镜像标志值不同时这种重置可能导致非期望的变化详见文档警示。六、ortho / triclinic正交盒与三斜盒互转ortho与triclinic关键字在create_box、read_data、read_restart创建盒子之后允许将现有盒子在正交与三斜之间切换。典型应用是先在正交盒中做初始平衡模拟再切换为三斜盒最后用 fix deform 执行非平衡分子动力学NEMD剪切变形模拟参见 Howto NEMD。change_box all triclinic # 正交盒 - 三斜盒 change_box all ortho # 三斜盒 - 正交盒要求倾斜因子均为 0限制条件源码与文档一致若盒子当前为三斜且xy、xz、yz任一倾斜因子非零则无法转换为正交盒源码直接报错Cannot change box to orthogonal when tilt is non-zerochange_box.cpp使用这两个关键字时不能有活动的 dump也不能有活动的 fix deform因为这些命令在首次发出时会检查盒子是否正交。可在脚本中先用 undump / unfix 关闭它们再执行change_box源码中还检查了fix-no_change_box标志定义有不允许改盒子的 fix 时同样报错change_box.cpp。仓库单元测试中大量使用该特性例如 test_kspace_auto_slab.cpp 的change_box all triclinic xy final 5.0 xz final 0.0 yz final 0.0以及 test_compute_voronoi.cpp 中对盒子施加剪切后验证 Voronoi 单元体积不变的测试——这类测试同时验证了“改变倾斜因子不改变体积”的语义。七、set 与 remap原子坐标重映射set保存当前盒子的尺寸/形状remap将原子坐标从最近一次保存的盒子状态映射到当前盒子状态。二者配合可实现对原子坐标的精确操控。set由于命令在任何关键字处理之前就会自动保存盒子状态即遇到create_box时的状态当你希望remap使用序列中间某个盒子状态时才需要显式调用set重新保存remap例如先用x、xy关键字拉伸 x 方向或倾斜 xy 平面再执行remap原子坐标会随之被膨胀或倾斜——如同原子“粘在盒子上一起变形”。源码实现是对组内原子先用保存的旧盒子状态做x2lamda()转换到 λ 坐标再用当前盒子状态做lamda2x()转换回来change_box.cpp然后再次保存盒子状态。只有指定组内的原子会被重映射。与早期版本displace_box的关键差异文档明确提示原子重映射默认不执行。本命令允许你在变换序列中指定remap出现的位置可为零次或多次进行更通用的重映射。若不用remap即使盒子尺寸/形状改变原子坐标也不会变化需要均匀应变状态时则必须指定remap。两个额外注意点remap操作不考虑周期边界非周期边界的收缩包裹发生在所有关键字含 remap处理完之后重映射可能把原子放到几乎彼此重叠的位置例如把边界从非周期改为周期时这通常会导致糟糕的动力学和/或报错。八、units距离单位控制units关键字决定命令中各种距离参数的解释方式box使用 units 命令 定义的标准距离单位例如units real或metal时为埃Ålattice距离以晶格间距lattice spacings为单位要求此前已用 lattice 命令 定义过晶格间距默认值为lattice。源码中的实现很直观options()解析units时设置scaleflagbox为 0lattice为 1当FINAL/DELTA风格存在且scaleflag为真时scale[]取domain-lattice-xlattice/ylattice/zlattice最终boxlo/boxhi和倾斜因子会乘以对应的晶格间距change_box.cpp。scale风格与volume风格不受单位影响。九、丢失原子与重启文件限制重要安全边界9.1 丢失原子策略文档警示改变盒子而不重映射原子、原子落到非周期边界之外或把周期边界改为非周期边界造成键跨边界畸变都会导致糟糕的动力学或错误信息。自 4Jul2026 版本起versionchanged标注change_box导致原子落到非周期边界之外时处理策略与运行过程中 thermo_modify 的lost设置一致默认error命令以 lost atoms 错误终止warn打印警告并删除这些原子ignore静默删除。源码印证了这一实现命令末尾统计删减后的原子数与atom-natoms比对再根据output-thermo-lostflag决定报错、警告还是静默并同步更新natomschange_box.cpp。此前版本对这些原子仅打印警告可能留下不一致状态例如导致后续 write_data 写出损坏的数据文件。9.2 读取重启文件后的限制读取重启文件且重启文件存储了 fix 的逐原子信息后、尚未运行仿真前若关键字会改变盒子尺寸/形状或边界条件则不能使用change_box——因为原子可能被迁移到新处理器而逐原子重启信息不会随之迁移。LAMMPS 会生成错误。只有ortho与triclinic不触发此错误。解决方案先执行一次run 0清空逐原子重启数据再使用change_box。源码中对应的检查是modify-nfix_restart_peratomchange_box.cpp。9.3 处理器映射与负载均衡盒子尺寸/形状可被任意大幅改变但处理器到盒子的映射不会从初始 3D 构型改变见 processors 命令。因此若盒子变化剧烈处理器映射可能不再最优此时可用 balance 命令 重新平衡原子分布。十、典型工程应用实战10.1 弹性常数计算应变-应力响应examples/ELASTIC/displace.mod 展示了change_box在弹性常数计算中的经典用法——对盒子施加微量应变后通过minimize弛豫原子位置并读取应力张量。其核心应变施加片段# 沿 x 方向拉伸/压缩并同步调整倾斜因子负变形示例 if ${dir} 1 then change_box all x delta 0 ${delta} xy delta ${deltaxy} xz delta ${deltaxz} remap units box if ${dir} 2 then change_box all y delta 0 ${delta} yz delta ${deltayz} remap units box if ${dir} 3 then change_box all z delta 0 ${delta} remap units box if ${dir} 4 then change_box all yz delta ${delta} remap units box if ${dir} 5 then change_box all xz delta ${delta} remap units box if ${dir} 6 then change_box all xy delta ${delta} remap units box这里remap units box保证原子坐标随盒子均匀变形均匀应变units box让delta以真实距离单位解释六个方向分别对应正应力与剪应力分量的弹性常数测量是研究型文档 Howto elastic 的可执行实现。10.2 体相转 slab添加真空层Howto bulk2slab 给出了将体相平衡体系转为带真空层 slab 体系的标准工作流。其关键操作是先用reset_atoms image all重置镜像标志、write_dump保存非包裹坐标再执行variable delta index 10.0 reset_atoms image all write_dump all custom rhodo-unwrap.lammpstrj id xu yu zu change_box all z final $(zlo-2.0*v_delta) $(zhi2.0*v_delta) boundary p p f read_dump rhodo-unwrap.lammpstrj 0 x y z box no replace yes kspace_modify slab auto该流程说明了一个重要的实践技巧直接修改盒子尺寸会导致带非零镜像标志的原子发生非物理位移因此需要配合write_dump/read_dump保存并恢复非包裹坐标而change_box的boundary p p f会强制 z 方向镜像标志归零。这正是文档中“改变周期边界为非周期会重置镜像标志”警告的实际应用场景。10.3 平衡相后的 NEMD 剪切模拟正交所描述的标准工作流——正交盒平衡、切换三斜盒、fix deform施加变形——在仓库示例中广泛出现例如 examples/ASPHERE/line/in.line 与 in.tri.srd 中的change_box all triclinic。单元测试如 test_kspace_auto_slab.cpp 也验证了triclinic 倾斜因子设置组合的合法性。十一、易错点清单自检速查shrink-wrap 陷阱不要试图用change_box扩大收缩包裹盒子来腾出空间插入原子——先boundary f关掉收缩包裹插完原子再恢复remap 非默认不带remap时盒子变形但原子不动需要均匀应变必须显式加remapvolume 使用规则只能紧跟在x/y/z之后、且不能作用于与前一关键字相同的维度倾斜限值每一步变换都必须满足倾斜因子 ≤ 平行盒长一半必要时拆分或重排变换序列restart 冲突重启文件含逐原子 fix 信息时先run 0再change_boxortho/triclinic 冲突存在活动 dump 或 fix deform 时禁止切换盒型先undump/unfix丢失原子策略依赖thermo_modify lost设置决定报错、警告还是静默删除注意warn/ignore会删除原子并更新natoms二维仿真change_box在 z 方向尺寸或xz/yz倾斜的操作对 2D 体系非法单位默认值默认units lattice使用真实距离单位时记得写units box。结语change_box是 LAMMPS 中连接“盒子几何”与“原子坐标”的枢纽命令它既能独立完成体积、形状、边界条件的静态重设也能与remap、set、volume组合实现应变控制、体积守恒等动态操控是弹性常数计算、NEMD 剪切、体相转 slab 等高端工作流的基本构件。理解其“逐关键字顺序执行 默认不重映射原子 收缩包裹收尾”三大行为特征就能在复杂输入脚本中游刃有余地驾驭它。进一步可结合 fix deform动力学连续变形与 boundary静态边界定义对比学习构建完整的盒子操控知识体系。赞分享科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载相关推荐告别尺寸烦恼ONNX动态形状导出完全指南告别尺寸烦恼ONNX动态形状导出完全指南 你是否还在为模型部署时输入尺寸不匹配而头疼尝试过修改代码却导致精度下降本文将通过PyTorch/TensorFl人工智能机器学习深度学习Arco Design 按钮 Button 组件完全指南类型、状态、形状、尺寸与源码级原理解析Arco Design 按钮 Button 组件完全指南类型、状态、形状、尺寸与源码级原理解析 按钮是界面交互中最基础的命令组件用于发起一个即时操作。在 AUI组件前端设计系统Ant Design Avatar 头像尺寸与形状全解析三种尺寸、两种形状的源码级实战指南Ant Design Avatar 头像尺寸与形状全解析三种尺寸、两种形状的源码级实战指南 本篇以 Ant Design 组件库中 Avatar头像组件的前端UI组件设计系统上一篇深入Android开源项目分析10个核心框架原理图解与源码解析下一篇react-native-paper-dates常见问题解答新手必看的10个解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考