¿Por qué mi solucionador lineal iterativo no converge?


26

¿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?


¿Pretende que esta pregunta sea una pregunta sobre solucionadores lineales iterativos específicamente en PETSc (que es lo que habría recopilado del texto del cuerpo de la pregunta), o una pregunta sobre posibles fallas algorítmicas de solucionadores lineales iterativos en un software en su mayoría? contexto agnóstico (que es lo que habría recopilado al mirar solo el titular)?
Geoff Oxberry

44
Tiene la petscetiqueta 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.
Jed Brown

Respuestas:


26

Consejo inicial

  • Siempre ejecute con -ksp_converged_reason -ksp_monitor_true_residualcuando intente aprender por qué un método no converge.
  • Haga que el tamaño del problema y la cantidad de procesos sean lo más pequeños posible para demostrar la falla. A menudo obtiene información al determinar qué pequeños problemas exhiben el comportamiento que está haciendo que su método se descomponga y se reduzca el tiempo de respuesta. Además, existen algunas técnicas de investigación que solo se pueden utilizar para sistemas pequeños.
  • Si el problema solo surge después de una gran cantidad de pasos de tiempo, pasos de continuación o pasos de resolución no lineales, considere escribir el estado del modelo cuando ocurra la falla para que pueda experimentar rápidamente.
  • Alternativamente, especialmente si su software no tiene capacidad de punto de control, use -ksp_view_binaryo MatView()para guardar el sistema lineal, luego use el código en $PETSC_DIR/src/ksp/ksp/examples/tutorials/ex10.cpara 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.
  • Hay muchas opciones posibles de solución (por ejemplo, un número infinito disponible en la línea de comando en PETSc debido a un número arbitrario de niveles de composición), consulte esta pregunta para obtener consejos generales sobre cómo elegir soluciones lineales.

Razones comunes para que KSP no converja

  • Las ecuaciones son singulares por accidente (por ejemplo, olvidé imponer condiciones de contorno). Marque esto para un pequeño problema usando -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).
  • Las ecuaciones son intencionalmente singulares (por ejemplo, espacio nulo constante), pero el método de Krylov no fue informado, ver KSPSetNullSpace().
  • Las ecuaciones son intencionalmente singulares y KSPSetNullSpace()se usaron, pero el lado derecho no es consistente. Es posible que tenga que llamar MatNullSpaceRemove()al lado derecho antes de llamar KSPSolve().
  • Las ecuaciones son indefinidas, por lo que los preacondicionadores estándar no funcionan. Por lo general, sabrá esto por la física, pero puede verificar con -ksp_compute_eigenvalues -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í ( petsc-users@mcs.anl.govoo petsc-maint@mcs.anl.gov) 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.
  • Si el método converge en un residuo preacondicionado, pero no en un residuo verdadero, es probable que el preacondicionador sea singular o casi similar. Esto es común para problemas de punto de silla de montar (por ejemplo, flujo incompresible) u operadores fuertemente no simétricos (por ejemplo, problemas hiperbólicos de baja Mach con pasos de tiempo largos).
  • El preacondicionador es demasiado débil o inestable. Ver si -pc_type asm -sub_pc_type lumejora 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 bcgsu otros métodos que no requieran reiniciar. (Tenga en cuenta que la convergencia con estos métodos es frecuentemente errática).
  • La matriz de preacondicionamiento puede no estar cerca del operador (posiblemente sin ensamblar). Intente resolver con un solucionador directo, ya sea en serie -pc_type luo en paralelo utilizando un paquete de terceros (por ejemplo -pc_type lu -pc_factor_mat_solver_package superlu_dist, o mumps). 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 testverificar las matrices si resuelve un problema no lineal.
  • El preacondicionador es no lineal (por ejemplo, una solución iterativa anidada), pruebe -ksp_type fgmres or -ksp_type gcr.
  • Está utilizando múltiples cuadrículas geométricas, pero algunas ecuaciones (a menudo condiciones de contorno) no se escalan de forma compatible entre niveles. Intente -pc_mg_galerkinconstruir 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.
  • La matriz está muy mal acondicionada. Verifique el número de condición utilizando los métodos descritos aquí . Intente mejorarlo eligiendo la escala relativa de los componentes / condiciones de contorno. Tratar -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.
  • La matriz es no lineal (p. Ej., Evaluada mediante la diferenciación finita de una función no lineal). Pruebe diferentes parámetros de diferenciación (p -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".
  • Se está utilizando un método simétrico para un problema no simétrico.
  • El Gram-Schmidt clásico se está volviendo inestable, pruebe -ksp_gmres_modifiedgramschmidto use un método que ortogonalice de manera diferente, por ejemplo -ksp_type gcr.

16

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.


55
-pc_type lu -pc_factor_mat_solver_type umfpackpara usar UMFPACK (o -pc_type cholesky -pc_factor_mat_solver_package cholmodpara 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_disto mumps, pastix, spooles.
Jed Brown el

2
Para ser claros, la opción completa establecida para usar (por ejemplo) superlu_distsería -ksp_type preonly -pc_type lu -pc_factor_mat_solver_package superlu_dist. ¿Está bien?
Leon Avery

No lo sé. ¿Qué pasa si haces esto?
Wolfgang Bangerth
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.