Hem doğrusal hata düzeltme (LDC) hem de tam yaklaşım şeması (FAS) kullanarak bir V-Cycle multigrid çözücü uyguladım.
Benim sorunum şu: LDC kullanarak artık döngü başına ~ 0.03 faktör azalır. FAS uygulaması da doğrusal bir faktörle yakınsar, ancak faktör sadece ~ 0.58'dir. Bu nedenle FAS, döngü sayısının yaklaşık 20 katına ihtiyaç duyar.
Kodun çoğu paylaşılır, tek fark aşağı / yukarı hesaplamalarıdır, LDC kullanır
aşağı:
yukarı:
ve FAS kullanımları
aşağı:
yukarı:
Test ayarım Brigg'in "A Multigrid Eğitimi, İkinci Baskı", s. 64, analitik çözümü vardır
ile
ve denklem Laplace-Operatörü olarak tipik doğrusal 5 noktalı şablon kullanılarak . İlk tahmin .
Test ayarının değiştirilmesi, örneğin başlangıçtaki tahmini kullanılarak önemsiz değerine dönüştürmek , neredeyse aynı yakınsama faktörleri ile sonuçlanır.
Sadece aşağı / yukarı kodu farklı olduğundan, LDC sonuçları kitaba uyuyor ve FAS en azından işe yarıyor gibi görünüyor, aynı lineer ayarda neden bu kadar yavaş olduğu konusunda hiçbir fikrim yok.
LDC ve FAS'ta açıklayamadığım tek bir garip davranış var, ancak bu sadece ilk tahmin kötü olduğunda gerçekleşir (örneğin ama aynı zamanda yeni ince ızgaraya enterpolasyonun kalıntıyı ila ): Çözüm kaba ızgaradaki makine hassasiyetine çözümlenecek şekilde düzeltme sonrası gevşeme sayısına çok yüksek bir sayıya yükselirsem, bir adım yukarı çıkarken neredeyse tüm basamakları kaybeder bir sonraki ince ızgaraya.
Bir resim kelimelerden daha fazlasını söylediğinden:
// 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)
Döngü başına yalnızca birkaç basamak kazanılıp kazanılamayacağından veya ince ızgaraya enterpolasyon sırasında bir hatayı gösterip göstermediğinden emin değilim. Eğer ikinci durum söz konusuysa, LDC her zaman 2 gevşeme kullanırken kitapta kalan ~ 0.03 kalıntı oranlarına nasıl ulaşabilir?