He implementado un solucionador multigrid V-Cycle utilizando una corrección de defectos lineales (LDC) y un esquema de aproximación completa (FAS).
Mi problema es el siguiente: con LDC, el residuo se reduce en un factor de ~ 0.03 por ciclo. La implementación de FAS también converge con un factor lineal, pero el factor es solo ~ 0.58. Por lo tanto, FAS necesita aproximadamente 20 veces el número de ciclos.
La mayor parte del código se comparte, la única diferencia son los cálculos descendentes / ascendentes, LDC utiliza
abajo:
arriba:
y FAS utiliza
abajo:
arriba:
Mi configuración de prueba es de "A Multigrid Tutorial, Second Edition" de Brigg, pág. 64, tiene la solución analítica
con
y la ecuación es usando el típico lineal stencil de 5 puntos como el Laplace-operador L . La suposición inicial es v = 0 .
Cambiar la configuración de la prueba, por ejemplo, al trivial usando una suposición inicial de v = 1 da como resultado casi los mismos factores de convergencia.
Dado que solo el código down / up es diferente, los resultados de LDC cumplen con el libro y el FAS al menos parece funcionar también, no tengo idea de por qué es mucho más lento en la misma configuración lineal.
Hay un extraño comportamiento, tanto en los PMA y FAS que no puedo explicar todavía que sólo ocurre si la conjetura inicial es mala (por ejemplo, , sino también en mis experimentos multigrid completos donde la interpolación de la nueva rejilla fina aumenta el residual de 10 - 15 a 10 - 1 ): Si aumento de número de relajaciones de corrección de colocar a un número muy elevado de tal manera que la solución se resuelve con precisión de la máquina en la malla gruesa, pierde casi todos los dígitos cuando se va un paso hasta la próxima rejilla fina.
Como una imagen dice más que palabras:
// 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)
No estoy seguro de si solo puede haber unos pocos dígitos ganados por ciclo o si esto indica un error durante la interpolación a la cuadrícula fina. Si es el último caso, ¿cómo puede el LDC alcanzar las proporciones residuales de ~ 0.03 cuando se usan siempre 2 relajaciones?