Add METHOD=DIRECTmf running the multifrontal symbolic stage

Close #910 (closed)

概要

外部ライブラリに依存しないマルチフロンタル直接法ソルバーを METHOD=DIRECTmf として hecmw に追加する。対称(不定値含む)は閾値・遅延ピボット付きタイル LDLT、数値非対称(摩擦接触・非関連塑性など)は対称フラグにより自動で LU に切り替わる。

機能

  • スレッド並列: OpenMP タスクによる木並列+フロント内並列(ifx・nvfortran でビルド可能な構成に調整済み)
  • MPI 並列: 任意プロセス数。行列は各ランク部分保持、symbolic はランク 0 で実行して配布、数値分解は subtree-to-subcube(上位フロントは行タイル 1D+fully-summed 部 2D 分散)。固定入力に対しスレッド数によらず逐次とビット一致(プロセス数によらずオーダリングは同一で、解は丸めの範囲で一致)
  • BLR 低ランク圧縮: !SOLVER のオプション行(4・5 行目)で指定。反復改良付き。フルランクが見込まれるタイルの圧縮試行を距離判定でスキップし、実時間の増加を抑制
  • 接触解析(SLAGRANGE): 消去なしは鞍点系を直接分解(単一プロセス限定。並列時は CONTACT_ELIM=1 を案内するエラーメッセージ)。CONTACT_ELIM=1 の消去あり経路は並列可
  • SA-AMG 粗グリッドソルバー: SA_CoarseSolver=4 で冗長スパース直接法として利用可能
  • ログ表示: TIMELOG=段階別時間、ITERLOG=反復改良の残差履歴、LOGLEVEL=診断(1: 統計・ピボット情報、2: 詳細)と役割を分担。#873 (closed) で提起されている直接法全般のログキーワード整理と方向を揃えており、DIRECTmf 内はこの整理を先行適用した(他ソルバーと共有の表示は本 MR では変更していない)

テスト

  • tests/solver/DIRECTmf/ に 8 スイート(basic/plasticity/contact_slag 系 3/mpc 系 2/eigen)を追加。メッシュ・参照結果は tests/with_mumps と同一(バイト共有)で、MUMPS と同等の解を返すことをテストが直接示す
  • ctest 28 エントリ(serial/openmp/mpi/hybrid)。消去なし接触の 2 スイートは単一プロセス限定のため mpi/hybrid から除外(CMakeLists にコメントで明記)
  • 手元環境で serial 全件・openmp/mpi/hybrid の solver/DIRECTmf 系すべて PASS(gfortran/OpenMPI。Intel oneAPI 2026・NVHPC 26.5 CPU でのビルド・実行も確認済み)

参考性能(単一ノード・物理 8 コアでの MUMPS 5.9.1 との比較例)

単一ノード・単一環境(Intel oneAPI ビルド、同一 METIS オーダリング)での測定例であり、一般的な優劣を示すものではない。この環境では:

  • 逐次: MUMPS が 2〜4% 速(factor カーネルは MUMPS 優、analysis は DIRECTmf が約半分)
  • スレッド並列: 2 スレッド以降は DIRECTmf が速く、8 スレッドで 25% 差
  • 実測モデル(30 万〜300 万自由度)の実用最速構成同士: DIRECTmf が 13〜17% 速

既知の制限

  • 性能評価は単一ノード(物理 8 コア)のみで、ノード間 MPI を含む多ノード・多コア環境での評価は今後の課題
  • 消去なし接触経路の MPI 対応は将来課題(現状は入口の明示エラー)

ドキュメントの対応 MR: frontistr_documents 側に別途提出(solver.ja/en.md への METHOD=DIRECTmf・オプション行・CONTACT_ELIM・ログキーワードの追記)

Edited by Kazuya Goto

Merge request reports

Loading
Loading