高温氦气物性补全;三通四通能量计算bug修正
This commit is contained in:
1 parent
6fc9afe41d
commit
2b07d996cf
133 files changed
+5230
-253310
No files matched your search
@@ -0,0 +1,128 @@
|
||||
# Amesim 非零相对误差与近零原值核验
|
||||
|
||||
**结论:按下列近零分界处理后,仍不能判定所有曲线均在 ±5% 内。** 压力、温度、容积、体积功率、质量及机械量的明显非零采样均满足 ±5%;节点焓流、节点质量流和信号在部分采样点超限。近零点只列原值和绝对差,不用极大相对百分数评价。
|
||||
|
||||
本次重新分析上一轮同一 AME、同参数和初始状态的原始结果,没有重新运行或改变模型。四组采样区间互相重叠,统计点数是“曲线×采样点”,不能解释成独立实验次数或连续时间覆盖率。两版主比较为 Amesim 与修复后平台;附表同时保留修复前数值。
|
||||
|
||||
## 判据和近零分界
|
||||
|
||||
明显非零:`|Amesim| > ε`,计算 `100 × (平台 − Amesim) / Amesim`,绝对值大于 5% 为超限。近零:`|Amesim| ≤ ε`(包含严格零),列出 Amesim、平台原值及绝对差。如果参考近零而平台明显非零,也保留异常,绝不自动算通过。
|
||||
|
||||
用户没有指定工程分辨率;以下 ε 是本次明确采用的**暂定报告分界,不是 Amesim 官方公差或用户批准的验收标准**。使用带单位的绝对分界,使不同运行窗口和异常大峰值不会改变同一个物理数值的分类。另计算 ε 缩小/放大 10 倍的敏感性。
|
||||
|
||||
| 物理量 | ε | 单位 |
|
||||
| --- | ---: | --- |
|
||||
| 绝对压力 | 1 | Pa |
|
||||
| 温度 | 1e-06 | K |
|
||||
| 节点参考端焓流 | 1 | W |
|
||||
| 节点参考端质量流 | 1e-06 | kg/s |
|
||||
| 速度 | 1e-06 | m/s |
|
||||
| 位移 | 1e-09 | m |
|
||||
| 间隙 | 1e-09 | m |
|
||||
| 气体质量 | 1e-12 | kg |
|
||||
| 气室容积 | 1e-12 | m3 |
|
||||
| 活塞容积 | 1e-12 | m3 |
|
||||
| 活塞容积变化率 | 1e-12 | m3/s |
|
||||
| 气室有效容积变化率 | 1e-12 | m3/s |
|
||||
| 气室体积功率 | 1 | W |
|
||||
| 接触力 | 1e-06 | N |
|
||||
| 信号 | 1e-12 | 1 |
|
||||
|
||||
压力沿用曲线对比的绝对压力(Amesim 表压加 101300 Pa),温度为 K。相对误差依赖物理量的零点,不能把这两个统计直接当成表压或摄氏温度的相对误差。
|
||||
|
||||
## 明显非零区域:修复后最大逐点相对误差
|
||||
|
||||
| 物理量 | 最大绝对相对误差 (%) | 是否超过 5% |
|
||||
| --- | ---: | --- |
|
||||
| 绝对压力 | 0.065922354 | 否 |
|
||||
| 温度 | 0.023452192 | 否 |
|
||||
| 节点参考端焓流 | 67.617447 | 是 |
|
||||
| 节点参考端质量流 | 10553.206 | 是 |
|
||||
| 速度 | 0.15139547 | 否 |
|
||||
| 位移 | 0.0023719562 | 否 |
|
||||
| 间隙 | 0.14853129 | 否 |
|
||||
| 气体质量 | 0.0068687288 | 否 |
|
||||
| 气室容积 | 1.2940894e-08 | 否 |
|
||||
| 活塞容积 | 6.166529e-06 | 否 |
|
||||
| 活塞容积变化率 | 2.7035985e-12 | 否 |
|
||||
| 气室有效容积变化率 | 2.346948e-13 | 否 |
|
||||
| 气室体积功率 | 4.7856974e-06 | 否 |
|
||||
| 接触力 | 0.012194529 | 否 |
|
||||
| 信号 | 100 | 是 |
|
||||
|
||||
上表取四个已有实验网格的最大值,不代表未采样时刻的极值。
|
||||
|
||||
| 比较区间 | 明显非零点 | 修复前超限点 | 修复后超限点 | 修复后超限曲线 |
|
||||
| --- | ---: | ---: | ---: | ---: |
|
||||
| 0–50 s,10 ms,容差 1e-8 | 902334 | 31 | 36 | 14 |
|
||||
| 0–0.15 s,0.1 ms,容差 1e-8 | 320526 | 1136 | 34 | 6 |
|
||||
| 0–0.15 s,0.1 ms,容差 1e-10 | 320534 | 1124 | 26 | 2 |
|
||||
| 0–2 μs,2 ns,容差 1e-10 | 194822 | 0 | 0 | 0 |
|
||||
|
||||
局部指标并非修复后全部改善:全程按本分界的超限采样由 31 增至 36,而启动细采样由 1136 降至 34。下文也保留修复后更差的尾段原值,不能用整体峰值误差改善代替逐点验收。
|
||||
|
||||
## 超限点和原因核查
|
||||
|
||||
| 区间 | 变量 | t (s) | Amesim | 修复后平台 | 相对误差 (%) | 单位 |
|
||||
| --- | --- | ---: | ---: | ---: | ---: | --- |
|
||||
| full | p4node2_8.焓流 | 0.36 | 2.2033573 | 0.71350335 | -67.617447 | W |
|
||||
| full | p4node2_8.质量流 | 0.34 | 4.3835447e-06 | 1.2817725e-05 | 192.40547 | kg/s |
|
||||
| startup | p4node2_1.焓流 | 0.1261 | -1.8519973 | -0.88438516 | -52.246951 | W |
|
||||
| startup | p4node2_3.质量流 | 0.04 | 0.0036984632 | 0.39400491 | 10553.206 | kg/s |
|
||||
| startup-refined | p4node2_1.焓流 | 0.1261 | -1.855029 | -0.90430536 | -51.251148 | W |
|
||||
| full | ud00_2.out.signal | 0.8 | 1e+12 | 0 | -100 | 1 |
|
||||
|
||||
- **0.04 s 阶跃点**:标准容差启动结果中,Amesim STEP0 原始保存值为 0,平台为 1;同一采样点 P4NODE2_3 质量流分别为 0.003698463218 与 0.394004911810 kg/s。四个 P4NODE2 的质量流超限都只在该点。下一个 0.0401 s 样本两边信号均为 1。收紧容差的独立启动运行中,该点两边信号均为 1,质量流最大相对差为 3.91268446%。证据支持“事件点输出侧别不同”,不能据此推断整个运行存在 100 倍流量误差,也未证明事件时刻之外完全无差异。
|
||||
- **0.8 s 信号点**:全程原始输出中,UD00_1 为 Amesim 1e17、平台 49000,UD00_2 为 Amesim 1e12、平台 0;在 0.81 s 已取相同后续值。两个事件点仍计为超限,没有剔除或移动时间轴。
|
||||
- **焓流过零与尾段**:0.126 s 附近焓流有约 1 W 的差异,收紧容差后仍存在;0.27–0.36 s 的少量焓流/质量流也有超限。原值如下。只凭本次统计不能将这些差异全部归为浮点噪声,根因尚未进一步确定。
|
||||
|
||||
## 近零及过零样本:原值对照
|
||||
|
||||
以下包括非常小的尾段值、焓流过零附近的小量、严格零,以及参考为零但平台不为零的事件点。是否可接受由原值和工程要求决定;本表不使用相对百分数。
|
||||
|
||||
| 区间 | 变量 | t (s) | Amesim | 修复前平台 | 修复后平台 | 修复后绝对差 | 单位 |
|
||||
| --- | --- | ---: | ---: | ---: | ---: | ---: | --- |
|
||||
| full | p4node2_2.焓流 | 1.63 | -0.0016188897 | -0.0021637398 | -0.8096496 | 0.80803071 | W |
|
||||
| full | pn3node2_3.质量流 | 1.93 | 1.9984767e-09 | 2.3960576e-09 | 2.5191052e-05 | 2.5189054e-05 | kg/s |
|
||||
| full | mecmas21_6.v | 3.69 | 1.2049528e-07 | 1.1364239e-07 | 1.1371358e-07 | 6.7816977e-09 | m/s |
|
||||
| full | pn3node2_9.焓流 | 5.75 | 5.2962888e-24 | -1.0745511e-06 | 3.106839e-07 | 3.106839e-07 | W |
|
||||
| full | pn3node2_9.质量流 | 5.75 | -3.2799132e-28 | 5.9755647e-11 | -1.9240571e-11 | 1.9240571e-11 | kg/s |
|
||||
| full | mecmas21_4.v | 29.6 | -2.5334477e-20 | -3.4949478e-15 | -4.0371247e-15 | 4.0370994e-15 | m/s |
|
||||
| startup | p4node2_1.焓流 | 0.126 | 0.81690182 | -12.915603 | 1.8036912 | 0.98678937 | W |
|
||||
| startup-refined | p4node2_1.焓流 | 0.126 | 0.81995653 | -12.878673 | 1.7699446 | 0.9499881 | W |
|
||||
| startup | step0_6.out.signal | 0.04 | 0 | 1 | 1 | 1 | 1 |
|
||||
| volume-startup | pnch012_15.volume_work | 3.2e-08 | -0 | -0 | -0 | 0 | W |
|
||||
|
||||
前三行分别选择全程近零区焓流、质量流、速度的最大绝对差,避免只展示误差最小的尾段。特别是 PN3NODE2_3 在 1.93 s:Amesim 约 0.001998 mg/s,修复前约 0.002396 mg/s,修复后约 25.19105 mg/s;修复后在此点明显比修复前偏差大。这不能用“分母接近零”解释掉,需要单独查明流量残差的原因。
|
||||
|
||||
近零分界仅针对参考值。例如 0.126 s 的 Amesim 焓流小于 1 W,而平台大于 1 W;这个差异仍明确展示,并未视为两边都等于零。每条曲线近零区的参考/平台最小值、最大值和最大绝对差对应的两版原值均保存于各区间的 `classified-relative-error.json`。
|
||||
|
||||
## 分界敏感性
|
||||
|
||||
| 区间 | ε×0.1 超限点 | ε 超限点 | ε×10 超限点 |
|
||||
| --- | ---: | ---: | ---: |
|
||||
| full | 232 | 36 | 2 |
|
||||
| startup | 38 | 34 | 20 |
|
||||
| startup-refined | 30 | 26 | 12 |
|
||||
| volume-startup | 0 | 0 | 0 |
|
||||
|
||||
该敏感性检查只改变呈现区域,没有改动数据或 ±5% 判据。不应为了获得通过结论而事后选择更宽的近零区。
|
||||
|
||||
## 时间对齐复核
|
||||
|
||||
上一轮曲线文件在共同网格上线性插值。复核发现,原始 Amesim 采样时间有浮点累积差;在 32 ns 容积限幅跳变点,原始 Amesim 与平台功率都为 0,但插值会从前一点约 1.109e13 W 混入约 0.402 W。因此本次直接匹配同一名义采样时刻的原始输出,要求时间偏差不超过输出间隔的 1e-8,无插值、无数值截零。
|
||||
|
||||
四组 Amesim 网格最大匹配时间差分别约 2.288e-12、2.554e-15、2.554e-15、2.033e-20 s,均通过匹配断言。真实事件侧别差异仍保留。原始结果及上轮曲线文件未被覆盖;本次匹配后的数据另存 `relative-aligned-curves.npz`。
|
||||
|
||||
## 数据和复现
|
||||
|
||||
- [汇总及阈值敏感性](F:/Master/SystemSimulationApp/test/node-fixes-amesim-20260914/classified-relative-error-summary.json)
|
||||
- [分类统计脚本](F:/Master/SystemSimulationApp/test/node-fixes-amesim-20260914/classify_relative_error.py)
|
||||
- [原始输出时间匹配和严格非零审计脚本](F:/Master/SystemSimulationApp/test/node-fixes-amesim-20260914/relative_error.py)
|
||||
- [原始数据哈希及严格非零审计](F:/Master/SystemSimulationApp/test/node-fixes-amesim-20260914/relative-error-summary.json)
|
||||
- [full 每曲线统计及近零原值](F:/Master/SystemSimulationApp/test/node-fixes-amesim-20260914/full/classified-relative-error.json)
|
||||
- [startup 每曲线统计及近零原值](F:/Master/SystemSimulationApp/test/node-fixes-amesim-20260914/startup/classified-relative-error.json)
|
||||
- [startup-refined 每曲线统计及近零原值](F:/Master/SystemSimulationApp/test/node-fixes-amesim-20260914/startup-refined/classified-relative-error.json)
|
||||
- [volume-startup 每曲线统计及近零原值](F:/Master/SystemSimulationApp/test/node-fixes-amesim-20260914/volume-startup/classified-relative-error.json)
|
||||
|
||||
复现顺序:先用项目 Python 执行 `relative_error.py`,再执行 `classify_relative_error.py`。原始文件、同模型参数审计、求解器设置与此前专项缺陷的覆盖边界,见[上一轮完整报告](F:/Master/SystemSimulationApp/docs/other/节点修复后同一Amesim文件曲线对比-2026-09-14.md)。该 AME 没有非零预设 dvol 或活塞经节点传容积的工况,本次统计不会扩大它的验证范围。
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
> 本文记录迁移当时的阶段结果;Python 参考实现已于 2026-09-10 退役,当前入口与保留范围见 [退役记录](Python数值实现退役记录.md)。
|
||||
|
||||
> 后续更新:本文下述高级摩擦、静摩擦、几何接触等限制已有后续实现,见 [2026-09-13 功能补齐与 Amesim 验证](Amesim摩擦与管路功能补齐验证-2026-09-13.md);分块存储后的完整曲线复核见 [2026-09-15 验收项复核](分块存储未完成验收项复核-2026-09-15.md)。不要将本文历史限制作为当前组件能力判断。
|
||||
|
||||
日期:2026-09-10。范围是当前注册表中的全部模型:Amesim 库 22 类,实验库 5 类。这里的“覆盖”指项目现有模型方程有对应的 C 实现,不代表复刻完整 Siemens 元件库,也不代表任意拓扑、任意刚性模型均能快速求解。
|
||||
|
||||
## 实施步骤
|
||||
|
||||
@@ -1,76 +1,32 @@
|
||||
# AMESim 氦气 Peng-Robinson 介质模型
|
||||
# Amesim 氦气 Peng–Robinson 介质模型
|
||||
|
||||
## 本地资料依据
|
||||
平台公开组件 `amesim_helium_medium` 的 `property_model=0` 对应 Amesim `fluidType=12`、`eosType=6`。`gi` 为气体引用索引。实际物性在 [native/components/modules/properties.c](../../native/components/modules/properties.c) 中计算;Python 介质类仅保存编译期身份和参考常数,不是另一个物性求值器。
|
||||
|
||||
仓库中已经包含该模型所需的说明和算例数据:
|
||||
## 状态方程与热量学
|
||||
|
||||
- `tests/data/AmesimModels/help/pneumatic_library_manual/03_gas_properties.pdf` 第 3.3 节
|
||||
给出 AMESim Pneumatic Library 的气体物性层级和 Peng-Robinson 状态方程。
|
||||
- `tests/data/AmesimModels/help/pneumatic_library_manual/lib_pneumatic.pdf` 第 87--88 页
|
||||
给出 293.15 K、1 barA 下的氦气参考物性。
|
||||
- `tests/data/AmesimModels/test_mql.ame` 中的 `PNGD00` 实例明确选择
|
||||
`fluidType=12`(helium)和 `eosType=6`(Peng-Robinson)。
|
||||
- `app/simulation/core/peng_robinson.py` 已实现纯物质 Peng-Robinson 方程,
|
||||
并定义了 `HELIUM_PR`。
|
||||
使用摩尔体积形式的 Peng–Robinson EOS,气相取最大物理解。常数来自 Amesim 2404 `libpn/data/nasa_properties/helium_eos.data`:`R_u=8.31446261815324 J/(mol·K)`、`M=0.004002602 kg/mol`、`Tc=5.1953 K`、`Pc=227460 Pa`、偏心因子 `−0.382`。
|
||||
|
||||
AMESim 手册中的 Peng-Robinson 形式为:
|
||||
热量学包含理想项和 PR 剩余项:`h=h0(T)+h_departure(p,T)`,`u=u0(T)+u_departure(T,rho)`,`u0=h0−R*T`。储气状态反解、p/h 温度反解及等熵系数使用同一套热物性。
|
||||
|
||||
```text
|
||||
p = r T / (v - b) - a alpha(T) / (v^2 + 2 b v - b^2)
|
||||
a = 0.457235583 r^2 Tc^2 / Pc
|
||||
b = 0.07779607 r Tc / Pc
|
||||
alpha(T) = [1 + m (1 - sqrt(T/Tc))]^2
|
||||
m = 0.37464 + 1.54226 omega - 0.26992 omega^2
|
||||
```
|
||||
2026-09-15 补齐的温度分段:
|
||||
|
||||
当前 Python EOS 使用等价的摩尔体积形式,并通过最大物理解选择气相根。
|
||||
| 项目 | Amesim 数据温区 | 当前实现 |
|
||||
| --- | --- | --- |
|
||||
| 理想 Cp、h | 200–1000、1000–6000、6000–20000 K | 前两段 Cp/R=2.5;第三段 NASA 2002 多项式,衔接处 Cp 和 h 连续 |
|
||||
| 动力黏度 | 200–1000、1000–5000、5000–15000 K | 三段 NASA 96 公式,1000/5000 K 处连续修正 |
|
||||
| 表外热量学 | 超过 20000 K | 按 Amesim 的二次 Cp 延拓及其焓积分处理,不能直接无限延长高阶多项式 |
|
||||
| 表外黏度 | 超过 15000 K | 延用末段并保持边界修正,与 Amesim 对照一致 |
|
||||
|
||||
## 首版参数
|
||||
低温参考量 `cp_ref` 和 `nasa_cp_over_R` 只描述低温段;它们不是全温区比热。黏度已不采用 Sutherland 近似。
|
||||
|
||||
| 参数 | 数值 | 本地依据 |
|
||||
| --- | ---: | --- |
|
||||
| 摩尔质量 | `0.004002602 kg/mol` | `HELIUM_PR` |
|
||||
| 临界温度 | `5.1953 K` | `HELIUM_PR` |
|
||||
| 临界压力 | `227460 Pa` | `HELIUM_PR` |
|
||||
| 偏心因子 | `-0.385` | `HELIUM_PR` |
|
||||
| 定压比热 | `5193 J/(kg*K)` | AMESim 手册表 11.1 |
|
||||
| 定容比热 | `3116 J/(kg*K)` | AMESim 手册表 11.1 |
|
||||
| 比气体常数 | 由 `R/M` 计算,约 `2077.26 J/(kg*K)` | EOS + 手册表 11.1 |
|
||||
| 293.15 K 黏度 | `1.96e-5 Pa*s` | AMESim 手册表 11.2 |
|
||||
| Sutherland 常数 | `79.4 K` | 已迁移 `test_mql` 管路近似 |
|
||||
## 有效域与验证边界
|
||||
|
||||
手册参考点还给出 `rho=0.164 kg/m3`、`gamma=1.667`、`Z=1.0005`。
|
||||
Amesim EOS 文件标记的有效温度为 **2.2–1500 K**。高温 NASA 理想热量学/输运数据存在,并不意味着 PR EOS 在相同高温也经过物理有效性验证;Amesim 自身会给出域外警告并继续计算。本次实现复现这些数值及延拓行为,没有宣称扩大 EOS 的适用范围。
|
||||
|
||||
## 组件与索引映射
|
||||
当前组件求解路径使用密度、焓、内能、比热、黏度与等熵系数。没有新增平台尚未使用的熵或导热系数接口。
|
||||
|
||||
公开介质组件使用:
|
||||
直接调用 Amesim 2404 官方库获取了 108 个固定温压状态作为独立回归基准,覆盖 200–30000 K、101300–250000000 Pa,各分段边界及其两侧。测试同时检查 p/h 温度反解、质量/内能状态重构、热力学导数和缓存路径。
|
||||
|
||||
```text
|
||||
modelType = amesim_helium_medium
|
||||
gi = 画布自动分配的 1..99 引用索引
|
||||
property_model = 0 (Peng-Robinson,本应用内的稳定编号)
|
||||
fluidType = 12 (AMESim 元数据)
|
||||
eosType = 6 (AMESim 元数据)
|
||||
```
|
||||
|
||||
`property_model` 与 AMESim 的 `eosType` 有意分离:前者是单个介质组件内部的
|
||||
下拉选项编号,后者用于保留 AMESim 原模型语义。以后给氦气增加其他计算方法时,
|
||||
只需扩展氦气的物性模型注册表。
|
||||
|
||||
源归档的 `gasName` 缓存文本与结构字段存在冲突,因此介质识别以
|
||||
`fluidType=12`、`PNGD_HELIUM` 和组件标签为准,不使用 `gasName` 猜测。
|
||||
|
||||
## 首版计算边界
|
||||
|
||||
首版公共组件实现以下闭合:
|
||||
|
||||
- `rho(p,T)`、`p(rho,T)` 和控制容积压力使用 Peng-Robinson EOS;
|
||||
- `u=cv*T`、`h=cp*T`,温度反解使用同一组定比热;
|
||||
- 黏度使用以 293.15 K 为参考点的 Sutherland 近似;
|
||||
- `gi` 注册、气动连通域一致性、XML/JSON 保存均复用现有介质机制。
|
||||
|
||||
这是一版可运行的“PR 压力--密度闭合 + 定比热热量学”,不是 AMESim 真实气体
|
||||
物性的完全复刻。AMESim 的 `Cp/Cv/h/mu/rho/Z` 接口均可随 `(p,T)` 变化,而当前
|
||||
`GasMedium` 的焓、内能和比热接口只有温度参数。后续若要接入完整残余焓、
|
||||
压力相关比热和真实气体临界流,应先扩展为状态相关物性接口,再调整气室、管路和
|
||||
孔口公式。
|
||||
- [回归测试](../../tests/test_native_helium_high_temperature.py)
|
||||
- [Amesim 独立数值基准](../../tests/data/amesim_helium_high_temperature_properties.json)
|
||||
- [修复证据、误差与整模型对照](氦气高温物性补齐与Amesim对照-2026-09-15.md)
|
||||
@@ -0,0 +1,131 @@
|
||||
# 八路循环信号:参数核对、耗时与曲线对比
|
||||
|
||||
2026-09-14,Windows,分支 `system-optimization`。
|
||||
|
||||
## 结论
|
||||
|
||||
先核对参数,再将两个 UD00 都设为循环并统一运行设置。最终测试副本的 **157 个元件、178 条逐端口连接、1,092 项公开参数均匹配**,另有 1,015 项图纸参数与 Amesim 实际运行参数表交叉核验通过。
|
||||
|
||||
两边均连续三次完成 50 秒。平台纯求解墙钟时间中位数 **9.133 秒**;平台原生进程完整运行 **10.660 秒**,Amesim 原生进程完整运行 **6.816 秒**,按此进程口径平台约慢 **1.56 倍**。平台通过真实 HTTP 流式接口提交和接收结果,完整请求中位数为 **14.593 秒**。
|
||||
|
||||
**曲线总体变化趋势相近,但不能验收为全部一致。** 循环切换采样点存在左右分支差异;起始快速变化阶段还有压力、温度差异,而且将双方误差限收紧到 `1e-10` 后仍然存在。
|
||||
|
||||
## 1. 仿真前参数检查
|
||||
|
||||
本轮来源为用户指定的当前八路默认文件:
|
||||
|
||||
| 来源 | 仿真前 SHA-256 |
|
||||
| --- | --- |
|
||||
| `tests/data/test_mql.ame` | `251b2f17c24ea02c1ab48f9f441a0ec38e7920627ea7e6870392326424a517c5` |
|
||||
| `tests/data/test-mql-8-corrected.json` | `60ed16c71b72be4ae71ca7980f4f8cdcdf6b4c4c4c8950863c2390960b71ced4` |
|
||||
|
||||
原模型公开物理参数和连接没有差异,两个 UD00 都为非循环。原运行设置有三项差别:JSON 为 10 秒、输出间隔 0.01 秒,Amesim 为 50 秒、0.05 秒;平台默认相对误差限 `1e-8`,Amesim 容差 `1e-7`。
|
||||
|
||||
在测试副本中调整如下,并在开始求解之前重新通过完整参数、连接和时间设置审计:
|
||||
|
||||
| 设置 | 平台 | Amesim |
|
||||
| --- | --- | --- |
|
||||
| 起止时间 | 0–50 s | 0–50 s |
|
||||
| 输出间隔 | 0.01 s | 0.01 s |
|
||||
| 最大积分步长 | 1e30 s | 1e30 s |
|
||||
| 误差限数值 | rtol=1e-8 | tolerance=1e-8 |
|
||||
| 运行方式 | CVODE BDF | 标准变步长积分器;API `integ_method=0` |
|
||||
| 循环开关 | 两个 UD00 均为 1 | 两个 UD00 均为 2 |
|
||||
|
||||
循环开关按各自枚举的语义转换,而非直接比较数字。两个信号周期都是 **10.8 秒**:
|
||||
|
||||
- `amesim_ud00_1` / `piecewiselinear`:前 0.8 秒为 `1e17`,后 10 秒为 `49000`。
|
||||
- `amesim_ud00_2` / `piecewiselinear_1`:前 0.8 秒为 `1e12`,后 10 秒为 `0`。
|
||||
|
||||
统一的是公开物理输入、连接和上述运行设置,不是两套求解器的全部内部行为。Amesim 保留 mixed error、standard solver、启用 optimized solver;平台保留生成的逐状态绝对误差限。相同的 `1e-8` 数字不等于完全相同的误差权重。按用户此前要求,仅记录 Amesim 运行选项,不把其内部算法直接认定为 CVODE BDF。
|
||||
|
||||
证据:`test/mql8-cyclic-20260914/preflight/audit.json`、`aligned-audit/audit.json`、`ame-settings.json`。原始 AME/JSON 在本轮结束时 SHA-256 均未改变。
|
||||
|
||||
## 2. 执行方式和耗时
|
||||
|
||||
Amesim 使用本机 2404 官方 API 打开副本、设置参数、生成程序并保存;随后独立运行其生成的模型程序。平台启动一个独立临时 FastAPI 实例,走 JSON→XML→`/api/system-xml/simulate-stream` 正式路径,使用本轮修复后的 C 封装。该临时服务已结束,未替换用户运行中的服务。
|
||||
|
||||
两边各串行运行三次,没有互相并发竞争计算资源。平台三次均命中模型编译缓存。主测均为 `1e-8`;后文 `1e-10` 仅用于精度诊断,不混入速度中位数。
|
||||
|
||||
| 计时字段 | 第 1 次 | 第 2 次 | 第 3 次 | 中位数 |
|
||||
| --- | ---: | ---: | ---: | ---: |
|
||||
| 平台 `solveSeconds`:纯求解墙钟 | 9.368 s | 9.133 s | 9.058 s | **9.133 s** |
|
||||
| 平台 `solveCpuSeconds`:纯求解 CPU | 9.344 s | 9.219 s | 9.078 s | **9.219 s** |
|
||||
| 平台 `processWallSeconds`:原生进程及结果读取 | 10.901 s | 10.660 s | 10.594 s | **10.660 s** |
|
||||
| 平台 HTTP 请求墙钟 | 14.593 s | 14.653 s | 14.291 s | **14.593 s** |
|
||||
| Amesim 原生进程墙钟 | 6.886 s | 6.816 s | 6.649 s | **6.816 s** |
|
||||
| Amesim 日志 `Total CPU time` | 4.406 s | 4.438 s | 4.250 s | **4.406 s** |
|
||||
|
||||
CPU 字段之比约 2.09;但 Amesim 的日志总 CPU 字段与平台明确排除了初始化/最终结果投影的纯求解 CPU 字段不保证边界完全一致,因此只作辅助观察。原生进程墙钟之比约 1.56;两边结果格式和输出数量也不同,不能把全部差额认定为积分器内部开销。
|
||||
|
||||
平台完整请求的额外成本可直接看到:缓存命中时仍有约 **2.22 秒构建检查/预处理**;原生进程时间比纯求解约多 **1.53 秒**;另有后端组装及本地 HTTP 结果传输。此次平台返回完整 1,784 个输出,JSON 体积较大。HTTP 计时包含请求至接收完全部流式响应,不含客户端随后解析大 JSON、浏览器 JavaScript 或绘图,所以不能称为网页按钮到绘图完成时间。
|
||||
|
||||
平台三次接受步均为 15,037,均记录同时间成功返回 12 次、最多连续 6 次;最终到达 50 秒,没有再次出现 10.8 秒提前终止。
|
||||
|
||||
## 3. 曲线结果
|
||||
|
||||
比较 158 条关键曲线:质量位移/速度、气腔和管路压力/温度、8 路接触力/间隙及信号。由参数审计确定对应元件,按物理单位转换,例如 Amesim 表压加 101300 Pa 对应平台绝对压力,间隙 mm 转为 m;没有通过交换元件或改变符号来拟合曲线。
|
||||
|
||||
平台返回 5,010 个时刻,Amesim 为 5,002 个时刻。双方具名保存值均有限;对比使用 0~50 秒的 5,001 个共同 0.01 秒网格点,线性插值。额外事件点及浮点边界的处理并不相同,原始文件全部保留。
|
||||
|
||||
### 完整区间的最大差
|
||||
|
||||
| 物理量/曲线 | 最大绝对差 | 发生时刻 |
|
||||
| --- | ---: | ---: |
|
||||
| 第 1 路接触力 `amesim_lstp00a_1.force` | **1,285,518 N** | 32.4 s |
|
||||
| 全部 8 路接触力的最差项,第 7 路 | 1,285,518 N | 32.4 s |
|
||||
| 管路压力 `amesim_pnl0002_6.p` | **163,286 Pa** | 0.01 s |
|
||||
| 管路温度 `amesim_pnl0001_13.T` | **105.215 K** | 0.01 s |
|
||||
| 接触间隙最差项,第 2 路 | 2.703e-8 m | 44.19 s |
|
||||
|
||||
不能只报“趋势重合”而省略上表的大差异。
|
||||
|
||||
### 循环切换点为什么有尖峰差异
|
||||
|
||||
在共同网格 `t=32.4 s`,两边取到了不同的信号分支:平台第一个信号为 `49000`,Amesim 插值值约为 `1e17`。这里正好是第三个循环边界;浮点时间、事件点及保存采样的先后约定影响取到跳变前还是跳变后的值。离开切换点前后 0.02 秒后,所有对照信号完全相同,说明不是周期长度或幅值参数仍不一致。
|
||||
|
||||
接触力对此特别敏感:本模型 `kcont=rcont=1e11`,32.4 秒处两边接触间隙接近,但 Amesim 相连两质量的相对速度约为 `1.2855e-5 m/s`,平台接近零,仅此阻尼项就对应约 **1.2855e6 N** 的力。因而微小速度和切换取样侧的差别,会被很大的阻尼放大为力尖峰。这里是对保存结果的解释,不等于已证明某一方的尖峰代表真实物理脉冲。
|
||||
|
||||
保留全部初始阶段、只避开每个 UD00 切换点前后 0.02 秒,8 路接触力最大差约 **5,129 N**。进一步仅看 `t>=0.1 s` 且避开上述窗口,接触力最大差 **32.12 N**;第 1 路在 50 秒时的差为 **−28.79 N**。这些筛选结果用于定位差异,不能代替完整区间验收。
|
||||
|
||||
### 温度和压力差异并未随容差收紧消失
|
||||
|
||||
补做两边 `1e-10` 的 50 秒诊断:
|
||||
|
||||
| 项目 | 双方 1e-8 最大差 | 双方 1e-10 最大差 |
|
||||
| --- | ---: | ---: |
|
||||
| 上述管路压力 | 163,285.92 Pa | 163,359.89 Pa |
|
||||
| 上述管路温度 | 105.2145 K | 105.2373 K |
|
||||
| 第 7 路接触力 | 1,285,518.34 N | 1,288,259.73 N |
|
||||
|
||||
对压力最差曲线,平台自身收紧容差的变化最大约 89.87 Pa,Amesim 自身变化约 15.89 Pa;温度最差曲线分别约 0.02356 K 和 0.00106 K,远小于双方之间的 105 K。因此这部分差异主要不是普通积分误差限偏松,后续应核对相应状态/物性公式、有效范围之外的处理和初始化后的快速压缩过程。
|
||||
|
||||
本次 Amesim 日志实际报告:初始快速过程的氦气温度超出状态方程及残余热物性有效上限 1500 K,日志中出现约 9609 K 的查询;保存曲线也有约 5174 K 的管内温度。Amesim 还报告 8 个 PNCH012 容积被最小容积 `cvol0/100=150 cm³` 限制。这些都是当前匹配模型实际进入的状态,需要在后续公式对照中保留,不能因为双方均正常终止就认定该工况的物性精度已经得到保证。本轮没有进一步认定某个具体物性函数为唯一根因。
|
||||
|
||||
### 巨大位移的特殊质量块
|
||||
|
||||
`amesim_mecmas21_9` 是质量 100 kg、无摩擦、无限位的质量块,受到本模型量级很大的重复激励。两边都得到约 `1.12e17 m` 的最终位移。默认容差下该位移的绝对差约 `1.50e10 m`,相对该量级约 `1.34e-7`;容差收紧后绝对差降到约 `2.66e8 m`。这部分不能与普通活塞的毫米级位移混在同一绝对误差指标里,也不能忽略这项极端模型状态。
|
||||
|
||||
排除该质量块,在 `t>=0.1 s` 且避开切换窗口后,其他质量位移最大差约 `2.19e-5 m`,速度最大差约 `2.43e-4 m/s`。完整逐曲线指标均见 `comparison.json`。
|
||||
|
||||

