接触ダンピング有効時にCONTACTNEARからの状態遷移が数えられず異常終了する
概要
接触ダンピング(!CONTACT の DAMP_ALPHA と DAMP_GACT)を有効にすると、接触面節点が CONTACTNEAR から CONTACTSTICK に遷移した次のサブステップで segmentation fault により 異常終了する。master の 818eb12d で確認した。
原因は、状態変化カウンタ free2contact と contact2free が is_contact_free() だけを基準に 数えていることである。CONTACTNEAR も CONTACTSTICK も free ではないため、この遷移は どちらのカウンタにも計上されない。その結果 fstr_is_matrixStructure_changed が偽を返して Lagrange未定乗数の行が再構築されず、fstr_is_contact_conv も真を返して接触反復が収束と 誤判定される。次のニュートン反復で hecLagMAT の lag_node_table を参照した時点で落ちる。
この食い違いは CONTACTNEAR を追加した 70bd6521 で生じた。それ以前は接触状態が CONTACTFREE / CONTACTSTICK / CONTACTSLIP の3値しかなく、free でないことは STICK または SLIP と同義だったため、カウンタ名の contact は STICK/SLIP を指していた。 CONTACTNEAR が増えたことで contact の指す集合が黙って広がったが、名前と用途は据え置かれている。
同じ原因で次の2点も起きている。
- 引張力で剥離するとき、ダンピングの作用距離内であっても CONTACTNEAR を経由せず一気に CONTACTFREE になる。ダンピングによるチャタリング抑制が働かない
- 接触面節点がすべて CONTACTNEAR の接近段階では fstr_is_contact_active() が偽になり、 接触剛性と残差の組み立ても fstr_mat_con_contact も行われない。ダンピングはこの段階の ために導入された機能であるが、その段階でだけ効かない
再現手順
tests/analysis/interaction/contact_slag_iter/2box_hex_nofric_iter を引用し、上側ブロックを 0.012 持ち上げて初期ギャップを設け、!CONTACT に DAMP_ALPHA=1.0E-2, DAMP_GACT=2.0E-2 を 付与して10サブステップで押し込む。2サブステップ目に CONTACTNEAR から CONTACTSTICK への 遷移が起き、その次のサブステップの冒頭で異常終了する。
tests 配下に接触ダンピングを使うテストが1件も無いため、この不具合はリグレッションテストでは 検出されない。
直し方
接触状態を free / near / contact(Lagrange未定乗数を持つ)の3カテゴリに分け、カテゴリ間の 遷移を数えるようにすれば、行列構造を変える遷移の数え漏らしがなくなる。あわせて contact の語が STICK/SLIP を指す本来の意味に戻る。