Loading
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)問題の連鎖:
- cstate_tmp%interference_flag が未初期化(スタックのゴミ値)
- スレッドごとにスタックレイアウトが異なるため非決定的
- ゴミ値が C_IF_SLAVE=1 に一致すると project_Point2Element 内で shrink_factor = distance / time_factor(time_factor=0 → ゼロ除算 → NaN)
- NaN の shrink_factor → isin=false に誤判定
- isin=false で cal_node_normal が呼ばれず、cstate_tmp%direction が未初期化のまま
- contact%states(nslave)%direction に NaN が書き戻される → ソルバー発散
master ブランチで隠れていた理由:
並列ループ内の write() 文が I/O ロックによりスレッドをシリアル化し、偶発的に問題を隠蔽していた。featureブランチがこれを除去して露呈した。