回答:
行列のシューア補数を計算することは非常にコストがかかり、実際にはほとんど必要ありません。PETScは、それを必要とするアルゴリズムを回避することを強くお勧めします。行列のシュール補数(密または疎)は本質的に常に密であるため、次のことから始めます。
MatLUFactor()
MatCholeskyFactor()
MatGetFactor()
MatLUFactorSymbolic()
MatLUFactorNumeric()
A
MatMatSolve(A,Kba,T)
。MatMatMult(Kab,T,MAT_INITIAL_MATRIX,1.0,&S)
。MatAXPY(S,-1.0,Kbb,MAT_SUBSET_NONZERO)
。MatScale(S,-1.0)
Schur補数をこのように計算する場合、KSP
反復分解ソルバーを使用しても意味がありません。直接因数分解を使用して多くの中規模サイズの問題を解決する場合、反復ソルバーよりもはるかに高速だからです。ご覧のとおり、これには大量の作業スペースと計算が必要なので、回避するのが最善です。ただし、Schur補数を使用してシステムを解くために、を組み立てる必要はありません。を使用して(で解決するために使用)のアクションを適用するが、アセンブルしないマトリックスを作成するために使用します。MatCreateSchurComplement(Kaa,Kaa_pre,Kab,Kba,Kbb,&S)
S
Kaa_pre
Kaa
または、すでにブロック行列(ある順序で)がある場合、インデックスセット()isaとisb を作成して各ブロックをアドレス指定し、次に、を使用してシューア補数および/または事前調整に適した近似を作成します。以来、一般的に緻密で、標準的な前処理方法は、典型的にシューア相補体に直接適用することはできません。SIMR近似を使用して、Schur補数を事前調整して、 Schur補数(これは、のオプションの「前処理」行列に対してデフォルトで返されます)。
IS
MatGetSchurComplement()
MatGetSchurComplement()
別の方法は、行列を微分演算子として解釈し、近似交換子引数を適用して、効率的に適用できるスペクトル的に等価な演算を見つけることです(Elman、Silvester、およびWathenの「PCD」前提条件を参照)。これの変形は、最小二乗整流子であり、これはムーアペンローズ疑似逆PCLSC
行列に密接に関連しており、タイプの行列で動作するで使用できますMATSCHURCOMPLEMENT
。