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?
Si vous utilisez une discrétisation centrée sur les sommets, la restriction d'état doit être l'injection plutôt que la restriction résiduelle pondérée que vous semblez utiliser. Autrement dit, remplacez par lors de la restriction de l'état. L'utilisation d'une restriction pondérée pour l'état produit un aliasing des composants haute fréquence de l'état qui, après l'application de génère un nouveau bruit à la même échelle qu'auparavant la correction grossière (les conditions aux limites sont particulièrement responsables de cet effet). Utilisez l'injection, , et ce problème devrait disparaître.I H h u h ← u h ( u H - I H h u h ) I H h u hIHh I^Hh uh←uh(uH−IHhuh) I^Hhuh
Spectralement, la restriction d'état ne nécessite qu'un ordre secondaire élevé (conservation précise des basses fréquences), mais l'ordre primaire (repliement des hautes fréquences) n'a pas d'importance. L'injection a un ordre primaire 0 et un ordre secondaire infini. Pendant ce temps, la restriction résiduelle doit être à la fois d'ordre primaire et secondaire pour être positive (au moins). Voir la section 4.3 du guide multigrille d' Achi Brandt .
Lors de la conception de méthodes MG, il est également bon de regarder les erreurs plutôt que les résidus et de vous assurer que vous pondérez la norme de manière appropriée.
la source
la source