fstr_Newton_contactALag が線形ソルバーの求解ステータスを確認せずに変位増分を適用している

概要

fistr1/src/analysis/static/fstr_solve_NonLinear.f90 の3つのNewton-Raphson反復ルーチンのうち、fstr_Newton_contactALag(拡張Lagrange法による接触解析)だけが、線形ソルバーの求解ステータスを確認せずに解を変位増分として適用している。
※ fstr_Newton には MR !xxx で追加

solve_LINEQ_contact にステータス受け取り用の istat を渡してはいるが、その値を一切参照していない。線形ソルバーが収束しなかった場合、その解がそのまま増分として適用され、以降の計算が破綻した状態のまま進行する。

現状

同一ファイル内の3経路の比較:

ルーチン 求解 ステータス確認 増分適用
fstr_Newton solve_LINEQ あり fstr_apply_solution_increment
fstr_Newton_contactALag solve_LINEQ_contact(istat を渡す) なし fstr_apply_solution_increment
fstr_Newton_contactSLag solve_LINEQ_contact(istat を渡す) あり fstr_apply_solution_increment

fstr_Newton_contactSLag は求解直後に次の処理を行っている。

! ----- check matrix solver error
if( istat /= 0 ) then
  if( hecMESH%my_rank == 0) then
    write(   *,'(a,i5,a,i5)') '     ### Fail to Converge  : at total_step=', cstep, '  sub_step=', sub_step
  end if
  fstrSOLID%NRstat_i(knstDRESN) = 4
  fstrSOLID%CutBack_stat = fstrSOLID%CutBack_stat + 1
  return
end if

fstr_Newton にも同等のガードを追加した(判定には hecmw_mat_get_flag_converged を使用)。fstr_Newton_contactALag だけが未対応のまま残っている。

なぜ問題か

非収束の線形解をそのまま増分として適用すると、単に精度が落ちるだけでなく、下流のルーチンで実行時間が桁違いに増大しうる。

fstr_Newton で同じ欠落を修正した際の実例では、発散した線形解(相対残差 4.92×10⁸)由来の巨大な回転増分が fistr1/src/common/fstr_FiniteRotationKinematics.f90 の ShellUpdateTriadWithIncrement に渡り、そこにある

nsub = max(1, ceiling(theta_norm/5.0D-2))

という上限のない細分ループが暴走した。198自由度の極小モデルで、1回の解析に299.29秒(うち線形ソルバーは1.128秒、99.6%が線形ソルバー外)を要した。

fstr_Newton_contactALag も同じ fstr_apply_solution_increment を呼ぶため、MITC4シェル要素を含む接触解析では同じ経路に到達しうる。

期待する対応

fstr_Newton_contactALag の solve_LINEQ_contact 呼び出し直後に、fstr_Newton_contactSLag と同等のステータス確認を追加し、非収束時は増分を適用せずNewton-Raphson反復の失敗(NRstat_i(knstDRESN) = 4、CutBack_stat の加算)として扱う。

影響範囲

  • 拡張Lagrange法(!CONTACT の AUGLAG)による接触解析
  • 線形ソルバーが収束しなかった場合のみ顕在化する。通常の解析では現れない

補足

  • 未確認: fstr_Newton_contactALag の経路で実際に停滞が発生することは再現していない。上記は同一ファイルの他2経路との整合性と、fstr_Newton で確認済みの実害に基づく指摘である
  • 動解析側(fistr1/src/analysis/dynamic/)についても同様の確認が必要かどうかは未調査である