¿Qué puede salir mal cuando se utilizan los métodos de Krylov preconditonado de KSP ( paquete de solucionador lineal de PETSc ) para resolver un sistema lineal disperso como los obtenidos al discretizar y linealizar ecuaciones diferenciales parciales?
¿Qué pasos puedo tomar para determinar qué está yendo mal para mi problema?
¿Qué cambios puedo hacer para resolver con éxito y eficiencia mi sistema lineal?
petsc
etiqueta La metodología es general, pero creo que la respuesta sería menos útil si cada "prueba esto" no incluyera también el "cómo". Alternativamente, el "cómo" debería ser mucho más largo (y más propenso a errores para el espectador) si fuera necesario explicarlo de manera independiente del software. Si alguien quiere explicar cómo hacer todas estas cosas usando un paquete diferente, felizmente haré la pregunta independiente del software y cambiaré mi respuesta para indicar que describe qué hacer en PETSc. Nota: Agregué esto, que es una versión mejorada de una pregunta frecuente, por lo que podría gustarme gente en este sitio.Respuestas:
Consejo inicial
-ksp_converged_reason -ksp_monitor_true_residual
cuando intente aprender por qué un método no converge.-ksp_view_binary
oMatView()
para guardar el sistema lineal, luego use el código en$PETSC_DIR/src/ksp/ksp/examples/tutorials/ex10.c
para leer en la matriz y resolverlo (posiblemente con un número diferente de procesos). Esto requiere una matriz ensamblada, por lo que su utilidad puede ser algo limitada.Razones comunes para que KSP no converja
-pc_type svd -pc_svd_monitor
. Pruebe también un solucionador directo con-pc_type lu
(a través de un paquete de terceros en paralelo, por ejemplo-pc_type lu -pc_factor_mat_solver_package superlu_dist
).KSPSetNullSpace()
.KSPSetNullSpace()
se usaron, pero el lado derecho no es consistente. Es posible que tenga que llamarMatNullSpaceRemove()
al lado derecho antes de llamarKSPSolve()
.-ksp_gmres_restart 1000 -pc_type none
. Para problemas simples de punto de silla, intente-pc_type fieldsplit -pc_fieldsplit_type schur -pc_fieldsplit_detect_saddle_point
. Consulte el Manual del usuario y la página de manual de PCFIELDSPLIT para obtener más detalles. Para problemas más difíciles, lea la literatura para encontrar métodos sólidos y pregunte aquí ([email protected]
oo[email protected]
) si desea consejos sobre cómo implementarlos. Por ejemplo, vea esta pregunta para Helmholtz de alta frecuencia. Para tamaños de problemas modestos, vea si puede vivir con solo usar un solucionador directo.-pc_type asm -sub_pc_type lu
mejora la tasa de convergencia. Si GMRES está perdiendo demasiado progreso en el reinicio, vea si ya reinicia la ayuda-ksp_gmres_restart 300
. Si hay una transposición disponible, pruebe-ksp_type bcgs
u otros métodos que no requieran reiniciar. (Tenga en cuenta que la convergencia con estos métodos es frecuentemente errática).-pc_type lu
o en paralelo utilizando un paquete de terceros (por ejemplo-pc_type lu -pc_factor_mat_solver_package superlu_dist
, omumps
). El método debería converger en una iteración si las matrices son iguales, y en un "pequeño" número de iteraciones de lo contrario. Intente-snes_type test
verificar las matrices si resuelve un problema no lineal.-ksp_type fgmres or -ksp_type gcr
.-pc_mg_galerkin
construir algebraicamente un operador grueso correctamente escalado o asegúrese de que todas las ecuaciones se escalen de la misma manera si desea utilizar niveles gruesos rediscretizados.-ksp_diagonal_scale -ksp_diagonal_scale_fix
. Quizás cambie la formulación del problema para producir ecuaciones algebraicas más amigables. Si no puede corregir la escala, es posible que necesite usar un solucionador directo.-mat_mffd_type ds
. Ej .). Trate de usar una mayor precisión para hacer la diferenciación más precisa,./configure --with-precision=__float128 --download-f2cblaslapack
. Compruebe si converge en regímenes de parámetros "más fáciles".-ksp_gmres_modifiedgramschmidt
o use un método que ortogonalice de manera diferente, por ejemplo-ksp_type gcr
.fuente
Mi consejo para los estudiantes es que intenten un solucionador directo en estos casos. La razón es que hay dos clases de razones por las cuales un solucionador puede no converger: (i) la matriz está mal, o (ii) hay un problema con el solucionador / preacondicionador. Los solucionadores directos casi siempre producen algo que puedes comparar con la solución que esperas, por lo que si la respuesta del solucionador directo parece correcta, entonces sabes que el problema es con el solucionador / condición previa iterativa. Por otro lado, si la respuesta parece incorrecta, el problema es ensamblar la matriz y el lado derecho.
Normalmente solo uso UMFPACK como solucionador directo. Estoy seguro de que es simple probar algo similar con PETSC.
fuente
-pc_type lu -pc_factor_mat_solver_type umfpack
para usar UMFPACK (o-pc_type cholesky -pc_factor_mat_solver_package cholmod
para problemas de SPD) a través de PETSc, pero tenga en cuenta que UMFPACK y CHOLMOD son en serie. Para paralelo, el uso-pc_factor_mat_solver_package superlu_dist
omumps
,pastix
,spooles
.superlu_dist
sería-ksp_type preonly -pc_type lu -pc_factor_mat_solver_package superlu_dist
. ¿Está bien?