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?
Jeśli używasz dyskretyzacji zorientowanej na wierzchołki, wówczas ograniczeniem stanu powinno być zastrzyk, a nie pełne ograniczenie resztkowe, które wydaje się stosować. Oznacza to, że zastąpi z gdy ograniczenie stanu. Zastosowanie pełnego ważenia ograniczenia dla stanu powoduje aliasing składowych wysokiej częstotliwości stanu, który po zastosowaniu powoduje powstanie nowego szumu na taką samą skalę jak poprzednio zgrubna korekta (warunki brzegowe są szczególnie prawdopodobnymi winowajcami tego efektu). Użyj zastrzyku, , a ten problem powinien zniknąć.jaH.h ja^H.h uh←uh(uH.-jaH.huh) ja^H.huh
Widmowo, ograniczenie stanu wymaga jedynie wysokiego rzędu wtórnego (dokładne zachowanie niskich częstotliwości), ale pierwotny porządek (aliasing wysokich częstotliwości) nie ma znaczenia. Zastrzyk ma pierwotny rząd 0 i nieskończony rząd wtórny. Tymczasem ograniczenie resztkowe musi być zarówno pierwotne, jak i wtórne, aby było dodatnie (przynajmniej). Zobacz rozdział 4.3 Przewodnika po wielu sieciach Achi Brandta .
Projektując metody MG, dobrze jest również spojrzeć na błąd, a nie na pozostałości, i upewnić się, że odpowiednio wyważasz normę.
źródło
Rozwiązałem teraz problem. I przechowywano , gdy spada podczas V cyklu ponownego wykorzystania później wuH.o l d=jaH.huh
Problem polegał na tym, zanim ponownie zszedłem z do , był zrelaksowany na miejscu . Przechowywanie kopii przed etapami relaksacji pomogło. Ponieważ był wymagany tylko w FAS, nie pojawił się w obliczeniach liniowych.H. 2 godz uH.o l d uH.o l d
źródło