Loading
BOX_EXP_RATE による接触候補の絞り込みを廃止する
Close #715 (closed)
概要
BOX_EXP_RATEをはずすとテストが失敗する原因を調べたところ、is_in_surface_box が探索を速くするための無害な事前フィルタではなく、実際には四面体・三角形で正しい接触候補を取りこぼすバグであることが分かりました。 is_in_surface_box は、中心を節点座標の平均 surf%xavg、半辺長を3方向の最大幅の半分 surf%dmax とする立方体で判定していました。中心にバウンディングボックスの中心ではなく重心を使っている点が問題です。
- 六面体・四角形では重心とバウンディングボックス中心が一致するため、箱は要素の外接直方体そのものになります。
- 四面体・三角形では重心が偏るため、箱が要素の一角を切り落とします。要素自身の頂点について比を実測すると次のとおりで、既定値 1.05 はもちろん、入力チェックが許す上限 2.0 でも tri3 面を覆いきれません。
| 要素 | メッシュ | 箱に棄却される自要素の頂点 | 比の最大値 |
|---|---|---|---|
| hex8 の quad4 面 | tests/analysis/interaction/contact_alag_iter/2box_hex_fric_iter.msh | 0 / 216 (0.0%) | 1.000 |
| tet4 の tri3 面 | tests/analysis/interaction/contact_alag_iter/2box_tet_fric_iter.msh | 394 / 1296 (30.4%) | 1.333 |
| tet4 ソリッド | tests/analysis/interaction/embed_slag_iter/embed_tet1.msh | 294 / 640 (45.9%) | 1.500 |
その結果、マスタ面上に確かに乗っているスレーブ節点が射影判定にかけられる前に捨てられ、四面体メッシュで接触・埋め込みが検出されないまま解析が進んでいました。接触ログで節点単位に確認した実例は次のとおりです。
- embed_tet1: 54個のスレーブ節点のうち 3個(節点 75, 88, 92)がどの要素にも埋め込まれていませんでした。絞り込みを外すとそれぞれ要素 74, 41, 42 に埋め込まれます。
- slag_nagata: 節点 196 がどのマスタ面とも接触しませんでした。加えて節点 101 は要素 60 → 59、節点 102 は要素 145 → 139 と、接触するマスタ面自体が変わります。
今回は参照解の方を更新しています
- embed_tet1 では3節点が埋め込まれず、slag_nagata では1節点が接触しないことで、差は最大 4.66%(REACTION_FORCE)、数値誤差の範囲ではありません。
- 既存の参照結果は BOX_EXP_RATE = 1.05 付近でしか再現できません。安全側に 1.2 へ上げるだけで再現できなくなります
- 逆に既定値を上限の 2.0 にしだ場合と、絞り込みを完全に削除した場合で、参照結果に対する残差が完全に一致します
変更内容
| commit | 変更内容 |
|---|---|
| 6850921e contact: remove the BOX_EXP_RATE candidate narrowing | is_in_surface_boxと、その3箇所の呼び出しを削除 |
| e6fd9239 tests: regenerate the tetrahedral contact and embed references | 四面体を含む19件の参照結果を再生成 |
Edited by inagaki