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?