警告
サドルポイントの問題を解決するには、明確な問題よりも多くの選択肢が必要です。また、失敗する可能性のあるものがたくさんあります。すべてのレベルのモニターを使用して収束をデバッグし、補助演算子が特異な場合にヌルスペースが正しく処理されるようにし(通常は一定のヌルスペース)、前提条件が安定するようにします。これらのテクニックはこの質問で議論されます。
サドルポイントの問題を解決する
ユーザーマニュアルのブロック行列の解決に関するセクションから開始できます。ストークスのような問題の場合、PCFIELDSPLITを使用してSchur補数前提条件を作成できます。
-pc_type fieldsplit -pc_fieldsplit_type schur -pc_fieldsplit_detect_saddle_point
これは、Schur補数()の最小二乗コミュテーター前提条件と組み合わせることができます-fieldsplit_1_pc_type lsc
。それは一般的で-fieldsplit_1_ksp_type preonly
あり、外側の反復がほとんどの作業を行うようにします。このように使用すると、ブロック三角形のバリアントが一般的-pc_fieldsplit_schur_fact_type upper
です。
ソルバーの構成の詳細は、ペーパー (preprint)のオプションoptionsを使用して見つけることができます。これは、マルチグリッドをブロック分解(マルチグリッド内にフィールド分割する)での通勤についても説明しています。
多くの問題では、フィールド分解とSchur補完の前提条件をカスタマイズする必要があります。これらの多くは補助演算子を必要とします。たとえば、Elmanらの「圧力対流拡散」(PCD)法では、圧力空間での補助演算子の離散化が必要です。この目的のために、PCSHELLの例を参照してください。