8.7 KiB
分块存储未完成验收项复核
日期:2026-09-15。复核对象:结果分块存储验证报告。
结论
原报告的“全量未通过”表示测试套件未全部完成,不表示高级摩擦尚未实现。MECMAS21 静摩擦保持、高级摩擦和 Stribeck 已在 9 月 13 日补齐;LSTP00A 几何接触/零剪切模量、PNL 多方指数范围与两半独立换热也有相应实现和 Amesim 对照。当时的功能补齐报告与当前源代码一致。
本次没有修改组件物理方程或放宽已有数值断言。修正了过时的元数据测试、依赖纳秒级文件时间戳的缓存测试,并为原有摩擦回归增加跨块完整性检查。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 类有连接/执行行为的组件,另两类介质通过气体注册与介质选择使用。覆盖清单。
缓存失败的可复现原因
测试原先给两个目录设置 1000000001 ns 和 1000000002 ns 的 mtime。本机 Windows 实际读回均为 1000000000 ns,导致排序从预期的年龄顺序变为键名顺序:先删除另一目录就已满足配额,因此 skippedInUse 为 0。锁保护目录保留、另一目录删除两项断言仍然通过,符合原报告现象。
已改为相隔 1 秒的年龄,并增加两个前置断言:碰撞项确实较旧,且其独占锁确实被另一个共享租约阻止。原来的 skippedInUse == 1 断言保留并通过,没有修改生产缓存的统计或淘汰逻辑。原始时间戳证据。元数据与缓存合计 31 项:28 通过,3 项因本机无符号链接权限而跳过。日志。
分块后的完整曲线复核
重新运行当前平台 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²。完整最大差保留在结果中,仅这两条曲线另外列出“除该已知切换点外”的误差;没有删除原始点或将两版宣称为逐点相同。
完整对照统计、执行日志、复现脚本。另外,持久化的 tests/test_native_friction.py 已增加状态/输出跨块检查,8 个冻结算例、10 次积分(其中两例覆盖 RK45/BDF)通过;原有乱序回放检查保留。专项日志。
本次组件回归汇总
采用分模块独立 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,但不能将其标记为已修复。
汇总、逐模块结果、PNCH012 诊断复跑、UD00 日志、目录回归日志。这些是组件及相关存储问题的本次专项复核,不是整个仓库全部测试的一次性全绿声明。
仍需区分的边界
- “全量曲线”仅指上述 13 个既定算例的全部常规采样点,不是 27 类组件任意参数和任意连接组合的穷举验证。
- 多质量刚性同速组的欠定静摩擦反力分配,仍不在这 13 个 Amesim 对照算例的逐元件验证范围内。
- 本机符号链接权限相关用例、Linux 实机验收仍未补足,不能记作通过。
- 原全量 Python 进程
0xC0000005的根因仍未由现有日志确定。分模块运行和重试通过只能确认相应用例本次能够完成,不能证明历史异常的根因已修复。