Ho implementato un solutore multigrid V-Cycle utilizzando sia una correzione lineare dei difetti (LDC) sia uno schema di approssimazione completo (FAS).
Il mio problema è il seguente: usando LDC il residuo è ridotto di un fattore di ~ 0,03 per ciclo. L'implementazione FAS converge anche con un fattore lineare, ma il fattore è solo ~ 0,58. Pertanto la FAS ha bisogno di circa 20 volte il numero di cicli.
La maggior parte del codice è condiviso, l'unica differenza sono i calcoli down / up, che utilizza LDC
giù:
su:
e usi FAS
giù:
su:
La mia impostazione di prova è tratta da "A Multigrid Tutorial, Second Edition" di Brigg, p. 64, ha la soluzione analitica
con
e l'equazione è utilizzando il tipico lineare 5 punti stencil come Laplace-operatore . L'ipotesi iniziale è .L v = 0
Cambiando l'impostazione del test, ad es. Con la banale usando un'ipotesi iniziale di ottengono quasi gli stessi fattori di convergenza.v = 1
Poiché solo il codice down / up differisce, i risultati LDC sono conformi al libro e almeno il FAS sembra funzionare, non ho idea del perché sia molto più lento nella stessa impostazione lineare.
Esiste un comportamento strano sia in LDC che in FAS che non posso ancora spiegare che si verifica solo se l'ipotesi iniziale è negativa (ad esempio ma anche nei miei esperimenti multigrid completi in cui l'interpolazione con la nuova griglia fine aumenta il residuo da a ): se aumento il numero di rilassamenti post correzione a un numero molto elevato in modo tale che la soluzione sia risolta per la precisione della macchina sulla griglia grossolana, perde quasi tutte le cifre quando si sale di un gradino alla prossima griglia fine.10 - 15 10 - 1
Dal momento che un'immagine dice più delle parole:
// 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)
Non sono sicuro che si possano ottenere solo poche cifre per ciclo o se ciò indica un errore durante l'interpolazione alla griglia fine. Se si tratta di quest'ultimo caso, come può il LDC raggiungere i rapporti residui per libro di ~ 0,03 usando sempre 2 rilassamenti?