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)を共有する場合、以下の順序で問題が発生する:

  1. シェルセクション(sect_type==2)の処理: fstr_get_prop → fstr_get_prop_shell が呼ばれ、shmatがallocateされてshell_varに正しく代入される
  2. ソリッドセクション(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情報を使いまわしている」という根本原因の示唆が含まれていたため、仮説構築が迅速にできた。不具合報告テンプレートでの原因推測記載は効果的である。
Edited by morita

Merge request reports

Loading
Loading