科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载LAMMPS 的fix pour是 GRANULAR 包提供的颗粒/分子注入 fix它按固定时间间隔在指定区域内随机投放有限尺寸的颗粒并自动做重叠检测是模拟重力倾倒如料斗放料、颗粒填充容器场景的核心工具。本文以官方文档 fix_pour.rst 为主线完整覆盖其命令语法、全部关键词及默认值并结合 fix_pour.cpp 源码与 examples/pour 示例讲透其插入时机计算、重叠判定和并行实现细节。读完后你可以直接写出可运行的倾倒模拟输入脚本并理解日志中 Particle insertion: ... every ... steps 这行估算信息的由来。命令语法与参数fix pour的基本语法如下fix ID group-ID pour N type seed keyword values ...ID、group-ID的语义见 fix 命令 的一般说明pour是 fix 风格名N 需要注入的颗粒总数type 注入颗粒的原子类型分子注入时作为类型偏移量seed 随机数种子正整数之后可跟零个或多个 keyword/value 参数对。完整参数列表继承自原文档逐项说明如下关键词取值含义regionregion-ID注入区域 ID必须已用 region 命令预先定义diamoneD /rangeDlo Dhi /polyNpoly D1 P1 D2 P2 ...注入颗粒直径单值、均匀随机区间、或多组分Npoly 个直径-百分比对百分比之和必须为 1.0idmax或next新颗粒/分子 ID 的分配方式volfraction Nattempt期望的填充体积分数 每个颗粒的最大尝试次数rateV注入区域沿 z 方向3d或 y 方向2d的移动速度实现从越来越高的位置倾倒densRholo Rhohi注入颗粒密度的随机区间质量/体积单位vel3d: vxlo vxhi vylo vyhi vz2d: vxlo vxhi vy注入颗粒 xy 速度区间及 z或 y方向基准速度moltemplate-ID通过 molecule 命令读取的分子模板 ID用于分子注入molfracf1 f2 ... fN模板内 N 个分子各自的相对插入概率必须和为 1.0rigidfix-ID处理刚体分子的 fix rigid/small 命令 IDshakefix-ID用 SHAKE 约束键长/键角的 fix shake 命令 IDignore无值重叠检测时跳过 line2d或 tri3d颗粒原文档给出的官方示例fix 3 all pour 1000 2 29494 region myblock fix 2 all pour 10000 1 19985583 region disk vol 0.33 100 rate 1.0 diam range 0.9 1.1 fix 2 all pour 10000 1 19985583 region disk diam poly 2 0.7 0.4 1.5 0.6 fix ins all pour 500 1 4767548 vol 0.8 10 region slab mol object rigid myRigid功能定位模拟倒颗粒fix pour每隔若干时间步在指定区域内插入有限尺寸的颗粒或分子直到 N 个全部注入为止。典型应用是在重力作用下把颗粒倒进容器chute。文档约定一个被插入的原子或分子统称为 particle。原子类型与分子类型偏移。若注入的是独立原子则直接赋予指定的原子类型若是分子模板文件中每个原子有自己的类型实际类型为模板文件中的类型 type参数。例如模板文件指定类型为 1,2,3则type 0得到类型 1,2,3type 2得到 3,4,5。这一偏移叠加逻辑在源码中体现为atom-avec-create_atom(ntype onemols[imol]-type[m], ...)见 fix_pour.cpp。分组归属。每个被插入颗粒的所有原子都会被同时加入两个 group默认的allgroup 和fix pour命令中指定的 group-ID二者都可为all。region 约束。必须使用region关键词。区域须为block类型或 z 轴的cylinder类型cylinder 仅限 3d 模拟且必须定义时带side in。源码构造函数中会校验区域必须有包围盒bboxflag、不得为 dynamic 区域、且完全位于模拟盒子内部否则报错 Insertion region extends outside simulation boxfix_pour.cpp。分子注入。未使用mol时插入独立原子使用mol时插入 molecule 命令预先读取的分子模板。分子文件可以指定坐标、原子类型、质心、转动惯量以及键/角等信息但必填项只有原子坐标和原子类型——源码中对xflag、typeflag、natoms均做了强制检查fix_pour.cpp。注意atom_style template体系下fix pour使用的模板 ID 必须与 atom style 的模板 ID 相同。多分子概率molfrac。模板含多个分子时molfrac给出各分子的相对插入概率。源码中把它累积成一个分布数组插入时取一个随机数做分段采样while (rng molfrac[imol]) imolfix_pour.cpp。不指定molfrac时默认为各分子等概率源码在options()中初始化为1.0/nmol的累积分布见 fix_pour.cpp。N 个值必须和为 1.0否则报错。刚体分子rigid。分子要作为刚体处理时用rigid指向输入脚本中的另一个fix rigid/small命令。源码在init()中会校验该 rigid fix 的分子模板与 pour 的模板必须一致不一致则报 not using same molecule template IDfix_pour.cpp。注意若希望新注入的刚体分子能被fix rigid/small/nvt或fix rigid/small/npt正确控温需要给 rigid fix 加上 fix_modify dynamic/dof yes。因为分子数在运行时动态变化该选项用于告知 rigid fix 自由度会动态改变。SHAKE 约束shake。若分子键长/键角要用 SHAKE 约束用shake指向脚本中的 fix shake 命令。rigid与shake不能同时使用且二者都要求mol模式源码检查rigidflag mode ATOM即报错见 fix_pour.cpp。插入成功后源码调用fixrigid-set_molecule(...)或fixshake-set_molecule(...)为新分子登记约束信息fix_pour.cpp。插入机制时间间隔、数量与重叠检测原文档 Implementation Notes 描述的单分散原子最简场景流程可以完整地在源码中找到对应实现。插入间隔nfreq的推导。每步init()中插入间隔被计算为一个颗粒从注入区顶部自由下落到区域底部所需的时间并计入区域移动速度rate。源码注释给出了联立方程x zhi vz*t 1/2*grav*t^2 x zlo rate*t t [-(vz-rate) - sqrt((vz-rate)^2 - 2*grav*(zhi-zlo))] / grav随后nfreq lround(t / update-dt)fix_pour.cpp。物理含义是等到上一批颗粒在重力作用下完全落出注入区后才进行下一批插入从而形成连续的颗粒流。每批插入数量nper。nper volfrac * volume / volume_one即注入区体积 × 目标体积分数 ÷ 单颗粒体积2d 为面积fix_pour.cpp。颗粒体积按最大半径计算poly模式用各组分半径的加权平均体积。若算出 0 则直接报错 Fix pour insertion count per timestep is 0——说明vol太小或区域太小。运行开始时的估算输出。初始化完成后rank 0 会向日志打印一行估算信息例如 examples/pour 示例的日志 log.16Mar23.pour.g.4 中Particle insertion: 402 every 3162 steps, 3000 by step 22135即每 3162 步插入 402 个预计在第 22135 步前插满 3000 个。这与文档所说 Estimates of this process are printed to the log/screen at the start of a run 一致。随机位置与重叠判定。插入在pre_exchange()阶段执行fix_pour.cpp。要点插入高度h不是均匀采样而是用h hi - r² * (hi - lo)做平方随机数变换使插入在时间上均匀分布源码注释 biased to give uniform distribution in time每个新颗粒与注入区附近的所有既有颗粒逐一做球面重叠检测且通过domain-minimum_image()计入周期性边界fix_pour.cpp发现重叠则重试总尝试上限为M nnew * NattemptNattempt即vol的第二个参数全部maxiter次尝试后仍未插满rank 0 打印警告 Fewer insertions than requested ({} vs {}) on step {}fix_pour.cpp多进程下各进程用MPI_Allgatherv汇总注入区附近的局部原子坐标到全局xnear数组保证跨进程边界的重叠也能被检测到。新颗粒的速度。xy 速度在vel指定区间内均匀随机z 速度3d则取颗粒从区域顶部落到当前位置应有的速度v -sqrt(vz² 2*grav*(z - hi))保证颗粒流在时间上连续、无初速突变fix_pour.cpp。随机数实现细节。源码使用RanPark生成器且在构造时对种子做 30 次预热warm up the generator 30x以避免使用连续不同种子重跑时首颗粒位置相关fix_pour.cpp。这也解释了 restart 无法做到严格可复现的原因见下文。注意在粒子数因注入而持续变化的体系中监控温度时通常要给正在使用的温度 compute 加 compute_modify dynamic/dof yes否则自由度固定会算出错误的温度。examples/pour/in.pour 与 in.pour.2d.molecule 都按此配置。各选项详解与默认值除region外其余关键词均为可选项默认值如下继承原文档 Default 小节diam one 1.0即默认半径 0.5dens 1.0 1.0vol 0.25 5025% 体积分数每颗粒 50 次尝试rate 0.0vel 0.0 0.0 0.0 0.0 0.03d/vel 0.0 0.0 0.02did max不注入分子无mol若用mol而没给molfrac则各分子等概率diam 三种风格。one所有颗粒直径为 Drange每个颗粒在 Dlo~Dhi 间均匀随机源码radius_sample()中radius_lo random-uniform()*(radius_hi-radius_lo)fix_pour.cpppoly给定 Npoly 组直径与占比占比和必须为 1.0源码用fabs(sum-1.0) 1e-10严格校验。以 diam poly 2 0.7 0.4 1.5 0.6 为例所有颗粒直径为 0.7 或 1.540% 小颗粒、60% 大颗粒。注意源码对直径一律除以 2 存为半径。分子注入时各原子直径可写在 molecule 文件中未指定时默认半径 0.5与create_atom默认一致。id 选项。两种模式都要先扫描当前体系求出最大原子/分子 ID源码find_maxid()用MPI_Allreduce取全局 MAXfix_pour.cpp。max默认在每次插入事件前重新扫描允许颗粒离开体系后复用其 IDnext仅在 fix 定义时扫描一次效率更高前提是确定不会有其他途径增删粒子。vol 选项。指定注入区将被填充的体积分数。用diam range时体积分数计算按最大直径 Dhi 计。分数越高每批插入越多由于颗粒互不重叠最大体积分数不要超过约 0.6无序球堆极限量级。插入失败上限 M 本批颗粒数 × Nattempt失败则打印警告。dens 与 vel。允许颗粒密度或 xy 速度取区间内随机值。密度在内部按颗粒半径体积换算为质量rmass 4/3*π*r³*densfix_pour.cpp。这解释了为什么该 fix 要求atom_style带radius和rmass属性——构造函数中明确检查atom-radius_flag || atom-rmass_flag如atom_style spherefix_pour.cpp。rate 选项。让注入区沿 z3d或 y2d方向随时间平移实现从越来越高的位置持续倾倒。每步的当前区域上下界为lo/hi (ntimestep - nfirst)*dt*ratefix_pour.cpp且该速度已参与 nfreq 下落时间的推导。ignore 选项。用于体系中同时存在 line2d或 tri3d颗粒的场景通常用于为球形颗粒定义边界。line/tri 存储尺寸可能较大即使方向上并无实际重叠其球形包络也可能覆盖注入区从而挡住插入。ignore使重叠检测直接跳过这些颗粒fix_pour.cpp。只有确认 line/tri 与注入区确实无重叠时才应使用。Restart、输出与运行限制Restart 行为。该 fix 不向 binary restart 文件 写任何信息。若在倾倒中途写 restart恢复后需要在重启输入脚本中写一条新的fix pour命令继续操作并相应调整 N 等参数已插入的部分不再计入随机数状态不保存于 restart 文件因此无法做严格restart即轨迹与原运行逐位一致但统计意义上合理调整参数后重启动画的行为应与原运行一致。fix_modify / 输出 / run start-stop / minimize。所有fix_modify选项对该 fix 均不适用。它计算一个全局标量——累计成功插入数可被thermo等输出命令以fx_ID形式访问文档标注该标量为 intensive。其参数不能用于 run 的start/stop关键词在 能量最小化 过程中该 fix 不会被调用。另外从源码可见reset_dt()直接报错即运行中不能改变 timestepfix_pour.cpp因为 nfreq 依赖 dt 一次性推导。限制条件Restrictions属于GRANULAR package仅当 LAMMPS 编译时包含该包才可用构建方式见 Build package。3d 模拟必须定义-z 方向的重力 fix2d 模拟必须定义-y 方向的重力 fix。源码在init()中严格检查恰好存在一个fix gravity、其方向分量满足上述要求3d 要求zgrav -1且重力在运行期间不得改变否则报 Gravity changed since fix pour was created[fix_pour.cpp](https://link.gitcode.com/i/00a479588a7ffa321b242e796affdeec#L215-L239, L329-L339)。注入区不能是 region 定义的 dynamic 区域。其他从源码可确认的隐含限制不支持斜角triclinic盒子init()直接报错fix_pour.cpp当前不能与 KOKKOS 包联用构造函数中明确报错fix_pour.cpp2d 模拟必须使用 block 区域cylinder 仅限 3d原子必须具有 IDtag机制否则报错。实战示例复现 examples/pour 的倾倒脚本仓库提供三个官方示例均使用atom_style sphere 重力 wall/gran底壁的组合是可直接复制运行的最小完整方案。3d 球颗粒倒入容器examples/pour/in.pouratom_style sphere boundary p p fm newton off comm_modify vel yes region reg block -10 10 -10 10 -0.5 16 units box create_box 1 reg neighbor 0.2 bin neigh_modify delay 0 pair_style gran/hooke/history 2000.0 NULL 50.0 NULL 0.5 0 pair_coeff * * timestep 0.001 fix 1 all nve/sphere fix 2 all gravity 1.0 spherical 0.0 -180.0 fix zlower all wall/gran hooke/history 2000.0 NULL 50.0 NULL 0.5 0 zplane 0.0 2000.0 region slab block -9.0 9.0 -9.0 9.0 10.0 15.0 units box fix ins all pour 3000 1 300719 vol 0.13 50 region slab compute 1 all erotate/sphere thermo_style custom step atoms ke c_1 vol thermo 1000 thermo_modify lost ignore norm no compute_modify thermo_temp dynamic/dof yes run 25000 unfix ins fix 2 all gravity 1.0 chute 26.0 # 倾倒完成后改为料斗流角度 run 25000关键要点region slab ... 10.0 15.0定义注入区在 z10~15位于盒子顶部zhi16之下pour 3000 1 300719 vol 0.13 50 region slab注入 3000 个 1 型颗粒体积分数 0.13每颗粒最多 50 次尝试对应日志 log.16Mar23.pour.g.4 输出Particle insertion: 402 every 3162 steps, 3000 by step 22135可用来核对 nper/nfreq 估算示例注明k2000、dt0.001 是为快速演示所用真实模拟推荐 k2.0e5、dt0.0001参照 bench/in.chute。2d 刚体分子注入examples/pour/in.pour.2d.molecule展示了molrigid的完整链路dimension 2 atom_style sphere ... molecule object molecule.vshape fix 3 all rigid/small molecule mol object # ensure region size molecule size does not overlap wall region slab block 3.0 97.0 30 34.5 -0.5 0.5 units box fix ins all pour 500 0 4767548 vol 0.8 10 region slab mol object rigid 3 compute Tsphere all temp/sphere thermo_modify lost ignore norm no temp Tsphere compute_modify Tsphere dynamic/dof yes注意三点type传 0 表示分子原子类型不做偏移2d 中重力必须沿 -ygravity 1.0 spherical 0.0 -180.0即指向 -y温度统计必须用temp/sphere并开启dynamic/dof否则刚体自由度变化会导致温度失真。圆柱注入区可参考 examples/granular 一族的料斗示例其中region disk即 z 轴圆柱区域side in配合diam range做尺寸分布。与相关命令的配合fix deposit逐原子而非整颗有限尺寸颗粒沉积的另一种方式适合表面成膜类场景fix pour面向有限尺寸颗粒/分子的流式注入。fix gravityfix pour的必备搭档其方向与大小直接决定插入间隔 nfreq 的计算。region注入区的定义命令side in是硬性要求。pair gran/hooke等 granular pair 中的半径读取fix pour通过extract(radius, itype)接口把注入颗粒半径告知 pair stylefix_pour.cpp因此pair_coeff无需再单独指定半径。小结fix pour的设计把物理上合理的颗粒流分解为三个可计算的量插入间隔重力下落时间、每批数量体积分数与重叠规避带 PBC 的随机重试并在此基础上扩展到分子、刚体、SHAKE 约束、尺寸/密度/速度分布和移动注入区等场景。写脚本时记住三条硬约束——重力方向3d 为 -z、2d 为 -y、region ... side in、原子 style 具备radius/rmass属性——并善用日志开头的 Particle insertion 估算行来快速验证vol、diam参数是否合理就能可靠地搭建出颗粒倾倒模拟。赞分享科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载相关推荐Illustrator脚本终极指南18个免费工具彻底解放设计师生产力Illustrator脚本终极指南18个免费工具彻底解放设计师生产力 你是否每天在Adobe Illustrator中重复着枯燥的机械操作调整数十个画板尺寸科研科学计算高性能计算TaleBook 密码存储从 SHA256 加盐哈希平滑迁移到 bcrypt 的完整实战解析TaleBook 密码存储从 SHA256 加盐哈希平滑迁移到 bcrypt 的完整实战解析 导读 本文基于 TaleBook 仓库中 .trae/specs/科研科学计算高性能计算LAMMPS 中 compute damage/atom 命令详解量纲化描述 Peridynamics 颗粒损伤的逐原子计算LAMMPS 中 compute damage/atom 命令详解量纲化描述 Peridynamics 颗粒损伤的逐原子计算 本文围绕 LAMMPS 的 co科研科学计算高性能计算上一篇PaddleX 人脸特征Face Feature模块使用教程模型选型、推理集成与二次开发全指南下一篇Cosmos 项目 C 线性查找Linear Search实战指南数组、链表与重复元素全场景实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考