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 iffstr_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/)についても同様の確認が必要かどうかは未調査である