Verwendung des algebraischen Multigrids zur Vorkonditionierung von Konvektionsdiffusionsoperatoren

8

Ich habe einen Navier Stokes implementiert, der auf FEM-Diskretisierung und PETSc basiert, um das lineare Gleichungssystem zu lösen. Um ein effizientes Lösungsverfahren zu erstellen, folge ich dem Artikel "Effiziente Vorkonditionierung der linearisierten Navier-Stokes-Gleichungen für inkompressiblen Fluss" (Silvester et al.), Der einen Schur-Komplement-Ansatz vorschlägt. Es funktioniert ganz gut in dem Sinne, dass ich eine nahezu konstante Anzahl von Iterationen unabhängig von Maschengröße und Zeitschritt für die einfachen Benchmarks habe, die auch in diesem Artikel vorgestellt werden (2D-gesteuerter Hohlraumfluss und rückwärts gerichteter Schritt). Aber im Moment löse ich den oberen Geschwindigkeitsblock mit einem parallelen Direktlöser (MUMPS). Der Druck-Schur-Block wird mit ungenauen Lösern gelöst, wie in der Veröffentlichung vorgeschlagen.

In der Arbeit schlagen die Autoren vor, in jeder äußeren Iteration einen einzelnen Multigrid-V-Zyklus durchzuführen und einen Punkt-Gauß-Seidel-Glätter zu verwenden, um die Umkehrung dieses diskreten Konvektionsdiffusionsoperators zu approximieren. Da ich eine geometrische Multigrid-Methode nicht einfach verwenden kann, dachte ich, den direkten Löser durch einen algebraischen Multigrid-V-Zyklus (Bumeramg aus dem Hypre-Paket) zu ersetzen. Aber dann verliere ich die konstante Anzahl von Iteraten, während ich das Netz feiner mache.

Hat jemand von euch eine Idee, wie man einen spektral äquivalenten und effizienten Vorkonditionierer für die Inverse der Geschwindigkeitsmatrizen basierend auf algebraischem Multigrid erstellt? Gibt es etwas inhärentes, das es in diesem Fall nicht erlaubt, algebraisches Multigrid zu verwenden? Wenn nicht, was könnte die Ursache für den Verlust der konstanten Iterationsskalierung sein?


Bearbeiten:

Ich habe einige Benchmarks für verschiedene Löser des Geschwindigkeitsblocks hinzugefügt. Das Problem, das gelöst wird, ist der standardmäßige 2D-gesteuerte Hohlraumfluss, die Diskretisierung mit Taylor-Hood und eine einheitliche Verfeinerung des Gerätekastens

Exakt-Löser (MUMPS)

h=132 : 25 iter : 25 iter : 25 iter : 22 iterh=164h=1128h=1256

ein V-AMG (algebraisch, Bumeramg)

h=132 : 30 iter : 30 iter : 39 iter : 48 iterh=164h=1128h=1256

FGMRES mit Vorkonditionierer V-AMG (algebraisch, Boomeramg), RTOL:106

h=132 : 30 iter : 29 iter : 30 iter : 47 iterh=164h=1128h=1256

FGMRES mit Vorkonditionierer V-AMG (algebraisch, Bumeramg), Atol:10- -8

h=132 : 27 iter : 27 iter : 28 iter : 26 iterh=164h=1128h=1256

Thomas W.
quelle

Antworten:

2

Sie haben den exakten (direkten) Löser oben links durch einen ersetzt, bei dem Sie nur einen einzigen V-Zyklus ausführen. Der Weg zu gehen besteht darin, den oberen linken Block in Ihrem Vorkonditionierer mit einem iterativen Löser (z. B. GMRES) zu lösen, wobei der V-Zyklus-AMG als Vorkonditionierer für diesen inneren Löser verwendet wird. Die Erfahrung zeigt, dass der innere GMRES-Löser nicht besonders genau sein muss, wenn Sie F-GMRES als äußeren Löser verwenden. Gerade genau genug, um eine nahezu konstante Anzahl äußerer Iterationen zu erhalten.

Wolfgang Bangerth
quelle
Ich folgte Ihrem Vorschlag und machte einige Tests mit dem Ersetzen des exakten Lösers durch ein fgmres (ich denke, man muss auch den flexibalen variante von gmres als inneren Löser verwenden, da sich Multigrid nicht als linearer Operator verhalten sollte) mit V-AMG als Vorkonditionierer . Ich habe die Ergebnisse zu meiner obigen Frage hinzugefügt. Wie Sie sehen, erhalte ich die gleichen Ergebnisse, wenn ich den einen V-Zyklus durch einen Löser mit relativer Toleranz ersetze. Nur wenn der innere Löser mit einer absoluten Toleranz ausgeführt wird, wird die äußere Iteration konstant zum Preis einer zunehmenden Anzahl innerer Iterationen.
Thomas W.
Ich habe das Problem gefunden! Überraschenderweise lag das Problem nicht an einer schlechten spektralen Approximation des Konvektions-Diffusions-Operators, sondern an einem Fehler, den ich im Schur-Komplement-Teil gemacht habe. Selbst ein V-Zyklus ist für den Geschwindigkeitsblock in Ordnung, und der Löser benötigt unabhängig von der Maschengröße 10 Iterationen pro Zeitschritt.
Thomas W.
Froh zu hören. Ihre Ergebnisse stimmen
Wolfgang Bangerth