Files
SystemSimulationApp/docs/other/LSTP主路接入与八路力差定位-2026-09-17.md
T
ljz 7611f13208 修复循环信号与事件采样并接入 LSTP 接触定位,补充八路验证及复用实验
相较上一版 Jacobian 确定性复用更新,本次补齐事件边界一致性、结果两侧采样及接触事件定位;保留已有物性复用和组件力学公式。

- 统一 UD00 信号求值与下一事件查询的绝对时间边界,修复循环边界浮点舍入导致的阶段错位、重复或漏报,并覆盖零时长、多阶段及长周期场景。
- 引入原生输出语义 v2:保留规则网格真实时间,补充内部时间事件和状态事件的左邻及事件后采样,按保存时间、状态和离散模式重放结果。
- 两条代码生成路径均发出 LSTP 接触描述,默认定位间隙过零及非负力模式的力截断;仅在接受事件时更新防重复记录,增加 contactEvents 诊断计数。
- 补充 MASS/LSTP 独立事件实验、八路全曲线与驱动阶段配对评估,以及 Amesim 不连续点输出对照和力差定位报告;MASS 新增释放机制仍保留为独立实验。
- 保存局部 probe、context 访问与回退、shadow replay、R288 real skip/typed replay 及阀门数值尾部诊断工具和报告;未证明净收益的实验不启用为生产默认优化。
- 更新原生运行说明和元件建模规范,补充信号边界、输出语义、接触事件和实验依赖回归测试。

验证:五组专项回归共 34 项全部通过;37 个待提交 Python 文件语法检查通过;git diff --cached --check 通过。
2026-09-17 23:50:13 +08:00

