Eu implementei um solucionador multigrid do ciclo V usando uma correção linear de defeitos (LDC) e um esquema de aproximação total (FAS).
Meu problema é o seguinte: Usando o LDC, o resíduo é reduzido em um fator de ~ 0,03 por ciclo. A implementação do FAS também converge com um fator linear, mas o fator é apenas ~ 0,58. Assim, o FAS precisa de cerca de 20 vezes o número de ciclos.
A maior parte do código é compartilhada, a única diferença são os cálculos para baixo / para cima, o LDC usa
down:
up:
e FAS usa
down:
up:
Minha configuração de teste é do "A Multigrid Tutorial, Second Edition" de Brigg, p. 64, tem a solução analítica
com
e a equação é utilizando a matriz de 5 pontos típica linear como de Laplace-Operador . O palpite inicial é .L v = 0
Alterar a configuração de teste, por exemplo, para trivial usando uma estimativa inicial de resulta quase nos mesmos fatores de convergência.
Como apenas o código para baixo / para cima difere, os resultados do LDC estão em conformidade com o livro e o FAS pelo menos parece funcionar também, não sei por que é muito mais lento na mesma configuração linear.
Existe um comportamento estranho no LDC e no FAS que ainda não posso explicar que só acontece se o palpite inicial for ruim (por exemplo, mas também em minhas experiências multigrid completas, em que a interpolação para a nova grade fina aumenta o residual de a ): se eu aumentar o número de relaxações pós-correção para um número muito alto, de modo que a solução seja resolvida com precisão de máquina na grade grossa, ela perde quase todos os dígitos ao subir um passo para a próxima grade fina.
Como uma imagem diz mais que palavras:
// 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)
Não tenho certeza se pode haver apenas alguns dígitos ganhos por ciclo ou se isso indica um erro durante a interpolação para a grade fina. Se este for o último caso, como o LDC pode atingir proporções residuais de aproximadamente 0,03 quando usando sempre dois relaxamentos?