Wdrożyłem solver wielosiatkowy V-Cycle przy użyciu zarówno liniowej korekcji defektów (LDC), jak i pełnego schematu aproksymacji (FAS).
Mój problem jest następujący: przy użyciu LDC reszta jest zmniejszana o współczynnik ~ 0,03 na cykl. Implementacja FAS również jest zbieżna z czynnikiem liniowym, ale współczynnik ten wynosi tylko ~ 0,58. Zatem FAS potrzebuje około 20 razy więcej cykli.
Większość kodu jest współdzielona, jedyną różnicą są obliczenia w dół / w górę, których używa LDC
dół:
w górę:
i wykorzystuje FAS
dół:
w górę:
Moje ustawienie testowe pochodzi z „A Multigrid Tutorial, Second Edition”, str. 64, ma rozwiązanie analityczne
z
a równanie , wykorzystując typowy liniowy szablon 5 punktów jako Laplace'a-Operator . Początkowe domysły to .
Zmiana ustawienia testu, np. Na trywialne przy początkowym zgadywaniu daje prawie takie same współczynniki konwergencji.
Ponieważ różni się tylko kod w dół / w górę, wyniki LDC są zgodne z książką, a FAS przynajmniej wydaje się działać, nie mam pojęcia, dlaczego jest tak wolniejszy w tym samym ustawieniu liniowym.
Jest jedno dziwne zachowanie zarówno w LDC, jak i FAS, którego nie mogę jeszcze wyjaśnić, a dzieje się tak tylko wtedy, gdy początkowe zgadywanie jest złe (np. ale również w moich pełnych eksperymentach z wieloma siatkami, w których interpolacja do nowej drobnej siatki zwiększa resztę z do ): Jeśli zwiększę liczbę relaksacji po korekcie do bardzo dużej liczby, tak że rozwiązanie zostanie rozwiązane z precyzją maszynową na grubej siatce, traci prawie wszystkie cyfry przy przejściu o jeden krok w górę do następnej drobnej siatki.
Ponieważ zdjęcie mówi więcej niż słowa:
// 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)
Nie jestem pewien, czy można uzyskać tylko kilka cyfr na cykl, czy też oznacza to błąd podczas interpolacji do dokładnej siatki. Jeśli tak jest w tym drugim przypadku, w jaki sposób LDC może osiągnąć ustalone przez księgę współczynniki resztkowe ~ 0,03, stosując zawsze 2 relaksacje?