资讯动态

LAMMPS 中 fix ave/histo 命令详解:从直方图统计到源码级实现原理

发布时间:2026/10/16 5:47:05 来源:尧图企业网站定制
科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载本文以 LAMMPS 的fix ave/histo与fix ave/histo/weight命令为核心完整覆盖其语法、输入值种类、时间参数、全部可选关键词、输出文件格式与默认值并结合 fix_ave_histo.cpp 与 fix_ave_histo_weight.cpp 的实现源码以及 单元测试用例 深入剖析直方图的累加、并行归约与窗口平均机制。读完后你可以熟练使用该 fix 对原子属性、compute/fix 输出或变量值做长期统计并理解其底层数据流与常见报错原因。命令语法与参数总览fix ave/histo与fix ave/histo/weight共用同一语法详见 doc/src/fix_ave_histo.rstfix ID group-ID style Nevery Nrepeat Nfreq lo hi Nbin value1 value2 ... keyword args ...ID、group-ID含义同 fix 通用语法styleave/histo或ave/histo/weightNevery每隔多少个时间步采样一次输入值Nrepeat用多少个采样值参与本次直方图统计即在Nfreq窗口内重复采样的次数Nfreq每隔多少个时间步生成一次最终直方图lo、hi直方图的分箱上下界Nbin直方图 bin 数value1 value2 ...一个或多个输入值可以是x、y、z、vx、vy、vz、fx、fy、fz、c_ID、c_ID[N]、f_ID、f_ID[N]、v_name、v_name[I]x,y,z,vx,vy,vz,fx,fy,fz原子属性位置、速度、力的分量c_IDcompute 的标量或向量c_ID[I]向量第 I 个分量或数组第 I 列I 可含通配符f_IDfix 的标量或向量f_ID[I]同理v_nameequal 型、vector 型或 atom 型变量v_name[I]vector 型变量的第 I 个值。官方文档给出的示例可直接复制fix 1 all ave/histo 100 5 1000 0.5 1.5 50 c_myTemp file temp.histo ave running fix 1 all ave/histo 100 5 1000 -5 5 100 c_thermo_press[2] c_thermo_press[3] title1 My output values fix 1 all ave/histo 100 5 1000 -5 5 100 c_thermo_press[*] fix 1 all ave/histo 1 100 1000 -2.0 2.0 18 vx vy vz mode vector ave running beyond extra fix 1 all ave/histo/weight 1 1 1 10 100 2000 c_XRD[1] c_XRD[2]从源码构造器 FixAveHisto::FixAveHisto 可以看到该 fix 声明了global_freq nfreq、size_vector 4、size_array_cols 3即它对外暴露一个 4 分量的全局向量和一个 Nbin 行 × 3 列的全局数组见后文“输出与可访问数据”一节同时设置time_dependend 1、dynamic_group_allow 1意味着允许在运行中改变原子分组也意味着其计算结果依赖时间步。输入值的种类、分组与 mode/kind 语义直方图本质上是对落入每个 bin 的值做计数。Nbin个 bin 在lo到hi之间等间距排布bin 中心坐标由 源码初始化逻辑 计算为lo (i0.5)*binsizebinsize (hi-lo)/Nbin。超出lo/hi的值如何处理由beyond关键词决定。每个输入值可以是原子属性x/v/f分量——属于 per-atom 向量值compute 结果c_前缀——可以是全局标量/向量/数组也可以是 per-atom 或 local 数据fix 结果f_前缀——同上变量v_前缀——equal/vector 型产生全局值atom 型产生 per-atom 向量。输入值集合必须全部属于同一 kindglobal、per-atom 或 local不允许混合。若某个 compute 或 fix 能产生多种 kind 的数据而 LAMMPS 无法无歧义地判断就必须用kind关键词强制指定。注意该命令的group-ID只在 per-atom 输入时才有意义——只有分组内的原子贡献计数global 与 local 输入时 group 被忽略。bin_atoms 实现 正是通过mask[i] groupbit过滤分组外的原子。mode关键词决定输入值形态mode scalar默认输入值必须是标量或向量加分量下标c_ID[I]形式mode vector输入值必须是向量或数组加列下标c_ID[I]形式。从源码可看到严格的校验链FixAveHisto 构造函数中的类型检查scalar 模式下出现 per-atom 或 local 输入会直接报错“cannot process per-atom values in scalar mode”scalar 模式下c_ID不带下标时该 compute 必须计算全局标量带下标时必须计算全局向量且下标不越界vector 模式下c_ID不带下标时该 compute 必须计算全局向量带下标时必须计算全局数组且列号不越界对f_输入还额外检查nevery % fix-global_freq 0即引用的 fix 只在部分时间步产生值时其频率必须与Nevery兼容否则报错 “Fix ... not computed at compatible time”。时间参数 Nevery / Nrepeat / Nfreq 的工作机制Nfreq必须为Nevery的整数倍且Nrepeat × Nevery ≤ Nfreq即使Nrepeat 1Nevery也必须非零。这些约束在 源码中直接报错“Inconsistent ... nevery/nrepeat/nfreq values”。以Nevery2、Nrepeat6、Nfreq100为例在时间步 100 生成最终直方图时实际使用的是 90、92、94、96、98、100 这 6 个时间步的采样值200 步时则使用 190~200 的采样。若Nrepeat1、Nfreq100则不做时间平均仅在 100、200、… 步各生成一个直方图。从 end_of_step 与 nextvalid 的实现 可以推断出精确的调度逻辑fix 通过setmask()注册END_OF_STEP回调nextvalid()从当前时间步的下一个Nfreq整数倍向前回退(Nrepeat-1)*Nevery步得到“本轮统计的第一次采样点”之后每次采样后nvalid Nevery推进直到完成Nrepeat次采样才合并输出。start关键词会抬高首个Nfreq整数倍下界默认 0用于跳过初始阶段取值全为 0.0 的采样。通配符下标与等价展开compute/fix/variable 的方括号下标支持通配符*形式为*、*n、m*、m*n*单独出现取 1 到 N 的全部下标scalar 模式 N 为向量长度vector 模式 N 为数组列数*n取 1 到 n含m*取 m 到 N含m*n取 m 到 n含。使用通配符与逐个列出分量等价。例如 compute com/chunk 产生 3 列全局数组下面两条命令等价compute myCOM all com/chunk fix 1 all ave/histo 100 1 100 -10.0 10.0 100 c_myCOM[*] file tmp1.com mode vector fix 2 all ave/histo 100 1 100 -10.0 10.0 100 c_myCOM[1] c_myCOM[2] c_myCOM[3] file tmp2.com mode vector源码中这一展开由 utils::expand_args 在解析阶段完成展开后的下标再逐个映射到value_t记录ArgInfo解析类型与下标见 值解析循环。注意对 vector 型变量只允许*n或m*n两种形式——因为 vector 型变量的长度只有在求值时才确定必须显式给出上界若 n 大于实际长度缺失位置按 0.0 输出源码注释 明确说明“if index exceeds vector length, use a zero value”。输入值前缀详解c_ / f_ / v_c_前缀c_ID必须引用输入脚本中已定义的 compute。scalar 模式下不带下标取全局标量带下标取全局向量第 I 个元素vector 模式下不带下标取全局/per-atom/local 向量带下标取对应数组第 I 列。除输入脚本显式定义外thermo 输出、fix nvt见 fix_nh或fix temp/rescale见 fix_temp_rescale等也会隐式创建 compute其 ID 可在对应文档页查到per-atom 量还可以先经 compute reduce 归约为全局标量/向量再被本 fix 访问。f_前缀f_ID必须引用已定义的 fix。取值规则与c_相同但 fix 的值可能只在特定时间步产生必须与Nevery兼容源码中每 4 类输入都做了nevery % global_freq检查见 fix 频率校验。v_前缀变量名。scalar 模式只允许 equal 型或 vector 型均为全局值vector 型需加下标vector 模式只允许 vector 型全局向量不加下标或 atom 型per-atom 向量不加下标。变量公式可引用原子属性、热力学关键词或在求值时调用其他 compute/fix/变量是表达待统计量最灵活的方式。关键词详解mode 与 kindmode scalar/vector如上所述。kind global/peratom/local仅在引用对象可产生多类输出时才需要显式指定否则 LAMMPS 自动推断并校验所有输入 kind 一致不一致即报错。从 源码校验逻辑 可见kind默认值为DEFAULT由第一个输入值确定后续值必须与之匹配否则抛出 “input kind is ambiguous” 或 “input kind is not global” 等错误。beyond越界值的三种处理设lo ≤ value ≤ hi的值落入某个 bin恰好位于 bin 边界的值归属靠下的那个 bin源码 bin_one 中(value-lo)*bininv取整且截断到nbins-1实现了这一点。beyond ignore默认value lo或value hi的值不计入任何 bin但会计入“未统计计数”missing counts且计入 min/max 统计beyond end越界值分别计入第一个和最后一个 binbeyond extra额外增加 2 个 bin总 bin 数变为Nbin2。value lo计入第 1 个 binvalue hi计入第Nbin2个 binlo到hi之间的值计入第 2 到Nbin1个 bin。两个额外 bin 的“坐标”分别打印为lo与hi源码分配与坐标设置if (beyond EXTRA) nbins 2且coord[0]lo、coord[nbins-1]hi。aveone / running / windowave决定每次在Nfreq整数步生成的直方图如何与历史直方图合并后再对外输出ave one默认各直方图彼此独立原样输出ave running对 fix 定义以来的所有Nfreq步直方图做累积平均。每个 bin 值是该步 bin 值与此前所有步同 bin 值的平均。运行平均从 fix 定义时开始只能靠unfix删除后重新定义来重启源码 RUNNING 分支 对bin_total逐 bin 累加min 取MIN、max 取MAXave window M在最近 M 个直方图的滑动窗口内求和。例如M3、Nfreq1000时10000 步的输出是 8000、9000、10000 三步直方图的合并早期步可用直方图不足 M 个则对已有部分求和。从 WINDOW 分支实现 可见源码用一个容量为nwindow的循环缓冲bin_list/stats_list保存最近 M 份直方图写入当前槽位前若窗口已满window_limit就先扣掉最旧一份min/max 则在窗口内逐份扫描取极值。file / append / overwrite / title1~3file filename指定输出文件若已存在则覆盖append filename若已存在则追加不存在则创建该关键词于 17Apr2024 版新增每Nfreq步写一份直方图。源码中仅 rank 0 写文件文件输出段每份数据以一行头部开始时间步、bin 数、参与统计的总计数、未统计计数、遇到的最小值、遇到的最大值——其中 min/max 包含未统计进直方图的值。随后每个 bin 一行bin 编号、bin 中心坐标、计数、归一化计数bin 计数 ÷ 总计数不含 missing 值因此归一化值跨 bin 求和为 1.0。overwrite持续用最新输出覆盖文件使文件只保留一个时间步的数据只能与ave running联用源码强制检查。实现上先记录写完三行标题后的文件位置filepos每次输出前fseek回该位置写完后用ftruncate截断文件尾部。title1、title2、title3自定义输出文件前三行标题仅在用了file时生效。默认标题为# Histogrammed data for fix ID mode MODE ave AVE version VERSION # TimeStep Number-of-bins Total-counts Missing-counts Min-value Max-value # Bin Coord Count Count/Total其中ID替换为 fix-IDMODE为scalar/vectorAVE为one/running/windowVERSION为 LAMMPS 版本号如 20260930 表示 2026 年 9 月 30 日版。这些默认串在 源码写文件头逻辑 中可直接对照。startstart Nstart从该时间步开始直方图统计默认 0。由于很多输入值在 0 步时为 0.0设置较大的start可避免 running/window 平均里混入这个 0.0。fix ave/histo/weight加权直方图fix ave/histo/weight语法与fix ave/histo完全相同但必须且只能指定恰好两个输入值第一个值按通常方式分箱第二个值作为“权重”——每个值不再是向所属 bin 累加 1而是累加对应的权重若两者是向量则第二个向量的第 N 项作为权重累加到第一个向量第 N 项对应的 bin。典型用途如 XRD 计算中按各贡献加权统计文档示例fix 1 all ave/histo/weight 1 1 1 10 100 2000 c_XRD[1] c_XRD[2]。从 FixAveHistoWeight 构造函数 可确认两个硬性检查nvalues ! 2直接报错 “must have two data arguments”随后按 kind/mode 分别推算两个输入的长度per-atom 输入取atom-nlocalglobal 向量取size_vectorlocal 取size_local_rows等长度不一致则报错 “value and weight vector lengths do not match”。计数逻辑的差异集中在 bin_one_weights与基类bin_one逐行对应只是所有 1.0变为 weight——包括越界值在ignore模式下的 missing 计数、extra额外 bin 的坐标处理规则完全一致。因此前文所述beyond、ave、文件输出等机制对该变体全部适用。并行环境下的归约机制这是理解 per-atom/local 输入正确性的关键per-atom 数据被 MPI 切分到各进程因此每个进程先统计本地原子的直方图再在 end_of_step 的归约段 做MPI_Allreduce总计数与 missing 计数用MPI_SUMmin 值用MPI_MIN、max 值用MPI_MAX每个 bin 的计数用MPI_SUM。global 与 local 输入则不需要跨进程归约local 数据已包含本进程负责的全部区域且统计量在全局一致。weight 变体在 其 end_of_step 中复用相同的归约方式。输出与可访问数据该 fix 产生一个全局向量和一个全局数组可被其他输出命令如thermo、variable、dump等见 Howto_output访问且只能在Nfreq整数步访问因为此时才有直方图。全局向量共 4 个值1) 直方图总计数2) 未统计进直方图的值数与beyond相关3) 所有输入值的最小值含未统计的4) 所有输入值的最大值含未统计的。对应 compute_vector 返回stats_total[i]全局数组共Nbin行beyond extra时为Nbin23 列第 1 列 bin 坐标、第 2 列该 bin 计数、第 3 列 bin 计数除以总计数不含 missing因此第 3 列跨行求和为 1.0。对应 compute_array。单元测试 验证了这一点对 29 个原子、20 个 bin 的vx分量做mode vector统计后global_vector的第一个值 145 29 原子 × 5 次采样第二值为 0无 missing第三、四值为速度 min/maxglobal_array恰好 20 行、每行 3 列且只有 -0.1 与 0.1 两个 bin 有计数62 83 145归一化值 0.4276 0.5724 1.0与实现严格一致。注意该 fix 的向量与数组值均被视为“强度量”intensive。若你统计的是 per-atom 输入如每原子速度实际计数会随原子数变化解释结果时必须自行考虑这一放大效应。Restart、fix_modify、run start/stop 与 minimize无 restart 信息该 fix 不向二进制 restart 文件写入任何状态restart 文档从 restart 恢复后统计从头累积fix_modify 无关任何 fix_modify 选项均不适用于该 fixrun 的 start/stop 关键词该 fix 的任何参数都不能与 run 的 start/stop 联用能量最小化期间不会被调用见 minimize。默认值与限制选项默认值modescalarkind由输入参数自动推断aveonestart0file/append无文件输出beyondignoretitle1/2/3上述三行默认标题overwrite关闭文档中 Restrictions 一节明确写着 “none”即无额外限制但实际使用中需牢记前文所述的 kind 一致性、mode 与输入类别匹配、fix 频率与Nevery兼容等由源码强制执行的约束。相关命令与 compute、fix ave/atom、fix ave/chunk、fix ave/time、variable、fix ave/correlate 同属时间统计类命令fix ave/time对标量/向量做时间平均fix ave/histo则回答“值落在哪个区间、占多大比例”这一分布问题二者常配合使用对单个直方图文件后处理时建议用beyond extra或检查 missing 计数以确认统计范围是否覆盖了关心的值域。赞分享科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载相关推荐LAMMPS 中 fix ave/correlate 命令详解时间关联函数的计算原理、参数配置与源码实现LAMMPS 中 fix ave/correlate 命令详解时间关联函数的计算原理、参数配置与源码实现 fix ave/correlate 是 LAMMPS科研科学计算高性能计算Go Web 开发数据库实战从 database/sql 驱动接口到 SQL/NoSQL 全栈方案Build Web Application with Golang 第 5 章Go Web 开发数据库实战从 database/sql 驱动接口到 SQL/NoSQL 全栈方案Build Web Application with Go科研科学计算高性能计算LAMMPS 磁自旋 GNEB 计算fix neb/spin 命令详解与源码级原理剖析LAMMPS 磁自旋 GNEB 计算fix neb/spin 命令详解与源码级原理剖析 导读 fix neb/spin 是 LAMMPS SPIN 包中专用于科研科学计算高性能计算上一篇WebAssembly Micro Runtime (WAMR) 异常处理机制从WASM字节码到原生异常的全流程解析 下一篇aider 实战指南在终端编程对话中添加图片与网页上下文创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