高温氦气物性补全;三通四通能量计算bug修正

This commit is contained in:
ljz committed 2026-09-15 17:57:20 +08:00
1 parent 6fc9afe41d
commit 2b07d996cf
133 files changed
+5230 -253310

No files matched your search

+32 -1
View File
@@ -34,6 +34,29 @@ bash bat/setup-native-linux.sh
原生运行库已在本机 GCC 8.1 / SUNDIALS 7.4.0 验证。构建需要对应 C 头文件、导入库和 DLL,单纯安装 Python 包不能代替这些文件。构建器根据环境变量或当前 Python 基础环境查找 SUNDIALS,根据环境变量或 PATH 查找 GCC。
## 仿真结果分块存储
网页和 Python 原生运行入口将采样结果写入项目根目录的 `simresults/run-<id>/`,不依赖启动时的工作目录。每次运行保存 `manifest.json`、`states.bin` 与 `outputs.bin`;纯求解(`--solve-only`)不创建结果档案。此目录已加入 Git 忽略。
清单和返回诊断中的 `directory` 为相对项目根目录的 `simresults/run-<id>`,统一使用 `/`,`directoryBase` 为 `project`。读取时使用 `result_storage.result_archive_path(id)` 根据当前代码位置定位;旧清单中的绝对目录提示不参与定位。停止应用、移动或复制整个项目(保留 `simresults`)、重新启动后,结果随项目迁移。运行中传给原生进程的绝对路径由当前目录重新计算,不固定盘符或机器路径;不支持运行过程中移动项目目录。
- **容量**:默认 1 GiB(1,073,741,824 字节),通过后端环境变量 `SIMULATION_RESULT_STORAGE_MB` 配置,单位 MiB,必须是正整数。例如 PowerShell 使用 `$env:SIMULATION_RESULT_STORAGE_MB = '1024'`,Linux 使用 `export SIMULATION_RESULT_STORAGE_MB=1024`。按文件逻辑字节计量,不包含文件系统分配单元的额外开销。
- **自动清理**:写每个采样块前,为状态块及其未来输出块一起预留空间。总配额涵盖所有结果档案和元数据;空间不足时依次删除最早结束的非活动档案(异常退出且未结束的档案按创建时间排序)。跨进程锁保护配额分配和正在使用的档案。符号链接、目录联接及用户另外放入的文件不会被自动删除;这些内容仍计入目录用量。活动档案、孤儿但仍存活的工作进程被保留。旧结果属于可淘汰历史,需要长期保留的结果应导出另存。
- **空间仍不足**:停止采样并报告 `storage-quota`,保留此前完整提交的块,不删除当前运行的数据,不悄悄丢样后继续报告成功。结果诊断 `native.resultStorage` 分别记录求解状态、状态/输出样本数、已存储到的时间及有效字节数;已存储时间可能早于求解器最终到达时间。
- **有限缓冲与背压**:采样缓冲最多 1024 行,按状态和输出列数进一步限制到约 1 MiB(单行更大时至少容纳一行)。缓冲写满后复用;采用同步批量写入,磁盘慢时求解线程等待,没有无限增长的异步写入队列。求解结束后逐块计算和写入输出,再分块生成兼容 JSON,原生工作进程不分配完整历史状态或输出数组。
- **数值隔离**:只替换结果记录缓冲,保留 RK45/CVODE 当前状态、稠密输出和事件定位数据。输出计算维持原先的结束后顺序,避免在求解过程中改变模型缓存。相同时间戳沿用原有“后值替换前值”规则,包括块边界。
- **取消与异常**:正常取消、求解失败会补写最后一个不满的块。每块具有 CRC32 校验和提交标记;强制终止后可通过 `result_storage.scan_blocks` 扫描完整前缀,截断尾块和损坏块不计为有效样本。强制终止时尚未计算的输出不会被伪造,已有状态块仍保留。元数据通过临时文件替换发布;块完成执行 `fflush`,不逐块强制物理落盘,因此这不是断电零丢失承诺。
块格式为 `SIMBLK01` + 四个小端 uint64(块序号、行数、列数、CRC32)+ 按列连续的小端 Float64 数据 + `COMMIT01`;每个块的第一列是时间。各文件的完整列顺序由清单的 `metadata.stateColumns`、`metadata.outputColumns` 指定;纯代数模型内部占位状态以 `null` 标记。公开状态和变量元数据仍保存在 `metadata.stateKeys`、`metadata.variables`。Windows/Linux 共用格式和 64 位文件偏移。
本阶段保留现有完整 JSON 传输和浏览器加载契约:后端返回结果和浏览器显示时仍可能加载完整数据。变量/时间范围查询和浏览器按需加载属于后续阶段;现有百万采样点保护仍保留。
回归入口(Windows 和 Linux 使用各自的 Python 环境):
```text
python -W error::ResourceWarning -m unittest tests.test_result_storage tests.test_native_sample_storage tests.test_native_result_transport tests.test_native_worker_control -v
```
## 独立生成与运行
```powershell
@@ -50,7 +73,15 @@ test/native-v1/example-run/program/model.exe --method RK45 --start 0 --stop 10 -
EXE 不需要 Python、SciPy、XML 或原工程文件。DLL 需要与 EXE 一同保留。默认运行设置是 RK45、0–10 s、最大步长 0.001 s;按需要传入运行选项。
`--solve-only` 关闭轨迹采样,只输出最终状态与诊断。`solveSeconds` 是程序内部数值求解墙钟时间,包含求解必需的 RHS 和事件定位,排除模型初始化、结果投影和文件写入;`processWallSeconds` 另含进程启动与结果处理。预热一次后报告三次求解的中位数。
`--solve-only` 关闭轨迹采样,只输出最终状态与诊断。`solveSeconds` 是程序内部数值求解墙钟时间,包含求解必需的 RHS 和事件定位,排除模型初始化、求解结束后的结果投影与 JSON 写入;启用采样时包含积分期间分块写盘及等待配额的时间。`processWallSeconds` 另含进程启动与结果处理。预热一次后报告三次求解的中位数。
## 求解器外层终止行为
BDF 外层仅在 CVODE 返回负错误码、返回非法时间/状态或触发取消、实际超时及资源保护时结束。成功返回但时间暂时未变时保留求解器历史继续调用,不以重复次数判失败,也不人为推进时间或重启来跳过该段。持续不推进沿用当前整次求解的墙钟时限;默认 300 秒,Python 进程监控另有 5 秒退出宽限。用户取消后,进程仍不响应且被强制结束时返回取消状态,并明确没有完整结果文件,只保留最后一次进度报告。
独立结果的 `solverControl`(网页位于 `diagnostics.native.solverControl`)记录终止原因、操作、CVODE 返回码、同时间返回次数和最长连续次数,以及最后的内部时间与步长。CVODE 数值诊断仅用于 BDF。正常返回的 `1` 表示到达指定停止边界;非有限诊断数值写为 JSON `null`。取消/超时的原因不会被随后产生的 CVODE 回调错误覆盖。强制取消没有可信轨迹时,`series`/`final` 为空,未知求解统计不填零,`statisticsComplete=false`。
原八路 10.8 秒退出问题的对照复现、50 秒完成验证及异常分支测试见 [封装修复验收报告](../docs/other/求解器外层提前终止修复与验收-2026-09-14.md)。专项回归:`python -m unittest tests.test_native_solver_control tests.test_native_worker_control -v`。
## 雅可比分组差分与诊断