Wie kann ich das Schur-Komplement in PETSc berechnen?

8

Wie kann ich das Schur-Komplement berechnen:

S.=K.bb- -K.beinK.einein- -1K.einb

wo

K.=(K.eineinK.einbK.beinK.bb)

(in einiger Reihenfolge) ist eine PETSc-Matrix ( Mat)?

Peter Brune
quelle

Antworten:

13

Die Berechnung des Schur-Komplements einer Matrix ist sehr teuer und wird in der Praxis nur sehr selten benötigt. PETSc empfiehlt dringend, Algorithmen zu vermeiden, die dies benötigen. Das Schur-Komplement einer Matrix (dicht oder dünn) ist im Wesentlichen immer dicht. Beginnen Sie also mit:

  • Bilden einer dichten Matrix ,K.bein
  • Erstellen Sie auch eine weitere dichte Matrix derselben Größe.T.
  • Faktorisieren Sie dann entweder die Matrix direkt mit oder oder verwenden Sie gefolgt von gefolgt von, wenn Sie ein externes Solver-Paket wie SuperLU_Dist verwenden möchten. Rufen Sie das Ergebnis auf .K.eineinMatLUFactor()MatCholeskyFactor()MatGetFactor()MatLUFactorSymbolic()MatLUFactorNumeric()A
  • Dann ruf an MatMatSolve(A,Kba,T).
  • Dann ruf an MatMatMult(Kab,T,MAT_INITIAL_MATRIX,1.0,&S).
  • Rufen Sie jetzt an MatAXPY(S,-1.0,Kbb,MAT_SUBSET_NONZERO).
  • gefolgt von MatScale(S,-1.0)

Für die Berechnung solcher Schur-Komplemente ist es nicht sinnvoll, die KSPiterativen Löser zu verwenden, da die Lösung vieler Probleme mittlerer Größe mit einer direkten Faktorisierung viel schneller ist als mit iterativen Lösern. Wie Sie sehen, erfordert dies viel Arbeitsraum und Rechenaufwand, sodass dies am besten vermieden wird. Es ist jedoch nicht erforderlich, das Schur-Komplement zusammenzusetzen, um Systeme damit zu lösen. Verwenden Sie diese Option , um eine Matrix zu erstellen, die die Aktion (Verwenden zum Lösen mit ) anwendet , sich jedoch nicht zusammensetzt.S.MatCreateSchurComplement(Kaa,Kaa_pre,Kab,Kba,Kbb,&S)SKaa_preKaa

Wenn Sie alternativ bereits eine Blockmatrix (in einer bestimmten Reihenfolge), können Sie dies Erstellen Sie Indexsätze ( ) isa und isb, um jeden Block zu adressieren, und erstellen Sie dann das Schur-Komplement und / oder eine für die Vorkonditionierung geeignete Näherung. Da im Allgemeinen dicht ist, können Standardvorkonditionierungsmethoden normalerweise nicht direkt auf Schur-Komplemente angewendet werden. Es gibt viele Ansätze zur Vorkonditionierung von Schur-Komplementen, einschließlich der Verwendung der EINFACHEN Näherung , um eine spärliche Matrix zu erstellen, die sich der Schur-Komplement (dies wird standardmäßig für die optionale "Vorkonditionierungs" -Matrix in zurückgegeben ).

K.=(K.eineinK.einbK.beinK.bb)
ISMatGetSchurComplement()S.K.bb- -K.beindiag(K.einein)- -1K.einbMatGetSchurComplement()

Eine andere Alternative besteht darin, die Matrizen als Differentialoperatoren zu interpretieren und ungefähre Kommutatorargumente anzuwenden, um eine spektral äquivalente Operation zu finden, die effizient angewendet werden kann (siehe die "PCD" -Vorkonditionierer von Elman, Silvester und Wathen). Eine Variante davon ist der Kommutator der kleinsten Quadrate, der eng mit der Moore-Penrose-Pseudoinverse verwandt ist und in PCLSCdem Matrizen vom Typ verarbeitet werden MATSCHURCOMPLEMENT.

Sean Farley
quelle
2
Ich halte diese Antwort für zu pessimistisch, da die Gefahr besteht, dass eine geklärte Frage erneut geöffnet wird. Ich denke, die Berechnung eines Schur-Komplements kann unter bestimmten Umständen sinnvoll sein (insbesondere Substrukturierung / Domänenzerlegung), und es gibt andere Algorithmen, die sie mit geringerer zeitlicher Komplexität berechnen können als hier beschrieben. Inspiration finden Sie unter scicomp.stackexchange.com/questions/28934 .
rchilton1980