fistr1 の終了コードを失敗の種別で分類する

概要

Closes #750 (closed)

fistr1 の終了コード (exit status) に意味を持たせる。正常完走は従来どおり 0、失敗は種別に応じた非ゼロを返す。自動化・最適化フローからログを読まずに成否と失敗種別を判定できるようにする。

終了コード 意味 主な原因
0 正常完走 警告付きで続行した場合 (線形ソルバ・固有値の反復打ち切り) も 0
1 使用法エラー 未対応オプション、引数不足
2 入力解釈エラー hecmw_ctrl.dat / メッシュ / 制御ファイルの読込失敗・構文エラー
3 モデル定義エラー 未対応要素型、材料・境界条件・接触定義の不整合
4 ソルバ設定不整合 HEC-MW-SOLVER-E-1001 / E-2001
10 非線形解析の打ち切り NR 非収束、カットバック連続上限、サブステップ上限
20 内部エラー・未分類 メモリ確保失敗、内部整合性、分類のない abort

現状の問題

  • hecmw_abort が errorcode を未初期化のまま MPI_ABORT に渡しており、終了コードが run ごとに変わる (同じメッシュ欠落で 24 / 72 / 232 を観測)
  • 解析打ち切り (カットバック上限・サブステップ上限) は引数なしの stop で常に 0
  • MPI_ABORT は Fortran の I/O バッファを flush しないため、abort 直前のエラー文が stdout から消え、FSTR.sta / FSTR.msg が 0 バイトで終わる
  • 可視化・並列直接法のメモリ不足経路が exit(0)、未実装オプション -c も 0

変更

  • hecmw_util: 終了コード定数 7 個 (HECMW_EXIT_*) を追加。hecmw_abort(comm[, code]) に optional 引数を追加 (既定 20)、flush(6) を入れてから MPI_ABORT。逐次ビルドは stop code。既存の呼び出し 274 箇所は無改変
  • m_fstr: fstr_abort(code) を新設。0.log / FSTR.sta / FSTR.msg を flush してから hecmw_abort へ委譲
  • 非線形の打ち切り 12 経路 (静解析・陰解法/陽解法動解析・熱伝導) を 10 に。判定行を書かずに落ちていた 2 経路に HAS NOT COMPLETED SUCCESSFULLY を追加
  • 入力読込の集約点 (hecmw_io.f90, fstr_setup_util.f90, fstr_setup.f90 の bare stop 43 件) を 2 (一部 3) に
  • hecmw_solve_error.f90 の abort 2 箇所を 4 に
  • C 側: HECMW_abort / 可視化・separator の exit(0) / fstr_ctrl_util.c の exit(-1) を 20 に、main.c の -c を 1 に
  • hecmw_config.h に同じ定数を追加。HECMW_EXIT_ERROR は残置

16 ファイル、+131 / −77。

検証

ケース 変更前 変更後
正常完走 0 0 (res / sta / log bit 一致)
cnt 構文エラー 0 2
NR 非収束 (cutback 非活性) 0 (sta に判定行なし) 10 (判定行あり)
カットバック連続上限 0 (sta 0 バイト) 10 (sta 1538 バイト、stdout にエラー文)
メッシュ欠落 24 / 72 / 232 (不定) 2
hecmw_ctrl.dat 欠落 0 2
未実装オプション -c 0 1
  • mpirun -np 2 (Open MPI 4.1.2) で 0 / 10 / 10、ハングなし
  • 逐次ビルド (WITH_MPI=OFF) でも同じ値
  • 正常完走 4 deck (接触 S2S / N2S ALAG / AUTOINC / 静解析) で res / sta / log が変更前後で bit 一致
  • ctest: (tester 結果を転記)
  • 別実行体 (hecmw_part1 / hecmw_vis1 / rmerge 等) のビルド確認済み

範囲外 (後続 MR)

  • stop 'message' 形式の終了 330 箇所 (要素型・材料定義など、主に 3 に属する経路) は gfortran では 0 を返すまま。分類別の機械置換を Phase B として別 MR にする
  • ifort / Fujitsu frt での Fortran 2018 stop <変数> の受理、MPICH / Intel MPI での MPI_Abort 戻り値の写像は未確認

備考

  • tests/test.sh は FrontISTR Completed !! の grep で判定しているため ctest は終了コードに非感応 (赤化しないが、PASS が終了コードの証拠にもならない)
  • マニュアル (機能リファレンス「エラーメッセージ一覧」) への追記は frontistr_documents 側の MR

Merge request reports

Loading
Loading