152 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# LSTP 主路接入与八路力差定位
日期:2026-09-17。参照:本机 Amesim 2404、当前循环八路归档及上轮已审计的非循环归档。
## 1. 结论
**LSTP 事件已接入平台默认原生求解流程。循环、非循环八路的 238 条比较曲线均与上一轮“仅 LSTP”独立实验逐值相同,生成的原 RHS、雅可比结构和求解计数保持一致。MASS 的新增释放检查未合入。**
此前循环八路约 **128.55 万 N** 的最大力差,主要来自事件附近的保存时刻差异:平台配对点尚在驱动跳变边界,Amesim 普通输出点已经向前演化约 **2.20 ps**。两边驱动值相同,但连续速度已经不同,`1e11 N/(m/s)` 的阻尼将这个速度差放大。
在 Amesim 副本中只开启 **Discontinuities printout(不连续点输出)** 后,沿用原有共同网格及同驱动阶段配对,循环八路最大力差降为 **1.312403 N**,力的相对差超过 5% 的样本归零。平台没有再次改变积分结果,Amesim 原有所有样本也逐值不变,只新增了事件保存点。
另一个约 **−2.084e14 N** 的原始力峰,在 Amesim 的事件输出中同样存在,来自理想硬限位碰撞后的速度重置与大阻尼。这是当前参照工况本身产生的瞬态量级,不能直接当成平台独有的数值误差。
## 2. 默认流程改动及验证
- 两条生成路径均发出 `NativeContact` 描述,直接引用两端质量组的速度/位移状态,涵盖数值/几何刚度模式。
- 默认定位 LSTP 间隙过零;非负力模式还定位接触区内原始力过零。允许负力的模式不新增力截断事件。
- 沿用已测试的接受步密集插值、二分定位及相对速度换向分段检查。接触事件不重置位置或速度,不额外调用整模型 RHS。
- 防重复记录只在事件接受时更新,不参与力、雅可比或输出重放。保留已有输出语义 v2;结果增加 `contactEvents` 诊断计数。
- 两条生成路径原有间隙表达式的浮点运算顺序分别保留。移除新增常量描述表后,生成的 C 源码 SHA-256 与上轮原模型相同;雅可比仍为 132 状态、27 色和原物性复用方案。
实现:[事件描述](../../app/simulation/native_codegen/contacts.py)、[公共事件处理](../../native/runtime/common.c)、[接触定位](../../native/runtime/contact_events.h)、[组件接入规范 12.3](../standard/component-model-authoring-spec-v1.md#123-lstp-接触状态事件)。已有 LSTP 实例自动生效,无需工程 JSON 另加事件开关。
| 主路复测 | 循环 | 非循环 |
| --- | ---: | ---: |
| 与独立 LSTP 实验的全部比较数组 | 完全相同 | 完全相同 |
| 接受步 | 16,934 | 9,980 |
| RHS 求值 | 81,067 | 54,412 |
| 求解器启动 | 21 | 6 |
| 新增 LSTP 接触事件 | 8,同一时刻合并重启一次 | 8,同一时刻合并重启一次 |
| 接触力截断事件 | 0 | 0 |
| 同阶段配对 | 5,001/5,001 | 5,001/5,001 |
本轮未重新做五次性能测量,不将单次秒数解释为新性能变化;积分计数与上一轮独立实验一致。上轮性能结论见[MASS/LSTP 独立报告](MASS与LSTP事件独立实验及八路对比-2026-09-17.md)。
验证覆盖解析碰撞、守恒、两个最大步长、BDF/RK45、几何刚度、指数阻尼、力截断、同号间隙的中间接触/脱离、切触、无事件轨迹不变、事件输出及纯求解一致性,以及原有摩擦、硬限位和雅可比结构。
8 项 LSTP 专项及相关输出/信号、摩擦/结构回归合计 **27 个不同测试方法通过**。最初 Amesim 参考回路测试误用 2 ms 采样,参考含 1 ms 点,产生插值误差;恢复到参考的 1 ms 采样后原公差通过,没有放宽断言。另保留旧独立实验工具的兼容处理:使用新运行库时关闭主路接触注册,避免与实验事件重复执行。
测试日志:[LSTP 首批](../../test/lstp-mainline-unit.log)、[参考回路复测及输出/信号回归](../../test/lstp-mainline-regression.log)、[摩擦与结构](../../test/lstp-mainline-friction-structure.log)、[几何刚度](../../test/lstp-mainline-geometry.log)。八路原始结果:[主路汇总](../../test/lstp-mainline-20260917/baseline-summary.json)。
另有 1 项旧独立实验入口在新运行库上的[兼容回归](../../test/lstp-mainline-experiment-compatibility.log)通过;最终源码/结果隔离核验见[检查记录](../../test/lstp-mainline-20260917/final-verification.json)。
## 3. 将 32.4 s 的力差拆开
以第 2 路为例,接触力为:
`F = K*p + R*(1-exp(-p/Pdis))*(v_branch-v_common)`。
此时穿透约 4.6866 μm,`Pdis=0.1 μm`,阻尼系数已基本达到 `R=1e11 N/(m/s)`。由两侧保存的间隙和速度分别重建接触力,均与各自输出完全一致。
| 原普通输出的配对量 | 平台 | Amesim |
| --- | ---: | ---: |
| 实际时间,s | 32.400000000000006 | 32.40000000000221 |
| 公共质量块速度,m/s | 0 | −1.2883209101e-5 |
| 第 2 路相对速度,m/s | −3.3024983e-12 | 1.2854894891e-5 |
| 弹性力,N | 468,662.995301 | 468,662.655106 |
| 阻尼力,N | −0.330250 | 1,285,489.489088 |
| 总接触力,N | 468,662.665051 | 1,754,152.144194 |
**弹性项只差 0.340 N,约 128.55 万 N 的差异几乎全部是阻尼项。** 双方均在接触区,并不存在一边接触、一边脱离的模式错误。
此刻 UD00 驱动从 0 切换为 1e12 N,经负方向力源作用于公共质量块。质量为 170,000 kg,位于 0.37 m 上限,切换后向允许方向释放,加速度约 −5.882e6 m/s²。经过约 2.2e-12 s,速度变化达到约 1.3e-5 m/s,乘以大阻尼便得到百万牛级力变化。
本机参考代码中,[UD00](F:/AMESim2404/Amesim/libsig/submodels/UD00.c:593)更新周期阶段并调用时间不连续处理;[MECMAS21](F:/AMESim2404/Amesim/libmec/submodels/MECMAS21.c:547)将理想限位交给 `endst2_`;[LSTP00A](F:/AMESim2404/Amesim/libmec/submodels/LSTP00A.c:296)由穿透及其导数计算接触力。这些代码和本次输出支持上述因果链,但本报告不据此声称两套积分器内部算法完全相同。
## 4. 三种对照验证取样影响
### A. 使用相同实际时刻的连续状态
在独立运行库副本中增加 210 个只读密集输出查询,包括 Amesim 真正保存的时间。查询不改变步长、时间事件或接受状态;完整积分计数与主路运行一致。结果重放仍调用原模型公式。
| 第 2 路名义时刻 | 原配对绝对力差,N | 同一实际时刻绝对力差,N | 减少 |
| --- | ---: | ---: | ---: |
| 21.6 s | 387,825.741 | 7,758.635 | 98.00% |
| 32.4 s | 1,285,489.479 | 5,025.566 | 99.61% |
| 43.2 s | 29,254.603 | 3.685 | 99.99% |
同一实际时刻仍有小残差,不能据此宣称皮秒瞬态完全一致。32.4 s 附近 binary64 时间间距约 7.105e-15 s;按此刻加速度和阻尼估算,一格时间变化对应约 4,180 N。主路日志在这些驱动边界也记录了积分器成功步未推进外部浮点时间的情况。
进一步用**同一已保存的边界状态**,在独立程序中将局部时间从 0 开始,只继续到上述 2.20 ps;原力学、热力学公式及驱动阶段不变。rtol=1e-8 和 1e-10 的第 2 路末力均约 **1,761,496.860 N**;默认绝对时间密集输出为 **1,749,126.578 N**,Amesim 普通输出为 **1,754,152.144 N**。该试验表明这一极短瞬态对时间原点和启动处理敏感,单纯再收紧相对容差不能解释或消除全部残差。局部时钟没有合入生产。
证据:[逐支路力分解与同时间对照](../../test/lstp-mainline-20260917/force-error-analysis.json)、[连续状态取样](../../test/lstp-mainline-20260917/trace/dense-outputs.json)、[局部时钟结果](../../test/lstp-mainline-20260917/rebase/summary.json)。
### B. 直接比较事件前后保存点
按本机 [Amesim `ameputsimopt`](F:/AMESim2404/Amesim/scripting/python/amesim.py:1093) 的定义,仅将副本 `.sim` 第二行的 `simOptions[2]` 从 0 改为 1,启用 `printDiscont`。模型、容差、时间区间、普通输出间隔及其他求解选项不变,重新运行 Amesim。
记录从 5,002 行增至 5,046 行,核验**所有原有时刻、全部原保存变量逐值不变**。32.4 s 第 2 路新增记录为:
| Amesim 实际时刻,s | 阶段 | 公共质量块速度,m/s | 接触力,N |
| --- | --- | ---: | ---: |
| 32.400000000000006 | 驱动切换前 | 0 | 468,662.652083 |
| 32.40000000000001 | 驱动切换后立即 | 0 | 468,662.652083 |
| 32.40000000000221 | 原普通输出,已演化约 2.2 ps | −1.2883209101e-5 | 1,754,152.144194 |
平台事件后的力为 **468,662.665051 N**。与 Amesim 的事件后立即值比较,差 **0.012968 N**。这直接证明“相同信号阶段”还不足以把事件边界与已经演化的普通输出当成同一个瞬态。
### C. 保持原比较算法,重新比较整组八路
平台结果不变;参照换成含事件点的 Amesim 输出,仍用相同名义 10 ms 网格、相同时间候选窗口、完整 10 个驱动信号配对,并让所有曲线共用一对行。没有根据力差选择样本,没有删除事件网格点。
Amesim 原始事件输出存在一处文件行序倒置:先写 0.8000000000000009 s 普通点,后写 0.8 s 事件点。本次诊断只按原始实际时间稳定排序,保留全部行、值和重复时间,并保存排序到原始行的映射;未改变平台导入器或原始结果文件。
| 循环八路指标 | 原普通 Amesim 输出 | Amesim 含事件点输出 |
| --- | ---: | ---: |
| 比较曲线/网格点 | 238 / 5,001 | 238 / 5,001 |
| 未配对时刻 | 0 | 0 |
| 全网格最大绝对力差,N | 1,285,489.485624 | **1.312403** |
| 最大力差时刻 | 32.4 s | 0.01 s |
| 力的相对差超过 5% 的曲线样本数 | 24 | **0** |
| 所有变量相对差超过 5% 的曲线样本数 | 32 | **6** |
| 最大压力差,Pa | 61.105785 | 61.105785 |
| 最大温度差,K | 0.389714 | 0.389714 |
剩余 6 个为质量流量 4、焓流 2;5% 仍只是原有诊断线。32.4 s 八路在事件侧配对后的力差均小于 0.015 N。**1.312403 N 是这组共同网格和事件侧对照的最大差,不能作为网格之间所有极短瞬态误差的上界。**
证据:[新对照汇总](../../test/lstp-mainline-20260917/event-output-comparison/summary.json)、[全部曲线](../../test/lstp-mainline-20260917/event-output-comparison/comparison.json)、[阶段配对](../../test/lstp-mainline-20260917/event-output-comparison/phase-pairing.json)、[原始行映射](../../test/lstp-mainline-20260917/event-output-comparison/ame-row-order.json)。
## 5. 约 2.084e14 N 的原始力峰来自哪里
该峰发生在约 32.4003551 s,即释放后约 0.355 ms,公共质量块从上限运动至下限。碰撞前,两端速度都约 −2083.9 m/s、相对速度较小;理想下限把公共质量块速度重置为 0,支路质量块仍保持约 −2083.9 m/s。因此大阻尼立即产生约 −2.084e14 N 的力。此模型允许负接触力,该值不会被截断。
| 第 2 路对应的下限碰撞后 | 平台 | Amesim |
| --- | ---: | ---: |
| 事件时刻,s | 32.40035510065042 | 32.400355100640695 |
| 公共质量块位移/速度 | 0 m / 0 m/s | 0 m / 0 m/s |
| 支路速度,m/s | −2083.913265366 | −2083.913208006 |
| 接触力,N | −2.083913259638e14 | −2.083913202278e14 |
对应碰撞时间差约 **9.73 ps**,力值相对差约 **2.75e-6%**。单看绝对差仍有约 5.74e6 N,但这是在约 2.084e14 N 的峰值上。两边都出现同一种速度重置和阻尼峰,不能把这个峰本身归因于缺少 LSTP 事件。
这验证了当前参照模型的实现一致性;是否希望工程模型具有如此大的外力、速度及理想碰撞瞬态,应由工况与接触建模目标决定,不能用调小数值结果来替代模型选择。
证据:[平台碰撞前后样本](../../test/lstp-mainline-20260917/raw-force-peak.json)、[Amesim 事件输出及碰撞样本](../../test/lstp-mainline-20260917/amesim-event-output/mechanical-events.json)。
## 6. 后续建议及复现
初步平台展示与正确性评价,优先使用**开启不连续点输出的 Amesim 结果**作为参照,并保留共同事件侧配对、原时间戳及原普通输出的审计。当前证据不支持为消除原来的 128 万 N 配对差再调整 LSTP 刚度、阻尼,或将昂贵的 MASS 释放实验合入默认路径。
若下一步要验证皮秒尺度的峰形,再研究按事件相对时间表示/求解短瞬态、保存精度以及硬限位重置后的连续状态;本次只完成了独立局部时钟诊断,没有改生产时间处理。
[诊断脚本](../../tests/manual/diagnose_mql8_force_events.py)支持分阶段复现,完整执行使用新目录:
```powershell
.\.venv-win\Scripts\python.exe -X utf8 -m unittest tests.test_native_contact_events -v
.\.venv-win\Scripts\python.exe -X utf8 tests/manual/diagnose_mql8_force_events.py --output test/lstp-mainline-new-run --stage all
```
该诊断依赖本工作站已对齐的工程、上一轮独立实验数据和 Amesim 2404。源码、测试、规范及本文为可跟踪交付;原始结果在 Git 忽略的 `test/lstp-mainline-20260917/`。Windows 编译器的偶发启动失败由现有重试恢复;诊断和新专项串行构建以减少干扰,生产构建调度未更改。