Files
SystemSimulationApp/docs/other/C计算依赖排序验证-2026-09-10.md
T

7.3 KiB
Raw Blame History

C 计算依赖排序验证(2026-09-10)

在 system-optimization 分支完成已知来源识别、依赖排序和局部循环划分,接入默认 C 编译入口使用的扩展生成路径。未修改管路内部求根、积分器、雅可比策略或用户模型接线。

本轮实现

原有处理 当前处理
对非储气端口先填默认焓,靠全网循环传递已知量 记录当前状态/已准备信号和物性的来源,参考量按依赖传递;初始猜测不作为已知来源
全网流量与端口焓反复更新 将流量、连接方程和焓传递拆为计算条目,按实际输入输出关系排序
一个未知量试算会刷新全网流量 自动划分局部循环;压力试算只刷新本块残差所需的关系
压力范围和焓初值使用全网信息 局部块使用自身已有压力边界和外部已知焓来源

图算法不依赖模型名称、组件实例顺序、画布方向或固定气体流向。节点参考别名与能量返回计算分离;常系数流量约束消元得到的表达式也参加排序。构建清单新增 evaluationSchedule,列出来源、计算条目和循环块,便于核查。

当前机械、信号、容积与气体物性准备阶段继续执行原有确定顺序;新图处理的是扩展生成器原先需要全网闭合的气动计算。紧凑储气拓扑原本已顺序计算,继续保留。没有恢复旧 Python 数值实现或旧 IR。

修正参考口模型

输入使用已有独立副本 test/amesim-order-study/reference-port-experiment.json。正式 tests/data/test-mql-8.json 和浏览器工程均未覆盖。对照 EXE 是上一轮已经包含管流精确输入缓存与粗糙度常量预计算的版本,因此本轮比较隔离了计算排序的影响。

  • 132 个状态、1784 个输出;编译后形成 484 条气动计算关系,系统代数循环块为 0。
  • 使用原有 14 组初始/扰动/反向状态,再逆序重访并重复前两组,共 30 次求值。两版全部成功,每次的全部导数与输出逐值一致。
  • 独立插入执行计数后,30 次求值中每条计算关系均执行一次;计数不进入生产代码或计时版本。

相同时段的 BDF 对照

两版均使用 CVODE BDF、相对误差限 1e-7、最大积分步长 1e30 s。保持已有绝对误差策略,不绘图、不调用网页端。

指标 排序前 排序后
完成的仿真时段 0~0.02 s 0~0.02 s
采样间隔 0.002 s 0.002 s
纯求解耗时(单次验证) 2.368098 s 1.645752 s
求值次数 5123 5123
接受步数 169 169
拒绝步数 5 5

两版最终状态和完整采样序列逐值一致,单次耗时减少约 30.5%。这是相同时段的功能与耗时对照;当时另有回归验证任务运行,因此另用下述独立微基准检查提速幅度。

更短的 0~0.002 s 对照同样逐值一致,均为 304 次求值、25 个接受步和 1 个拒绝步。

独立 C 状态求值计时

使用同一批 14 组状态,在 C 内重复 200 次,共 2800 次系统求值;输入读取、进程启动、编译与输出写出不在计时内。两版各预热一次,交替计时 5 轮,取中位数:

排序前 排序后 加速倍数
1.686816 s 1.156371 s 1.459

计时版本不含诊断计数,校验和一致。这是状态求值的局部基准,不能直接代表任何模型的完整仿真倍数。

长时段验证的边界

尝试仿真到 10 s,每版限制执行 30 s:排序前推进到 0.0741618 s,排序后推进到 1.8645395 s,两版均返回执行超时。共同的 0、0.02、0.04、0.06 s 采样点逐值一致,但本轮没有取得完整 10 s 曲线对照。

另一次仿真终点为 0.06 s、采样间隔 0.002 s 的检查中,排序前在 30 s 限额内推进到 0.0487527 s,排序后用 25.022361 s 完成。共同的 25 个采样点逐值一致;将排序后该段全部 31 个采样状态分别送入两版 EXE,全部导数与输出也逐值一致。该次两版完成范围不同,不作为整段加速倍数。

上述不同采样/终点设置会影响积分运行,不能把两次计时直接混用,也不能用相同执行时间推进的仿真时长之比宣称提速。管流内部迭代及刚性积分的成本仍在,本轮未处理这两项。

通用性验证

  • 2000 层逆序输入的依赖链正确排序并追溯到状态来源,不使用 Python 递归。
  • 缺失来源、重复提供者、无来源的纯别名环均拒绝编译。
  • 两个独立串联阻力压力循环与一个直算支路组合后,循环内各流量计算次数与独立运行相同;直算支路每次只执行一次。正反流及状态重访的结果均逐值一致。
  • 打乱四通节点模型的组件和连接顺序后,仍无系统循环,各条目仅执行一次。常系数消元的求和顺序变化只产生浮点舍入级差异,使用远严于冻结基准的容差验证。
  • 三支路的压力与混合焓耦合模型保留一个局部块;正反流、零压差与状态重访均通过质量/能量守恒检查。
  • 现有 50 个冻结网络通过 C 数值对照;管流缓存、两种积分器、接口供需及编译入口的定向回归通过。
  • tests/data/native-skill-test.xml 的 skill-test 回归完整完成 10 s,RK45 最大步长 0.001 s、rtol 1e-7,预热后单次纯求解 0.450283 s。它走原有紧凑路径,作为兼容性检查,不用于声称排序收益。

定向回归共 29 项通过。后端全量运行 276 项:首次 274 项通过、1 项锁定环境检查跳过、1 项因编译器版本查询返回空输出出错。重跑冻结网络时又有一次 EXE 初始化返回空输出;这两次均未触发数值不一致断言。受影响的网络 5 和 40 随后使用原冻结期望值单独复核通过。没有为此改动生产进程处理、冻结基准或数值容差;本次全量运行不能表述为一次全部通过,原始限制在此保留。

源文件与模型接入要求见 C 求值排序规范。本轮条件表达式按所有可能分支保守记录依赖,尚未进行运行时流向特化;局部压力/焓求解保留既有方法,未宣称支持任意新非线性方程。

复现材料

test/dependency-schedule-study/ 按仓库约定被 Git 忽略,包含:

  • baseline-build.json、scheduled-build.json:两版 EXE 与构建清单。
  • schedule.json、model.c:正式生成器输出的依赖清单与 C 源码。
  • verification.json、*-probes.jsonl:30 次逐值验证。
  • benchmark.json:5 轮交替计时及校验和。
  • integration-comparison*.json、bdf-*/result.json:积分统计与原始序列,包括未完成的超时运行。
  • trajectory-probe-check.json:长段共同采样及采样状态的求值对照。
  • skill-test/summary.json:完整 skill-test 回归结果。
  • study.py:verify、benchmark、integrate(0.002 s)、short(0.02 s)、matched(0.06 s)、full(10 s)模式;积分复现需选择新的输出目录,不能覆盖已有运行结果。

自动回归位于 tests/test_native_schedule.py,不依赖上述临时材料;纯依赖图测试已加入 Linux 合同检查,完整 C 执行测试由 Windows 数值回归自动发现。