修复循环信号与事件采样并接入 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 通过。
This commit is contained in:
1 parent
1aac220084
commit
7611f13208
85 files changed
+11358
-33
No files matched your search
@@ -414,6 +414,33 @@ def create(
|
||||
9. 保持 SI、端口符号和适用的质量/能量守恒;按需编译及缓存由内容失效机制管理,测试完整模型命中、参数变化、模块变化及遗漏导出错误。
|
||||
10. C 代码、构建依赖、进程与文件操作遵守[跨平台交付约定](跨平台交付约定.md)。分别记录 Linux 与 Windows 实际结果,不把 Linux 模拟测试写成 Windows 验收。
|
||||
|
||||
### 12.1 分段信号的时间事件
|
||||
|
||||
新增阶跃、脉冲或循环分段信号时,元数据注册不会自动建立时间事件。除信号值方程外,还须在原生生成器中提供下一事件时间,汇入 `model_next_break(t, end)`。默认接入 `extended.py`;若该型号也走 `compiler.py` 紧凑路径,则两条路径都须实现。连续光滑信号没有这项分段要求;由压力、位置等状态触发的切换需要相应状态事件支持,不能仅凭时间表处理。
|
||||
|
||||
- 求值与事件查询必须共享同一套绝对时间边界。可复用 UD00 的 `native_signal` / `native_signal_break`;避免一边以取模判断阶段,另一边独立计算事件。仅新增现有 UD00 实例或修改参数无需再次注册事件。
|
||||
- 对 `t < end`,返回严格晚于 `t` 的最近边界,超过仿真终点或没有后续事件时返回 `end`。包含开始时刻、阶段端点、周期回绕,以及模型需要定位的斜率变化;同一时刻的零时长阶段按合同合并处理。
|
||||
- UD00 使用右连续阶段规则:`t < boundary` 属于前一段,`t == boundary` 属于后一段。周期终点统一使用下一周期起点。不能用任意全局 epsilon 把真实边界前的时刻提前切换。
|
||||
- 求值必须支持试探步、回退和结果重放;不得在普通 `model_eval` 调用中推进全局阶段索引。UD00 当前由时间纯函数查找阶段。需要离散状态的组件,应另行实现可回退、可重放的状态及事件提交机制。
|
||||
- 运行库按最早边界分段积分,在内部边界左侧结束旧段,再于边界处保留连续状态并重新启动积分。新组件通常复用该流程,不为每个型号新增求解器分支。名义采样时间仍按其实际浮点值求值;“界面显示同一小数”不等于内部时间完全相等。
|
||||
- 新内核函数同步公共声明及 `native_codegen/modules.py` 导出/依赖。测试边界前一个浮点数、边界本身及后一个浮点数,并覆盖延迟开始、周期回绕、多周期、退化参数和 BDF/RK45 最小系统的结果重放。参照 `tests/test_native_signal_boundaries.py`。
|
||||
|
||||
### 12.2 事件输出与重放
|
||||
|
||||
原生输出语义 version 2 保留实际时间的规则采样,并自动保存内部时间事件的左侧相邻浮点时刻及事件时刻。已有状态重置事件在当前积分区间可用时保存左邻插值状态,再保存重置后的状态;同一实际时间以后一次接受状态为准。时间序列保持严格递增,样本数量可能超过规则网格点数。初始即时事件不倒填时间,仿真终点不额外制造时间事件。
|
||||
|
||||
组件接入已有时间/状态事件接口后无需自行写入输出文件。结果重放必须仅依赖保存时间、完整状态和模型参数;模式影响输出时,必须有可保存、可回退、可重放的表示,不能读取运行结束时的全局模式。接触状态接口同样需要遵守这项约束。相关运行库合同见 [native/README.md](../../native/README.md),测试见 `tests/test_native_output_semantics.py`。
|
||||
|
||||
外部对照不能把显示为同一小数时刻当作同一事件侧。当前八路评估以全部分段常值信号核验驱动阶段,所有变量共用同一对保存样本;保留双方真实时间及无法配对记录。相同阶段也不等于实际时间完全相同,高刚度快速过程仍需进一步核验时间差的影响。
|
||||
|
||||
### 12.3 LSTP 接触状态事件
|
||||
|
||||
LSTP00A 已在两条原生生成路径默认注册:`native_codegen/contacts.py` 发出两端机械速度/位移状态索引、间隙、刚度、阻尼、阻尼距离、力符号模式及原公式运算顺序;`native/runtime/contact_events.h` 在接受步的密集插值上定位间隙过零,并在非负力模式定位接触区内的原始力过零。新增现有 LSTP 实例或修改其参数无需额外注册。
|
||||
|
||||
此接口只覆盖已审查的 LSTP 状态形式,不会因新组件名称或元数据相似而自动适用。新增类似组件时,须明确事件函数及依赖、根方向、初始贴边/切触、连续状态是否重置、同时事件和防重复提交规则;生成的事件表达式应与力公式保持一致,包括浮点运算顺序。检测不能悄悄引入整模型 RHS 求值或改变已有雅可比/物性复用。MASS 弹性限位及连续释放仍为独立实验,未在本次加入默认路径。
|
||||
|
||||
接触事件的运行期记录只用于定位及防止重复触发,不影响力求值。若新模式需要真正的离散物理状态,应按 12.2 保存和重放,不能借用这个定位记录作为不可重放的力开关。验证应包括解析或独立参考、步长变化、接触与脱离、力截断、无事件轨迹保持和 BDF/RK45;参考 `tests/test_native_contact_events.py`。
|
||||
|
||||
## 13. 模型实现示例
|
||||
|
||||
可参照 [气瓶声明](../../app/simulation/components/experimental/storage/cylinder.py)、[气腔声明](../../app/simulation/components/amesim/storage/chambers.py)、[C 数值模块](../../native/components/modules/) 与 [系统 C 生成器](../../app/simulation/native_codegen/extended.py)。完整开发顺序见 [注册示例与验证](component-registration-example-v1.md)。
|
||||
|
||||
Reference in new issue
Block a user