尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
LAMMPS fix vector 命令完全指南:全局标量序列存储、环形缓冲与扩散系数计算
科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载fix vector是 LAMMPS 中用于时间序列数据积累的核心输出工具它以固定的采样周期Nevery把来自 compute、fix 或 variable 的全局标量逐个存入不断增长的全局向量单个输入值或全局数组多个输入值供其他输出命令及variable的trap()、slope()等特殊函数消费。本文基于官方文档 fix_vector.rst 与实现源码 fix_vector.cpp 展开读者将掌握该命令的完整语法、nmax环形缓冲原理、与trap()/slope()配合计算扩散系数的实战方案以及多段run场景下的内存预分配策略。一、语法总览与参数详解fix vector的命令格式如下fix ID group-ID vector Nevery value1 value2 ... keyword args ...位置/关键字说明ID,group-ID任意 fix 的通用参数参见 fix 命令文档vector本 fix 的 style 名称Nevery每隔多少个时间步采样一次输入值value1 value2 ...一个或多个输入值取值形式见下表keyword nmaxnmax length将向量最大长度限制为length其中每个value可以是形式含义c_ID由 computeID计算的全局标量c_ID[I]由 computeID计算的全局向量的第I个分量f_ID由 fixID计算的全局标量f_ID[I]由 fixID计算的全局向量的第I个分量v_name由 equal 风格变量name计算的值v_name[I]由 vector 风格变量name计算的向量的第I个分量官方文档给出的三个典型示例fix 1 all vector 100 c_myTemp fix 1 all vector 5 c_myTemp v_integral fix 1 all vector 50 c_myTemp nmax 200第一个示例每 100 步采样一次温度标量第二个示例每 5 步同时采样温度与一个变量值构成两列数组第三个示例把温度序列限制为最多 200 个元素填满后丢弃最旧数据。二、工作原理从标量序列到全局向量/数组从数据流角度fix vector做的事情非常纯粹把全局标量按时序攒成向量。当只指定一个输入值时各次采样值被存为一个不断增长的全局向量指定多个值时每次采样的多个标量被存为全局数组的一行行数不断增长。官方文档 Howto_output.rst 也将其归入处理输出量的 fixes明确描述为以全局标量作为输入、一次一个元素地累积成全局向量输出。从源码 fix_vector.cpp 可以看到它的注册与生命周期类FixVector通过FixStyle(vector,FixVector)宏注册见 fix_vector.h因此vector是内置 fix 风格无需安装任何可选包。setmask()只注册END_OF_STEP回调即每个时间步结束时检查是否需要采样。构造函数对每个value使用ArgInfo解析c_/f_/v_前缀与可选的[I]下标并立即做三类校验对 compute检查其 ID 存在、scalar_flag/vector_flag是否支持对应访问方式、下标是否越界对 fix除同样检查外还校验nevery % ifix-global_freq 0即该 fix 产生全局值的周期必须与采样周期兼容否则报错Fix for fix ... vector not computed at compatible time对 variable校验必须是equal风格无下标或vector风格带下标atom风格变量因产生逐原子值而被禁止。每个被引用的 compute/fix 的 intensive/extensive 属性会被读取并合并若多个输入值的属性不一致报错Fix vector cannot set output array intensive/extensive from these inputs详见下文第六节。存储形态的确定源码 fix_vector.cpp 中明确单个输入值 →vector_flag 1输出一个全局向量多个输入值 →array_flag 1size_array_cols等于输入值个数输出一个全局数组每一行是一次采样的全部值。同时global_freq nevery、time_depend 1表示该 fix 的输出随时间变化且每Nevery步才更新一次。因此外部命令只能在Nevery整数倍的时间步读取到有效值这是使用时的重要约束。采样时间点规则Nevery参数决定哪些时间步的输入值会被采用并存储只有Nevery的整数倍时间步包括时间步 0才会贡献数据。从源码看构造函数会计算出下一个需要动作的nextstep并通过modify-addstep_compute_all(nextstep)预登记所有 compute 的调用时机end_of_step()中若update-ntimestep ! nextstep则直接跳过否则采样后nextstep nevery并再次登记。setup()回调会直接调用一次end_of_step()保证时间步 0 的首个值被写入。三、数据来源约束必须输出全局标量fix vector的输入必须是全局量且必须是标量不能是逐原子量per-atom或局域量local也不能直接是全局向量/数组——向量分量需通过[I]下标逐个取出。compute 来源产生全局量的 compute 是那些 style 名称中不含atom一词的如compute temp、compute msd、compute vacf。若想对逐原子量求和得到全局量可使用 compute reduce 把逐原子量归约为全局标量或向量后再供fix vector使用。fix 来源只有少数 fix 会产生全局量如 fix nvt、fix temp/rescale 内置的温度 compute需查阅各 fix 文档确认。此外某些 fix 只在特定时间步产出值该周期必须与Nevery兼容否则运行时报错。variable 来源仅equal风格和vector风格变量可用atom风格变量因产生逐原子值被拒绝。equal/vector风格变量的公式本身可以引用原子属性、热力学关键字甚至在其求值时调用其他 compute、fix 或变量因此是一种非常通用的取值方式。注意fix vector的group-ID参数本身被忽略源码中直接继承 Fix 基类处理但引用的 compute/fix 内部可以携带它们自己的 group 定义实际影响采样值的正是后者。四、实战案例一VACF 积分求扩散系数fix vector最经典的用途是累积一条时序曲线后用 variable 文档 中的trap()函数做数值积分。trap()对全局向量中的点序列按梯形法则求和——首尾元素权重减半等价于对等间距采样点的积分。官方文档给出的速度自相关函数VACF积分示例compute 2 all vacf fix 5 all vector 1 c_2[4] variable diff equal dt*trap(f_5) thermo_style custom step v_diff每步Nevery 1把compute vacf输出的第 4 个分量速度自相关分量存入向量再通过trap(f_5)对整个时间序列做梯形积分并乘以dt即得到扩散系数可直接写入thermo_style输出。仓库自带的二维扩散示例 examples/DIFFUSE/in.vacf.2d 给出了完整可运行版本并考虑了二维修正因子compute vacf all vacf fix 5 all vector 1 c_vacf[4] variable vacf equal 0.5*dt*trap(f_5) thermo_style custom step temp c_vacf[4] v_vacf run ${nprod}这里0.5因子是二维体系的扩散系数修正文档注释明确说明。如果读者运行该示例v_vacf即为逐步收敛的扩散系数估计。五、实战案例二MSD 斜率法求扩散系数除trap()外variable 文档 中的slope()函数对全局向量做线性回归拟合返回拟合直线的斜率fix vector累积的均方位移MSD时间序列正是它的理想输入。二维 MSD 示例 examples/DIFFUSE/in.msd.2d 实现如下compute msd all msd com yes variable twopoint equal c_msd[4]/4/(step*dt1.0e-6) fix 9 all vector 10 c_msd[4] variable fitslope equal slope(f_9)/4/(10*dt) thermo_style custom step temp c_msd[4] v_twopoint v_fitslope run ${nprod}这里每 10 步采样一次c_msd[4]MSD 的第 4 分量slope(f_9)对累积序列做线性回归得到 MSD 增长率再除以 4二维与10*dt采样间隔换算即得到扩散系数 D。同一脚本还给出了逐点计算的v_twopoint作对照。多输入值数组形态的真实案例见弹性常数示例 examples/ELASTIC_T/BORN_MATRIX/Argon/Analytical/in.ljcovfix VEC all vector 1 v_s1 v_s2 v_s3 v_s4 v_s5 v_s6每步把 6 个变量值存入一个 6 列的全局数组每行对应一个时间步后续再整体读取用于 BORN 矩阵分析。六、intensive / extensive 属性与输出兼容性fix vector产生的向量/数组有 intensive内禀量与 extensive广延量之分这影响其他命令如compute reduce、compute global/atom等如何处理其输出若输入为单个值整个向量统一为 intensive 或 extensive取决于被采样值的属性若输入为多个值数组的所有列必须属性一致否则构造时报错源码中if (value ! finalvalue) error-all(...)compute/fix 提供的值其属性由对应 compute/fix 决定变量产生的值一律按 intensive 处理。从源码看单值模式设置extvector finalvalue多值模式设置extarray finalvalue最终通过compute_vector()/compute_array()接口暴露给其他输出命令。官方文档 Howto_output.rst 中的输出命令总览表也把fix vector列为输入全局标量、输出全局向量的处理型 fix。七、nmax 关键字与环形缓冲机制nmax length用于限制向量/数组的最大长度。默认情况下nmax由运行总步数推导等于一次 run或使用run命令start/stop关键字的多段 run 合并步数除以Nevery再加 1。当采样周期很小而模拟步数很大时累积的向量会非常庞大官方文档给出约 20 亿2 billion条目的实现上限并明确警告内存风险使用nmax即可规避。源码中的机制是一个典型的环形缓冲ring bufferinit()中按(finalstep - initialstep) / nevery 1计算ncountmax并取min(ncountmax, nmaxval)作为实际分配容量end_of_step()中写入位置为nindex ncount % ncountmax即填满后自动回绕覆盖最旧的元素对外读取接口compute_vector()/compute_array()在缓冲区已满时通过idx (i ncount) % ncountmax将逻辑索引映射回实际存储位置保证读取到的仍是按时间顺序排列的最新数据窗口。换言之启用nmax后fix vector始终保存最近nmax次采样值旧值被新值滚动淘汰。八、多段 run 场景的内存预分配如果执行多次run且后续 run 使用pre no选项跳过初始化那么首次run必须配合stop关键字给出覆盖所有 run 的总步数使fix vector一次性分配足够容量的存储。官方文档对此有明确要求这样该 fix 才能为存储值分配充足空间。源码实现也印证了这一设计init()在每次 run 之前基于update-endstep重新计算ncountmax并扩容且只把新增存储区清零、保留前次 run 已存的数据注释明确指出 values stored in previous runs must be kept。因此配合run start stop的正确用法多段 run 的采样数据会被连续累积进同一个向量/数组。九、测试验证仓库如何校验 fix vector当前仓库为fix vector提供了多层次的测试证据可作为行为正确性的依据数值回归测试unittest/force-styles/tests/fix-output-vector.yaml输入脚本执行fix test all vector 2 c_output_temp v_pe每 2 步采样温度与势能两列并用global_array给出期望的数值结果逐项比对覆盖了数组形态与精确数值输出。参数合法性测试unittest/commands/test_input_validation.cpp验证nmax 3000000000超出 32 位整数范围、会截断分配与nmax 0均报Invalid nmax value而nmax 1000合法——与源码中(nmaxval 1) || (nmaxval MAXSMALLINT)的检查一致。Fortran 接口测试unittest/fortran/test_fortran_extract_fix.f90通过lmp%command(fix vec all vector 1 v_natoms v_ts)创建全局数组并在 Fortran 侧通过extract_fix接口读取验证了多值数组形态对外的可访问性。十、注意事项与限制汇总内存Nevery较小而运行很长时向量可能极大接近 20 亿条上限前务必设置nmax。读取时机输出值只能在Nevery的整数倍时间步被其他命令访问。采样周期兼容引用产出全局值的 fix 时其产出周期必须与Nevery兼容否则报错。最小化fix vector在能量最小化minimize 命令过程中不会被调用。重启该 fix 不向二进制重启文件restart 命令写入任何信息fix_modify的所有选项对它均不适用。限制官方文档声明 Restrictions 为 none无内置使用限制。十一、默认值与相关命令默认值nmax默认从单次 run 的步数或多段 run 配合start/stop关键字的合计步数除以Nevery再加 1 推导。相关命令compute 命令提供全局标量/向量、variable 命令trap()/slope()等特殊函数消费全局向量、run 命令start/stop/pre关键字控制存储分配。扩展阅读Howto_output.rst 系统介绍了 LAMMPS 全部输出机制fix vector在其中扮演标量序列累积器的角色更复杂的时序分析如自相关函数可参考 fix ave/correlate其文档亦在仓库中。综上fix vector虽语法极简却是连接逐时间步的全局标量与整体时间序列分析的桥梁配合variable的trap()与slope()即可实现扩散系数等动力学量的在线计算配合nmax与run的start/stop关键字则能在长模拟与多段 run 中安全控制内存值得在每个需要时序积累的 LAMMPS 脚本中优先考虑。赞分享科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载相关推荐LAMMPS 计算 SNAP 双谱分量compute sna/atom、snap、sna/grid 系列命令完全指南LAMMPS 计算 SNAP 双谱分量compute sna/atom、snap、sna/grid 系列命令完全指南 本指南以 LAMMPS ML SNAP科研科学计算高性能计算LAMMPS 计算变形梯度compute smd/tlsph/defgrad 命令完全指南LAMMPS 计算变形梯度compute smd/tlsph/defgrad 命令完全指南 compute smd/tlsph/defgrad 是 LAMMP科研科学计算高性能计算LAMMPS compute msd 命令详解均方位移计算与扩散系数提取LAMMPS compute msd 命令详解均方位移计算与扩散系数提取 导读 compute msd 是 LAMMPS 中用于计算原子均方位移Mean S科研科学计算高性能计算上一篇用 mcp-use 构建最小的 TypeScript MCP 服务器工具、资源与提示词一次讲透下一篇Viper 信息收集智能体LangGraph Discovery Agent用自然语言驱动自动化信息收集实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

