Loading
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