Multigrid FAS mais lento que a correção linear de defeitos?


9

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:vocêH: =0 0,bH: =EuhH(bh-euhvocêh)

up:vocêh: =vocêh+EuHhvocêH

e FAS usa

down:vocêH: =EuhHvocêh,bH: =EuhHbh+euHEuhHvocêh-EuhHeuhvocêh

up:vocêh: =vocêh+EuHh(vocêH-EuhHvocêh)

Minha configuração de teste é do "A Multigrid Tutorial, Second Edition" de Brigg, p. 64, tem a solução analítica

você(x,y)=(x2-x4)(y4-y2) comx,y[0 0,1 1]2

e a equação é utilizando a matriz de 5 pontos típica linear como de Laplace-Operador . O palpite inicial é .L v = 0euv=Δvocê=:beuv=0 0

Alterar a configuração de teste, por exemplo, para trivial usando uma estimativa inicial de resulta quase nos mesmos fatores de convergência.você(x,y)=0 0v=1 1

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.=0 010-1510-1 1

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?

Respostas:


7

Não sei diretamente sua resposta, pois uso principalmente o FAS em vez de correção, pois faço multigrid para problemas não-lineares, mas alguns pensamentos podem ser observados:

  • Você está aplicando um esquema de correção linear a um problema linear, por isso não é chocante que ele se dê muito bem.

  • Considere suas condições de contorno: verifique se as está fazendo corretamente e observe também que BCs complicados podem parecer completamente diferentes na grade grossa, fazendo correções não tão úteis.

  • Verifique novamente o tratamento do termo de origem; Lembro-me de estragar alguma coisa no estágio de prolongamento relacionado a esse termo quando o escrevi para poisson.

  • Eu nunca vi a necessidade de iterar para a convergência na grade mais grossa. Uma solução depende do resíduo da grade fina estar correto, o que não é. Você está tentando empurrar esses erros para fora do domínio / suavizá-los. Se você estiver totalmente convergido na grade mais grossa em uma iteração inicial, sua solução está naturalmente muito longe da solução correta de grade fina, porque seus resíduos não estão atualizados. Esta é quase certamente a razão pela qual você está vendo resíduos saltarem no estágio de prolongamento.

  • Além disso, tente um fator de relaxamento para os operadores de restrição e prolongamento, digamos 0,75.

Se isso ajudar, é assim que minha história residual do FAS se parece com um problema de poisson usando a grade única através de ciclos completos de 7V. Acredito que o fator de relaxamento foi de 0,75 e estava usando um esquema de RK de três estágios como mais suave, com uma única iteração em cada nível da grade.

res história


Obrigado pela sua resposta, o caso linear e o BC simples (borda quadrada = 0) são apenas o primeiro passo, o teste de casos reais será feito após o trabalho das configurações "fáceis". Não sei se entendi o que você quer dizer com um fator de relaxamento para restrição e prolongamento. Atualmente, uso interpolação bilinear para prolongamento e meia ponderação para restrição.
Silpion

vocêh: =vocêh+αEuHh(vocêH-EuhHvocêh)0 0<α<1 1

(1 1-α)

@ Aurelius, você menciona que não é necessário convergir na grade grossa. Concordo com o seu raciocínio, mas as provas de convergência na literatura (para o caso linear) pressupõem que a resolução da grade grossa é exata. Não conheço nenhuma referência (para o caso linear ou não-linear) em que se afirma que a resolução da grade grossa não deve ser exata e fiquei imaginando se você poderia citar uma referência para isso? Eu ficaria muito interessado em ver isso eu mesmo
Keeran Brabazon

@KeeranBrabazon Também não tenho uma referência para isso e, sinceramente, não estou familiarizado com os detalhes das provas de convergência para multigrid. Eu sugiro procurar qualquer literatura que introduza esse fator de relaxamento. Esse fator é comum a todas as implementações multigrid modernas que eu já vi, e é intuitivamente verdade que não seria necessário se as soluções exatas do curso fossem necessárias / desejáveis. Para uma prova intuitiva, apenas imagino como são as condições de contorno para a grade mais grossa versus a mais fina. É fácil imaginá-los criando soluções muito diferentes.
Aurelius

6

EuhHEu^hHvocêhvocêh(vocêH-EuhHvocêh)Eu^hHvocêh

Espectralmente, a restrição de estado precisa apenas de ordem secundária alta (preservação precisa de baixas frequências), mas a ordem primária (aliasing de altas frequências) não importa. A injeção tem ordem primária 0 e ordem secundária infinita. Enquanto isso, a restrição residual precisa que a ordem primária e a secundária sejam positivas (pelo menos). Veja a seção 4.3 do Guia Multigrid de Achi Brandt .

Ao projetar métodos de MG, também é bom olhar para os erros e não para os resíduos, além de garantir o peso adequado da norma.


Bons pontos, e eu falhei em mencionar algo nesse sentido. Um aspecto importante do uso prático de multigrid é a escolha de mais suave: você deseja um que amortece os erros de alta frequência o mais rápido possível, o que soluciona o problema que você descreve.
Aurelius

@Aurelius No registro fornecido, você pode ver que o mais suave não é o problema. Lembre-se de que Silpion está usando a mesma suavidade da correção de defeitos MG, que converge adequadamente.
Jed Brown

>0,8

1

vocêoeudH=EuhHvocêh

vocêhvocêh+EuHh(vocêH-EuhHvocêh)=vocêh+EuHh(vocêH-vocêoeudH)

H2HvocêoeudHvocêoeudH

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.