Was kann schief gehen, wenn mit vorkonditionierten Krylov-Methoden von KSP ( dem linearen Lösungspaket von PETSc ) ein spärliches lineares System gelöst wird, wie es durch Diskretisierung und Linearisierung partieller Differentialgleichungen erhalten wird?
Welche Schritte kann ich unternehmen, um festzustellen, was bei meinem Problem schief läuft?
Welche Änderungen kann ich vornehmen, um mein lineares System erfolgreich und effizient zu lösen?
petsc
Tag. Die Methodik ist allgemein gehalten, aber ich denke, die Antwort wäre weniger nützlich, wenn bei jedem "Versuch dies" nicht auch das "Wie" enthalten wäre. Alternativ müsste das "Wie" viel länger (und für den Betrachter fehleranfälliger) sein, wenn es softwareagnostisch erklärt werden müsste . Wenn jemand erklären möchte, wie man all diese Dinge mit einem anderen Paket macht, werde ich die Frage gerne softwareagnostisch stellen und meine Antwort dahingehend ändern, dass sie beschreibt, was in PETSc zu tun ist. Hinweis: Ich habe dies hinzugefügt, was eine erweiterte Version einer FAQ ist, damit ich Leute auf diese Site lenken kann.Antworten:
Erstberatung
-ksp_converged_reason -ksp_monitor_true_residual
wenn Sie herausfinden möchten, warum eine Methode nicht konvergiert.-ksp_view_binary
oderMatView()
speichern. Verwenden Sie dann den Code unter$PETSC_DIR/src/ksp/ksp/examples/tutorials/ex10.c
, um die Matrix einzulesen und zu lösen (möglicherweise mit einer anderen Anzahl von Prozessen). Dies erfordert eine zusammengesetzte Matrix, so dass ihre Nützlichkeit etwas eingeschränkt sein kann.Häufige Gründe dafür, dass KSP nicht konvergiert
-pc_type svd -pc_svd_monitor
. Versuchen Sie auch einen direkten Löser mit-pc_type lu
(z-pc_type lu -pc_factor_mat_solver_package superlu_dist
. B. über ein Drittanbieterpaket ).KSPSetNullSpace()
.KSPSetNullSpace()
wurden verwendet, aber die rechte Seite ist nicht konsistent. Sie müssen möglicherweiseMatNullSpaceRemove()
auf der rechten Seite anrufen, bevor Sie anrufen könnenKSPSolve()
.-ksp_gmres_restart 1000 -pc_type none
. Versuchen Sie es bei einfachen Sattelpunktproblemen-pc_type fieldsplit -pc_fieldsplit_type schur -pc_fieldsplit_detect_saddle_point
. Weitere Informationen finden Sie im Benutzerhandbuch und auf der PCFIELDSPLIT-Manpage . Lesen Sie bei schwierigeren Problemen die Literatur, um zuverlässige Methoden zu finden, und fragen Sie hier (oder[email protected]
oder[email protected]
), ob Sie Tipps zur Implementierung dieser Methoden benötigen . Sehen Sie sich diese Frage zum Beispiel für hochfrequentes Helmholtz an. Sehen Sie bei bescheidenen Problemgrößen nach, ob Sie nur mit einem direkten Löser leben können.-pc_type asm -sub_pc_type lu
die Konvergenzrate verbessert. Wenn GMRES beim Neustart zu viel Fortschritt verliert, prüfen Sie, ob ein längerer Neustart hilft-ksp_gmres_restart 300
. Wenn eine Transponierte verfügbar ist, versuchen Sie-ksp_type bcgs
oder andere Methoden, die keinen Neustart erfordern. (Beachten Sie, dass die Konvergenz mit diesen Methoden häufig fehlerhaft ist.)-pc_type lu
oder parallel mit einem Paket eines Drittanbieters (z . B.-pc_type lu -pc_factor_mat_solver_package superlu_dist
odermumps
). Die Methode sollte in einer Iteration konvergieren, wenn die Matrizen identisch sind, und ansonsten in einer "kleinen" Anzahl von Iterationen. Versuchen Sie-snes_type test
, die Matrizen zu überprüfen, wenn Sie ein nichtlineares Problem lösen.-ksp_type fgmres or -ksp_type gcr
.-pc_mg_galerkin
, einen korrekt skalierten Groboperator algebraisch zu konstruieren, oder stellen Sie sicher, dass alle Gleichungen auf die gleiche Weise skaliert sind, wenn Sie rediskretisierte Grobstufen verwenden möchten.-ksp_diagonal_scale -ksp_diagonal_scale_fix
. Ändern Sie möglicherweise die Formulierung des Problems, um freundlichere algebraische Gleichungen zu erhalten. Wenn Sie die Skalierung nicht korrigieren können, müssen Sie möglicherweise einen direkten Löser verwenden.-mat_mffd_type ds
. B. ). Versuchen Sie es mit höherer Präzision, um die Differenzierung genauer zu machen./configure --with-precision=__float128 --download-f2cblaslapack
. Überprüfen Sie, ob es in "einfacheren" Parameterregimen konvergiert.-ksp_gmres_modifiedgramschmidt
oder verwenden Sie eine Methode, die anders orthogonalisiert, z-ksp_type gcr
.quelle
Mein Rat an die Schüler ist, in diesen Fällen einen direkten Löser zu versuchen. Der Grund ist, dass es zwei Klassen von Gründen gibt, warum ein Löser möglicherweise nicht konvergiert: (i) die Matrix ist falsch, oder (ii) es liegt ein Problem mit dem Löser / Vorkonditionierer vor. Direktlöser liefern fast immer etwas, das Sie mit der erwarteten Lösung vergleichen können. Wenn die Antwort des Direktlösers also richtig aussieht, wissen Sie, dass das Problem mit dem iterativen Löser / der iterativen Vorbedingung zusammenhängt. Wenn die Antwort jedoch falsch aussieht, besteht das Problem darin, die Matrix und die rechte Seite zusammenzusetzen.
Ich verwende normalerweise nur UMFPACK als direkten Löser. Ich bin mir sicher, dass es einfach ist, mit PETSC etwas Ähnliches zu versuchen.
quelle
-pc_type lu -pc_factor_mat_solver_type umfpack
UMFPACK (oder-pc_type cholesky -pc_factor_mat_solver_package cholmod
bei SPD-Problemen) über PETSc verwenden, beachten Sie jedoch, dass UMFPACK und CHOLMOD seriell sind. Für parallele, Verwendung-pc_factor_mat_solver_package superlu_dist
odermumps
,pastix
,spooles
.superlu_dist
wäre-ksp_type preonly -pc_type lu -pc_factor_mat_solver_package superlu_dist
. Ist das richtig?