科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载fix ave/grid是 LAMMPS 中用于在 2d/3d 模拟盒上叠加均匀网格、并对网格内物理量做时间平均time-average的核心 fix 命令。它既能对原子属性速度、力、密度、温度等按网格单元做时空平均per-atom 模式也能对其他 compute/fix 产生的网格场如 TTM 双温模型的热流做网格级时间平均per-grid 模式。读完本文你可以掌握该命令的完整语法、Nevery/Nrepeat/Nfreq时间平均语义、norm/ave/bias/adof/cdof各关键字的取值与公式并理解其分布式网格的数据结构与通信机制从而在流体速度剖面、质量密度场、热流场等场景下正确配置该命令并输出结果。命令语法与参数说明fix ave/grid的完整语法如下来自 doc/src/fix_ave_grid.rstfix ID group-ID ave/grid Nevery Nrepeat Nfreq Nx Ny Nz value1 value2 ... keyword args ...各参数含义ID, group-ID通用 fix 参数定义见 fix 命令Nevery每隔多少个时间步读取一次输入值必须为非零正整数Nrepeat参与一次平均计算的采样次数Nfreq每隔多少个时间步计算并输出一次平均值必须是 Nevery 的整数倍Nx, Ny, Nz网格在 x/y/z 三个方向上的格子数value1, value2, ...一个或多个待平均的输入值可以是 per-atom 值或 per-grid 值keyword args零个或多个可选关键字/参数对。per-atom 输入值的合法取值vx, vy, vz, fx, fy, fz 原子属性速度、力分量 density/number 数密度粒子数/体积 density/mass 质量密度总质量/体积 mass 原子质量 temp 温度 c_ID 由 compute 计算的 per-atom 向量 c_ID[I] compute 产生的 per-atom 数组的第 I 列I 可用通配符 f_ID 由 fix 计算的 per-atom 向量 f_ID[I] fix 产生的 per-atom 数组的第 I 列I 可用通配符 v_name 由 atom-style variable 计算的 per-atom 向量per-grid 输入值的合法取值c_ID:gname:dname compute 产生的 per-grid 向量 c_ID:gname:dname[I] compute 产生的 per-grid 数组的第 I 列 f_ID:gname:dname fix 产生的 per-grid 向量 f_ID:gname:dname[I] fix 产生的 per-grid 数组的第 I 列其中gname是 compute 或 fix 定义的网格名dname是该网格上的数据字段名。同一个 compute/fix 可以定义多个不同尺寸的网格、以及每个网格上的多个数据字段但用于同一fix ave/grid实例的所有网格尺寸必须一致。官方文档给出的两个典型示例fix 1 all ave/grid 10000 1 10000 10 10 10 fx fy fz c_myMSD[*] fix 1 flow ave/grid 100 10 1000 20 20 30 f_TTM:grid:data第一行是 per-atom 模式对力分量与compute msd产生的所有列做 10×10×10 网格上的时间平均第二行是 per-grid 模式对 TTM 双温模型 fixID 为TTM产生的网格数据f_TTM:grid:data做时间平均。仓库中 examples/ttm/in.ttm.grid 正是这一用法的完整脚本其中fix twotemp all ttm/grid 342785 ...产生网格场再配合注释中的fix ave all ave/grid 10 10 100 10 10 10 f_twotemp:grid:data做平均。Nevery / Nrepeat / Nfreq 的时间平均语义这三个时间参数决定了输入值在哪些时间步被采样、平均值在哪些时间步产生最终平均值在Nfreq的整数倍时间步上生成平均值是对前一个Nfreq区间内、每隔Nevery个时间步计算的Nrepeat个采样求平均Nfreq必须是Nevery的整数倍Nevery必须非零即使Nrepeat 1参与平均的时间步不能重叠即Nrepeat × Nevery不能超过Nfreq。举例若Nevery2、Nrepeat6、Nfreq100则时间步 90、92、94、96、98、100 上的值被用来在时间步 100 上计算最终平均值同理在时间步 200 上使用 190200 的采样。若Nrepeat1且Nfreq100则不做时间平均值只在 100、200、… 上生成。在源码中src/fix_ave_grid.cpp 的构造函数对这些约束做了严格校验if (pergrid_freq % nevery || nrepeat * nevery pergrid_freq) error-all(FLERR, Error::NOPOINTER, Inconsistent fix ave/grid nevery/nrepeat/pergrid_nfreq values);即Nfreq % Nevery ! 0或Nrepeat*Nevery Nfreq时会直接报出Inconsistent fix ave/grid nevery/nrepeat/pergrid_nfreq values错误这正是文档所述约束的实现依据。此外构造函数还设置pergrid_flag 1声明该 fix 产生 per-grid 数据与time_depend 1声明结果随时间演化。网格尺寸与模拟盒形状的自适应Nx、Ny、Nz指定叠加在模拟盒上的网格尺寸2d 模拟时Nz必须为 1各值可以是任意正整数。网格可以相对粒子数非常粗也可以非常细。若某个维度值为 1则该方向的格子退化为 2d 平面或 1d 切片。文档还给出了与其他 ave 类命令的选型建议若网格总格数很少用 fix ave/chunk配合 compute chunk/atom 定义的规则 bin可能更高效——因为那种方式下每个处理器都保存全网格的一份副本全局数据若NxNyNz1同样的计算用 fix ave/atom 更高效。fix ave/grid的网格是分布式的每个处理器只负责其子域subdomain内的网格点这与原子分布方式类似因此当网格很大且并行度很高时它比每处理器一份完整网格的 ave/chunk 方案内存效率更高。关于盒形变化时的行为网格始终跟随当前模拟盒的大小/形状若某维度为非周期 shrink-wrap 边界由 boundary 命令 定义网格覆盖该维度的动态收缩范围若为斜方盒triclinic网格也是斜方的每个网格单元是与模拟盒同形的小斜方单元参见 Howto triclinic。从源码结构看src/fix_ave_grid.h 中同时维护Grid2d *grid2d与Grid3d *grid3d两个指针并在setup()中根据当前盒的维度与形状含triclinic标志、nxlo_in/nxhi_in/...等子域索引区间分配处理器拥有的网格区域这对应了上述网格跟随盒形变化、按子域分布的行为当负载均衡导致子域改变时reset_grid()会利用保留的grid2d_previous/grid3d_previous旧网格数据完成 remap见pack_remap_grid/unpack_remap_grid接口。通配符展开数组列对于产生多列数组的 compute/fix方括号索引I支持通配符*形式为*、*n、n*、m*n。设数组列数为 Nmode vector*所有列 1..N*n列 1..n含n*列 n..N含m*n列 m..n含。使用通配符等价于把各列逐一列出。例如某compute fft/grid为每个网格点产生 3 个值下面两条命令等价compute myFFT all fft/grid 10 10 10 ... fix 1 all ave/grid 100 1 100 10 10 10 c_myFFT:grid:data[*] fix 2 all ave/grid 100 1 100 10 10 10 c_myFFT:grid:data[*][1] c_myFFT:grid:data[*][2] c_myFFT:grid:data[3]在源码中这一展开由 src/fix_ave_grid.cpp 中的utils::expand_args(...)完成发生在参数解析之前会更新nvalues因此用户无需知道*会被展开成几个具体列。per-atom 模式可平均的原子量在 per-atom 模式下每个输入值可以是原子属性速度、力分量、质量、数密度/质量密度、温度或 compute、fix、atom-style variable 的计算结果后三者必须产生 per-atom 量而非全局量。注意 compute property/atom 可以访问原子存储的任意属性从而作为通用入口。各输入向量的 per-atom 值独立地求和与平均。选择依据产生 per-atom 量的 compute 通常风格名中含atom产生 per-atom 量的 fix 需查看各 fix 的文档页确认只有 style 为atom的 variable 可用于本 fix其他 style 的 variable 产生全局量。特殊内置值density/number每个网格单元的数密度 粒子数/体积density/mass每个网格单元的质量密度 总质量/体积 输出单位随 units 命令 而定如 g/cm³。在 normalize_atom() 中这两者的归一化因子分别是1/(binvol*Nrepeat)和mv2d/(binvol*Nrepeat)其中mv2d是质量-体积单位换算系数即密度输出会自动完成单位制换算temp按公式KE (DOF/2)·k_B·T计算每个网格单元的温度其中 KE 为单元内原子总动能½mv²DOF N×adof cdofN 为单元内原子数。默认adof等于 dimension 命令 设定的维度2 或 3cdof 0。关于 per-grid 温度文档有几点重要限制需要牢记该温度目前只包含平动自由度不含有限尺寸粒子的转动自由度不为速度 bias 或约束如 fix shake、fix rigid扣减自由度——因为约束涉及的原子可能分布在网格单元内外这个概念本身就是不明确的可用adof/cdof关键字手动修正可通过bias关键字在计算 KE 前从原子速度中减去 bias 速度例如在扣除流动速度剖面后计算热温度本 fix 与 compute temp/chunk使用 bin给出的 per-bin 温度可能不同后者只计算单个快照下每个 chunk 的温度且允许先减除每个 chunk 的质心速度本 fix 既可以做同样的单快照计算也可以对多个快照做时间平均还可以把不同时间步落在同一网格单元中的原子合并为一组来计算温度但它不做质心速度扣除。c_ID / f_ID / v_name 输入以c_开头必须跟一个输入脚本中已定义的 compute ID以f_开头跟 fix ID注意有些 fix 只在特定时间步产生值其步长必须与Nevery兼容否则报错以v_开头跟 atom-style variable 的名称。atom-style variable 可引用热力学关键词、原子属性或在求值时调用其他 compute/fix/variable是构造待平均原子量的非常通用的手段。用户也可以自行编写 compute/fix 风格并 扩展 LAMMPS。仓库的单元测试 unittest/commands/test_input_validation.cpp 中即有一条针对本命令的输入校验用例fix a1 all ave/grid 1 1 1 2 2 2 v_f[2]会报Fix ave/grid variable f cannot be indexedvariable 不能带索引列。per-grid 模式对其他命令产生的网格场做时间平均per-grid 模式下c_ID:gname:dname与f_ID:gname:dname通过冒号分隔的gname网格名和dname数据字段名引用某个 compute 或 fix 定义的网格与数据字段c_ID:gname:dname访问 compute 产生的 per-grid 向量c_ID:gname:dname[I]访问 per-grid 数组M 列的第 I 列f_ID:gname:dname访问 fix 产生的 per-grid 向量f_ID:gname:dname[I]访问 per-grid 数组第 I 列。约束一个 compute/fix 可定义多个网格、每个网格可有多个数据字段但用于同一fix ave/grid实例的所有网格尺寸必须相同且 per-grid 模式下指定的 group 被忽略不参与计算。一个真实的仓库用例是 TTM 双温模型脚本 examples/ttm/in.ttm.gridfix twotemp all ttm/grid 342785 1.2470e-5 0.087614 0.005365 29.5917 47.5679 58.4613 10 10 10 set 1800.0 #fix ave all ave/grid 10 10 100 10 10 10 f_twotemp:grid:data #dump ave all grid 100 tmp.dump.ave # c_10:grid:data[*] f_ave:grid:data #dump_modify ave sort idfix ttm/grid自带一个 10×10×10 网格数据字段名datafix ave/grid以 per-grid 模式对其做 10 步采样、每 100 步输出一次的时间平均再用dump grid输出。可选关键字详解fix ave/grid支持以下零个或多个关键字部分仅适用于 per-atom 模式部分两种模式通用。默认值为discard yesnorm allave onebias 无。这些默认值在 src/fix_ave_grid.cpp 中可以直接看到discardflag DISCARD; normflag ALL; aveflag ONE; nwindow 0; biasflag 0; adof domain-dimension; // 默认 adof 系统维度 cdof 0.0;discard仅 per-atom 模式discard yes/no。当某维度为非周期边界时网格只覆盖盒的维度范围固定或 shrink-wrap 边界。某个时间步上原子可能略微落在网格范围之外discard yes默认该原子被忽略discard no该原子被重新映射到该方向的首个或末个网格单元。源码中 atom2grid() 的注释明确写着discardflag DISCARD时越界原子被跳过skip[i] 1discardflag KEEP时若越界且位于自己的子域边界nxlo_out 0或nxhi_out nxgrid-1则重映射到第 0 格或最后一格否则仍跳过。需要提醒的是文档语法页对 yes/no 的文字描述yes 丢弃no 重映射与Description章节中discard yes 时分配到最近网格单元的表述存在前后不一致以源码行为为准默认 yes 是丢弃越界原子no 才触发重映射。norm仅 per-atom 模式有效per-grid 模式下被忽略norm all/sample/none决定Nfreq时间步上的输出如何由Nrepeat个样本归一化。设样本 I 的求和为 SumI、该网格单元内原子数为 CountII 从 1 到 NN Nrepeat。公式适用于除density/number、density/mass、temp之外的所有 per-atom 输入值取值输出公式含义all默认(Sum1 Sum2 ... SumN) / (Count1 Count2 ... CountN)整个Nfreq时间范围内对原子的平均sample(Sum1/Count1 Sum2/Count2 ... SumN/CountN) / Nrepeat平均的平均各样本先平均再平均none(Sum1 Sum2 ... SumN) / Nrepeat不按原子数归一化特殊值的处理density/number与density/mass输出与norm all/norm sample公式相同但再除以网格单元体积。norm all用最后一个Nfreq时间步的体积norm sample对每个样本用该样本时间步的体积分别除norm none的输出与norm all相同temp输出温度按上文 KE 公式计算归一化方式类似norm all/norm sample但自由度DOF计算方式不同norm allDOF Nrepeat×cdof Count×adof其中 Count Count1...CountN即所有样本的所有原子一起参与计算一个温度norm sample单样本 DOF cdof CountI×adof输出是 Nrepeat 个单样本温度的平均norm none输出与norm all相同。无论哪种 norm 设置输出的每单元原子数都是Output count (Count1 Count2 ... CountN) / Nrepeat源码中这一逻辑体现在 end_of_step()normflag ALL时调用normalize_atom(nrepeat, grid_sample)按总计数归一化SAMPLE时每个样本单独归一化后累加到grid_nfreq最后normalize_grid(nrepeat, ...)除以 NrepeatNONORM时直接除以 Nrepeat 而不除以计数。ave两种模式通用ave one/running/window M决定每Nfreq步产生一次网格值后如何与之前Nfreq整数倍时间步产生的值做二次平均在被其他输出命令访问之前one默认各Nfreq时间步的网格值相互独立原样输出不再平均running网格值按累积意义求和再平均即每次输出是当前值与之前所有同位置值的累计平均。运行平均从 fix 定义时开始只能通过unfix删除或重新定义该 fix 来重启见 unfix 命令window M在最近 M 个Nfreq值构成的移动时间窗内求和再平均。例如 M3、Nfreq1000 时第 10000 步输出的是第 8000、9000、10000 步网格值的平均早期输出若不足 M 个值则对已有值求平均。源码中 end_of_step() 对三种情况分别处理ONE直接output_grid(grid_nfreq)RUNNING维护running_count将grid_nfreq累加进grid_running后除以running_countWINDOW用grid_window[]环形缓冲保存最近 M 份网格窗口满时减去最旧一份subtract_grid(grid_window[window_oldest], grid_running)实现 O(1) 的滑窗平均。ave window的参数解析处还要求 M 为正整数否则报Illegal fix ave/grid ave window argument。bias / adof / cdof仅 per-atom 模式bias bias-ID指定一个温度 compute 的 ID用于在计算temp时从每个原子速度中减去bias速度分量。只在计算temp时使用例如在扣除流动速度剖面后计算每个网格单元的热温度。是否支持 bias 取决于具体温度 compute见各 compute 文档页。源码中 构造函数 会校验该 compute 存在、tempflag ! 0且tempbias ! 0否则报Bias compute ID {} does not calculate a velocity biasadof value定义每个原子的自由度用于温度 DOF 公式。例如若网格单元内有若干水分子且用 fix shake 使其刚性可用adof 2.0表示每分子 6 个自由度3 平动 3 转动——注意此处是按每分子 2 个自由度单位折算的用法若 compute temp/partial 配 bias 只允许 x 分量贡献温度则adof 1.0合适cdof value定义每个网格单元附加的自由度。用cdof -22d或cdof -33d可以为每个网格单元扣减 2 或 3 个自由度类似 compute temp 对整个系统扣减 3 个自由度的做法。温度归一化因子的源码实现normalize_atom()norm mvv2e / ((repeat*cdof adof*count) * boltz);其中mvv2e是速度平方到能量的换算因子、boltz为 Boltzmann 常数repeat在norm all下为 Nrepeat、norm sample下为 1逐样本计算与上文的 DOF 公式一一对应。实现机制分布式网格与每步数据流从 src/fix_ave_grid.h 的类结构可以看出该命令的内部设计数据布局私有GridData结构体维护 2d/3d 两套指针vec2d/vec3d向量、array2d/array3d数组、count2d/count3d原子计数。fix 维护多份这样的网格grid_sample当前样本累加器、grid_nfreq一次 Nfreq 的平均结果、grid_running累积平均、grid_window[]滑窗缓冲以及用于 remap 时暂存旧数据的_previous系列副本每步主流程end_of_step()先检查当前步是否为待处理的采样步ntimestep nvalid由nextvalid()计算是则清零grid_sample随后按模式调用atom2grid()per-atom遍历本处理器拥有的原子、按mask[i] groupbit过滤 group、将每个原子的贡献累加进其所在网格单元的本地幽灵格或grid2grid()per-grid把其他 fix/compute 的网格值搬移进来幽灵格通信per-atom 模式在 Nfreq 边界normsample时每个样本后调用grid2d-reverse_comm(...)/grid3d-reverse_comm(...)把相邻处理器幽灵格上的累加量汇合到 owned 格保证每个网格单元只由一个处理器最终归一化——这正是网格分布、类似原子域分解的设计输出网格接口该 fix 产生的网格名为grid见 FixAveGrid::get_grid_by_name() 中name grid的判断其 per-grid 数据有两个 datumdataper-grid 数组每个输入值一列和countper-grid 向量每单元原子数仅 per-atom 模式。行数为 Nx×Ny×Nz跨所有处理器分布可被各种 输出命令如dump grid访问强度量语义per-atom 模式下输出的 per-grid 数组被视为 intensive强度量因为它们通常已按每单元原子数归一化这在跨处理器 remap 时的插值/加和方式上会体现出来。仓库中的可运行示例examples/grid 目录专门演示了在模拟域上叠加网格的一系列命令fix ave/grid、compute property/grid、dump grid、dump grid/vtk其 README 说明各脚本均使用动态负载均衡fix ... balance ... rcb以展示网格单元像粒子一样可被动态划分到各处理器。2d Lennard-Jones 熔体examples/grid/in.grid.2dunits lj atom_style atomic dimension 2 # ... 建 50x50 sq 晶格盒、lj/cut 对势、nve ... comm_style tiled fix 100 all balance 100 0.9 rcb # fix ave/grid每 10 步采样 10 个样本每 100 步输出10x10x1 网格 fix ave all ave/grid 10 10 100 10 10 1 vx vy # 用 compute property/grid dump grid 输出平均结果 compute ave all property/grid 10 10 1 id ix iy #dump ave all grid 100 tmp.dump.2d # c_ave:grid:data[*] f_ave:grid:count f_ave:grid:data[*] #dump_modify ave sort 1 run 500这里10 10 100表示 Nevery10、Nrepeat10、Nfreq100满足 Nrepeat×Nevery 100 Nfreq即整个窗口采样10 10 1表示 2d 下 Nz1。被注释掉的 dump 命令展示了如何把本 fix 的f_ave:grid:data平均后的 vx/vy 剖面与f_ave:grid:count原子计数以及compute property/grid的坐标数据一起写出。3d 版本examples/grid/in.grid.3dfcc 晶格 LJ 熔体fix ave all ave/grid 10 10 ${dumpfreq} 5 5 5 vx vy vz并附注释掉的dump grid/vtk与fix graphics/labels可视化命令可用颜色标尺输出网格计数场。壁面流动examples/wall/in.wall.flow演示了 per-atom 模式输出速度剖面与质量密度并显式给出全部关键字的写法#fix 3 g_flow ave/grid ${gr_Nevery} ${gr_Nrepeat} ${gr_Nfreq} ${gr_Nx} ${gr_Ny} ${gr_Nz} # vx vy vz density/mass norm all ave one #compute ct_gridId g_flow property/grid ${gr_Nx} ${gr_Ny} ${gr_Nz} id #dump dmp_grid g_flow grid ${dump_every} grid.lammpstrj c_ct_gridId:grid:data f_3:grid:data[*]注意这里 group 指定为g_flow障碍物以外的流动区域说明 per-atom 模式下只有指定 group 的原子参与求和与平均。Restart、fix_modify、输出与运行信息按官方文档的约定性说明该 fix 的任何信息都不写入 binary restart 文件参见 restart 文档fix_modify 的选项对本 fix 均不适用输出为 per-grid 数组每个输入值一列各列单位与对应 per-atom/per-grid 量在 units 命令 下的单位一致per-atom 模式额外产生 per-grid 向量countper-grid 数组的行数与 per-grid 向量的元素总数为 Nx×Ny×Nz跨处理器分布该 fix 的参数不能用于 run 命令 的start/stop关键字该 fix不在能量最小化期间被调用参见 minimize 文档。限制、相关命令与默认值汇总Restrictions无none。相关命令fix ave/atom逐原子平均适合 NxNyNz1 的整盒平均、fix ave/chunk按 chunk/region 分组平均网格数据为全局副本适合小网格。默认值discard yes、norm all、ave one、bias 无未设置、adof 系统维度、cdof 0.0。选型速查场景建议整盒标量平均fix ave/atom或fix ave/time少量 region/bin 的分组平均fix ave/chunk每处理器全网格副本大规模网格速度剖面、密度场、温度场fix ave/gridper-atom 模式分布式网格其他 fix/compute 已产生网格场如ttm/grid、heat/flux/gridfix ave/gridper-grid 模式引用c_ID:gname:dname/f_ID:gname:dname需要扣除流动速度后的热温度剖面per-atom 模式 tempbias temp-compute-ID必要时配合adof/cdof需要跨多次 Nfreq 输出的平滑曲线ave running或ave window Mfix ave/grid通过网格按子域分布 幽灵格通信的设计把 per-atom 时空平均的内存开销摊薄到各处理器上是 LAMMPS 中做网格化时间平均流场剖面、密度/温度场、网格场平滑的标准工具配合dump grid、dump grid/vtk等输出命令即可直接得到可用于后处理与可视化的网格数据。赞分享科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载相关推荐LAMMPS fix ave/grid 命令完全指南分布式网格上的逐原子与逐网格量时间平均LAMMPS fix ave/grid 命令完全指南分布式网格上的逐原子与逐网格量时间平均 fix ave/grid 是 LAMMPS 中面向 分布式网格d科研科学计算高性能计算fix ave/atom 详解LAMMPS 逐原子时间平均的完整指南fix ave/atom 详解LAMMPS 逐原子时间平均的完整指南 摘要 本文以 LAMMPS 官方文档 fix_ave_atom.rst https://科研科学计算高性能计算LAMMPS fix nve/eff 命令详解电子力场eFF模型中的微正则系综时间积分LAMMPS fix nve/eff 命令详解电子力场eFF模型中的微正则系综时间积分 fix nve/eff 是 LAMMPS 电子力场electro科研科学计算高性能计算上一篇微软ELL革命性嵌入式AI学习库10分钟快速上手Raspberry Pi部署下一篇WinDiskWriter深度解析如何在macOS上创建Windows启动盘的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考