接触カウンタログの表示方式

接触反復ごとに出る Contact change: 行を、次の形にしたいと考えています。

 Contact change: Free2Cont=   5479 Cont2Free=      0 InnerSlid=      0 MoveNeibr=      0 MoveBynd=      0 ActiveNodes=    484
 Contact change: Free2Cont=      5 Cont2Free=      0 InnerSlid=      0 MoveNeibr=      0 MoveBynd=      0 ActiveNodes=    484
列 中身
Free2Cont 新しく接触に入った数。点-面は節点 (n_statechange(FREE,CONT))、面-面は新しく master に付いた積分点を 1 つ以上含むスレーブ面の数 (free2contact_new を含む)
Cont2Free 接触から離れた節点数 (n_statechange(CONT,FREE)、点-面)
InnerSlid 同じ master 要素の中で投影点が動いた節点数 (contact2diffLpos、旧 InElemSlid、点-面)
MoveNeibr 隣接する master 要素へ移った数 (contact2neighbor、旧 ElemMoved)。点-面は節点、面-面はそうした積分点を含むスレーブ面の数
MoveBynd 隣接要素の外へ移り、探索で付け直した数 (contact2beyond、新規)。点-面は節点、面-面はそうした積分点を含むスレーブ面の数
ActiveNodes 接触中の節点数。点-面の節点数に、面-面で接触中のスレーブ面に属する節点数 (可視化の CONTACT_STATE と同じ数え方) を足したもの
  • 列の順は、状態変化の起こりやすい順 (接触の出入り → 要素内の移動 → 隣接への移動 → 隣接外への移動) にしています。
  • 数値は i7 の固定幅で右寄せにし、grep "Contact change" で並べたときに列が揃うようにします。
  • NEAR_DIST や DAMP_GACT で近接状態を使うときにだけ出る 2 行目 (near state change:) も、同じ固定幅にそろえます (出す条件は変えません)。
   near state change: Free2Near=     12 Near2Free=      3 Near2Cont=      7 Cont2Near=      0
  • 隣接要素の外へ移動するたびに出ている Warning: contact moved beyond neighbor elements (fstr_contact_search.f90:878) は、MoveBynd に数えるので出さないようにします。

きっかけは、収束判定 fstr_is_contact_conv (fstr_contact.f90:415-416) に入るカウンタのうち free2contact_new と contact2beyond がいまの行に出ておらず、接触状態が変わっていないように見えたまま Contact failed to Converge になり、ログから原因が読めなかったケースがあったことです。
面-面接触の実機モデルで、全反復が Free2Cont=0, Cont2Free=0, ElemMoved=0, InElemSlid=0 のまま MAXCONTITER を使い切って止まり、2 カウンタを印字して初めて free2contact_new が 4〜5 で張り付いている (少数の積分点が 2 つの master 要素の間を往復している) と分かりました。
同じ理由で ActiveNodes も面-面の接触を数えておらず、面-面だけの解析では 0 のままです。

なお explicit 動解析のスキャン (fstr_scan_contact_state_exp) はこの 2 カウンタを初期化していないので、印字に合わせて初期化も入れます。

この後,関連するMRを提出予定です.

Edited by Toru Ando