Ich habe einen V-Cycle-Multigrid-Solver implementiert, der sowohl eine lineare Fehlerkorrektur (LDC) als auch ein vollständiges Approximationsschema (FAS) verwendet.
Mein Problem ist folgendes: Bei Verwendung von LDC wird der Rest um einen Faktor von ~ 0,03 pro Zyklus reduziert. Die FAS-Implementierung konvergiert zwar auch mit einem linearen Faktor, der Faktor beträgt jedoch nur ~ 0,58. Somit benötigt FAS etwa die 20-fache Anzahl von Zyklen.
Der größte Teil des Codes wird gemeinsam genutzt. Der einzige Unterschied besteht in den von LDC verwendeten Down / Up-Berechnungen
unten:
up:
und FAS verwendet
unten:
up:
Meine Testeinstellung stammt aus Briggs "A Multigrid Tutorial, Second Edition", S. 22. 64, hat die analytische Lösung
mit
Da sich nur der Down / Up-Code unterscheidet, die LDC-Ergebnisse dem Buch entsprechen und das FAS zumindest auch zu funktionieren scheint, habe ich keine Ahnung, warum es in derselben linearen Einstellung so viel langsamer ist.
Da ein Bild mehr sagt als Worte:
// first cycle, levels 0-4
// DOWN
VCycle top 4, start res_norm 3.676520e+02 // initial residual
VCycle top 4, cycle 0, current 4, res_norm 3.676520e+02
VCycle top 4, cycle 0, current 4, res_norm 1.520312e+02 // relaxed (2 iterations)
VCycle tau_norm 2.148001e+01 (DEBUG calculation)
VCycle top 4, cycle 0, current 3, res_norm 1.049619e+02 // restricted
VCycle top 4, cycle 0, current 3, res_norm 5.050392e+01 // relaxed (2 iterations)
VCycle top 4, cycle 0, current 2, res_norm 3.518764e+01 // restricted
VCycle top 4, cycle 0, current 2, res_norm 1.759372e+01 // relaxed (2 iterations)
VCycle top 4, cycle 0, current 1, res_norm 1.234398e+01 // restricted
VCycle top 4, cycle 0, current 1, res_norm 4.728777e+00 // relaxed (2 iterations)
VCycle top 4, cycle 0, current 0, res_norm 3.343750e+00 // restricted
// coarsest grid
VCycle top 4, cycle 0, current 0, res_norm 0.000000e+00 // solved
// UP
VCycle top 4, cycle 0, current 1, res_norm 3.738426e+00 // prolonged
VCycle top 4, cycle 0, current 1, res_norm 0.000000e+00 // relaxed (many iterations)
VCycle top 4, cycle 0, current 2, res_norm 1.509429e+01 // prolonged (loosing digits)
VCycle top 4, cycle 0, current 2, res_norm 2.512148e-15 // relaxed (many iterations)
VCycle top 4, cycle 0, current 3, res_norm 4.695979e+01 // prolonged (loosing digits)
VCycle top 4, cycle 0, current 3, res_norm 0.000000e+00 // relaxed (many iterations)
VCycle top 4, cycle 0, current 4, res_norm 1.469312e+02 // prolonged (loosing digits)
VCycle top 4, cycle 0, current 4, res_norm 9.172812e-24 // relaxed (many iterations)
Ich bin mir nicht sicher, ob pro Zyklus nur wenige Stellen gewonnen werden können oder ob dies auf einen Fehler bei der Interpolation in das feine Gitter hinweist. Wenn es der letztere Fall ist, wie kann der LDC die Restverhältnisse von ~ 0,03 erreichen, wenn immer 2 Relaxationen verwendet werden?
Spektral erfordert die Zustandsbeschränkung nur eine hohe sekundäre Ordnung (genaue Erhaltung niedriger Frequenzen), aber die primäre Ordnung (Aliasing hoher Frequenzen) spielt keine Rolle. Die Injektion hat die Primärordnung 0 und die unendliche Sekundärordnung. In der Zwischenzeit muss die Restrestriktion sowohl in der Primär- als auch in der Sekundärordnung positiv sein (zumindest). Siehe Abschnitt 4.3 des Achi Brandt Multigrid Guide .
Beim Entwerfen von MG-Methoden ist es auch gut, Fehler anstelle von Residuen zu betrachten und sicherzustellen, dass Sie die Norm angemessen gewichten.
quelle
quelle