多求解器如何同步?preCICE 做什么?#
想象一个求解器算手指运动,另一个算海绵变形。它们约定这一轮都计算仿真时间 0~10 ms:手指先算,电脑花 1 ms;海绵随后算,电脑花 100 ms。以下数字是教学假设,不是引擎测速。
电脑实际经过的时间 |
手指算到哪里 |
海绵算到哪里 |
|---|---|---|
0 ms |
仿真 0 ms |
仿真 0 ms |
1 ms |
仿真 10 ms,等待 |
仿真 0 ms |
101 ms |
仿真 10 ms |
仿真 10 ms |
人等了 101 ms,模拟世界只过去 10 ms。 如同电脑花一分钟生成一秒动画,动画里不会多出 59 秒。在离线、控制器跟随仿真时钟的条件下,这种等待主要降低运行速度;真机闭环另有必须赶上的现实时间期限。
内部步长也可以不同:手指每步推进 1 ms,算 10 小步;海绵每步推进 5 ms,算 2 小步,都在仿真第 10 ms 碰头。这时,手指内部算了 10 次,不等于收到 10 次海绵的新反力。电脑耗时、内部积分步长、两侧交换周期是三个不同的量。不同步长怎样对齐
但时间对齐之后,还要回答:手指计算这段运动时,使用的是哪一次海绵反力?
先各算一遍,再往前走(显式耦合的一种安排): 手指先用旧反力算到 10 ms;海绵根据这段运动算出新反力;手指下一轮才用上它。即使电脑瞬间算完,旧反力造成的误差仍可能存在。
在同一段时间里反复校正(隐式耦合): 海绵返回新反力,手指据此重新计算 0~10 ms,海绵再更新,直到交换结果满足收敛要求。重算始终针对同一段,不能每轮都把仿真时间再加 10 ms;算不收敛也不能直接当成有效结果。
“先后算还是同时算”与“这一段要不要反复重算”是两个独立选择。缩短交换周期、增加校正可能改善相互响应,也会增加计算或通信成本;仅把某一边的内部步长调小,不自动刷新另一边的反馈。耦合方式说明
preCICE 是开源的多物理耦合库,可以理解成求解器之间的协调员。 接入后,它按配置协调时间、传递数据、把不同网格上的数据对应起来,并组织需要的迭代校正。例如水冲击柔性挡板时,流体程序算压力,结构程序算变形,preCICE 协调双方交换。物理方程、接触和摩擦仍由求解器及接入方式决定。官方介绍
对抓取而言,接触变化慢时,旧反力可能仍接近当前值;滚动、滑移、换指时则更需要及时且完整的反馈。因此计算慢不能单独证明做不了手内操作,保持成功也不能证明换指可靠。preCICE 在这里是方法参考;连接 MuJoCo、SuperDex 等仍需适配与验证,本段不代表 DexLab 已接入 preCICE,也不表示 RSS 使用它。RSS 耦合源码分析与讨论