|
||||
|
||||
## 4. 后续方向与本轮范围
|
||||
|
||||
这次已经确认:参数与连接匹配、两个循环信号配置正确、两边都完成 50 秒、外层提前终止问题没有复发。仍未完成的“一致性”包括切换点采样侧统一,以及高温快速过程的压力/温度差异解释。应先完成这两项,再把此模型作为等精度性能基准。
|
||||
|
||||
本轮没有修改生产求解器、组件公式或两个可调环境参数,也没有据此开展稀疏矩阵优化。Amesim 首次重新编译遇到既有 GCC CreateProcess 故障,另一次 API 会话缺少模型库搜索路径;补齐该会话使用的既有库路径后编译完成,未修改机器工具链配置。这些发生在正式计时之前。
|
||||
|
||||
## 5. 交付文件与证据
|
||||
|
||||
所有本机工件位于 `test/mql8-cyclic-20260914/`:
|
||||
|
||||
- **`amesim/test_mql.ame`**:循环、50 秒、0.01 秒采样、容差 1e-8 的模型副本,已通过官方 API 保存最新仿真结果;归档 `.results` 的 SHA-256 与本次实际运行结果一致。
|
||||
- **`test-mql-8-cyclic.json`**:参数对应的平台工程,可直接导入;rtol 由当前平台后端默认值提供。
|
||||
- `platform-curves.csv`、`amesim-curves.csv`:158 条曲线在共同网格上的单位统一数据。
|
||||
- `comparison.png` / `.svg`:总体及局部曲线。
|
||||
- `comparison.json`、`refinement-comparison.json`:完整指标及严格容差诊断。
|
||||
- `platform-timings.json`、`ame-timings.json`:三次计时;`platform-result-event.json`、`ame-run/` 保留原始输出。
|
||||
- `prepare_ame.py`、`run_comparison.py`、`analyze.py`、`refine.py`、`analyze_refinement.py`:本机复现脚本。
|
||||
|
||||
原始 `tests/data` 两份默认输入保持不变;循环测试使用交付副本。测试目录为 Git 忽略目录,报告保存在 `docs/other/`。
|
||||
@@ -0,0 +1,193 @@
|
||||
# 八路采样失败与曲线差异定位
|
||||
|
||||
日期:2026-09-14。分支:`system-optimization`。本次只定位,未修改生产代码、原始 JSON 或原始 Amesim 文件。
|
||||
|
||||
## 结论
|
||||
|
||||
| 现象 | 判定 | 证据 |
|
||||
|---|---|---|
|
||||
| 50 s 仿真、0.001 s 采样退出 64 | 触发结果容量限制;错误解释和日志保留有缺陷,不是积分失败 | 进入积分前预计约 746 MiB,超过固定 256 MiB 限制;同一 EXE 关闭历史结果保存后完成 50 s |
|
||||
| 启动阶段约 163 kPa、105 K 差异 | **主要是节点能量传递 bug** | 仅在诊断生成代码中按各支路能量流求和,50 s 对比的最大压力差降至 44 Pa、温差降至 0.37 K |
|
||||
| 循环切换点约 1.29 MN 力差 | 比较时刻位于切换点不同侧,且存在信号边界计算不一致;不能直接归为 BDF 算法误差 | 32.4 s 两端读取了不同信号阶段;44 s 的事件定位与信号求值在同一个 double 时间上不一致 |
|
||||
| 高温物性差别 | 氦气黏度和热物性分段实现有遗漏 | 相同 p、T 下直接调用双方物性;高温黏度明显不同,但单独调整它不能消除主要温差 |
|
||||
| 管流小幅差别 | 摩擦系数公式的近似差异,属于模型实现差异 | 不经过积分,在相同边界状态下仍有流量差;常温探针测试点最大约 0.234% |
|
||||
| 其余很小的差别 | 包含已知物性/管流公式差异及数值误差,尚不能全部指定为积分算法差别 | 节点诊断后仍非逐位一致;没有证据要求先更换 BDF 或矩阵求解方式 |
|
||||
|
||||
## 1. 测试对象与范围
|
||||
|
||||
沿用上份报告的八路循环模型及参数审计结果:157 个组件、178 条连接,1092 项公开参数已核对。平台采用 BDF;Amesim 保留标准变步长隐式配置,未假定其内部算法、误差权重与 CVODE 完全相同。
|
||||
|
||||
原始文件在本次结束时的 SHA256 与开始前一致:
|
||||
|
||||
- `tests/data/test-mql-8-corrected.json`:`60ed16c71b72be4ae71ca7980f4f8cdcdf6b4c4c8950863c2390960b71ced4`
|
||||
- `tests/data/test_mql.ame`:`251b2f17c24ea02c1ab48f9f441a0ec38e7920627ea7e6870392326424a517c5`
|
||||
|
||||
循环比较基准使用 `test/mql8-cyclic-20260914/` 内上次保留的模型副本。诊断实验集中在 `test/diagnosis-20260914/`。对 188 个已跟踪的 app/native/frontend 文件逐一核对开始、结束时的哈希,变化数量为 0;保留工作区此前已有改动。
|
||||
|
||||
## 2. 0.001 s 采样为什么退出 64
|
||||
|
||||
这里的 0.001 是**采样时间间隔**,即每秒保存 1000 次,不是积分器的最大步长。
|
||||
|
||||
`native/runtime/main.c:163` 在调用 `native_solve` 前检查预计结果容量:
|
||||
|
||||
`(仿真时长 / 采样间隔 + 1024) × (状态数 + 输出数) × 8 字节`
|
||||
|
||||
八路模型有 132 个状态、1784 个输出。50 s、0.001 s 时:
|
||||
|
||||
`(50000 + 1024) × (132 + 1784) × 8 = 782095872 字节 = 745.865 MiB`
|
||||
|
||||
固定上限是 268435456 字节,即 256 MiB。超限直接 `return 64`,没有进入积分,也没有写结构化结果或解释原因。因此这不是 GCC、CVODE 或操作系统实际分配内存失败。
|
||||
|
||||
使用同一缓存 EXE 的复现结果:
|
||||
|
||||
| 配置 | 结果 | 时间 |
|
||||
|---|---|---|
|
||||
| 50 s,采样 0.001 s,保存历史结果 | 退出码 64,无结果文件,日志 0 字节 | 进程约 0.054 s |
|
||||
| 1 s,采样 0.001 s,保存历史结果 | 正常完成 1 s | 求解 2.613 s |
|
||||
| 50 s,采样参数仍为 0.001 s,`--solve-only` | 正常完成 50 s | 求解 12.187 s |
|
||||
|
||||
这些耗时用于判别失败阶段,不是重复测量后的性能基准。
|
||||
|
||||
目前保存的是全部输出,不仅是界面选择绘制的曲线。结果写出阶段还会一次性申请 `采样数 × 输出数` 的数组,并再次检查 256 MiB。因此单纯移除前面的限制也不构成完整解决方案。
|
||||
|
||||
`runner.py:122` 将“无结果文件”解释成通用 Native worker 错误;`runner.py:151` 的临时目录随后被清理,所以错误文字中的日志路径可能已不存在。本次给出的原始临时日志路径也已不存在,但保留工作目录的复现清楚确认了退出原因。
|
||||
|
||||
后续建议:
|
||||
|
||||
1. 启动前给出“结果容量超限”、状态/输出/采样数量、预计容量和上限,后端也要校验。
|
||||
2. 原生程序返回明确的资源限制错误;异常时保留或回传日志,不能只指向随后被删除的路径。
|
||||
3. 分块计算、写出历史输出,或支持选择保存变量。前端、HTTP 与 CLI 使用一致的限制和错误含义。
|
||||
4. 当前模型 50 s 对该前置检查的采样间隔阈值约为 0.00303237 s;0.004 s 可通过此项容量检查。已实测可正常运行的旧配置是 0.01 s。通过容量检查不代表对其他运行问题作保证。
|
||||
|
||||
## 3. 主要压力、温度差异:节点没有完整传递能量流
|
||||
|
||||
### 3.1 具体代码路径
|
||||
|
||||
- `app/simulation/native_codegen/extended.py:452`:PN3NODE2/P4NODE2 将支路流量和焓折算成参考口的一个焓值。
|
||||
- `extended.py:457` 起:只有部分流向进行补偿,并在净流量接近零时使用正则化的倒数。
|
||||
- `extended.py:615`:储气元件按流向选择“流入焓”或“本腔体焓”,再乘该口的净质量流量。
|
||||
|
||||
这套表达对于普通单支路换向可以成立,但对于一边进、一边出的多支路汇合节点不够。**净质量流量与净能量流必须分别求和;不能依据净质量流量的正负决定整组支路只携带一个来源的能量。**
|
||||
|
||||
Amesim 本机安装的 `libpn/submodels/PN3NODE2.c` 和 `P4NODE2.c` 声明参考口分别汇总各支路的质量流、焓流、体积及体积变化率。它们直接对带符号的焓流求和,并不先除以净质量流量再折回能量。
|
||||
|
||||
例如,一支路送入 2 kg/s、比焓 2000 J/kg,另一支路送出 3 kg/s、比焓 1000 J/kg:净质量流是流出 1 kg/s,但净能量流是流入 1000 W。把它当成“净流出 1 kg/s × 本腔体 1000 J/kg”,会得到流出 1000 W,连方向都反了。
|
||||
|
||||
### 3.2 在实际八路模型中捕捉到的错误
|
||||
|
||||
把 Amesim 在 0.0004 s 的完整物理状态送给原平台 C 方程计算。压力、温度、位移等状态匹配后,`amesim_p4node2_8` 向 `amesim_pnl0001_20` 传递的能量为:
|
||||
|
||||
| 量 | 数值 |
|
||||
|---|---:|
|
||||
| 净质量流入管腔 | −0.0525535 kg/s |
|
||||
| 支路 1 的能量流 | +7.080728 MW |
|
||||
| 支路 3 的能量流 | −4.770562 MW |
|
||||
| 支路 4 的能量流 | +0.027449 MW |
|
||||
| 按支路求和应计入的能量 | **+2.337615 MW** |
|
||||
| 原代码计入的能量 | **−1.252658 MW** |
|
||||
| 少计的能量流 | **3.590273 MW** |
|
||||
|
||||
以上全部来自**同一组状态下的一次方程计算**,不需要比较积分器。这直接证明存在能量传递错误。
|
||||
|
||||
### 3.3 隔离因果实验
|
||||
|
||||
在诊断目录生成独立 C 模型,只把节点参考口传给储气元件的能量改为支路能量求和。没有改正式 Python/C 文件、管路公式、物性、积分器或原模型参数。
|
||||
|
||||
双方误差限取 1e-10、最大步长 1e30;50 s 全程按共同 0.01 s 网格比较:
|
||||
|
||||
| 指标 | 原实现 | 仅调整诊断副本的节点能量 |
|
||||
|---|---:|---:|
|
||||
| 最大压力差 | 163359.89 Pa | **43.96 Pa** |
|
||||
| 最大温度差 | 105.24 K | **0.373 K** |
|
||||
| 排除信号切换点前后 0.02 s 后的最大力差 | 约 5131 N | **1.373 N** |
|
||||
| 是否完成 50 s | 是 | 是 |
|
||||
|
||||
因此主要压力、温度偏差已定位为模型连接层的能量计算 bug,不是“换一种积分方法自然产生的正常差别”。诊断生成代码只用于验证原因,不是已经合入的通用修复。
|
||||
|
||||
后续应在 C 连接计算中明确传递带符号的能量流,质量流和能量流独立守恒;不要依赖“能量流除以接近零的净质量流”来构造参考口焓。正式修复还需覆盖节点串联、流向同时相反、净流量为零但有热量交换等情况。
|
||||
|
||||
## 4. 排查过的其他原因
|
||||
|
||||
### 积分步长和误差限
|
||||
|
||||
此前已从 1e-8 收紧至 1e-10,主要误差不消失。本次进一步比较前 0.02 s:最大积分步长由 1e30 降至 1e-5 s,采样间隔为 1e-5 s。0.01 s 的最大压力差仍约 163359.8 Pa,最大温差仍约 105.237 K。
|
||||
|
||||
细采样还发现启动过程真正的短时最大差约为 276.66 kPa 和 125.05 K,分别出现在约 0.00042 s 和 0.00055 s。上份报告的 163 kPa、105 K 是共同 0.01 s 网格上的最大差,不是对所有内部时刻取最大。
|
||||
|
||||
### 物性及储气方程
|
||||
|
||||
在已经初始化真实氦气介质的 Amesim 生成程序副本中,调用官方库的 p、T 物性接口和储气方程;与直接包含平台原始物性 C 文件的探针比较。
|
||||
|
||||
- 同 p、T 下,密度和低于 6000 K 的焓基本一致。
|
||||
- 分别输入质量变化、能量输入、压缩体积三种情况,双方储气压力/温度变化率基本一致;高温处残余差异与热物性分段遗漏相符。
|
||||
- Amesim 的温度有效域警告不表示温度被强行截为 1500 K;直接测试表明它仍在高温状态上计算。
|
||||
- 平台氦气黏度始终使用第一段公式,Amesim 数据在 1000 K 和 5000 K 换段。5000 K 时平台黏度低约 3.48%,9600 K 时低约 5.51%。
|
||||
- 平台定比热的氦气理想热物性也未覆盖 Amesim 6000 K 以上的数据段。在 9600 K 探针点,焓相对差约 2.72e-7、比热相对差约 4.70e-6;它不是这次 105 K 温差的主要来源。
|
||||
|
||||
仅在隔离副本补上黏度分段,前 0.15 s 最大温差只从 105.237 K 降至 105.104 K,压力差从 163359.89 Pa 降至 163032.28 Pa。主因被明确排除。
|
||||
|
||||
### 管路摩擦公式
|
||||
|
||||
使用同 p、T、压力比、管径、长度和粗糙度,直接比较 Amesim `pn2pipefr_` 与原生 `native_pipe_flow`,不进行时间积分。探针包含 3 个压力、4 个温度、5 个压力比,共 60 点。
|
||||
|
||||
300 K 测试点的最大流量相对差约 0.234%,1000 K 约 0.241%。这些点的可压缩流量参数基本一致,摩擦系数不同。平台 `native/components/modules/pipe.c:8` 使用拟合、混合的摩擦系数公式,不能视为与 Amesim 实现完全相同;高温差异还叠加黏度分段遗漏。
|
||||
|
||||
节点能量和黏度同时在诊断副本调整后,前 0.15 s 最大压力差约 24.26 Pa,温差约 0.453 K。单项误差并不保证同方向变化,不能只凭某个最大温差略升就否定已确认的黏度缺项。剩余小误差尚未完全拆分为摩擦近似、热物性分段和积分误差各自的份额。
|
||||
|
||||
### 自由质量块的巨大位移数值
|
||||
|
||||
上份报告单列的 `amesim_mecmas21_9` 质量为 100 kg,静摩擦、库仑摩擦、黏性摩擦均为零,不启用限位;模型施加的循环力达到 1e17 N。其位移本身约为 1e17 m 量级,不能把绝对位移差直接与正常行程元件比较。收紧误差限后的 50 s 节点诊断对比,最大位移差约 2.04e8 m,相对该位移量级约为十亿分之几。这里具有明显的误差尺度和数值累计特征,未发现与主要节点能量 bug 相当的力学公式错误证据;尚未对这一自由质量块另做解析解误差分解。
|
||||
|
||||
## 5. 循环信号切换点与力尖峰
|
||||
|
||||
### 同一个显示时间,不一定处于同一阶段
|
||||
|
||||
收紧误差限后的原始结果:
|
||||
|
||||
| 原始保存时刻 | 平台/来源 | 信号 1 | 信号 2 | LSTP00A_1 力 |
|
||||
|---|---|---:|---:|---:|
|
||||
| 32.4 | 平台 | 49000 | 0 | 468633.757 N |
|
||||
| 32.40000000000221 | Amesim | 1e17 | 1e12 | 1756893.431 N |
|
||||
|
||||
平台的事件时间计算为 `32.400000000000006`,所以采样时刻 `32.4` 位于切换前;Amesim 上述结果位于切换后。这些时间在界面上都会显示为 32.4 s。模型信号幅值和接触阻尼非常大,微小时间差造成的小速度差会被阻尼放大为很大的力差。
|
||||
|
||||
节点能量诊断后,32.4 s 处仍有约 1.288 MN 的差别,但排除切换窗口后的力差降到 1.373 N,说明这与主要能量 bug 是两个问题。当前证据不支持把切换点差别直接判为 LSTP00A 力公式错误。
|
||||
|
||||
### 信号求值和事件定位本身也存在不一致
|
||||
|
||||
`native/components/modules/signal.c:8` 用 `fmod` 求周期内时间;`signal.c:26` 起用“周期数乘周期再加阶段偏移”定位事件。
|
||||
|
||||
独立 C 探针直接调用这两个原始函数:事件定位返回 44 s,但在完全相同的 double 值 44 上,信号求值仍返回上一阶段的 1e17;到 `nextafter(44, +∞)` 才返回 49000。54 s 也可复现类似现象。**这是可重复的边界一致性缺陷,不需要运行积分器即可触发。**
|
||||
|
||||
后续应让阶段判定、事件定位及结果采样共享同一套边界定义,并明确保存切换前值、切换后值或两者。不能用任意放宽时间容差的方式把所有邻近时刻混在一起。
|
||||
|
||||
### 普通采样会漏掉很窄的尖峰
|
||||
|
||||
平台原始结果还保存了约 32.40035510065 s 的额外事件点,力约 −2.0839e14 N,0.01 s 共同网格并不包含它。为排除“平台独有尖峰”,在 Amesim 生成 C 的诊断副本中记录该窗口的内部方程计算,也捕捉到相同时刻、相同量级的负尖峰(约 −2.0839e14 N)。这些内部计算含事件和试算调用,不能把它们全部当作已经接受的普通输出采样。
|
||||
|
||||
因此既不能拿平台额外事件点与 Amesim 的粗采样曲线直接逐点相比,也不能把上份报告的共同网格指标当作全时间域尖峰误差。后续事件验收应分别比较同侧极限、事件时间、事件后的状态及窄窗口波形。
|
||||
|
||||
## 6. 后续修复顺序建议
|
||||
|
||||
1. 先修复节点能量传递:这是已证实影响主要物理结果的 bug。
|
||||
2. 修复采样容量错误的校验、说明和日志保留;再安排分块结果输出。
|
||||
3. 统一循环信号的事件与采样边界。
|
||||
4. 补齐氦气分段物性,明确管路摩擦公式对齐标准;之后再量化剩余积分误差。
|
||||
|
||||
本次没有合入以上修改,也没有调整求解器、矩阵或生产工具链。
|
||||
|
||||
## 7. 可复核证据
|
||||
|
||||
以下路径均相对 `test/diagnosis-20260914/`:
|
||||
|
||||
- `sampling-reproduction.json`:退出 64、短仿真及 solve-only 的命令和结果。
|
||||
- `initial-convergence-summary.json`:启动瞬间细采样、最大步长收紧实验。
|
||||
- `same-state-flow-comparison.json`、`replay-state-*.json`:将 Amesim 物理状态送入原平台 C 方程。
|
||||
- `node-energy-balance.json`:各支路能量及漏算量。
|
||||
- `node-energy-replacements.json`、`node-energy-model.c`:只用于因果验证的生成代码改动。
|
||||
- `node-energy-final-comparison.json`:独立诊断程序完成 50 s 的曲线指标,以及节点加黏度实验。
|
||||
- `properties-summary.json`、`volume-comparison.json`、`native-flows.csv`、`ame-flow-probe/flow-probe.csv`:直接物性、储气方程及管流对比。
|
||||
- `signal-boundaries.csv`、`force-event-samples.json`、`event-force-probe-summary.json`:循环边界和窄尖峰证据。
|
||||
- `production-source-verification.json`:188 个生产文件哈希核对结果。
|
||||
|
||||
所有诊断源码、实验模型副本及日志均保留在该目录,可在后续正式修复时复用。
|
||||
@@ -0,0 +1,75 @@
|
||||
# 分块存储未完成验收项复核
|
||||
|
||||
日期:2026-09-15。复核对象:[结果分块存储验证报告](结果分块存储验证-2026-09-15.md)。
|
||||
|
||||
## 结论
|
||||
|
||||
原报告的“全量未通过”表示测试套件未全部完成,不表示高级摩擦尚未实现。MECMAS21 静摩擦保持、高级摩擦和 Stribeck 已在 9 月 13 日补齐;LSTP00A 几何接触/零剪切模量、PNL 多方指数范围与两半独立换热也有相应实现和 Amesim 对照。[当时的功能补齐报告](Amesim摩擦与管路功能补齐验证-2026-09-13.md)与当前源代码一致。
|
||||
|
||||
本次没有修改组件物理方程或放宽已有数值断言。修正了过时的元数据测试、依赖纳秒级文件时间戳的缓存测试,并为原有摩擦回归增加跨块完整性检查。13 个补齐算例已使用当前平台重新运行完整曲线对照。
|
||||
|
||||
## 逐项定位
|
||||
|
||||
| 报告/排查中涉及的项目 | 当前情况与证据 | 本次处理 |
|
||||
| --- | --- | --- |
|
||||
| MECMAS21 高级摩擦、Stribeck | C 内核 `native_dry_friction` 包含保持反力和指数过渡;生成器保存 `_friction_mode`,高级模式使用 dvel 和 0.1% 脱离滞环 | 旧测试还要求描述含“尚未实现”,与已实现功能相反。改为验证低速保持区间、指数过渡及原 Amesim 编码;完整数值回归通过 |
|
||||
| LSTP00A 几何模式、G=0 | 有几何刚度公式,G=0 时保留阻尼 | 几何接触、零剪切模量和机械联合系统完整对照通过 |
|
||||
| PNL0001/2 多方指数 | 已允许 k>0,含 k=2.5 的实现/验证 | 两个独立管路及联合系统完整对照通过 |
|
||||
| PNL0003 两半换热 | 各半使用自己的温度 | 非对称换热与联合系统完整对照通过 |
|
||||
| PNCH012 旧组件测试文件 | `tests/test_amesim_pnch012_component.py` 只剩 setUp,没有 test 方法 | 不能把“0 个测试”当成已验证;其执行覆盖由 XML 测试、`test_native_node_conservation.py` 和原生目录提供 |
|
||||
| PNL0002/3 旧组件测试文件 | `tests/test_amesim_pnl0002_pnl0003_component.py` 同样没有 test 方法 | 执行覆盖在 XML、原生语义、管路物理及目录测试;本次另有完整 Amesim 曲线验证 |
|
||||
| UD00 | 原全量进程最后输出的测试涉及 UD00,但没有足够证据把异常退出归因于信号组件 | 保留历史异常记录,单独复核 XML 入口;摩擦算例还完整运行其多段信号驱动 |
|
||||
| 缓存锁冲突测试 | 缓存淘汰逻辑未发现错误,测试时间戳在 Windows 上发生舍入 | 修正测试时间间隔,并直接检查锁冲突和年龄顺序 |
|
||||
|
||||
两份空测试文件来自 `3b38f73`(2026-09-10,Python 数值内核退役);该提交从这两个文件删除了原 Python 数值测试。不能据文件名称推断里面还有可运行用例,也不能据它们为空推断 C 实现缺失。原生目录包含 27 类注册模型;50 个历史网络包含 25 类有连接/执行行为的组件,另两类介质通过气体注册与介质选择使用。[覆盖清单](../../test/chunk-storage/component-audit-20260915/coverage-inventory.json)。
|
||||
|
||||
## 缓存失败的可复现原因
|
||||
|
||||
测试原先给两个目录设置 `1000000001 ns` 和 `1000000002 ns` 的 mtime。本机 Windows 实际读回均为 `1000000000 ns`,导致排序从预期的年龄顺序变为键名顺序:先删除另一目录就已满足配额,因此 `skippedInUse` 为 0。锁保护目录保留、另一目录删除两项断言仍然通过,符合原报告现象。
|
||||
|
||||
已改为相隔 1 秒的年龄,并增加两个前置断言:碰撞项确实较旧,且其独占锁确实被另一个共享租约阻止。原来的 `skippedInUse == 1` 断言保留并通过,没有修改生产缓存的统计或淘汰逻辑。[原始时间戳证据](../../test/chunk-storage/component-audit-20260915/cache-timestamp-evidence.json)。元数据与缓存合计 31 项:28 通过,3 项因本机无符号链接权限而跳过。[日志](../../test/chunk-storage/component-audit-20260915/metadata-cache.log)。
|
||||
|
||||
## 分块后的完整曲线复核
|
||||
|
||||
重新运行当前平台 BDF:0–3 s,rtol=1e-9,最大步长 0.002 s,采样间隔 0.001 s。参考使用 9 月 13 日已经实际运行并保存的 Amesim 2404 原始 `.results`,核对源哈希;本次没有重新启动 Amesim,亦未改写原参考数据。
|
||||
|
||||
13 个算例、98 条映射曲线,每条比较全部 3001 个 Amesim 常规采样点。平台同时保存自己的事件点,再插值到 Amesim 常规网格。每例状态/输出均保存为 3 个有效块,没有截断或 CRC 错误。保留原有绝对误差限:压力 1 Pa、温度 0.001 K、加速度及干摩擦/限位/接触力 0.002(对应 SI 单位)、其余 3e-6;不把这组验收等同于所有变量逐点相对误差小于 5%。
|
||||
|
||||
| 算例 | 本次主要最大绝对差 |
|
||||
| --- | --- |
|
||||
| friction_simple | v:3.78e-9 m/s;x:5.47e-9 m;瞬时切换的力差另列 |
|
||||
| friction_advanced | v:3.78e-9 m/s;x:8.68e-9 m |
|
||||
| friction_stribeck | v:5.30e-8 m/s;干摩擦:3.00e-6 N |
|
||||
| friction_elastic | v:6.88e-8 m/s;干摩擦:2.90e-6 N |
|
||||
| friction_ideal | v:1.72e-8 m/s;干摩擦:4.85e-7 N |
|
||||
| friction_band | v:8.74e-9 m/s;x:2.10e-9 m |
|
||||
| joint_mechanical | 接触力:4.30e-5 N |
|
||||
| joint_pneumatic | 通过原有逐变量绝对误差限,详见 JSON |
|
||||
| contact_geometry | 接触力:6.70e-8 N |
|
||||
| contact_zero_G | 接触力:2.88e-8 N |
|
||||
| pipe1_poly | 管内压力:0.02045 Pa;温度:1.85e-5 K |
|
||||
| pipe2_poly | 管内压力:0.14171 Pa;温度:1.28e-4 K |
|
||||
| pipe3_heat | 两半最大压力:0.0001684 Pa;温度:8.41e-7 K |
|
||||
|
||||
简单摩擦在 t=0.15 s 的切换点仍存在左右取值差异:干摩擦最大差约 2 N,加速度约 2 m/s²。完整最大差保留在结果中,仅这两条曲线另外列出“除该已知切换点外”的误差;没有删除原始点或将两版宣称为逐点相同。
|
||||
|
||||
[完整对照统计](../../test/chunk-storage/component-audit-20260915/full-grid-summary.json)、[执行日志](../../test/chunk-storage/component-audit-20260915/full-grid.log)、[复现脚本](../../test/chunk-storage/component-audit-20260915/run-full-grid.py)。另外,持久化的 `tests/test_native_friction.py` 已增加状态/输出跨块检查,8 个冻结算例、10 次积分(其中两例覆盖 RK45/BDF)通过;原有乱序回放检查保留。[专项日志](../../test/chunk-storage/component-audit-20260915/friction.log)。
|
||||
|
||||
## 本次组件回归汇总
|
||||
|
||||
采用分模块独立 Python 进程运行,避免把某个模块的进程中断误报成后续所有组件的失败;每个模块设 300 s 外层超时,保留所有原始日志。
|
||||
|
||||
- 组件/介质相关 128 项测试最终通过,其中包含原生目录的 4 项测试、全部 27 类注册模型的版本合同、50 个历史网络。50 个网络中的 3 个旧输入存在启用干摩擦时 `fcoul > fstick`,按当前契约验证明确拒绝;不能把拒绝非法输入记为高级摩擦未实现。
|
||||
- 元数据/缓存 31 项中 28 通过、3 项因 Windows 符号链接权限跳过;摩擦专项 1 项内的 8 个算例、10 次积分通过。
|
||||
- 合计 160 项测试方法:157 通过、3 跳过。两份没有用例的遗留文件不计为通过测试,单独执行返回 `NO TESTS RAN`。
|
||||
- 本轮 PNCH012 XML 模块首次在 300 s 外层限制下超时,未得到内部错误栈;随后开启 faulthandler 的独立运行在 4.961 s 完成,2 项均通过。这是重试后的覆盖结果,不是一次运行全绿,也未确认首次超时的根因。
|
||||
- UD00 XML 2 项在独立进程中通过(约 5.64 s);原生组件语义 11 项通过;目录回归 4 项通过(约 229.24 s)。未复现原报告的 `0xC0000005`,但不能将其标记为已修复。
|
||||
|
||||
[汇总](../../test/chunk-storage/component-audit-20260915/audit-summary.json)、[逐模块结果](../../test/chunk-storage/component-audit-20260915/component-suite-summary.json)、[PNCH012 诊断复跑](../../test/chunk-storage/component-audit-20260915/pnch012-diagnostic.log)、[UD00 日志](../../test/chunk-storage/component-audit-20260915/test_amesim_ud00_xml.log)、[目录回归日志](../../test/chunk-storage/component-audit-20260915/test_native_catalog.log)。这些是组件及相关存储问题的本次专项复核,不是整个仓库全部测试的一次性全绿声明。
|
||||
|
||||
## 仍需区分的边界
|
||||
|
||||
- “全量曲线”仅指上述 13 个既定算例的全部常规采样点,不是 27 类组件任意参数和任意连接组合的穷举验证。
|
||||
- 多质量刚性同速组的欠定静摩擦反力分配,仍不在这 13 个 Amesim 对照算例的逐元件验证范围内。
|
||||
- 本机符号链接权限相关用例、Linux 实机验收仍未补足,不能记作通过。
|
||||
- 原全量 Python 进程 `0xC0000005` 的根因仍未由现有日志确定。分模块运行和重试通过只能确认相应用例本次能够完成,不能证明历史异常的根因已修复。
|
||||
@@ -0,0 +1,115 @@
|
||||
# 氦气高温物性补齐与 Amesim 对照
|
||||
|
||||
## 结论
|
||||
|
||||
已补齐平台氦气物性中遗漏的高温分段,并直接调用本机 Amesim 2404 气动库验证。**108 个相同温度、相同绝对压力的状态中,密度、焓、Cp、Cv、黏度及单位能量输入下的储气温度/压力变化率,与 Amesim 的最大逐点相对差小于 `6.4e-13%`。** 这是浮点数值对齐,不是对高温物理适用范围的验证。
|
||||
|
||||
原模型启动段误差减小,但完整 50 s 的个别温差/焓流差最大值增大。本次修复没有证明整模型所有曲线均满足 ±5%,也没有把事件点差异或近零流量差异归因成物性缺段后宣布全部解决。
|
||||
|
||||
## 1. 已确认的缺项
|
||||
|
||||
数据依据为本机 `F:/AMESim2404/Amesim/libpn/data/nasa_properties/` 下的氦气数据文件,另以初始化真实氦气后的 Amesim 库函数输出核实公式及边界。
|
||||
|
||||
| 项目 | 修复前 | Amesim 与修复后 |
|
||||
| --- | --- | --- |
|
||||
| 动力黏度 | 所有温度均用 200–1000 K 系数 | 200–1000、1000–5000、5000–15000 K 三段,换段处连续修正 |
|
||||
| 理想 Cp | 全温度 `Cp/R=2.5` | 6000 K 以下保持原值,6000–20000 K 使用 NASA 2002 高温段 |
|
||||
| 理想 h、u | 全温度线性热量学 | 对分段 Cp 积分得到 h,且 `u=h−R*T`,保留原焓基准 |
|
||||
| 温度反解 | 线性反解 | 高温段用有区间保护的 Newton 反解,低温保留直接计算 |
|
||||
| 等熵系数 | Cv 理想项始终为 `1.5R` | 使用同一高温 Cp 推导 Cv,连接孔口及管流计算 |
|
||||
|
||||
PR EOS、密度方程、PR 剩余焓/内能公式及其常数没有更换。
|
||||
|
||||
只复制数据文件的高温系数是不够的。官方库对高温段做连续性修正:
|
||||
|
||||
- `ln(mu)` 在 1000 K 和 5000 K 逐段衔接。直接换原始系数会留下约 `1e-6` 量级的相对跳变。
|
||||
- 高温 Cp 的常数项在 6000 K 对齐低温 Cp,再通过积分使 h 连续。直接使用原始高温 a8,会在该点产生约 **3.94 J/kg** 的焓跳变。
|
||||
- 超过 20000 K 时,Amesim 使用匹配值和斜率的二次 Cp 延拓及相应三次焓积分;直接无限延长 NASA 高阶多项式不会得到相同结果。此规则以 25000 K、30000 K 官方库输出交叉验证。
|
||||
|
||||
若 `c=Cp0(20000)`,`k=Cp0'(20000)/c`,`ΔT=T−20000`,则延拓采用:
|
||||
|
||||
```text
|
||||
Cp0(T) = c × [1 + kΔT + (kΔT)²/2]
|
||||
h0(T) = h0(20000) + cΔT × [1 + kΔT/2 + (kΔT)²/6]
|
||||
```
|
||||
|
||||
## 2. 独立物性对照
|
||||
|
||||
从已初始化 `fluidType=12`、`eosType=6` 的 Amesim 模型副本,直接调用 `pn2rhopti_`、`pn2hpti_`、`pn2cppti_`、`pn2cvpti_`、`pn2mupti_`、`pn2vol_`。没有用平台公式产生参考值。
|
||||
|
||||
- 温度:200–30000 K,共 27 点,包含 1000、5000、6000、15000、20000 K 边界及其 `±1e-6 K` 邻点。
|
||||
- 绝对压力:101300、1e7、5e7、2.5e8 Pa,共 4 点。
|
||||
- 108 个温压组合均保存为独立 JSON 基准,日常测试不需要安装或运行 Amesim。
|
||||
- 对 `pn2vol_` 使用固定容积 1 m³、零质量流、零容积变化率及 1 W 能量输入,独立验证 `dT/dt` 和 `dp/dt`。
|
||||
|
||||
下表在 101300 Pa 下比较动力黏度,误差以 Amesim 为分母。
|
||||
|
||||
| T (K) | Amesim (Pa·s) | 修复前 (Pa·s) | 修复前相对误差 | 修复后 (Pa·s) |
|
||||
| ---: | ---: | ---: | ---: | ---: |
|
||||
| 1000 | 4.625395961e-5 | 4.625395961e-5 | 0% | 4.625395961e-5 |
|
||||
| 5000 | 1.560851464e-4 | 1.506553992e-4 | −3.47871% | 1.560851464e-4 |
|
||||
| 9600 | 2.592262341e-4 | 2.449318836e-4 | **−5.51424%** | 2.592262341e-4 |
|
||||
| 15000 | 3.704987036e-4 | 3.418731155e-4 | **−7.72623%** | 3.704987036e-4 |
|
||||
| 20000(黏度表外) | 4.685124691e-4 | 4.239668715e-4 | −9.50788% | 4.685124691e-4 |
|
||||
|
||||
108 点的修复后最大绝对相对误差:
|
||||
|
||||
| 物性 | 最大误差 (%) |
|
||||
| --- | ---: |
|
||||
| 密度 | 1.354e-13 |
|
||||
| 焓 | 6.330e-13 |
|
||||
| Cp | 5.152e-14 |
|
||||
| Cv | 7.065e-14 |
|
||||
| 动力黏度 | 3.658e-13 |
|
||||
| 储气温度变化率 | 1.302e-13 |
|
||||
| 储气压力变化率 | 2.257e-13 |
|
||||
|
||||
这些参考样本的分母均非零。整模型近零点另按此前口径报告原值/绝对差,不用巨大相对百分数判定。
|
||||
|
||||

