Fix segfault in shell-solid mixed model due to shell_var overwrite
Close #725 (closed)
シェル・ソリッド混在モデルでのSegmentation fault修正
シェル要素(761/781)とソリッド要素(361)を混在させたモデルで静構造解析・固有値解析を実行すると、シェル要素の剛性・質量マトリックス生成時にSegmentation faultが発生する不具合を修正した。
不具合の内容
シェル・ソリッド混在モデル(761+361 または 781+361)で静構造解析・固有値解析を実行するとSegmentation faultが発生する。
期待される動作と現状
期待される動作は、シェル・ソリッド混在モデルでの計算が正常に完了することである。
現状は、static_LIB_shell.f90のelementstress_shell_mitc等のサブルーチンでgausses(1)%pMaterial%shell_var(m)%weightにアクセスした際にSegmentation faultが発生する。
不具合の再現方法
work_shell_solid_mix/ディレクトリに761+361混在モデルの入力データを作成し、逐次実行する。
cd work_shell_solid_mix
/path/to/fistr1修正前はexit code 139(Segmentation fault)が発生する。スタックトレース:
[moritanoMacBook-Pro:83201] Signal: Segmentation fault: 11 (11)
[moritanoMacBook-Pro:83201] Failing at address: 0x58
__m_static_lib_shell_MOD_elementstress_shell_mitc + 9056
__m_fstr_nodalstress_MOD_fstr_nodalstress3d + 12124
__m_static_output_MOD_fstr_static_output + 1796
__m_fstr_solve_nlgeom_MOD_fstr_solve_nlgeom + 3096不具合修正の試行
原因に対する仮説
fstr_setup.f90の363〜397行目のセクション処理ループにおいて、各セクションに対してmaterial IDを取得し、fstr_get_propで材料プロパティを取得した後、materials(cid)%shell_varとmaterials(cid)%totallyrを無条件に上書きしている。
シェルとソリッドが同一の材料ID(cid)を共有する場合、以下の順序で問題が発生する:
- シェルセクション(
sect_type==2)の処理:fstr_get_prop→fstr_get_prop_shellが呼ばれ、shmatがallocateされてshell_varに正しく代入される - ソリッドセクション(
sect_type==1)の処理:fstr_get_propはシェル処理を行わないためshmatはnullのまま →materials(cid)%shell_var => shmatでシェル側のshell_varがnullで上書きされる
結果、シェル要素がgausses(1)%pMaterial%shell_varを参照する際にnullポインタアクセスとなりSegfaultが発生する。
仮説の検証
fstr_setup.f90のセクション処理ループ内で、shell_varとtotallyrの代入をシェルセクション(sect_type == 2)のときのみに限定する修正を適用した。
修正前:
fstrSOLID%materials(cid)%mtype = ELASTIC
fstrSOLID%materials(cid)%totallyr = n_totlyr
fstrSOLID%materials(cid)%shell_var => shmat修正後:
fstrSOLID%materials(cid)%mtype = ELASTIC
if( hecMESH%section%sect_type(i) == 2 ) then
fstrSOLID%materials(cid)%totallyr = n_totlyr
fstrSOLID%materials(cid)%shell_var => shmat
endif修正後、以下3パターンすべてでSegfaultが解消し正常完了した:
- 761+361混在モデル: 静構造解析(exit 0)
- 761+361混在モデル: 固有値解析(exit 0, 5モード取得)
- 781+361混在モデル: 静構造解析(exit 0)
テスト結果
混在モデルテスト
work_shell_solid_mix/に以下のテストケースを作成・実行し、正常動作を確認した。
| テストケース | 解析種別 | 結果 | 出力ファイル |
|---|---|---|---|
| 761+361混在 | STATIC | 正常完了 | mix_model.res.0.0 |
| 761+361混在 | EIGEN | 正常完了(5モード) | mix_model_eigen.res.0.1〜.0.5 |
| 781+361混在 | STATIC | 正常完了 | mix_model_781.res.0.0 |
既存テスト(ctest)
serial: 100% tests passed, 0 tests failed out of 49
hybrid: テストなし(OpenMP無効環境のため対象テスト0件)commitの説明
FrontISTRリポジトリ
ブランチ: bugfix/fix-shell-solid-mixed-segfault
commit: 30d91eac
Fix segfault in shell-solid mixed model due to shell_var overwrite
- Guard shell_var and totallyr assignment with sect_type==2 check
in the section setup loop of fstr_setup.f90
- When shell and solid sections share the same material ID, the
solid section loop iteration was overwriting shell_var with null,
causing segfault when shell elements accessed layer data変更ファイル: fistr1/src/common/fstr_setup.f90(4行追加、2行削除)
入力や機能の仕様に変更はないため、frontistr_documentsリポジトリへの変更は不要である。
レポート検証結果
このレポートに記述した不具合修正の内容と、コード・ドキュメントリポジトリの内容については、一致を確認した。
| 検証項目 | 結果 | 根拠 |
|---|---|---|
| レポートの記述とコードリポジトリの一致 | 確認済 | fistr1/src/common/fstr_setup.f90 commit 30d91eac |
| レポートの記述とドキュメントリポジトリの一致 | 変更なし(仕様変更なし) | — |
| テスト結果と実行結果フォルダの一致 | 確認済 | work_shell_solid_mix/内の.resファイル群 |
| 不具合の内容節のAUTHOR NOTE適合 | 確認済 | 本レポートの該当節 |
参考文献
特になし。
フィードバック
- コスト回避:
guide_code_frontistr.mdにより、fstr_setup.f90がセクション処理とmaterial設定の主要箇所であることを早期に特定でき、コード探索の範囲が限定された。不具合情報で具体的な行番号が指定されていたことも効果的だった。今後もコード構成ガイドの維持と、不具合報告での行番号指定を保持すべきである。 - コスト回避: 不具合情報に「material情報を使いまわしている」という根本原因の示唆が含まれていたため、仮説構築が迅速にできた。不具合報告テンプレートでの原因推測記載は効果的である。