硬件项目开发相关知识

硬件项目开发相关知识

硬件项目开发相关知识样机阶段命名M16 A-CODE、M12G-X-CODE航空头含义M是什么意思A-Code/X-Code含义线缆按照能不能动分类线缆的弯折,拖链,扭转区别根据拖链次数区分按柔字分级(最常见)按宣传拖链次数分级样机阶段命名 硬件/整机…

📅 2026/10/16 2:36:32
数据库基础查询

数据库基础查询

1.建库建表2.插入数据mysql> use mydb8_worker; Database changed mysql> create table t_worker(-> department_id int(11) not null comment 部门号,-> worker_id int(11) primary key not null comment 职工号,-> worker_date date not null comment 工作时间…

📅 2026/10/16 2:36:32
airi 桌面端的键盘魔法:VueUse `useMagicKeys` 组合键监听实战指南

airi 桌面端的键盘魔法:VueUse `useMagicKeys` 组合键监听实战指南

人工智能AI AgentMCP 服务工具调用GUI 自动化语音数字人交互助手 【免费下载链接】airi 💖🧸 自托管、归你拥有的 Grok 风格 AI 伴侣与 waifu / 赛博生命灵魂容器,目标是接近 Neuro-sama 的高度;支持实时语音聊天、Minecraft 和 F…

📅 2026/10/16 2:31:32
MORE NEWS

更多资讯

📰

SAP Fiori Elements实战:从CDS注解到RAP应用开发全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

实训5指纹设置全解析:从传感器原理到实操与安全

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

语音特征提取全流程:从原始波形到MFCC特征向量

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Java线程start()方法原理与线程生命周期解析

1. 线程生命周期与start()方法本质当面试官抛出"为什么线程start()不能重复调用"这个问题时,实际上是在考察你对Java线程生命周期的理解深度。让我们先看一个典型的错误示例:Thread thread new Thread(() -> System.out.println("Run…

📰

Spring Cloud Gateway GatewayFilter 源码解析与责任链机制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

粒子群算法优化LQR的二级倒立摆控制设计与避坑实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