Files
SystemSimulationApp/docs/other/test-mql-4仿真对照与耗时分析-2026-09-11.md

12 KiB
Raw Permalink Blame History

test-mql-4 仿真对照与耗时分析(2026-09-11)

后续状态:本报告所述 C 修正已于 2026-09-11 合入正式网页后端,并完成重启及 HTTP 仿真核验,详见 合入记录。以下正文保留合入前的实验过程与结论;其中“未合入正式内核”描述的是当时状态。

新增核查:后续直接查看网页 LSTP00A 接口力时,在额外保存的碰撞事件点发现约 1.50×10¹¹ N 的纳秒级瞬态峰。它不在本报告的 0.01 s 共同采样点对照范围内;不能把下面的曲线接近结论扩展为所有事件点输出一致。完整曲线、采样差异与内部步诊断见 网页接口力对比报告。

在 system-optimization 分支工作区开展测试。原始 JSON 不能直接运行;修正参考口后,现有 C 内核仍在后半段陷入极小步长。测试副本经过参数对齐、管路计算修正和质量绝对误差限调整后,能够完整算到 10 s。最终验证版与 Amesim 的主要曲线接近,但仍有下面列出的局部差值,不能称为逐点完全一致。

本次只在 /test/mql4-20260910 中生成实验程序和数据;未将实验修改并入正式 C 内核,未改网页,未改雅各比矩阵算法,也未提交或推送。原始两个输入文件的 SHA256 复核通过,均未修改。

测试来源为 F:/Downloads/test-mql-4.json 和 tests/data/test_mql_4.ame。模型均为四支路气动机械系统;按元件类型和连接拓扑匹配后,均为 81 个元件、90 条连接、64 个动态状态。其中 26 个气体容腔产生 52 个状态,6 个质量块产生 12 个状态。Amesim 采用压力、温度状态,C 采用质量、内能状态;比较时转换到相同物理量。全部分支的元件对应关系保存在 topology-mapping.json。

先解决输入和测试条件。 原 JSON 的 amesim_p4node2_2/3/4 分别把 2 号参考口接到了阀门,3 号支路口接到了储气管端。供需校验报告 CONNECTION_VARIABLE_SUPPLY_MISSING,这是实际模型接线错误。仅在副本交换这三个节点的 2、3 号口,共修正六个端点;详见 connection-corrections.json。

AME 包内带有旧八支路结果和 C 源文件缓存。通过本机 Amesim 官方 API 重新编译运行四支路图纸后,EXE 日志确认 64 unknowns,新结果包含 0~10 s。对比采用这批新结果,未使用旧结果。归档 .c 缓存没有随本次保存更新,不能用它证明本次运行的代码结构;本次 Amesim 侧的依据是官方重编译、EXE 运行日志和新变量/结果文件。

AME 实际保存的积分设置为固定步长。测试副本已通过官方 API 改为 Standard 变步长、误差限 1e-7、最大步长 1e30、动态运行、不接续旧状态。JSON 的 BDF/max_step=1e30 被保留,rtol 显式设为 1e-7;当前网页后端默认 rtol=1e-6,因此不能用默认值冒充已对齐设置。两边输出间隔均为 0.01 s。Amesim 实际使用的自动算法和统计仅记录,不将复现 Amesim 求解算法作为本次目标。

此外有五处参数差异,按 AME 当前实际参数/初始值修正 JSON 副本:

JSON 元件 参数 原 JSON AME 对应值
amesim_pnl00r_4 直径 14 mm 10 mm
amesim_pnl0002_10 直径 20 mm 10 mm
amesim_pnl0002_10 长度 2 m 1 m
amesim_pnl0002_10 相对粗糙度 0.00225 0.00001
amesim_pnl0002_10 初始绝对压力 100000 Pa 101301.013 Pa

最后一项不是 1.013 bar:AME 实际保存的 pctr 是表压 1.013 Pa,加环境压力 101300 Pa 得到 101301.013 Pa。交付文件为 test-mql-4-corrected.json,与实验输入 test-mql-4-amesim-aligned.json 和最终打包副本 final/input.json 内容相同。该 JSON 包含接线及参数修正,C 公式与质量绝对误差限的修改保存在实验程序中,不属于 JSON 内容。初次只比较气罐、气缸和机械量时未发现该差异;扩大到全部 64 个状态量后识别并修正。

