接触と判定する貫入深さを !CONTACT_PARAM で指定できるようにし、既定値を広げる
概要
接触探索が受理する貫入深さの上限が、マスター面の代表長さ(要素中心のヤコビアンの平方根)の 0.5 倍に固定されていた。 1増分でこれより深く沈んだスレーブ節点は、正しいマスター面が候補にあっても棄却され、次の探索でも同じ条件で棄却されるため、 接触が検出されないままマスター面を突き抜ける。issue #844 の 1-1(しきい値のカットオフによる貫入検出漏れ)にあたる。
この上限を !CONTACT_PARAM の省略可能な4データ行目から読む2つのパラメータで与え、既定値を広げた。
| パラメータ | 使う場面 | 既定値 |
|---|---|---|
| PENCLR_FREE | どのマスター面かを幾何だけで決める場面(自由節点と近接節点の探索、mortar の候補探索) | 1.0 |
| PENCLR_NOCHECK | 接触中の節点を現在の面とその隣接面で追跡する場面 | 1e10 |
隙間側の DISTCLR_FREE・DISTCLR_NOCHECK と対にした。剥離は引張力(mortar では DISTCLR_C2F)で判定するのが既存の設計なので、 追跡では深さで離さない。1つのパラメータにまとめると、1反復で上限より深く沈んだ接触中の節点が追跡で FREE に落ち、 同じ上限の自由節点探索でも拾い直せずにすり抜ける。
PENCLR_FREE の 1.0 は候補が集まる範囲の上限に合わせた値である。候補のマスター面はスレーブ節点のバケットとその 3×3×3 近傍から 集めるので、平らなマスター面では、全マスター面の外接箱の最大辺 d_max より深い節点には候補が集まらない。一様なメッシュで 要素の辺長を a とすると d_max はおよそ a で、代表長さとの比では四角形で約2倍、直角二等辺三角形で約1倍が届く範囲の上限になる。 1.0 を超えても三角形には効かない。
深さで弾かれなくなると、マスター面が凸な稜線をまたぐ形状では、稜線の向こう側の面も要素寸法ほどの深さで受理される。 候補を試す順に最初に受理した面を採ると、稜線の隣を滑る節点がその面に拘束される。そこで、マスター面を幾何だけで選ぶ場面は すべて、受理した候補のうち距離の絶対値が最小の面を採る形にそろえた(自由節点の探索が b2504e94 で採っている選び方と同じ)。 issue #844 の 2-1 のうち、貫入側を緩めたことで現れる分にあたる。
既存テスト hertz_autinc は、すり抜けた節点が引き戻される経過でカットバックが起きる筋書きだった。このテストが守るのは カットバック時の行列構造の復元なので、STEP2 に MAXCONTITER=3 を加えて接触反復の上限でカットバックを起こすようにし、 参照解を更新した。
変更内容
| コミット | 一行要約 |
|---|---|
| b27dc872 contact: take the penetration depth of the projection from the contact parameters | 射影の判定に使う貫入深さを引数にし、固定値 0.5 を接触パラメータから渡す |
| 9ec1eefa contact: read the penetration clearances from !CONTACT_PARAM | 4データ行目から2つの値を読み、入力チェックとエラーメッセージを加える |
| 60ce9c2a contact: take the nearest master surface wherever geometry chooses it | 幾何だけでマスター面を選ぶ場面を、距離の絶対値が最小の面を採る形にそろえる |
| 4e775e85 contact: accept a penetration of up to the reference length by default | 既定値を 1.0 と 1e10 にし、hertz_autinc の入力と参照解を更新する |
| 6235c7d7 tests: add a contact case that penetrates deeper than half the reference length | 代表長さの 0.6 倍沈む回帰テストを追加する |
| 952f9dce tests: add a contact case whose master surface wraps a convex edge | 稜線をまたぐマスター面の回帰テストを、節点-面と mortar の2つ追加する |