前提条件、たとえばMは、システム行列(たとえばA)の近似であり、問題を改善された固有値スペクトルを持つ別の問題に変更します。完全な前処理は、Aの逆、つまりinv(M)= Aになります。
残念ながら、この逆行列は通常利用できず、計算が複雑すぎて、因数分解中に導入されたフィルインのために格納するためにより多くのスペースが必要であり、丸め誤差も発生する可能性があります。したがって、プレコンディショナーは、計算と適用が簡単で、しかも効果的でなければなりません。
JacobiやGauss-Seidel(またはSOR)のような基本的な前処理の他に、最もよく使われる前処理の1つはILU(対称問題のIC-システムまたは非対称のCFDで作業している)です。
前提条件子の選択は通常、問題によって異なります。ILUにはILUT、ILUS、MILUなどの多くのバリアントがあります。最後に追加した文献を参照できます。軽度の難しさの問題ではILU(0)を使用できますが、問題が難しくなるにつれて、つまりレイノルズ数がより多くのフィルイン(例:ILU(1))を増やし、しきい値戦略(ILUT)を使用する必要があります。問題は、ILUの高度な使用には、より多くのメモリと、現在のシステムマトリックスとは異なるスパースパターンの決定が必要であることです。この場合、スパリティパターンを最初にシンボリックに、後で数値的に計算する必要があります。
計算作業を減らすためのいくつかのアイデアがあります。
- 線形システムが変化した場合でも前処理を再計算することを回避する、遅延前処理の使用。
- フラックス分割アルゴリズムで効率的に実装できる前提条件子のようなLU-SGSの使用。
- マトリックスフリーの方法の使用-私の博士課程の研究で私が好んだ方法。ヤコビアンが不要なNewton-Krylovソルバーは、通常は低次近似で、おそらくカラーベースのアルゴリズムで計算される前提条件子を想定しています(ただし、非構造化問題ではより困難です)。
- ラプラシアンのような拡散演算子のみを使用し、対流項を回避します(反復回数を減らすのに効率的ではありません)
- マルチグリッド。グリッド階層でw-JacobiやSORなどの単純なスムーザーを使用します。構造化されていない問題の場合は、幾何学的ではなく代数的マルチグリッド(AMG)を使用する必要があります。
- その他多数(私のエントリ数に10を掛ける)。
問題は非対称であるため、主に2つのソルバー、GMRESまたはBiCGStabを使用します。(QMRまたはTFQMRは他の代替手段ですが、そのパフォーマンスはこれら2つより低いと思います)。GMRESは通常、保存されたベクトルが原因でまだストレージの問題がない場合は、より良いソルバーです。再起動が必要です。これは、プレコンディショナーが不十分であるか、非常に大きなDOFがある場合の問題です。BiCGStabに必要なのは4つのMatrix-Vector製品だけです。これは大きな問題には適していますが、通常はGMRESよりも劣ります。(私はGMRESを好みましたが、BiCGStabがとても好きです!)
この前提条件、線形ソルバーの問題はすべて非常に複雑です。いくつかの本を読むことをお勧めします。あなたの出発点は線形システムの解決のためのテンプレートである必要がありますこれは無料の本です。この本では、スタンドアロンソルバーとしてのスムーザーとクリロフソルバーの前提条件子の両方について説明します。Yousef Saadの「スパース線形システムの反復法」を参照することもできます。それはあなたの機関の図書館で決定的です。初版もこちらから入手できます。
結論前に、私はのようなフレームワークを見てすることをお勧めいたしますPetsc、TrilinosあるいはHypreともによって提供されるファイル1。彼らはいくつかのプログラミングで前提条件を提供します。実際に提供する書籍は他にもありますが、Ke Chenの「Matrix Preconditioning Techniques and Applications」もご覧ください。本にはMatlabコードが含まれています。
あなたの旅で頑張ってください、あなたはそれを必要とするでしょう。