可視化出力の MATERIAL_ID / ORIENTATION が MPC 疑似要素で断面配列を範囲外参照する問題を修正
概要
!EQUATION の本数が !SECTION の本数より多いモデルで、可視化出力の MATERIAL_ID と ORIENTATION が !SECTION ごとの配列を範囲外参照する不具合(#869 (closed))を直した。
原因は、 HEC-MW が !EQUATION 1 本につき生成する疑似要素(3 次元では要素タイプ 912)の hecMESH%section_ID に、 !SECTION の番号ではなく MPC の通し番号 1..n_mpc が入ることである(hecmw1/src/common/hecmw_io_mesh.c の setup_mpc_sectid)。
make_result.f90 の MATERIAL_ID 出力と ORIENTATION 出力は全要素を回り、この値をそのまま sect_mat_ID_item と sect_orien_ID の添字に使うため、通し番号が !SECTION の本数を超えた時点で配列の外を読む。
読むのは step 0 の可視化出力を書くときで、 fstr_setup: OK の直後にあたる。
MATERIAL_ID は拾った値をそのまま材料 ID として書き、ヒープの配置次第で生き延びるか落ちる。
ORIENTATION は拾った値を g_LocalCoordSys の添字に渡すので、 Linux の通常ビルドでも segfault する。
S2S 接触の !CONTACT_PAIR から生成する patch 要素(1031 等)も setup_contact_sectid で接触ペアの通し番号を持つので、 !CONTACT_PAIR の本数が !SECTION の本数を超えるモデルでも同じことが起きる(こちらは未実測)。
同じ出力を持つ precheck_make_result.f90 は、 section_ID が 1 以上 n_sect 以下に収まるかを確かめてから !SECTION の配列を引いている。
make_result.f90 の 2 箇所にも同じ範囲チェックを入れ、範囲外では MATERIAL_ID を 0、 ORIENTATION を cdsys_ID = -1 として、既存の「cdsys_ID が -1 なら座標系を 0 にする」分岐にそのまま落とす。
-1 は sect_orien_ID の初期値であり、 !ORIENTATION を指定しない !SECTION と同じ扱いになる。
要素タイプで疑似要素を除く方法も採れるが、既存の precheck と流儀を揃え、通し番号が n_sect 以下に収まっている疑似要素の出力を変えないために範囲チェックにした。
実要素の出力は変わらない。
回帰テストは tests/analysis/static/mpc_pena_iter (!EQUATION 12 本 / !SECTION 1 本)の !OUTPUT_VIS に MATERIAL_ID,ON と ORIENTATION,ON を足す形で用意した。
修正前はこのモデルが通常ビルドでも Address not mapped で落ち、-fcheck=bounds のビルドでは make_result.f90 の当該行で停止する。
修正後は完走し、疑似要素の MATERIAL_ID が 0、 ORIENTATION が 0 になる。
結果ファイルと反復履歴は !OUTPUT_VIS の有無で変わらないため、このモデルの参照結果は変えていない。
!EQUATION を持たないモデル(tests/lib/static_LIB_Fbar/elastic-ortho_beam に同じ出力を足したもの)では、 MATERIAL_ID = 1、 ORIENTATION1 = (1,0,0) という非自明な値が出たうえで出力全体が修正前後でバイト一致する。
!EQUATION 402 本 / !SECTION 31 本の実モデルでも、修正前は停止し、修正後は step 0 の可視化出力を書いて解析に入る。
Close #869 (closed)
変更内容
| コミット | 要約 |
|---|---|
| 3e119114 output: guard the section arrays against the pseudo elements | MATERIAL_ID と ORIENTATION の出力で section_ID の範囲を確かめてから!SECTION の配列を引く |
| f5d03707 tests: output MATERIAL_ID and ORIENTATION from the MPC penalty test | mpc_pena_iter に !OUTPUT_VIS を足し、疑似要素を含む可視化出力を回帰に載せる |