|
||||
|
||||
## 3. 同一原模型的接入验证
|
||||
|
||||
继续使用上一轮已经审计的 `test_mql.ame` 对应模型及其非循环信号输入。平台输入副本逐字节相同,物理参数、初始条件、输出间隔和 `rtol=1e-8` 保持不变。Amesim 使用上一轮已运行并保留的原始结果;本次重新运行物性修复前后两版平台。
|
||||
|
||||
为了隔离变量,在实验目录复制当前 native 源码,仅把副本的 `properties.c` 换成本次开始时保存的版本,作为“物性修复前”;其余组件代码、节点修复和求解器均与修复后相同。生产文件未被来回覆盖。逐一校验其余 native 文件相同。
|
||||
|
||||
| 采样窗口 | 比较量 | 物性修复前最大绝对差 | 物性修复后最大绝对差 |
|
||||
| --- | --- | ---: | ---: |
|
||||
| 0–0.15 s,0.1 ms | 压力 | 13606.981 Pa | 4641.503 Pa |
|
||||
| 同上 | 温度 | 1.174655 K | 0.457507 K |
|
||||
| 同上 | 节点焓流 | 51182.787 W | 27064.123 W |
|
||||
| 0–50 s,10 ms | 压力 | 71.6543 Pa | 65.6868 Pa |
|
||||
| 同上 | 温度 | 0.355813 K | **0.395395 K** |
|
||||
| 同上 | 节点焓流 | 24.8071 W | **141.9202 W** |
|
||||
| 同上 | 节点质量流 | 2.5189054e-5 kg/s | 5.6631705e-6 kg/s |
|
||||
|
||||
两套平台结果均正常到达指定终点。各栏取相应网格中全部已映射曲线的最大差,最差元件/时刻可能变化,不能把这些数值当成同一时刻误差或未采样时刻的极值。
|
||||
|
||||
全程修复后最大温差和焓流差均在 0.01 s;最大质量流差在 0.37 s。启动段 0.04 s 的阶跃点质量流差仍约 0.390305 kg/s,属于此前已经记录的事件点输出差异,没有在本次物性工作中删除该点或改变时间轴。
|
||||
|
||||
本次比较说明:遗漏的物性已被独立证实并修正,但整模型还存在其他差异;不能为了让某个最大误差下降而保留错误的物性。
|
||||
|
||||
## 4. 有效域与范围
|
||||
|
||||
`helium_eos.data` 标记 PR EOS 有效温度为 **2.2–1500 K**,理想热量学表到 20000 K,黏度表到 15000 K。Amesim 超过 EOS 标注温度也会给出警告并继续计算。本次对齐这一实现行为,没有宣称高温 PR 结果具有经过验证的物理精度。
|
||||
|
||||
修改覆盖平台当前求解路径使用的热力学、黏度和等熵量;没有新加当前组件未使用的熵或导热系数接口。`cp_ref` 仍表示参考比热,Python 介质类的说明已修正,避免将其误读为全温区常数。
|
||||
|
||||
## 5. 代码、测试与证据
|
||||
|
||||
- [物性实现](F:/Master/SystemSimulationApp/native/components/modules/properties.c)
|
||||
- [独立高温物性回归测试](F:/Master/SystemSimulationApp/tests/test_native_helium_high_temperature.py)
|
||||
- [108 点 Amesim 基准及来源哈希](F:/Master/SystemSimulationApp/tests/data/amesim_helium_high_temperature_properties.json)
|
||||
- [物性修复前后误差统计](F:/Master/SystemSimulationApp/test/helium-high-temperature-20260915/property-errors.json)
|
||||
- [整模型对比统计](F:/Master/SystemSimulationApp/test/helium-high-temperature-20260915/network-comparison-summary.json)
|
||||
- [Amesim 编译与直接调用日志](F:/Master/SystemSimulationApp/test/helium-high-temperature-20260915/amesim/run.log)
|
||||
- [原模型复现脚本](F:/Master/SystemSimulationApp/test/helium-high-temperature-20260915/run_network.py)
|
||||
- [原模型分析脚本](F:/Master/SystemSimulationApp/test/helium-high-temperature-20260915/analyze_network.py)
|
||||
- [关联回归日志](F:/Master/SystemSimulationApp/test/helium-high-temperature-20260915/regression.log)
|
||||
|
||||
新增回归检查同温同压物性、分段边界、p/h 温度反解、质量/内能状态重构、Cp/Cv 数值导数、能量恒等式、缓存和等熵消费者。关联回归包括已有物性缓存、管路物理、管流缓存、节点守恒/容积、氦气长期均压与组件目录测试。
|
||||
|
||||
验证结果:新增专项 3 项、关联物性/管路/节点/长期均压 14 项通过。组件目录 4 项中,冻结基准覆盖 50 个网络、112 个探针;整批仅网络 #2 的 `--init` 曾返回空输出而导致 JSON 解析异常,没有报告数值断言失败。网络 #2 随后独立复跑通过(含两条编译路径)。因此共 21 个测试方法覆盖完成,但不将首次目录运行表述成无错误通过。
|
||||
|
||||
目录回归曾在进程管道处停滞并伴随编译器启动异常,中断后复跑;未因此修改物性数值、公差或测试基准。记录见[目录完整复跑日志](F:/Master/SystemSimulationApp/test/helium-high-temperature-20260915/catalog-final.log)和[网络 #2 独立复跑日志](F:/Master/SystemSimulationApp/test/helium-high-temperature-20260915/catalog-case2-retry.log)。
|
||||
@@ -0,0 +1,94 @@
|
||||
# 求解器外层提前终止修复与验收
|
||||
|
||||
日期:2026-09-14。分支:`system-optimization`。
|
||||
|
||||
## 结论
|
||||
|
||||
原先在 10.8 秒退出的八路模型,使用新封装完成 50 秒,纯求解墙钟时间 9.082 秒。旧封装在同一输入及当前组件实现下仍于 10.8 秒退出,确认本次修复针对外层判定,而非通过改模型参数避开问题。
|
||||
|
||||
新旧结果在前 10.8 秒的 1,082 个共同采样时刻、1,785 条序列(包括时间)上逐项完全一致。新封装共遇到 12 次成功返回但时间未变,最长连续 6 次,均自行恢复。当前四路、八路 corrected JSON 也均完成 50 秒。22 项相关自动测试通过。
|
||||
|
||||
## 处理规则
|
||||
|
||||
旧代码将 `flag < 0` 和 `next <= t` 合并为失败。两者含义不同:负返回码表示 CVODE 报告错误;成功的内部步可能小于当前时间的浮点分辨率,因此外部读取的时间暂时不变。
|
||||
|
||||
| 情况 | 新行为 |
|
||||
| --- | --- |
|
||||
| CVODE 成功返回且时间增加 | 正常处理接受步、采样和事件 |
|
||||
| CVODE 成功返回但时间相同 | 保存 CVODE 当前状态与历史,继续调用;记录次数,不做零长度采样/事件处理 |
|
||||
| 连续时间相同 | 不设置次数门槛;继续检查取消与当前整次求解的实际墙钟时限 |
|
||||
| 超时发生且仍在上述停滞阶段 | 失败原因 `time-stagnation` |
|
||||
| 其他实际求解超时 | 失败原因 `timeout` |
|
||||
| CVODE 返回负错误码 | 立即报告 `solver-error`,保存失败操作、原始返回码和最后接受时间 |
|
||||
| 时间倒退、越过请求边界或非有限时间/状态 | 分别报告 `time-regression`、`time-overshoot`、`nonfinite-time`、`nonfinite-state` |
|
||||
| 接受步或状态切换超过既有保护上限 | 报告 `resource-limit`,明确具体上限类型 |
|
||||
| 用户取消 | 保持取消状态;不会被后续 CVODE 回调错误覆盖为求解失败 |
|
||||
| 积分器声称完成但未到请求终点 | 报告 `incomplete-result` |
|
||||
|
||||
时间相同的恢复路径不增加容差、不设置最小步长、不人为令时间增加,也不调用 `CVodeReInit` 跳过困难区间。既有信号分段边界和物理事件重启流程保留。
|
||||
|
||||
默认求解时限仍是 300 秒,Python 进程监控保留 5 秒退出宽限;这不是“某次停滞开始后再计 300 秒”。测试中的原模型使用 180 秒时限,实际远未触及。独立运行可通过已有 `--timeout` 设置时限。
|
||||
|
||||
CVODE 初始化、资源分配、配置 API,以及 BDF 步内采样与事件处理失败有独立操作/原因信息。CVODE 的正常停止返回码 `1` 不视为失败。返回码语义参见 [SUNDIALS 官方 CVODE 文档](https://sundials.readthedocs.io/en/latest/cvode/Usage/index.html)。
|
||||
|
||||
## Python 进程封装
|
||||
|
||||
同时修正进程监控中的分类问题:此前取消后进程不响应,被强制结束时也抛出“超过时间限制”的异常。
|
||||
|
||||
现在,取消后不响应且达到退出宽限的进程仍返回 `cancelled`,网页任务映射为 `stopped`。如果强制结束导致没有完整结果文件,则明确返回空轨迹和空最终量,只保留最后收到的时间及进度计数,标记 `resultAvailable=false`、`statisticsComplete=false`;不读取可能写了一半的结果,也不伪造未知的最终统计。
|
||||
|
||||
真正超出进程时限且没有取消请求,仍报告进程超时;自行崩溃则报告退出码。已经退出的进程不会仅因监控线程尚在读取日志而被误判超时。
|
||||
|
||||
正常结果新增 `solverControl` 字段,网页后端保存在 `diagnostics.native.solverControl`。包含原因、操作、返回码、同时间返回次数、最长连续次数及结束时 CVODE 内部时间与步长;这些 CVODE 数值字段只对 BDF 有意义。非有限诊断数字使用 JSON `null`,受控失败输出保留最后有效的接受状态。
|
||||
|
||||
## 模型验收
|
||||
|
||||
共同设置:BDF/CVODE 7.4.0,时长 50 秒,最大步长 `1e30` 秒,`rtol=1e-8`,采样间隔 0.01 秒,状态绝对误差限沿用生成器。原输入文件未修改;当前 corrected 文件仅在运行配置中延长时长。
|
||||
|
||||
旧封装对照使用临时 native 目录,仅将 `cvode_solver.c` 恢复为本轮修改前的 HEAD 内容;组件、生成器和其他当前运行库一致。因此该对照不是拿不同历史组件实现作比较。
|
||||
|
||||
| 输入与入口 | 结果 | 最终仿真时间 | 纯求解墙钟时间 | 同时间返回总数 / 最长连续数 |
|
||||
| --- | --- | ---: | ---: | ---: |
|
||||
| 原触发模型,旧 CVODE 封装 | 提前失败 | 10.8 s | 4.805 s | 旧封装不记录 |
|
||||
| 原触发模型,新封装独立进程 | 完成 | 50 s | 9.082 s | 12 / 6 |
|
||||
| 原触发模型,新封装网页后端入口 | 完成 | 50 s | 9.006 s | 12 / 6 |
|
||||
| 当前八路 corrected,新封装独立进程 | 完成 | 50 s | 6.792 s | 0 / 0 |
|
||||
| 当前四路 corrected,新封装独立进程 | 完成 | 50 s | 1.011 s | 0 / 0 |
|
||||
|
||||
上述时间是各次单次验收测量,不是速度基准测试;尤其旧封装只完成 10.8 秒,不能据此计算新旧加速比。纯求解计时包括积分、采样和事件处理,不含编译、进程启动及结果投影/文件写入。
|
||||
|
||||
原触发输入为 `test/mql8-50s-20260913/model-50s.json`,SHA-256:
|
||||
|
||||
`7c48a380e465ba5ee8a15610586325d14ac36a8cda5b3caa02053a8efc27fe47`
|
||||
|
||||
当前输入为 `tests/data/test-mql-8-corrected.json`、`tests/data/test-mql-4-corrected.json`。原触发模型保留历史循环信号,以覆盖旧故障;它与当前 corrected 模型用途不同,不拿它直接判定与 Amesim 的一致性。
|
||||
|
||||
独立进程三组完整输出均为有限数,采样时间严格递增。按输出气体质量相加核对闭合系统总质量漂移:原触发模型 `4.53e-14 kg`,当前八路 `2.58e-14 kg`,当前四路 `2.75e-14 kg`。网页后端入口走 JSON→XML→模型生成→原生进程→原始序列传输,返回 5,010 个采样点,接受步统计与独立进程一致。
|
||||
|
||||
本轮没有重新启动 Amesim 或新增组件语义对照;摩擦及管路的既有 Amesim 数值基准回归已通过。本次验收目标是封装正确终止及不扰动已有轨迹。
|
||||
|
||||
## 自动测试与故障注入
|
||||
|
||||
| 测试模块 | 方法数 | 验证范围 |
|
||||
| --- | ---: | --- |
|
||||
| `tests.test_native_solver_control` | 4 | 实际 CVODE + 临时注入:连续 1,000 次同时间成功返回后完整轨迹不变;负错误码、倒退、非有限时间/状态;持续停滞实际超时与取消;普通超时及既有资源保护 |
|
||||
| `tests.test_native_worker_control` | 3 | 实际子进程拒绝退出时的强制取消、普通/原始序列两种传输、网页 stopped 合同、超时与崩溃分类;半写入文件不作为结果 |
|
||||
| `tests.test_native_codegen` | 8 | RK45/BDF 完成与最大步长、取消、独立进程、缓存及默认 C 后端 XML 接口等 |
|
||||
| `tests.test_native_result_transport` | 6 | 实际 HTTP/流式结果合同、取消、序列与索引完整性等 |
|
||||
| `tests.test_native_friction` | 1 | 既有 8 组 Amesim 冻结数值基准,共 10 次 RK45/BDF 积分 |
|
||||
| 合计 | 22 | 全部通过 |
|
||||
|
||||
注入代码只存在于测试创建的临时 C 源码副本,生产运行库没有注入开关。连续 1,000 次恢复测试同时核对轨迹、接受步、事件和重启次数,防止以隐蔽重启或丢失事件的方式“跑完”。
|
||||
|
||||
实测平台为 Windows、GCC 8.1、SUNDIALS 7.4.0。本轮遇到既有 GCC 子进程启动偶发故障,重试构建后完成测试,没有改编译器路径或工具链配置。新增测试采用公共 SUNDIALS API、Python 可移植子进程接口和路径处理;已加入 Linux 原生 CI,Windows CI 的完整发现也会包含它们。本机没有执行 Linux 实测,Linux 通过情况待 CI 验证。
|
||||
|
||||
## 交付与复现
|
||||
|
||||
- 运行库修改:`native/runtime/cvode_solver.c`、`common.c`、`main.c` 和 `native/include/runtime.h`。
|
||||
- 进程封装:`app/simulation/native_codegen/runner.py`。
|
||||
- 新增自动测试:`tests/test_native_solver_control.py`、`tests/test_native_worker_control.py`。
|
||||
- 本机验收脚本:`test/verify_solver_wrapper_20260914.py`、`test/verify_solver_wrapper_backend_20260914.py`。
|
||||
- 模型结果与摘要:`test/solver-wrapper-20260914/`;前缀逐项对照见 `prefix-comparison.json`。
|
||||
- 测试日志:`test/solver-wrapper-control-20260914.log`、`solver-wrapper-worker-20260914.log`、`solver-wrapper-regression-20260914.log`、`solver-wrapper-friction-20260914.log`、`solver-wrapper-backend-20260914.log`。
|
||||
|
||||
`test/` 是本机忽略目录,包含大体积运行结果,不进入 Git;正式自动测试与本报告进入源码交付范围。重启后端后,新请求会使用更新的 Python 封装;C 运行库内容变化参与构建缓存键,正常构建会自动生成对应的新程序,无需手动清空缓存。此次未提交或推送远端,也未处理工作区已有的 Amesim 文件变更。
|
||||
@@ -0,0 +1,49 @@
|
||||
# 物性有效温度越界提示与 Amesim 核验
|
||||
|
||||
已给平台原生仿真增加非致命物性温度越界提示,实时显示在仿真控制台,并保存到结果诊断信息中。提示包含气体名称、物性类别、物性计算使用的温度、有效界限和仿真时刻,不包含具体元件名称。
|
||||
|
||||
## Amesim 实际行为
|
||||
|
||||
核对 Amesim 2404 实际运行的 [run.log](../../test/helium-high-temperature-20260915/amesim/run.log),例如第 16 行起的提示:状态方程使用了 10890.565 K,超过 1500.000 K 上限,发生于 0.001000 s;下一行说明使用 pneumatic gas 1、predefined helium (He) real。后续还有 Cp/h/s 中依赖状态方程的真实气体修正项越界提示。
|
||||
|
||||
这些提示没有具体元件名。因此,“不报元件”的判断与本次日志相符;但 Amesim 不只是给出温度,还包含物性类别、界限、时刻和气体编号/名称。日志存在重复提示,本次平台按“氦气物性类别 + 上/下界方向”在一次仿真内仅提示一次,另外保存极值,避免刷屏。没有依据该日志推断所有 Amesim 物性模块、版本都采用完全相同策略。
|
||||
|
||||
## 范围与触发规则
|
||||
|
||||
范围来自本机 Amesim 2404 的 `libpn/data/nasa_properties/` 数据文件,来源哈希见 [原物性对照清单](../../test/helium-high-temperature-20260915/manifest.json)。
|
||||
|
||||
| 实际使用的物性 | 有效温度范围 | 数据来源 |
|
||||
| --- | --- | --- |
|
||||
| 状态方程及热力性质的真实气体修正项 | 2.2–1500 K | helium_eos.data |
|
||||
| 理想气体热容、焓和内能 | 200–20000 K | helium_cp_h_s.data;内能由焓减 RT |
|
||||
| 动力黏度 | 200–15000 K | helium_mu.data |
|
||||
|
||||
- 只检查实际调用的物性。封闭容积不使用黏度时,不因容积温度高而生成黏度警告。
|
||||
- 在初始状态和每个求解器接受的状态检查,包括接受的事件状态;不采纳被拒绝的步、Newton/Jacobian 试探状态或结果回放。提示首次时刻指首次检测到越界的接受状态,未额外求解准确穿越时刻。
|
||||
- 温度指物性计算的输入温度,也可能包括等熵估算温度;不能将其解读为某个容积元件的存储温度。
|
||||
- 边界使用 `1e-9 × max(界限, 1)` K 的浮点容差,避免温度反解舍入造成端点误报。
|
||||
- 保持现有物性公式、外推行为和求解状态不变,越界本身不中断仿真;温度有计算结果不意味着它仍处于物性有效范围。
|
||||
- 多个氦气实例使用同一数据集,提示合并为“氦气”,不添加无法从当前原生介质结构可靠还原的 Amesim 气体编号。平台其他介质目前没有对应的已核验温度有效域,本次没有虚构空气等介质的界限。
|
||||
|
||||
## 实现
|
||||
|
||||
`NativePropertyTemperatures` 在每次检查中汇总实际物性调用的最小/最大温度,不依赖物性缓存是否已满,也不使用进程全局状态。两个代码生成路径都提供诊断入口。原生运行时按初始/接受状态额外执行一次只读模型计算;不改变积分器的 RHS 统计或状态,无氦气的通用模型跳过该检查。
|
||||
|
||||
原生进程通过 stderr JSON 发出 `property-warning`;后端保留现有进度/心跳阶段并转发警告;前端以 warning 级别显示,实时提示与最终结果提示去重。结果的 `diagnostics.propertyWarnings` 同时保存首次温度/时刻、极值温度/时刻及提示文字,原生结果也有 `propertyWarnings`。用户终止且工作进程被强制停止时,保留已收到的警告。
|
||||
|
||||
## 验证结果
|
||||
|
||||
新增 4 项原生测试覆盖两个生成路径的端点、上下限、黏度按需触发、空气不误报、缓存容量耗尽、试探计算隔离、去重和极值。RK45/BDF 下开启与关闭提示的最终状态、全部最终输出以及 nfev/njev/nlu、接受/拒绝步数完全一致。结合氦气物性、属性缓存、结果分块、求解器控制和工作进程控制回归,共 22 项 Python 测试分批通过。前端 5 项浏览器测试通过,包含实时/仅结果提示、重复消息去重与 IndexedDB 结果保存;TypeScript 检查和 Vite 生产构建通过。
|
||||
|
||||
验证期间修正了两个测试环境问题:浏览器导入工程名已由文件名决定,旧测试仍断言 JSON 内名称;原生控制测试需显式提供临时目录内的二进制结果文件,避免 Windows `tmpfile()` 无权限导致空结果。这些调整没有修改生产求解行为。
|
||||
|
||||
使用上一次已经核对参数和初始条件的同一 Amesim 模型对应 [startup/platform.json](../../test/node-fixes-amesim-20260914/startup/platform.json),经真实后端消息流完成 0–0.15 s 仿真:1784 条输出曲线、每条 1501 个采样值,与添加提示前的高温物性修复结果逐值完全一致。[验证结果](../../test/property-temperature-warnings-20260915/model-validation.json)、[消息流](../../test/property-temperature-warnings-20260915/stream-events.jsonl)、[复现脚本](../../test/property-temperature-warnings-20260915/validate_model.py)。本次检查的是提示功能,不是重新声明整个模型对 Amesim 的相对误差均小于 5%。
|
||||
|
||||
本模型检测到:
|
||||
|
||||
| 类别 | 首次时刻 / s | 首次物性计算温度 / K | 界限 / K | 期间越界极值 / K |
|
||||
| --- | ---: | ---: | ---: | ---: |
|
||||
| 理想气体热容、焓和内能下界 | 0 | 39.4411755352 | 200 | 39.4411755352 |
|
||||
| 状态方程及真实气体修正项上界 | 2.95514285254e-8 | 1513.97899017 | 1500 | 11759.1354656 |
|
||||
|
||||
初始的 56 个容积温度输出都约为 293.15 K;39.44 K 是物性计算内部使用的温度,不能说初始容积气体降到了 39.44 K。实时消息按发生顺序发出,结果列表按物性类别汇总,顺序可以不同。
|
||||
@@ -0,0 +1,121 @@
|
||||
# 组件连接守恒扩展排查
|
||||
|
||||
## 结论与范围
|
||||
|
||||
本次只排查,未修改生产代码。核对现有 27 类注册模型的声明、紧凑和扩展两条 C 生成路径,完成 38 个原生方程探针,涉及 24 类运行元件;另外调用安装版 Amesim 的 PNRP17、PNCH012 原始子模型进行容积传递对照。
|
||||
|
||||
结论是:**原有焓流问题会影响六类储气元件,另确认一处活塞容积传递遗漏。没有发现其他独立流阻、动态管路或本次机械探针中存在同类守恒错误。**
|
||||
|
||||
“未发现”限定于下文代码路径与测试工况。此次不是对全部组件所有模式重新进行 Amesim 长时间曲线验收。两种介质定义没有独立物理端口;UD00 的信号边界问题已在上一份报告确认,本次未重测。数值探针采用氦气介质,不代表已经覆盖理想空气或任意介质组合。
|
||||
|
||||
## 1. 原节点焓流 bug 的实际影响范围
|
||||
|
||||
PN3NODE2/P4NODE2 参考口连接下列元件时,错误不只存在于节点本身,还涉及储气元件如何接收节点汇总后的能量:
|
||||
|
||||
| 储气元件 | 受影响的连接 | 小模型中整个封闭系统的能量收支残差 |
|
||||
|---|---|---:|
|
||||
| PNCH023 | 任一气动口接节点参考口 | −189.319 W |
|
||||
| PNCH012 | 任一气动口接节点参考口 | −189.319 W |
|
||||
| PNL0001 | 储气侧端口 2 接节点参考口 | −189.319 W |
|
||||
| PNL0003 | 端口 1 或 2 的储气侧;本次探针测试端口 1 | −189.319 W |
|
||||
| 临时库 Cylinder 气瓶 | 唯一气动口接节点参考口 | −189.254 W |
|
||||
| 临时库 Tank 储罐 | 唯一气动口接节点参考口 | −189.254 W |
|
||||
|
||||
上述探针为固定容积、无环境换热、无机械做功的封闭系统。应有“所有储气元件的质量变化率之和为零、内部能量变化率之和为零”。实测质量收支平衡到约 1e-19 kg/s,能量却持续漏算。
|
||||
|
||||
这些不是六个互不相关的组件公式错误,而是它们共用 `app/simulation/native_codegen/extended.py:615` 的流向选焓逻辑。参考口净流出时,接收端采用自身焓覆盖节点信息。不同模型在这里会触发相同问题。
|
||||
|
||||
PNL0002 的两端是流量供给口,并非这种储气参考口,当前固定供需检查不允许它们与节点参考口直接组成上述连接。因此不能仅凭“它也有内部气体”就把 PNL0002 列为同一种直接触发对象;它仍可能受到系统其他位置错误结果的间接影响。
|
||||
|
||||
进一步验证:
|
||||
|
||||
- 节点参考口净流入的对照工况,能量残差约 1.59e-12 W。这解释了某些正常测试为什么没有暴露问题。
|
||||
- 参考腔体净质量流约 −4.34e-19 kg/s,几乎为零时,整个系统仍漏算约 **3573.65 W**。只处理普通单向流动不够。
|
||||
- 两个节点串联仍漏算约 **189.319 W**。未来修复不能只识别“节点直接连接某一个管腔”的固定模板。
|
||||
- PNCH023、PNCH012 各支路**直接分别连接各自端口**,不经上述节点汇总时,同样的冷热气体同时进出测试能量残差为 0。这进一步排除了腔体基础能量方程本身漏掉多端口求和。
|
||||
|
||||
## 2. 新确认:PNRP17 经节点连接 PNCH012 时丢失容积和做功
|
||||
|
||||
### 原因
|
||||
|
||||
`extended.py:270` 只查找“气动口直接连到当前 PNCH012 的活塞”,再把这些活塞的容积、容积变化率加进气室。
|
||||
|
||||
当连接变成:
|
||||
|
||||
`PNRP17 → PN3NODE2/P4NODE2 支路口 → 节点参考口 → PNCH012`
|
||||
|
||||
活塞不再是气室的直接邻居,因此被漏掉。活塞本身仍计算扫掠容积和受压力,气室却只采用基础容积,并认为容积变化率为零。连 `−p × 容积变化率` 的气体做功项也随之消失。
|
||||
|
||||
### 数值验证
|
||||
|
||||
小模型设置:活塞直径 0.1 m、杆径 0、初始腔长 0.2 m、活塞与缸体相对速度 0.1 m/s;气室基础容积 10 L、绝对压力 200000 Pa、温度 400 K。
|
||||
|
||||
| 量 | 平台直接连接 | 平台经过三通 | 平台经过四通 | Amesim 原始子模型及节点公开求和规则 |
|
||||
|---|---:|---:|---:|---:|
|
||||
| 活塞扫掠容积 | 1.570796 L | 1.570796 L | 1.570796 L | 1.570796 L |
|
||||
| 气室总容积 | 11.570796 L | **10 L** | **10 L** | 11.570796 L |
|
||||
| 气室容积变化率 | 0.785398 L/s | **0** | **0** | 0.785398 L/s |
|
||||
| 平台气体内部能量变化率 | −157.079633 W | **0** | **0** | 对应应计入 −p·dV/dt |
|
||||
|
||||
平台直接连接时,气体内部能量变化、机械动能变化和对环境做功之和约为 −1.42e-14 W。经过节点后,功率收支出现 **157.079633 W** 的缺口。
|
||||
|
||||
本次 Amesim 对照不是另搭三份完整图纸运行,而是在生成程序的隔离副本中调用已安装的 PNRP17、PNCH012 原始子模型,并按 PN3NODE2/P4NODE2 的公开容积求和宏分别传递输入。三种路径都得到 11.570796 L,温度变化率 −18.109354 K/s、压力变化率 −22635.528 Pa/s。原始子模型接口与公开规则支持容积经节点传递,平台的遗漏不是 Amesim 也采用的限制。
|
||||
|
||||
参考文件:
|
||||
|
||||
- `F:/AMESim2404/Amesim/libpcd/submodels/PNRP17.c`:输出扫掠容积和容积变化率。
|
||||
- `F:/AMESim2404/Amesim/libpn/submodels/PN3NODE2.c`、`P4NODE2.c`:分别汇总支路体积与体积变化率。
|
||||
- `F:/AMESim2404/Amesim/libpcd/submodels/PNCH012.c`:采用外部体积及变化率计算储气状态。
|
||||
|
||||
这是与焓流遗漏不同的一条缺陷,涉及 **PNRP17—节点—PNCH012** 整条连接路径。修复需要沿已声明的容积传递关系汇总贡献,同时防止漏算、重复计入和无来源的环路。
|
||||
|
||||
## 3. 本次没有发现同类错误的部分
|
||||
|
||||
| 元件/路径 | 检查内容 | 结果与限制 |
|
||||
|---|---|---|
|
||||
| PNOR001、PNVO001 固定开度/信号开度 | 两储气腔之间正向、反向流动 | 所有质量、能量收支残差为 0;普通单通道的流向选焓成立 |
|
||||
| PNL00R、临时库 Pipe、Orifice | 正向、反向流动 | 所有质量、能量收支残差为 0;不证明流阻公式与 Amesim 完全相同 |
|
||||
| PNL0001、PNL0002、PNL0003 | 独立进出、两种压差方向,换热模式 | 连同相邻气室的质量、能量守恒;未把多方过程当作绝热内部能量方程检查 |
|
||||
| PNL0001/2/3 环境换热 | 设置非零换热系数,核对内部能量总变化与外部热量 | 去除应有热量后,残差不超过约 1.31e-11 W |
|
||||
| PNL0003 内部连接 | 两半管腔之间质量流、能量流 | 内部交换在两半方程中符号相反,合计抵消 |
|
||||
| 临时库 Tee | 热冷支路同时进出 | 能量残差约 1.14e-12 W;它采用对称混合语义,与 Amesim 两种参考口节点不同 |
|
||||
| PNPL01 | 封闭端 | 质量流为零,不产生气体对流能量流;在上述用例中作为封口参与验证 |
|
||||
| PNRP17 直接连接 PNCH012 | 气体膨胀、受压力、机械动能与环境做功 | 收支平衡;缺陷在经过节点后的传递路径 |
|
||||
| LMECHN1、MECMAS21、FORC、F000 | 四质量刚性连接、外力输入 | 节点力和约 8.88e-16 N;动能变化率与外部输入同为 90 W |
|
||||
| LSTP00A 与质量块 | 接触压缩及阻尼耗散 | 动能变化 −0.599980 W、弹性势能变化 +0.15 W、耗散 +0.449980 W,收支残差为 0 |
|
||||
|
||||
独立流动元件的正反向测试共 18 个,全系统最大质量残差约 **3.23e-16 kg/s**,最大能量残差约 **2.31e-10 W**。这些残差对应几百至数千瓦的流动能量量级,与已确认的百瓦、千瓦漏算明显不同。
|
||||
|
||||
机械摩擦、恢复系数限位、多方模式等没有在本次逐个重新运行完整 Amesim 工况。其特殊过程可能有耗散或隐含热交换,不能要求仅气体内部能量或仅机械动能单独恒定。
|
||||
|
||||
之前确认的高温氦气物性分段遗漏、管流摩擦公式近似、UD00 时间边界缺陷仍然存在,它们属于另一类问题,本次没有修复,也不能因本次守恒测试通过就宣布消失。
|
||||
|
||||
## 4. 为什么现有检查会漏掉这些问题
|
||||
|
||||
1. `core/port_computation.py` 的供需契约包含 p、T、质量流、能量流,但主要检查双方是否声明了对应输入、输出,没有验证生成方程是否真的实现能量收支。
|
||||
2. 容积、容积变化率出现在通用端口定义中,却没有纳入同一套供需契约的检查量,也没有形成通用的跨节点计算路径。
|
||||
3. `systems/network.py:214` 的连接方程清单只收录相等和求和为零的变量。气体比焓的混合规则、容积的定向传递不会在这份清单中成为独立守恒项。它是声明清单,不是运行时数值守恒验收。
|
||||
4. 因此,“端口供需检查通过”“质量流平衡”“C 和旧 Python 结果接近”,都不足以证明能量和做功正确。
|
||||
|
||||
## 5. 建议的修复范围
|
||||
|
||||
- 将带符号的质量流和能量流分别汇总并传递,修复所有合法参考口接收者及节点串联。
|
||||
- 为容积、容积变化率建立实际生成路径,不能只搜索直接连接的活塞。
|
||||
- 在测试中独立检查质量、气体能量、机械功和外部热量/环境功的收支;采用直接连接与经理想节点连接的对照。
|
||||
- 保留普通单支路、动态管内部交换、临时库 Tee 的正确语义,避免对所有端口套用同一种混合规则。
|
||||
|
||||
上述是修复建议,本次没有实施。
|
||||
|
||||
## 6. 证据与复现
|
||||
|
||||
目录:`test/conservation-audit-20260914/`。
|
||||
|
||||
- `audit.py`:独立流阻、管路、节点接收者及活塞路径探针。
|
||||
- `additional.py`:直接多端口气室、环境换热、机械力与功率探针。
|
||||
- `edge_cases.py`:近零净流量和节点串联。
|
||||
- `prepare_ame_volume.py`、`ame-volume/volume-routing.csv`:安装版 Amesim 子模型的容积路径对照。
|
||||
- 每个用例的 `model.c`、`manifest.json`、`probe.json`:生成方程、变量映射、输入状态、导数和输出。
|
||||
- `final-summary.json`、`catalog-inventory.json`:最终统计、逐类覆盖清单。
|
||||
- `production-before.json` 与最终汇总:188 个生产文件开始、结束哈希一致,无本次生产代码改动。
|
||||
|
||||
诊断过程中两个首次尝试受本机编译/进程启动异常影响,重跑后均完成,保留于 `audit.log`、`retry.log`;最终 38 个用例按成功生成的探针结果统计,不将工具链异常计为组件方程问题。原模型文件和此前工作区改动均保留。
|
||||
@@ -0,0 +1,52 @@
|
||||
# 结果分块存储交付与验证
|
||||
|
||||
日期:2026-09-15。
|
||||
|
||||
## 已实现
|
||||
|
||||
- 项目根目录 `simresults/` 保存每次运行的状态块、输出块和清单,默认总配额 1 GiB。通过 `SIMULATION_RESULT_STORAGE_MB` 调整,单位 MiB。
|
||||
- 每块写入前,为状态及未来输出一起预留容量;跨进程锁串行分配配额。优先淘汰最早结束且未被使用的档案;保护活动运行、仍存活的孤儿工作进程和用户额外放入的文件。无法腾出空间时返回部分结果及 `storage-quota`。
|
||||
- 原生采样采用固定大小缓冲和同步批量写入,磁盘慢时等待;无无限增长的异步队列。求解器必要状态及事件定位数据不受影响。
|
||||
- 求解结束后按原有顺序分块计算输出,保留原有数值编码。相同时间戳在块边界仍使用原有后值替换规则。
|
||||
- 正常取消及求解失败补写不满块。CRC32 和提交标记支持识别异常退出后的有效前缀;强制终止时不伪造尚未计算的输出。
|
||||
- Windows/Linux 共用小端 Float64 格式和 64 位偏移;纯代数模型内部占位状态有明确列标记。I/O 错误、配额耗尽和控制进程断开分别报告。
|
||||
|
||||
详细配置、文件格式和行为边界见 [C 后端说明](../../native/README.md#仿真结果分块存储)。本阶段的 Python/HTTP 返回和浏览器仍使用完整结果;按变量、时间范围读取及浏览器按需加载尚未实现。
|
||||
|
||||
## Windows 实际验证
|
||||
|
||||
环境:项目 `.venv-win`,Python 3.12、MinGW GCC 8.1、SUNDIALS 7.4.0。
|
||||
|
||||
专项命令:
|
||||
|
||||
```text
|
||||
python -W error::ResourceWarning -m unittest tests.test_result_storage tests.test_native_sample_storage tests.test_native_result_transport tests.test_native_json_writer tests.test_native_worker_control tests.test_native_solver_control -v
|
||||
```
|
||||
|
||||
结果:38 项,37 通过、1 跳过。跳过的是依赖 Linux `/dev/full` 的真实延迟写入失败测试。新增测试覆盖固定缓冲、跨块同时间替换、负零位模式、完整尾块、纯代数模型、并发容量预留、跨进程保护、旧档案清理、未知文件保护、截断与损坏识别、配额耗尽、I/O 失败及强制终止后的状态块保留。
|
||||
|
||||
数值基线使用改造前保存的 `native-skill-test.xml`(终止时间 0.15 秒,采样间隔 0.0001 秒),与分块版本的 RK45、BDF 分别比较。每种方法均比较 1502 个采样、176 个序列列,共 264,539 个数值及 25 项元数据;原始 Float64 位模式(含负零)、事件样本和求解统计全部一致。
|
||||
|
||||
本地日志和基线位于 Git 忽略目录 `test/chunk-storage/`:`final-regression.log`、`parity-RK45.json`、`parity-BDF.json`。
|
||||
|
||||
## 首次验收未通过项(后续复核见补充报告)
|
||||
|
||||
2026-09-15 后续复核:高级摩擦已经在 9 月 13 日实现;下列第 1 项是过时测试断言,第 2 项是 Windows 时间戳精度造成的测试排序问题,两项均已修正。高级摩擦等 13 个补齐算例已使用分块存储重新检查完整曲线。具体组件、覆盖入口、实际结果及仍未定因的进程问题见 [未完成验收项复核](分块存储未完成验收项复核-2026-09-15.md)。以下保留首次验收的历史结果,不代表组件当前尚未实现。
|
||||
|
||||
首次验收没有宣称全量测试通过:
|
||||
|
||||
1. 机械参数测试 `test_mecmas21_choice_metadata_preserves_amesim_codes` 仍要求“尚未实现”的高级摩擦描述,与当前组件说明不一致。该测试单独复测仍失败;本次未修改机械组件或该断言。
|
||||
2. 扩展回归 34 项中,30 通过、3 项因 Windows 符号链接权限跳过,另有未修改的缓存测试 `test_lock_shards_are_bounded_and_collisions_only_defer_eviction` 失败:`skippedInUse` 期望 1、实际 0;对活动项保留和另一旧项删除的断言已通过。单独运行该缓存测试同样失败。
|
||||
3. 全量发现测试的长进程运行出现 Python 异常退出,退出码 `0xC0000005`,未取得完整汇总。最后执行的 UD00 模型测试另行运行通过;没有据此判定异常退出原因。
|
||||
|
||||
相关日志:`test/chunk-storage/full-regression.log`、`test/chunk-storage/extended-regression.log`。
|
||||
|
||||
## Linux 状态
|
||||
|
||||
已检查 POSIX 文件偏移、文件锁、路径及统一二进制格式,并将新增测试接入现有 `native-linux` CI 作业。本机仅有 Docker Desktop 的 WSL 发行环境且 Docker 服务未运行,未取得实际 Linux 工具链执行结果;Linux 实机验收仍待执行。
|
||||
|
||||
## 项目路径迁移补充验证
|
||||
|
||||
清单的目录引用已改为 `simresults/run-<id>`,相对于项目根目录。读取使用结果 ID 与当前安装位置计算路径,兼容旧清单中的过期绝对目录提示。原生进程执行时接收的绝对路径仍由当前位置即时生成。
|
||||
|
||||
Windows 实际执行 `tests.test_result_storage`、`tests.test_native_sample_storage`、`tests.test_native_result_transport`,23 项全部通过。新增测试将包含存储模块和结果档案的测试项目改名移动到含中文、空格的新目录,确保原目录已不存在,再从无关工作目录启动新 Python 进程;旧块读取与新档案创建均成功。日志为 `test/chunk-storage/relative-path-regression.log`。移动项目需先停止应用,移动后重新启动;未承诺运行中的目录迁移。
|
||||
@@ -0,0 +1,71 @@
|
||||
# 结果存储额度增量优化验证 — 2026-09-15
|
||||
|
||||
## 问题与范围
|
||||
|
||||
原生端每次准备写入状态块时,先通过 `storage-reserve` 申请状态块与后续输出块的合计额度,并同步等待 Python 回复。旧版 `ResultArchive.reserve()` 每次都遍历历史目录、统计大小、读取完整 manifest、检查使用锁和工作进程,再序列化、fsync 并原子替换当前 manifest。因此,块数、历史工程数量和历史清单体积一起放大了求解器的等待时间。
|
||||
|
||||
这里的重复扫描是历史目录和清单的配额检查,并非每块都重新读取历史二进制轨迹做 CRC。结束时的一次完整性扫描仍保留。
|
||||
|
||||
## 修改
|
||||
|
||||
- 使用预先持久化的额度窗口:最大 16 MiB,同时不超过总配额的 1/16;单块需求超过窗口时按实际需求申请。
|
||||
- 窗口内逐块扣减本实例的剩余额度,不访问历史目录、不拿跨进程配额锁、不写 manifest。
|
||||
- 剩余额度不足时,在原有全局锁下只为缺少的部分确保空间,再利用已有空闲空间适量预留。不会为了扩大窗口而额外淘汰历史记录。
|
||||
- 额度先原子持久化、后允许工作进程写入。未消费的额度仍被其他进程计入占用,避免重复分配;发布失败不发放新额度。
|
||||
- 实例内加锁,防止同一归档的并发扣减丢失。结束时归还未使用的窗口额度,关闭后拒绝继续申请。
|
||||
- 原有使用锁、孤儿工作进程保护、未知文件不删除、配额耗尽返回部分结果以及 CRC 校验保持。
|
||||
|
||||
额度窗口只是记账,不会增加同等大小的内存缓冲或预写空文件。历史目录在创建归档及额度补充时仍会扫描,并非完全消除了历史数量的影响;磁盘空间紧张时,窗口缩小,收益也会降低。多个同时运行的工程可能暂时各占用一部分未消费额度,因此窗口设置了上限。本机制是应用内逻辑字节配额,不是操作系统硬配额,也不能防止用户从外部工具额外写入或删除文件。
|
||||
|
||||
不修改二进制格式、采样点、求解算法、求解容差或结果传输格式;不新增数据库、不迁移或清理用户的已有结果。
|
||||
|
||||
## 性能对比方法
|
||||
|
||||
脚本:`tests/manual/benchmark_result_reservations.py`。旧路径仅作为脚本内对照函数保留,生产代码使用新路径。所有历史目录、清单及结果文件都在独立临时目录中生成。使用真实文件系统、锁和 fsync,不模拟 I/O。
|
||||
|
||||
环境:Windows、本机 Python 3.12。每组两轮,下面为算术平均值;运行时间会受系统缓存、磁盘及其他进程影响。额度微基准的清单包含 1,000 个变量,历史文件是只用于目录/大小统计的合成夹具,不是完整真实工程。计时不包含夹具创建、归档初始化和结束扫描,也不包含求解与实际数据块写入。
|
||||
|
||||
| 历史记录数 | 申请负载 | 旧路径耗时 | 新路径耗时 | 检查/清单发布次数(旧 → 新) |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 0 | 256 × 64 KiB | 2.294 秒 | 0.00844 秒 | 256 → 1 |
|
||||
| 100 | 256 × 64 KiB | 52.247 秒 | 0.22886 秒 | 256 → 1 |
|
||||
| 300 | 256 × 64 KiB | 161.104 秒 | 0.57988 秒 | 256 → 1 |
|
||||
| 0 | 64 × 1 MiB | 0.639 秒 | 0.04084 秒 | 64 → 4 |
|
||||
|
||||
以上是额度管理耗时,不可直接解释为整段仿真的提速比例。64 MiB 场景覆盖多次窗口补充。
|
||||
|
||||
### 实际原生仿真对比
|
||||
|
||||
机械质量块连接两个自由端口,RK45,仿真区间 0–1 秒,采样步长 0.00001 秒,共 100,001 点;结果目录内有 300 条合成历史记录。共用同一次编译产物,计时包含归档初始化、工作进程、写块、结果读取和结束校验,不包含编译和历史夹具创建。每种路径两轮。
|
||||
|
||||
| 路径 | 第 1 轮总耗时 | 第 2 轮总耗时 | 平均总耗时 | 平均额度申请耗时 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 逐块全量检查 | 32.077 秒 | 28.035 秒 | 30.056 秒 | 29.085 秒 |
|
||||
| 批量额度 | 1.458 秒 | 1.421 秒 | 1.440 秒 | 0.565 秒 |
|
||||
|
||||
- 每次仿真都有 98 次块额度请求;新路径只补充两次窗口。
|
||||
- 包括初始化在内,目录配额检查由 99 次降至 3 次;包括初始化、工作进程登记和结束在内,清单发布由 101 次降至 5 次。
|
||||
- 四次运行的 `states.bin`、`outputs.bin` SHA-256 完全一致,返回的每个采样值也完全一致,CRC 检查通过。
|
||||
- 这是一组求解计算较轻、便于暴露存储等待的模型,不代表所有复杂工程都能获得约 95% 的总耗时降幅。本次没有改动求解器的数学计算路径。
|
||||
|
||||
复现:
|
||||
|
||||
```powershell
|
||||
py -3.12 -m tests.manual.benchmark_result_reservations --native
|
||||
py -3.12 -m tests.manual.benchmark_result_reservations --histories 0 --requests 64 --block-kib 1024 --repeats 2
|
||||
```
|
||||
|
||||
## 正确性回归
|
||||
|
||||
新增窗口快速路径无文件系统操作、跨窗口只申请差额、临近配额不额外淘汰、发布失败回滚、八线程并发扣减、关闭后拒绝申请、结束归还额度、跨进程未消费额度保护、申请失败后仍可写入更小尾块等回归。
|
||||
|
||||
原生测试同时覆盖 RK45/BDF、多块及尾块、所有输出的 binary64 位一致性、负零、取消、强制终止、配额耗尽和存储 I/O 失败。
|
||||
|
||||
使用项目已有 `.venv-win` 完整依赖环境运行:
|
||||
|
||||
```powershell
|
||||
$env:SIMULATION_NATIVE_REQUIRE_TOOLCHAIN='1'
|
||||
./.venv-win/Scripts/python.exe -m unittest tests.test_result_storage tests.test_native_sample_storage tests.test_native_cache_storage tests.test_native_result_transport tests.test_result_csv_export -v
|
||||
```
|
||||
|
||||
共 56 项,53 项通过,3 项因 Windows 缺少创建符号链接的权限而跳过;没有失败。传输流、取消后的部分结果和 CSV 导出契约也通过。单独使用系统 Python 跑后两组时缺少 FastAPI,随后已切换上述项目环境完成全部五组验证,未安装或更改依赖。Python 语法检查通过。
|
||||
@@ -0,0 +1,100 @@
|
||||
# 节点修复后:同一 Amesim 文件、相同输入的曲线对比
|
||||
|
||||
## 结论
|
||||
|
||||
本次已重新运行当前八支路 `tests/data/test_mql.ame` 及其平台对应模型,比较 **Amesim、平台修复前、平台修复后** 三组结果。每组比较 238 条曲线,包含压力、温度、节点参考端焓流/质量流、气室容积/质量/容积功率、活塞容积/变化率、机械位移/速度、接触力和信号。
|
||||
|
||||
**节点焓流修复使主要差异显著下降,但不能宣布所有结果完全一致。** 在 0–0.15 s、0.1 ms 采样下,最大温差由 124.930 K 降至 1.175 K,最大压差由 267.642 kPa 降至 13.607 kPa,最大节点焓流差由 1.459 MW 降至 51.183 kW。收紧双方误差限后,剩余差异仍然存在。
|
||||
|
||||
气室容积和做功也已比较到纳秒采样尺度。但该文件的活塞直接连接 PNCH012,且预设 `dvol1..4` 均为零,因此这些曲线验证了直接连接的动态容积行为,**不能单独证明“活塞经节点传递容积”及“非零预设 dvol 积分”两种工况的修复**;后两者的依据仍是上一轮专项回归。
|
||||
|
||||
## 1. 同一模型与输入一致性
|
||||
|
||||
来源为用户工作区中的当前文件;本次没有改动原文件:
|
||||
|
||||
| 文件 | SHA-256 |
|
||||
| --- | --- |
|
||||
| `tests/data/test_mql.ame` | `251b2f17c24ea02c1ab48f9f441a0ec38e7920627ea7e6870392326424a517c5` |
|
||||
| `tests/data/test-mql-8-corrected.json` | `60ed16c71b72be4ae71ca7980f4f8cdcdf6b4c4c4c8950863c2390960b71ced4` |
|
||||
|
||||
使用已有图纸审计器重新核查类型、拓扑和逐端口连接,映射不按曲线拟合选择。结果:
|
||||
|
||||
- 157 个元件、178 条连接、1,092 项公开参数一致,参数变更数与连接变更数均为 0。
|
||||
- 1,015 项图纸参数与归档内实际 `.param`/`.data` 运行参数交叉核验通过。
|
||||
- 所比较的初始压力最大差 `1.92e-7 Pa`、初始温度最大差 `3.64e-12 K`;气室容积/质量、机械位移/速度的初值差为 0。
|
||||
- 原文件的两个 UD00 保持**非循环**,没有沿用之前循环实验的修改。
|
||||
|
||||
审计记录:[原始输入审计](F:/Master/SystemSimulationApp/test/node-fixes-amesim-20260914/audit/audit.json)、[最终 AME 与平台副本的参数及时间设置审计](F:/Master/SystemSimulationApp/test/node-fixes-amesim-20260914/full/aligned-audit/audit.json)。
|
||||
|
||||
## 2. 运行方式与采样
|
||||
|
||||
Amesim 端从同一 `.ame` 归档提取其生成的程序和运行输入,重新执行原生程序,未复用归档中的旧结果。`.cir`、`.param`、`.data`、`.state`、生成 C 和 EXE 在提取后均与源归档逐字节核对;只调整副本 `.sim` 前五个已知运行设置。所有 Amesim 运行均正常结束。
|
||||
|
||||
平台通过对应 JSON→XML→网络→原生 C 编译与执行路径运行。修复前基线在隔离模块中加载 Git HEAD 中修复前的扩展生成器;两组使用同样的输入、当前物性内核和当前求解器,仅改变本轮节点/容积生成逻辑,没有覆盖生产代码。基线提交和源码哈希见 [manifest.json](F:/Master/SystemSimulationApp/test/node-fixes-amesim-20260914/manifest.json)。
|
||||
|
||||
| 比较区间 | 两端输出间隔 | 两端误差限数值 | 用途 |
|
||||
| --- | --- | --- | --- |
|
||||
| 0–50 s | 0.01 s | 1e-8 | 完整运行,5,001 个共同网格点 |
|
||||
| 0–0.15 s | 0.0001 s | 1e-8 | 启动阶段,1,501 点 |
|
||||
| 0–0.15 s | 0.0001 s | 1e-10 | 剩余差异的容差敏感性检查 |
|
||||
| 0–2 μs | 2 ns | 1e-10 | 捕捉快速压缩与体积功率,1,001 点 |
|
||||
|
||||
所有区间均从同一初值重新开始,不接续已有状态;最大积分步长均为 `1e30 s`。Amesim 保留源文件其他积分选项,平台使用 CVODE BDF。误差限数字一致不代表两套积分器的内部误差权重和算法完全相同。
|
||||
|
||||
曲线在共同时间网格上线性插值,没有调整时间轴拟合、改变物理参数、交换元件或任意翻转符号。Amesim 表压加 101300 Pa 转为绝对压力,g/g/s 转 kg/kg/s,cm³ 转 m³,L/min 转 m³/s。节点参考端质量流和焓流统一取**送入参考侧储气元件为正**,对应 Amesim 的 `dm2`/`dh2`。
|
||||
|
||||
所有“最大差”均指所注明网格上的最大差,不是未采样时刻的连续时间全局极值;更密集启动采样得到的最大差必须同时报告。
|
||||
|
||||
## 3. 焓流修复的曲线效果
|
||||
|
||||
下表每一列取对应物理量的全部已映射曲线中的最大绝对差,最差元件可能随修复变化。
|
||||
|
||||
| 物理量 | 0–50 s 修复前 | 0–50 s 修复后 | 0–0.15 s 细采样修复前 | 0–0.15 s 细采样修复后 |
|
||||
| --- | ---: | ---: | ---: | ---: |
|
||||
| 压力 | 163.286 kPa | 0.07165 kPa | 267.642 kPa | **13.607 kPa** |
|
||||
| 温度 | 105.215 K | 0.35581 K | 124.930 K | **1.17465 K** |
|
||||
| 节点参考端焓流 | 8.007 kW | 0.02481 kW | 1,459.272 kW | **51.183 kW** |
|
||||
| 接触力 | 5,128.545 N | 2.243 N | 8,347.077 N | **150.358 N** |
|
||||
|
||||
细采样中,修复后最大压差出现在 `PNL0001_14.p` 的 0.0001 s,约为该曲线参考峰值的 0.0384%;最大温差出现在 `PNL0001_14.T` 的同一时刻,约为参考峰值的 0.0160%;最大焓流差出现在 `P4NODE2_2` 的 0.0002 s,约为参考峰值的 0.0370%。这些是按参考曲线峰值归一化的差值,不是逐点相对误差。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## 4. PNCH012 容积与体积功率
|
||||
|
||||
原模型的载荷信号包含 `1e17 N`,气室迅速被压缩到容积下限。对第 15 个 PNCH012,初始有效容积 15 L,Amesim 与平台在 **32 ns 的首个命中下限采样点**都达到 0.15 L。普通 0.1 ms/0.01 s 采样已经错过压缩过程,因此不能用后续恒定容积和零功率曲线作为完整验证。
|
||||
|
||||
补充 0–2 μs、2 ns 采样后:
|
||||
|
||||
- 八个气室容积最大差为 `1.716e-13 m³`。
|
||||
- 气室容积功率最大差约 `5.307e5 W`;对应参考峰值约 `1.109e13 W`,归一化最大差约 `4.786e-6%`。
|
||||
- 两边均在容积受下限限制后把有效变化率置零,并停止该容积做功项。
|
||||
|
||||
Amesim 的总有效 `dvol` 不是直接保存变量,本次按原 PNCH012 子模型规则,从保存的活塞/节点输入求和,并包含容积下限条件,再计算 `-p_abs*dvol`。直接用原始活塞变化率而忽略气室下限,会人为算出 Amesim 气室实际没有施加的巨大做功;本报告没有采用那种计算。
|
||||
|
||||

|
||||
|
||||
这一快速压缩阶段修复前后基本相同,是因为该文件的活塞均直接连接气室,且该阶段未显著触发本轮混合支路焓流缺陷。不能把这张图当作经节点传递容积或非零预设变化率的专项验证。
|
||||
|
||||
## 5. 仍存在的差异与判断边界
|
||||
|
||||
把启动实验双方误差限从 `1e-8` 收紧到 `1e-10` 后,修复后的最大压差仍约 13.459 kPa,最大温差约 1.185 K,最大节点焓流差约 51.078 kW,最大接触力差约 148.477 N。剩余差异没有随容差收紧而明显消失,因此不能将其全部归结为普通积分容差;本次没有进一步修改物性或管阻公式来拟合 Amesim。
|
||||
|
||||
自由质量块 #9 在原文件中无限位且受巨大载荷,50 s 位移约 `3.968e16 m`。修复后该曲线最大绝对差约 `4.062e6 m`,按该曲线峰值归一化约 `1.024e-8%`。该量必须报告其尺度,不能把绝对数值当作正常毫米级行程的误差,也不能省略它而宣称所有机械量绝对误差都很小。
|
||||
|
||||
本次结论是:**相同物理输入下,修复确实消除了主要节点能量遗漏,整段结果明显接近 Amesim;仍有小幅差异,尚未在本次实验中完成逐项归因。** 原模型未覆盖的两种容积工况仍应以专项测试或另建 Amesim 专项模型验证。
|
||||
|
||||
## 6. 可复现产物
|
||||
|
||||
- [包含本次 50 秒结果和运行设置的 Amesim 副本](F:/Master/SystemSimulationApp/test/node-fixes-amesim-20260914/full/test_mql.ame)
|
||||
- [同参数的平台 JSON 副本](F:/Master/SystemSimulationApp/test/node-fixes-amesim-20260914/full/platform.json)
|
||||
- [238 条曲线映射及单位换算](F:/Master/SystemSimulationApp/test/node-fixes-amesim-20260914/curve-mapping.json)
|
||||
- [全部区间误差统计](F:/Master/SystemSimulationApp/test/node-fixes-amesim-20260914/comparison-summary.json)
|
||||
- [全程三组曲线 CSV](F:/Master/SystemSimulationApp/test/node-fixes-amesim-20260914/full/curves.csv)
|
||||
- [启动细采样三组曲线 CSV](F:/Master/SystemSimulationApp/test/node-fixes-amesim-20260914/startup/curves.csv)
|
||||
- [容积快速压缩三组曲线 CSV](F:/Master/SystemSimulationApp/test/node-fixes-amesim-20260914/volume-startup/curves.csv)
|
||||
- [运行脚本](F:/Master/SystemSimulationApp/test/node-fixes-amesim-20260914/run_comparison.py)、[分析脚本](F:/Master/SystemSimulationApp/test/node-fixes-amesim-20260914/analyze.py)、[绘图脚本](F:/Master/SystemSimulationApp/test/node-fixes-amesim-20260914/plot.py)
|
||||
|
||||
原始 Amesim 结果保存在各区间的 `amesim/test_mql_.results`,平台原始结果保存在 `before/result.json` 和 `after/result.json`。运行日志、参数审计、输入与输出哈希均保留在同一实验目录。本次没有修改生产代码或源 AME/JSON。
|
||||
@@ -0,0 +1,57 @@
|
||||
# 节点焓流与 PNCH012 容积修复
|
||||
|
||||
## 复核结论
|
||||
|
||||
用户报告的两类现象均已复现,具体包含三个缺陷:
|
||||
|
||||
1. PN3NODE2/P4NODE2 的参考口用净质量流量和比焓表示支路汇总能量,无法表示“净质量流量为零、净焓流非零”。接收储气元件又在净流出时使用自身比焓,覆盖了节点带来的混合支路能量;原参考比焓算法的小流量平滑还会引入守恒偏差。
|
||||
2. PNCH012 只搜索直接连接的 PNRP17,漏掉经过节点传来的活塞容积和变化率。因此气室状态所用容积和 `-p*dV/dt` 做功一起出错。
|
||||
3. 两条 C 生成路径都把 PNCH012 的 `dvol1..4` 参数用于做功,却没有积分它们对应的预设容积,导致容积输出保持不变。
|
||||
|
||||
需要区分原模型与本平台参数的含义:安装版 Amesim 的 PNCH012 接收独立的外部 `vol` 和 `dvol` 输入,原子模型本身并不替输入提供者积分。本平台把这些输入暴露为常数参数后,本次明确约定 `vol1..4` 为仿真开始时的初始预设容积,`dvol1..4` 为对应的恒定变化率。PNCH023 没有这些参数,本条变化率修复针对 PNCH012。
|
||||
|
||||
## 实现
|
||||
|
||||
- 在扩展生成器中按节点支路到参考口的方向排序,先计算子节点,再计算父节点;焓流以带符号的功率直接求和并送入接收储气元件,不再从汇总净流量反推能量。支路流出的比焓仍取参考端提供的温度对应值。
|
||||
- 同一方向关系用于追踪活塞容积来源,覆盖直接连接、两类节点、多活塞和节点串联。初始气体质量/内能使用完整初始容积计算。
|
||||
- 两条生成路径仅对非零预设变化率之和增加 `_volume_displacement` 状态,从仿真起点积分;活塞的实时几何容积直接叠加,不重复积分。
|
||||
- 总容积低于 `cvol0/100` 时钳位并停止容积做功;恰好在下限且向外膨胀时保留正变化率。
|
||||
- 登记新增状态和节点能量表达式的 Jacobian 依赖,容积积分状态使用 `1e-14 m³` 绝对误差下限;补充参数说明,保留已有模型版本以兼容保存的 XML。原生缓存根据生成源码内容重新构建。
|
||||
|
||||
节点参考端的 `h_outflow` 仍是有限比焓诊断值;在零净质量流量条件下,不能用它乘净流量来重建实际传递的焓流。实际能量方程使用独立的带符号焓流汇总。
|
||||
|
||||
主要代码:
|
||||
|
||||
- `app/simulation/native_codegen/extended.py`:定向节点汇总、完整容积初始化、接收端能量方程、容积积分。
|
||||
- `app/simulation/native_codegen/compiler.py`:紧凑生成路径的容积积分与下限处理。
|
||||
- `app/simulation/native_codegen/tolerances.py`:新增容积状态误差下限。
|
||||
- `app/simulation/components/amesim/storage/chambers.py`、`junctions/nodes.py`:行为说明。
|
||||
- `tests/test_native_node_conservation.py`:守恒和动态容积回归。
|
||||
|
||||
## 数值证据
|
||||
|
||||
理想空气探针:节点参考气室初始压力 200000 Pa、温度 400 K;两支路储气室温度为 700 K 和 300 K,经流阻连接。两侧压力调整至支路质量流量大小相等、方向相反。
|
||||
|
||||
| 量 | 修复前 | 修复后 |
|
||||
| --- | ---: | ---: |
|
||||
| 参考口净质量流量 | 约 0 kg/s | −5.42×10⁻²⁰ kg/s |
|
||||
| 气室接收净焓流 | 约 0 W | 95.3426714541 W |
|
||||
| 系统总内能变化率残差 | 约 −95.3426714541 W | 0 W |
|
||||
|
||||
另三组探针覆盖参考口净流入、净流出和接近零流量;修复后的系统能量残差绝对值不超过 `7.11e-15 W`。数值输出保存在 `test/node-fixes-evidence.json`。
|
||||
|
||||
双活塞探针中,气室基础与预设容积合计 0.011 m³,每个活塞直径 0.1 m、初始腔长 0.2 m。经过节点时,修复前气室容积为 0.011 m³,修复后为正确的 0.014141592653589793 m³,与直接连接一致。
|
||||
|
||||
预设变化率探针从 `t_start=5 s` 开始,初始容积 0.013 m³,变化率为 ±0.002 m³/s。修复前容积恒定,修复后满足 `V=0.013±0.002*(t-5)`。扩展路径另用理想气体绝热关系 `p*V^γ=常数` 和 `T*V^(γ-1)=常数` 验证能量与容积变化一致。
|
||||
|
||||
## 验证范围与既有问题
|
||||
|
||||
专项测试覆盖两类节点、六类储气接收元件、正反向与停滞流向组合、零净流量、极小流量、节点串联及反序生成、双活塞、非零起始时间、容积下限,以及 RK45/BDF 两种积分器。首次修复前运行的五项测试产生 55 个失败子用例;修复后扩展到七项测试并全部通过。
|
||||
|
||||
安装版语义依据:`F:/AMESim2404/Amesim/libpn/submodels/PN3NODE2.c` 第 21–32 行、`P4NODE2.c` 的对应宏说明,均定义支路焓流、容积及变化率向参考口求和;`F:/AMESim2404/Amesim/libpcd/submodels/PNCH012.c` 第 314–329 行分别求和外部容积与变化率,并处理容积下限。
|
||||
|
||||
既有 `tests.test_native_jacobian_structure.NativeJacobianProbeTests` 无法进入计算:夹具 `tests/fixtures/native-jacobian-cache-state.json` 要求输入 SHA-256 为 `670977be…`,而 `tests/data/test-mql-8-corrected.json` 的工作区与 Git HEAD 都是 `60ed16c7…`。本次未修改这两个文件,也未覆盖该校验;同模块的结构依赖测试另行执行。
|
||||
|
||||
原生进程在一次中间回归中返回空输出,编译器也出现过启动重试;已批量执行流向探针并重跑验收。修复前、中间及最终测试日志分别保存在 `test/node-fixes-before.log`、`test/node-fixes-after.log`、`test/node-fixes-final.log`、`test/node-fixes-acceptance.log`。
|
||||
|
||||
最终组合验收执行 68 项测试(265.185 s),其中 67 项直接通过,包括七项专项测试、旧 XML/API、组件元数据、计算调度、Jacobian 结构依赖和当前八支路模型的完整保存配置。唯一错误是旧目录基准第 6 个网络的 `--init` 进程返回空输出;该网络由 PNCH023、PNL0002 和堵头组成。随后保留原始基准内容单独重跑该失败网络,通过两条编译入口的原有初值、输出和导数断言,耗时 5.212 s,日志为 `test/node-fixes-catalog-retry.log`。以上不包含因既有哈希不匹配而无法启动的 Jacobian 固定状态测试类。
|
||||
Reference in new issue
Block a user