Files
SystemSimulationApp/docs/other/Amesim与C计算顺序差异核查-2026-09-10.md
T
lujingze b6c22a54f8 修复测试模型路径并完善四路八路回归与文档
- 按文件哈希区分当前八路工程和历史 Amesim 基准,修复测试与清单中的旧路径。
- 四路审计从 JSON 按需生成 XML,八路新增只核对模式,并显式使用 UTF-8 与 LF。
- 将缺失高刚度夹具的测试替换为当前八路完整 BDF 运行,明确未恢复原 RK45 专项覆盖。
- 更新前端大型工程测试、历史活动回放入口、数据说明、现行规范和相关报告。

验证:全量后台 374 项通过、1 项条件跳过;前端 11 项通过、历史独立服务用例 1 项跳过;四路八路 AME 审计通过。
环境、缓存和运行产物保持忽略;本次未实施工程 JSON 字段精简。
2026-09-12 15:49:09 +00:00

9.9 KiB

Amesim 与 C 计算顺序差异核查

路径复核 / 2026-09-12:本文引用的旧 tests/data/test-mql-8.json 已删除,保留当时实验描述;后续实验输入统一为 tests/data/test-mql-8-corrected.json,对应 tests/data/test_mql.ame。 详见 路径修复记录。

日期:2026-09-10。分支:system-optimization;核查时提交:0dcb465。

本次对照当前 tests/data/test-mql-8.json、Amesim 2404 的生成代码和本机组件源码,并在 test/amesim-order-study/ 中进行独立实验。正式模型、C 生成器、数值内核、积分器和雅可比策略均未修改。

结论与先前判断的修正

  1. 这个 JSON 没有执行节点压力二分循环。 实际编译得到 48 个压力组、48 个储气状态压力锚点,待求节点压力为 0。此前从通用生成器看到的“256 轮压力协调 × 每节点 48 次二分”分支不适用于本例。
  2. 四通节点的参考口连接语义与 Amesim 存在偏差。 8 个四通节点中只有 1 个直接接到相应储气状态端,另外 7 个的参考口接法不同,其中 3 个会引入流量与比焓的相互依赖。单纯把这些循环算快,不能解决与 Amesim 模型语义不一致的问题。
  3. 当前生成器缺少热力变量的依赖排序。 即使参考口修正,原生成器仍然运行全网流量/焓传播循环。实验中可以在编译时排好顺序,将全网流量计算降至每次状态求值 1 次,并移除该副本的全网焓迭代。
  4. 管道内部的数值迭代是另一层问题。 诊断中常见的是 PNL0001/2 流量函数的 16 次迭代耗尽;全网焓迭代并未耗尽上限。

Amesim 为什么可以顺序计算

生成文件 F:/CO2Project/Amesim/test_maql/test_mql_.c 声明 132 个显式状态,声明隐式状态和生成隐式状态均为 0。文件第 10427 行说明部件按照满足输入依赖的顺序调用;三通、四通节点没有运行时计算函数调用,它们通过变量复用和加法展开。

其气动部件主要交换两类量:

  • 储气部件提供当前压力、温度;管道和阀门据此计算质量流率、能量流率。
  • 节点从参考口取得压力、温度并传给其他端口,把其他端口的质量流率和能量流率相加后送回参考口。

PN3NODE2/P4NODE2 的参考口是 port 2。这是一项固定的计算接口关系,与气体当时向哪个方向流动是两回事;交换参考口与其他口可能改变模型。

在该 Amesim 模型中,8 个四通节点的参考温度、压力全部直接复用 PNL0001 的储气状态。已将 .var 中的共享变量位置与生成代码 GcontStateVarNum 核对,确认对应项属于连续状态,而非仅根据图形位置推测。

Amesim 节点 参考温度/压力所属管道
pnnode4_16 pneumatic_69 的 t2/p2
pnnode4_17 pneumatic_68 的 t2/p2
pnnode4_18 pneumatic_66 的 t2/p2
pnnode4_19 pneumatic_65 的 t2/p2
pnnode4_20 pneumatic_72 的 t2/p2
pnnode4_21 pneumatic_73 的 t2/p2
pnnode4_22 pneumatic_74 的 t2/p2
pnnode4_23 pneumatic_71 的 t2/p2

此时,温度/压力向支路传递,质量/能量流率向储气部件汇总,最后计算状态变化率。通过储气状态隔开了不同计算阶段,不需要先迭代求出所有连接量。

这里的显式系统仍可使用 BDF 等隐式积分方法;零系统隐式状态也不表示物性函数、管流函数或积分器内部绝无迭代。

当前 JSON 的具体偏差

当前网络有 156 个运行部件、178 条连接、132 个状态、1784 个输出、232 个气动端口。Amesim 部件与管线展开后,各数值组件类型数量与该 JSON 一致;数量一致不足以保证参考口关系一致。

JSON 四通节点 当前 port_2 接到 独立实验中接到的对应储气端
amesim_p4node2_1 amesim_pnl0001_13.port_2 原连接已满足
amesim_p4node2_2 amesim_pnvo001_2.port_2 amesim_pnl0001_14.port_2
amesim_p4node2_3 amesim_pnvo001_3.port_2 amesim_pnl0001_15.port_2
amesim_p4node2_4 amesim_pnvo001_4.port_2 amesim_pnl0001_16.port_2
amesim_p4node2_5 amesim_pnl0001_21.port_1 amesim_pnl0001_17.port_2
amesim_p4node2_6 amesim_pnl0001_25.port_1 amesim_pnl0001_18.port_2
amesim_p4node2_7 amesim_pnl0001_26.port_1 amesim_pnl0001_19.port_2
amesim_p4node2_8 amesim_pnl0001_27.port_1 amesim_pnl0001_20.port_2

