O que pode dar errado ao usar métodos Krylov pré-condicionados da KSP ( pacote de solucionadores lineares do PETSc ) para resolver um sistema linear esparso, como os obtidos pela discretização e linearização de equações diferenciais parciais?
Que etapas posso tomar para determinar o que está errado com o meu problema?
Que mudanças posso fazer para resolver com êxito e eficiência meu sistema linear?
petsc
etiqueta. A metodologia é geral, mas acho que a resposta seria menos útil se cada "tente isso" também não incluísse o "como". Como alternativa, o "como" precisaria ser muito mais longo (e mais suscetível a erros para o visualizador) se precisasse ser explicado de uma maneira independente de software. Se alguém quiser explicar como fazer todas essas coisas usando um pacote diferente, felizmente tornarei a questão independente de software e mudarei minha resposta para indicar que ela descreve o que fazer no PETSc. Nota: eu adicionei isso, que é uma versão aprimorada de uma FAQ, para que eu possa gostar de pessoas neste site.Respostas:
Conselho inicial
-ksp_converged_reason -ksp_monitor_true_residual
ao tentar descobrir por que um método não está convergindo.-ksp_view_binary
ouMatView()
para salvar o sistema linear, use o código em$PETSC_DIR/src/ksp/ksp/examples/tutorials/ex10.c
para ler na matriz e resolvê-lo (possivelmente com um número diferente de processos). Isso requer uma matriz montada, portanto sua utilidade pode ser um pouco limitada.Razões comuns para o KSP não convergir
-pc_type svd -pc_svd_monitor
. Tente também um solucionador direto com-pc_type lu
(por meio de um pacote de terceiros em paralelo, por exemplo-pc_type lu -pc_factor_mat_solver_package superlu_dist
).KSPSetNullSpace()
.KSPSetNullSpace()
foram usadas, mas o lado direito não é consistente. Talvez você precise ligarMatNullSpaceRemove()
do lado direito antes de ligarKSPSolve()
.-ksp_gmres_restart 1000 -pc_type none
. Para problemas simples do ponto de sela, tente-pc_type fieldsplit -pc_fieldsplit_type schur -pc_fieldsplit_detect_saddle_point
. Consulte o manual do usuário e a página do manual PCFIELDSPLIT para obter mais detalhes. Para problemas mais difíceis, leia a literatura para encontrar métodos robustos e pergunte aqui (ou[email protected]
ou[email protected]
) se deseja conselhos sobre como implementá-los. Por exemplo, veja esta pergunta para Helmholtz de alta frequência. Para tamanhos modestos de problemas, veja se você consegue conviver usando apenas um solucionador direto.-pc_type asm -sub_pc_type lu
melhora a taxa de convergência. Se o GMRES estiver perdendo muito progresso na reinicialização, verifique se a ajuda é reiniciada por mais tempo-ksp_gmres_restart 300
. Se uma transposição estiver disponível, tente-ksp_type bcgs
ou outros métodos que não exijam reinicialização. (Observe que a convergência com esses métodos é frequentemente irregular.)-pc_type lu
ou em paralelo, usando um pacote de terceiros (por exemplo-pc_type lu -pc_factor_mat_solver_package superlu_dist
, oumumps
). O método deve convergir em uma iteração se as matrizes forem iguais e em um número "pequeno" de iterações caso contrário. Tente-snes_type test
verificar as matrizes se estiver resolvendo um problema não linear.-ksp_type fgmres or -ksp_type gcr
.-pc_mg_galerkin
construir algebricamente um operador grosseiro corretamente dimensionado ou certifique-se de que todas as equações sejam dimensionadas da mesma maneira, se você desejar usar níveis grosseiros rediscretizados.-ksp_diagonal_scale -ksp_diagonal_scale_fix
. Talvez mude a formulação do problema para produzir equações algébricas mais amigáveis. Se você não conseguir corrigir a escala, pode ser necessário usar um solucionador direto.-mat_mffd_type ds
). Tente usar maior precisão para tornar a diferença mais precisa./configure --with-precision=__float128 --download-f2cblaslapack
,. Verifique se converge em regimes de parâmetros "mais fáceis".-ksp_gmres_modifiedgramschmidt
ou use um método que ortogonalize diferentemente, por exemplo-ksp_type gcr
.fonte
Meu conselho para os alunos é tentar um solucionador direto nesses casos. A razão é que existem duas classes de razões pelas quais um solucionador pode não convergir: (i) a matriz está incorreta ou (ii) há um problema com o solucionador / pré-condicionador. Os solucionadores diretos quase sempre produzem algo que você pode comparar com a solução que você espera; portanto, se a resposta do solucionador direto parecer correta, você saberá que o problema está no solucionador / pré-condição iterativa. Por outro lado, se a resposta parecer errada, o problema está em montar a matriz e o lado direito.
Normalmente, apenas uso o UMFPACK como solucionador direto. Tenho certeza de que é simples tentar algo semelhante com o PETSC.
fonte
-pc_type lu -pc_factor_mat_solver_type umfpack
para usar UMFPACK (ou-pc_type cholesky -pc_factor_mat_solver_package cholmod
para problemas de SPD) através do PETSc, mas observe que UMFPACK e CHOLMOD são seriais. Para paralelo, utilização-pc_factor_mat_solver_package superlu_dist
oumumps
,pastix
,spooles
.superlu_dist
seria-ksp_type preonly -pc_type lu -pc_factor_mat_solver_package superlu_dist
. Isso esta certo?