运行失败与其原因。 仅修正接线、保留原 C 算法及 JSON 参数,BDF/rtol=1e-7 运行 120 s 后停在 4.926982415 s;已接受 285780 步、调用模型 651838 次。它是超时退出,并非已完成或进程崩溃。另一次 30 s 的诊断运行显示,约 4.9 s 后步长降至 7.23e-8~1.59e-7 s,主要控制误差的状态是 PNL0003 管内气体质量/内能。超时回调使 RHS 返回失败后,CVODE 会附带线性系统/Jacobian 失败日志;不能把这种派生日志误判为另一个独立的雅各比崩溃。

把五处参数中的前四处对齐,但保留原管路算法,40 s 内也只推进到 4.720248930 s,说明参数差异与慢速问题并不是同一件事。此阶段初始压力差异尚未修正,原始记录保留在 matched-original。

C 的 PNL0003 用了独立 Darcy 压降反求、固定 48 次二分;现有其他气体管路采用可压缩流量关系。在接近平衡时,前者的流量对很小的压差过于敏感,给积分器造成很快的局部动态。只把 PNL0003 切到项目已有可压缩流量关系的实验中,同一份只修正接线的模型便在 18.03 s 墙钟内跑完 10 s,接受步数降至 9074;这验证了管路公式是主要卡顿来源之一,并不表示只减少二分次数就能获得相同效果。

最终 C 验证版还让 PNL0001 按流动方向选择上游温度,并统一氦气管路流量计算和诊断使用的黏度表达式。原实现存在“一个用途使用 Sutherland,另一个用途使用 NASA 表达式”的不一致。它们是物理输入/计算一致性修正,不是全局求解顺序调整。各项实验的源文件和统计均保留;没有据单次速度变化声称某一项具有普遍的固定加速比。

另一个已验证问题是小管腔质量状态的绝对误差限。旧 C 对所有气体质量和内能状态都给 1e-8(各自 SI 单位)。对质量只有约 1e-5~1e-3 kg 的小容腔,1e-8 kg 会盖过 rtol=1e-7,允许的相对质量误差远大于 1e-7。两边名义 rtol 相同,不代表压力/温度精度相同。

在相同已对齐模型和管路公式上,仅把质量绝对误差限调为 1e-14 kg,保留能量 1e-8 J、速度/位移 1e-12,模型调用从 61246 降到 24941,线性化触发的模型调用从 48960 降到 16768。阀流量最大差从 0.1652 g/s 降至约 0.0160 g/s,9.53~9.58 s 附近的异常小流量尖峰明显降低。更严格的容腔质量控制在此模型上改善了稳定性,反而更快;1e-14 kg 是本次试验值,不能直接作为任意尺寸新模型的统一默认值,应按容腔尺度定义误差权重。

曲线对比。 在共同的 1001 个采样时间点比较 64 个状态对应的物理量,并补充 8 条孔口/阀流量,共 72 条曲线。压力统一为绝对压力;AME 的 g/s 转为 kg/s,并按端口流入/流出约定处理符号。没有绘图。最终验证版的最大绝对差为:

量 最大绝对差 对应量 时间
位移 0.646855 μm amesim_mecmas21_9.x 1.22 s
速度 3.41015 μm/s amesim_mecmas21_9.v 1.22 s
压力 198.27 Pa amesim_pnl0001_14.p 0.05 s
温度 0.00962632 K amesim_pnl0002_1.T 0.08 s
质量流量 0.0160272 g/s amesim_pnvo001_3.port_2.m_flow 1.89 s

主要储气罐和气缸的压力差比表中管路局部压力峰值更小。位移末值停在规定的 -0.72 m 和 0.37 m。882 个输出序列全部有限,完整输出含两个碰撞事件点共 1003 点;闭合气路总质量初值为 2.78334124184 kg,全程最大漂移 8.44e-15 kg。三次重复 C 运行的完整序列及最终状态逐值相同。

原来主要腔室约 50 kPa 的差异,在参数对齐后降到几十 Pa,主要差异可归因于输入参数。仍有约 198 Pa 的管内短时偏差;收紧质量绝对误差限后这一峰值基本没有变化,因此不能用质量容差解释所有剩余偏差。两边还有管路阻力近似、物性计算和积分/事件处理的差别;本次没有逐项证明这 198 Pa 的唯一来源,也未建立“所有输出逐点满足 1e-7 相对差”的验收结论。接近零流量时应使用绝对误差或工作范围归一化,不能只看瞬时相对百分比。

