Fixed error in thread parallel contact

!549 (merged) のエラー修正です。issueを立てるほどでもないのでMR単独で修正だします

根本原因:

fstr_contact_geom.f90:update_direction の cstate_tmp が 部分的にしか初期化されていなかった。

! 修正前: state と surface の2フィールドのみ初期化

cstate_tmp%state = contact%states(nslave)%state
cstate_tmp%surface = sid0

! 修正後: 全フィールドをコピー

cstate_tmp = contact%states(nslave)

問題の連鎖:

  1. cstate_tmp%interference_flag が未初期化(スタックのゴミ値)
  2. スレッドごとにスタックレイアウトが異なるため非決定的
  3. ゴミ値が C_IF_SLAVE=1 に一致すると project_Point2Element 内で shrink_factor = distance / time_factor(time_factor=0 → ゼロ除算 → NaN)
  4. NaN の shrink_factor → isin=false に誤判定
  5. isin=false で cal_node_normal が呼ばれず、cstate_tmp%direction が未初期化のまま
  6. contact%states(nslave)%direction に NaN が書き戻される → ソルバー発散

master ブランチで隠れていた理由:

並列ループ内の write() 文が I/O ロックによりスレッドをシリアル化し、偶発的に問題を隠蔽していた。featureブランチがこれを除去して露呈した。

Merge request reports

Loading
Loading