Loading
非関連塑性の行列非対称性をソルバへ伝搬し直接法の分解モードを正しくする
Close #841 (closed)(登録したissue番号に更新)
解決策
非関連 MC/DP 材料の存在を判定する fstr_is_material_symmetric を追加し、
hecMAT%symmetric と既存の対称性判定へ伝搬する(実装3ファイル・+42/−3行、
新しい API 引数・データ構造なし)。
fstr_mat_con_contact.f90: 判定関数を新設(MC: PLCONST3=φ ≠ PLCONST4=ψ、 DP: PLCONST3=η(φ) ≠ PLCONST5=η̄(ψ)。ψ 省略時はパーサが psi=phi を同一値・同一演算で 格納するため、厳密比較で関連流れ=対称と判定され既定挙動は完全不変)。fstr_is_matrixStruct_symmetricの判定条件に AND で合成し、接触経路 (SLag/ELIM/動解析)へは既存の is_sym 伝達で自動反映fstr_solve_NonLinear.f90: 静解析ドライバ共通のfstr_init_NewtonでhecMAT%symmetricを設定(フラグ供給源のなかった非接触経路と、d591ea1f の既知の 残課題だった ELIM 接触非アクティブ相をカバー。MPC 消去時は既存のコピーで hecMATmpc へ伝搬)。ALagrange init のハードコード.true.2箇所を材料述語に置換 (ALag の接触項は従来どおり対称扱いを維持し、材料非対称のみ反映)fstr_dynamic_nlimplicit.f90: 動解析ドライバ init でもhecMAT%symmetricを設定- 反復法は解法メソッド由来の既存の上書き(hecmw_solver_Iterative.f90)が solve 毎に走るため影響なし
検証
- 非関連 DP モデル(4x4x4 立方体・三軸圧縮・ψ=10°/φ=30°): 修正前は MUMPS SYM=2 / PARDISO mtype=-2 のまま線形相対残差 worst 1.36E+03 / 1.61E+02・警告40回で Newton が NaN 発散し解析破綻 → 修正後は SYM=0 / mtype=11 で全線形解が 1e-15〜16 水準・警告0回・全 substep 完走。MUMPS 2プロセスも同水準
- 無影響確認: ψ 省略の DP(関連流れ)・von Mises・弾性のみ・摩擦なし接触 (SLagrange+ELIM+MUMPS)の4ケースで修正前後の結果ファイルが bitwise 一致 (1スレッド実行で比較)
- 回帰: ctest -L serial 99/99・hybrid solver 3/3 PASS、tests/test.sh の with_mumps 53件・with_mkl 14件・analysis/interaction 55件 全 success
- 回帰テストを新設(tests/with_mumps/plastic_dp_nonassoc_mumps、 tests/with_mkl/plastic_dp_nonassoc_mkl)。参照結果は分解モードに依存しない BiCGSTAB(許容1e-10)で生成しており、修正前のコードではこのテストは収束破綻で fail する(検出能力を確認済み)。修正後は全登録エントリ(serial/mpi/openmp/hybrid) で PASS
- ClusterMKL は手元環境の MKL BLACS/OpenMPI 不整合で実行検証できていないため、 CI での確認を期待する(読み取る分岐は MKL 直列版と同一パターンであることは コードで確認済み)
挙動が変わり得る点
- 判定は定義された材料に対する保守的なもので、要素に未割当の非関連材料定義でも 非対称モードになる(結果は正しく、分解コストのみ増。摩擦判定 fcoeff≠0 が接触の アクティブ状態を見ないのと同じ設計)
- 未対応直接法(Iarray(99)==4)のガードが本判定を参照するため、非関連材料との 組み合わせは明示エラーで停止するようになる(従来は誤って対称扱いのまま実行)
既知の限界(本MRの範囲外)
- n_dof=4 述語の既知の誤分類(d591ea1f 時の既知の限界)は従来のまま
- user material・粘塑性など他の非対称源は対象外