J'ai implémenté un solveur multigrille V-Cycle utilisant à la fois une correction de défaut linéaire (LDC) et un schéma d'approximation complète (FAS).
Mon problème est le suivant: En utilisant LDC, le résidu est réduit d'un facteur de ~ 0,03 par cycle. L'implémentation FAS converge également avec un facteur linéaire, mais le facteur n'est que de ~ 0,58. Ainsi, le SAF a besoin d'environ 20 fois le nombre de cycles.
La plupart du code est partagé, la seule différence réside dans les calculs vers le haut / vers le bas, les PMA utilisent
bas:
en haut:
et FAS utilise
vers le bas:
up:
Mon paramètre de test est tiré de "A Multigrid Tutorial, Second Edition" de Brigg, p. 64, a la solution analytique
avec
et l'équation est à l' aide du pochoir linéaire typique de 5 points en tant que l' opérateur de Laplace- . La supposition initiale est .L v = 0
La modification du paramètre de test, par exemple vers le trivial utilisant une estimation initiale de entraîne presque les mêmes facteurs de convergence.
Étant donné que seul le code bas / haut diffère, les résultats LDC sont conformes au livre et le FAS semble au moins fonctionner aussi, je n'ai aucune idée pourquoi il est tellement plus lent dans le même cadre linéaire.
Il y a un comportement étrange dans les PMA et le SAF que je ne peux pas encore expliquer qui ne se produit que si la supposition initiale est mauvaise (par exemple mais aussi dans mes expériences multigrilles complètes où l'interpolation vers la nouvelle grille fine augmente le résiduel de à ): Si j'augmente le nombre de relaxations de post-correction à un nombre très élevé de telle sorte que la solution soit résolue à la précision de la machine sur la grille grossière, il perd presque tous les chiffres lorsque vous montez d'un cran à la prochaine grille fine.
Puisqu'une image en dit plus que des mots:
// 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)
Je ne sais pas s'il ne peut y avoir que quelques chiffres gagnés par cycle ou si cela indique une erreur lors de l'interpolation à la grille fine. Si c'est le dernier cas, comment le PMA peut-il atteindre les ratios résiduels de ~ 0,03 en utilisant toujours 2 relaxations?