Krylov部分空間法 — CAE用語解説
Krylov部分空間法
先生、クリロフ部分空間法って反復法ソルバーの核心技術ですよね?
Krylov部分空間法の理論基礎
Krylov部分空間法の基本概念
Krylov部分空間法って、名前はよく聞くんですけど、結局何をやっている方法なんですか?「部分空間」って言われてもイメージが湧きません。
連立一次方程式
「最も良い」の基準は何ですか?残差のノルムを最小にする、とかですか?
その通り。代表的なアルゴリズムであるCG法(共役勾配法)は、エネルギー・ノルム
なぜ直接法ではなく、わざわざ反復法を使う必要があるんですか?有限要素法で出てくるような大きな行列でも、直接法で一発で解けないんでしょうか。
計算コストとメモリ使用量が圧倒的に違うんだ。例えば、自由度100万の3次元構造解析問題を考えてみよう。直接法(例えばスパースLU分解)では、非ゼロ要素の数が膨大に増える「フィルイン」が発生し、必要なメモリは数百GBからTB単位に達し、計算時間も非常に長くなる。一方、Krylov法(適切な前処理付き)では、行列Aそのものを保存するだけで、反復ごとの計算は行列ベクトル積が中心だから、メモリ使用量は数GB程度で済み、計算も速いことが多い。
Krylov部分空間法の数値計算手法
主要アルゴリズムとその使い分け
CG法とGMRES法以外にも、Bi-CGSTABとかMINRESとか聞きます。これらは全部Krylov部分空間法の仲間なんですか?どうやって使い分けるんですか?
そうだ。これらは全てKrylov部分空間法ファミリーだ。使い分けの第一基準は行列の性質だ。
GMRESはメモリが増えると言いましたが、具体的にどういう仕組みで、どう対策するんですか?
GMRESはArnoldi過程で正規直交基底を構築するが、この基底ベクトルをすべて保存する必要がある。反復回数mが増えると、m本のn次元ベクトルを保存するので、メモリ使用量はO(mn)で増加する。対策は「リスタート」だ。例えば、m=50回反復した時点で得られた近似解を新しい初期値とし、Krylov部分空間の構築を最初からやり直す(GMRES(50)などと表記する)。ただし、リスタートすると最適性(残差最小)が保証されなくなるというトレードオフがある。
収束判定の「残差ノルム」って、具体的にどの値を見ればいいんですか?「1e-6」とかなんとなく設定していますが。
相対残差ノルム
Krylov部分空間法の実務適用
前処理の重要性と選択
Krylov法を使う時は必ず「前処理」が必要と言われます。前処理をしないとどうなるんですか?また、ILUとかICとかありますが、何が違うんですか?
前処理なしのKrylov法は、実用問題ではほとんど収束しないか、非常に時間がかかる。前処理行列
Fill-inレベルは、具体的にどうやって決めればいいですか?とりあえず0にしておけばいいんでしょうか。
それは問題の難しさによる。単純な線形弾性問題ならIC(0)やILU(0)で十分収束する。しかし、メッシュのアスペクト比が極端に悪い(1:1000以上)とか、材料特性の差が非常に大きい(ゴムと鋼の接触)ような「条件数が悪い」問題では、ILU(0)では収束しないか遅い。その場合、ILU(1)やILUT(しきい値=0.01など)にすると、反復回数が10分の1以下に激減することがある。まずは0で試し、収束が悪ければレベルを上げる、というのが実践的なアプローチだ。
ソフトウェアのソルバー設定で「Vサイクル」や「AMG」という前処理も見かけます。これらはILUなどとどう違うんですか?
それらは「代数的マルチグリッド法(AMG)」ベースの前処理だ。ILUが行列の「局所的な」近似分解であるのに対し、AMGは「大域的な」スケールの誤差を除去するように設計されている。特に、弾性問題などで現れるスカラー拡散方程式とは異なる、複雑な連成や変形モードを持つ問題(例えば、ほぼ非圧縮性材料)に対して強力だ。Ansys Mechanicalでは、スパース直接ソルバーに代わるデフォルトの反復ソルバーとして、AMG前処理付きのCG法が採用されている。計算規模が大きい場合、直接法よりメモリと時間で大幅に優位になる。
Krylov部分空間法のソフトウェア比較
各CAEソフトウェアでの実装とデフォルト
Ansys、Abaqus、COMSOLといった主要ソフトでは、Krylov法はどのように実装され、ユーザーはどこまで設定をいじれるんですか?
各社とも高度にチューニングされたソルバーライブラリ(PETSc, Trilinos, 自社開発)を採用しているが、露出度はソフトにより異なる。
CFDソフトでは事情が違いますか?OpenFOAMのようなオープンソースではどうなっていますか?
大きく違う。CFDでは圧力-速度連成のため、非対称行列が中心となり、GMRESやBi-CGSTABが主力だ。
Krylov部分空間法のトラブル対応
収束しない・遅い場合の対策
反復ソルバーが全然収束しない、または「収束失敗」でエラーになることがあります。最初にチェックすべきポイントは何ですか?
以下の順で確認する。
モデルとメッシュは問題なさそうなのに、収束が遅いです。前処理を変えるべきですか?
そうだ。まずは前処理の「強度」を上げてみる。例えば、ILU(0)からILU(1)やILUTに変更し、Fill-inの許容量やしきい値を緩和する。AnsysのAMG前処理なら、「緩和タイプ」を「ガウス・ザイデル」からより強力な「SOR」や「チェビシェフ多項式」に変える。ただし、前処理自体の計算コストとメモリは増えるので、トレードオフを考える必要がある。
「NaN(非数)」や「無限大」がソルバーから報告されることがあります。これはKrylov法特有の問題ですか?
直接法より反復法で起こりやすい。原因は主に二つ。
反復ソルバーを使うと、直接法と比べて結果が微妙に違うことがあります。これは許容範囲の誤差なんですか?
収束許容値が十分に厳しければ(例えば1e-8以下)、直接法との差は無視できるレベルだ。しかし、許容値を1e-4などの緩い値に設定していると、特に感度の高い量(応力集中部の最大応力、流体力学的な抗力係数)に数%の差が出ることがある。重要なのは、関心ある物理量が収束許容値に対して「収束」しているかを確認することだ。許容値を1e-4, 1e-5, 1e-6と段階的に厳しくし、結果が変わらなくなるポイントを見つければ、その結果は信頼できる。それが「グリッド依存性試験」ならぬ「ソルバー収束性試験」だ。
関連トピック
なった
詳しく
報告