实验只在工程副本中交换后 7 个节点的 port_2/port_3 连线,让参考口连接到同一压力组中的储气状态端。物理支路数量、参数和动态状态没有增加。

对于 _2/_3/_4,当前 C 计算存在以下潜在反馈:

阀门流量需要入口比焓
        ↓
入口比焓来自四通节点 port_2 的能量平衡
        ↓
该能量平衡又用到阀门流量

是否实际激活反馈还与流向有关。给低压侧供气时,阀门可使用另一侧已知比焓;反向流时则可能需要节点返回的比焓。本次反向流诊断使当前全网焓迭代从通常的 3 轮升至 10 轮。

编译时追踪显示:当前流量表达式读取 48 个端口比焓,其中 3 个无法仅由储气状态和简单赋值提前确定,正是 _2/_3/_4.port_2。调整参考口后的副本中,这 48 个输入全部可提前确定。

Python 元数据把这些气动端口都声明为 bidirectional。目前连接校验主要检查领域、端口占用和物理连接合同,没有针对该 Amesim 子模型检查“参考温度应由谁提供”的因果关系,因此能够接受这种与原 Amesim 接法不同的工程。

即使连接修正,为什么旧循环仍然存在

extended.py 先把无储气状态端口的比焓初始化为默认气体比焓,再按部件在网络中的顺序执行:

计算全网流量 → 更新全部端口比焓 → 检查变化 → 必要时重复

它没有先区分:哪些比焓只需要复制已知状态,哪些流量依赖这些复制结果,哪些能量输出应在流量确定后再计算。全网焓循环结束后还额外计算一次全网流量。

在独立副本中,提前排序这些关系即可生成:

恢复储气状态的物性
→ 传递流量计算所需的参考比焓
→ 计算一次全网流量
→ 按依赖顺序计算其余比焓和节点能量输出
→ 计算导数与展示输出

这说明质量/内能状态和比焓端口形式本身并不必然要求全网迭代。它们会增加局部物性反解的成本,但正确的连接和计算顺序仍可以消除本例的全网闭合循环。

独立实验结果

三个版本均为独立编译的 C 诊断程序:原模型及原生成器、仅调整参考口的模型及原生成器、调整参考口并按依赖顺序生成的模型。管道公式、误差阈值与物性函数保持相同。

使用初始状态、12 组质量/内能扰动状态,以及 1 组反向阀流状态,共 14 组。它们是用于检验依赖关系的状态点,不能作为完整 10 s 轨迹或 Amesim 曲线对齐的替代品。

每次状态求值的工作量 原模型 仅调整参考口 调整参考口并顺序计算
常规诊断状态:全网焓循环 3 3 0
常规诊断状态:全网流量调用 4 4 1
反向流诊断:全网焓循环 10 3 0
反向流诊断:全网流量调用 11 4 1

后两个版本在全部 14 组状态的 132 个导数与 1784 个输出上逐值完全一致。这项对照隔离了计算顺序变化的影响。它没有比较“修正前后应该相同”:参考口修正确实会改变多个状态点的数值结果,必须按模型修正处理。

本次未进行新的 Amesim/EXE 全程速度或曲线比较。诊断文件中的单次微秒计时含计数开销,不能外推为完整仿真的加速倍数。

真正达到迭代上限的地方

本例生成的全网焓循环上限是 928 轮。本次 14 组状态中,原模型最多执行 10 轮,触顶次数为 0;节点压力二分没有生成。

在 12 组普通扰动状态中,每次原模型求值调用 PNL0001/2 支路流量 144 次,144 次均执行满内部 16 轮。顺序版本将该调用数降至 36 次,但这 36 次仍执行满 16 轮。当前函数耗尽循环后返回最后的近似流量,没有将其标记为不收敛错误。

PNL0003 两个储气状态之间的 Darcy 流量则使用固定 48 次二分。本例每次状态求值有 8 次此类管流计算,压力差非零时执行这些局部二分;这与“未知节点压力二分”不同。

因此,优化顺序应是:先对齐节点参考口语义并增加相应检查,再生成正确的静态计算顺序,随后单独检查管道内部的收敛判据和求根算法。管流近似对 BDF 数值差分和小步推进的影响仍需进一步量化;本次不对其贡献比例作结论。

证据与复现

  • 结构快照和源文件哈希:test/amesim-order-study/structure.json。
  • Amesim 状态索引与四通节点参考来源:test/amesim-order-study/amesim-evidence.json。
  • 独立模型副本:test/amesim-order-study/reference-port-experiment.json;正式测试输入未覆盖。
  • 14 组状态、计数和逐值差异:probe-cases.json、probe-comparison.json、*-probes.jsonl。
  • 复现脚本:.venv-win/Scripts/python.exe test/amesim-order-study/study.py。
  • 当前生成器:app/simulation/native_codegen/extended.py:261(物性)、:362(未知压力)、:386(焓传播)、:409(全网循环)。
  • 当前管流:native/components/kernels.c:246 起;固定 48 次二分和 16/64 轮固定点迭代分别处理不同管流模型。
  • Amesim 组件依据:F:/amesim2404/amesim/libpn/submodels/PN3NODE2.c、P4NODE2.c、PNL0001.c、PNL0002.c、PNL0003.c、PNVO001.c。

实验输出保存在 Git 忽略的 /test/ 下。报告不复制 Siemens 组件实现;相关文件需使用本机已有 Amesim 安装读取。