还做了一次针对管内迭代上限的独立检查:在最终版本基础上,把相应管流求解的最大迭代次数从 16 提高到 64,仍得到约 200 Pa 的最大压力差、0.00991 K 的最大温度差。增加迭代次数没有消除该局部偏差,不能把剩余差异直接归因于这个迭代上限。该诊断保存在 matched-v4-pnl3-compressible-upstream-viscosity-nasa-mass-atol-tight-pipe,最终交付和计时仍采用 v3。

速度对比。 最终版本与 Amesim 在同一台机器交错运行各三次,取中位数。下表的主要速度指标是各程序报告的求解 CPU 时间,编译和进程启动不计入;另外列出进程墙钟供核对。结果序列保存一致,未涉及网页或绘图。

项目 Amesim 当前图纸重编译版 最终 C 验证版
完成仿真时间 10 s 10 s
求解 CPU 中位数 1.14062 s 4.01562 s
进程墙钟中位数 4.1550 s 6.5606 s
接受积分步数 2456 5137
程序报告的模型/函数计算次数 33143 24941
程序报告的 Jacobian 计算次数(仅记录) 382 262

C 的纯求解墙钟中位数为 4.4412 s;求解 CPU 比值约为 3.52。进程墙钟包含启动、授权、结果整理与写文件,不能拿它替代求解时间。两套程序的函数统计口径并不保证一次调用执行同样多的工作,不直接用调用数相除推导单函数性能。原 C 没有完成全程,因此不报告“原 C 完整运行耗时”或从仿真推进比例外推完整速度。

C 内部的耗时证据。 另编译一个只加计数/计时的版本,按嵌套调用排除重复计时;以下占比的分母是 C 模型 RHS 计算时间。该诊断运行不作为上述正式计时结果。

计算 次数 模型 RHS 时间占比
model_eval 24,941 5.72%
native_pipe_flow 548,702 49.39%
native_medium_orifice 199,528 8.22%
native_medium_gas 648,466 9.21%
native_temperature_ph 608,716 20.13%
native_pipe_diagnostics 548,702 7.18%
native_contact 99,764 0.16%

这里 model_eval 一行指去掉列出的子函数后的模型调度、赋值及机械平衡等剩余工作。模型 RHS 合计约占诊断求解墙钟的 96.4%。C 求解器线性化共触发 16768 次 RHS,占全部 24941 次的 67.2%;这是“为何重复计算”的另一种切分,与上表不能相加。

本模型生成的 236 项流体运算组成零循环依赖块,已经按依赖顺序一次执行;当前主要开销不能再解释为 Python 数值积分或多层全局压力/焓值循环。真正重的是一次 RHS 内反复算管流、反算温度、求氦气物性,以及积分器在试算/线性化时反复调用整套计算。

后续优先事项是:先把本次确认的物理公式和误差权重修正做成通用内核变更并补独立部件验证;再消除同一 RHS 内的重复物性换算、共享管流所需物性;把只用于显示的雷诺数、流速、摩擦系数等从每次 RHS 移到采样输出阶段;最后改进管内阻力方程的收敛策略和未收敛诊断。雅各比相关实现暂不改。

Amesim 算法信息仅留档:当前 Standard 自动运行统计为 Adams 727 步、BDF 1729 步,处理 8 次不连续事件;日志记录启用了其自适应 Jacobian 计算。按用户最新要求,不将 Amesim 的具体算法作为后续实现标准。

可复现文件。 全部位于 test/mql4-20260910:final/ 是本次 C 验证包,包含模型 C、公共计算 C、运行时快照、EXE、DLL、输入 JSON、哈希清单和运行脚本;final/run-bdf.ps1 显式指定本次求解参数;final/input.json 导入现有网页时仍由正式旧版 C 内核运行,不等同于此实验 EXE。run_ame.py 使用本机 Amesim 官方 API,experiment.py 保留各阶段实验,compare.py 生成比较指标,benchmark-v3/ 保存三次对照计时,cost-profile-v3/ 保存函数计时,verification-final.json 保存基本验证,amesim-fresh/test_mql_4.ame 保存重新计算的 Amesim 参考结果。