前端进度条性能优化、仿真结束后后处理优化;后端C代码生成流程优化:先识别来源,再按照已知未知量需求排序,最后局部求解
This commit is contained in:
1 parent
0dcb465d84
commit
91bd9fb252
77 files changed
+11223
-551
No files matched your search
@@ -0,0 +1,135 @@
|
||||
# Amesim 与 C 计算顺序差异核查
|
||||
|
||||
日期: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 计算存在以下潜在反馈:
|
||||
|
||||
```text
|
||||
阀门流量需要入口比焓
|
||||
↓
|
||||
入口比焓来自四通节点 port_2 的能量平衡
|
||||
↓
|
||||
该能量平衡又用到阀门流量
|
||||
```
|
||||
|
||||
是否实际激活反馈还与流向有关。给低压侧供气时,阀门可使用另一侧已知比焓;反向流时则可能需要节点返回的比焓。本次反向流诊断使当前全网焓迭代从通常的 3 轮升至 10 轮。
|
||||
|
||||
编译时追踪显示:当前流量表达式读取 48 个端口比焓,其中 3 个无法仅由储气状态和简单赋值提前确定,正是 `_2/_3/_4.port_2`。调整参考口后的副本中,这 48 个输入全部可提前确定。
|
||||
|
||||
Python 元数据把这些气动端口都声明为 `bidirectional`。目前连接校验主要检查领域、端口占用和物理连接合同,没有针对该 Amesim 子模型检查“参考温度应由谁提供”的因果关系,因此能够接受这种与原 Amesim 接法不同的工程。
|
||||
|
||||
## 即使连接修正,为什么旧循环仍然存在
|
||||
|
||||
`extended.py` 先把无储气状态端口的比焓初始化为默认气体比焓,再按部件在网络中的顺序执行:
|
||||
|
||||
```text
|
||||
计算全网流量 → 更新全部端口比焓 → 检查变化 → 必要时重复
|
||||
```
|
||||
|
||||
它没有先区分:哪些比焓只需要复制已知状态,哪些流量依赖这些复制结果,哪些能量输出应在流量确定后再计算。全网焓循环结束后还额外计算一次全网流量。
|
||||
|
||||
在独立副本中,提前排序这些关系即可生成:
|
||||
|
||||
```text
|
||||
恢复储气状态的物性
|
||||
→ 传递流量计算所需的参考比焓
|
||||
→ 计算一次全网流量
|
||||
→ 按依赖顺序计算其余比焓和节点能量输出
|
||||
→ 计算导数与展示输出
|
||||
```
|
||||
|
||||
这说明质量/内能状态和比焓端口形式本身并不必然要求全网迭代。它们会增加局部物性反解的成本,但正确的连接和计算顺序仍可以消除本例的全网闭合循环。
|
||||
|
||||
## 独立实验结果
|
||||
|
||||
三个版本均为独立编译的 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 安装读取。
|
||||
Reference in new issue
Block a user