Un preacondicionador, digamos M, es una aproximación en la matriz del sistema, digamos A, que cambia el problema a otro problema con un espectro de valor propio mejorado. Un preacondicionador perfecto sería inverso de A, es decir, inv (M) = A.
Desafortunadamente, este inverso normalmente no está disponible, es demasiado complicado de calcular, requiere más espacio para almacenar debido al relleno introducido durante la factorización y también puede sufrir errores de redondeo. Por lo tanto, un preacondicionador debería ser fácil de calcular y aplicar pero efectivo.
Además del preacondicionador básico como Jacobi o Gauss-Seidel (o SOR), uno de los preacondicionadores más frecuentes es ILU (IC en problemas simétricos: está trabajando en CFD para los sistemas o no simétricos)
La selección del preacondicionador normalmente depende de su problema. ILU tiene muchas variantes como ILUT, ILUS, MILU, etc. Puede consultar la literatura que agregué al final. Para problemas con dificultad leve, se puede usar ILU (0) pero a medida que los problemas se vuelven más difíciles, es decir, el número de Reynolds aumenta más rellenos (por ejemplo, ILU (1)) con estrategias de umbral (ILUT). El problema es que los usos avanzados de ILU requieren más memoria y la determinación del patrón de dispersión que ahora es diferente de la matriz de su sistema. En este caso, debe calcular el patrón de esparticidad simbólicamente primero y numéricamente después.
Hay varias ideas para reducir el trabajo de computación,
- uso de preacondicionadores rezagados en los que evita volver a calcular el preacondicionador incluso si el sistema lineal varía.
- uso de LU-SGS como preacondicionador que podría implementarse eficientemente con algoritmos de división de flujo.
- uso de métodos sin matriz, el que preferí en mi trabajo de doctorado. Los solucionadores de Newton-Krylov donde no se necesita el jacobiano esperan un preacondicionador que normalmente se calcula con una aproximación de bajo orden y probablemente con algoritmos basados en colores (aunque es más difícil en problemas no estructurados).
- uso de solo operadores de difusión como laplaciano y evitar términos convectivos (no es eficiente para reducir el número de iteraciones)
- multigrid, donde utiliza un suavizador simple como w-Jacobi o SOR en una jerarquía de cuadrícula. para problemas no construidos, debe usar Multirrid Algebraico (AMG) en lugar de geométrico.
- y muchos otros (multiplico el número de mis entradas por 10).
Dado que el problema no es simétrico, existen principalmente dos solucionadores para usar: GMRES o BiCGStab. (QMR o TFQMR son otra alternativa, pero creo que su rendimiento está por debajo de esos dos). GMRES normalmente es un mejor solucionador si aún no tiene un problema de almacenamiento debido a que los vectores almacenados son necesarios para reiniciar; este es un problema si el preacondicionador es deficiente o si tiene un dof muy grande. BiCGStab requiere solo cuatro productos Matrix-Vector, lo que es bueno para grandes problemas pero normalmente inferior a GMRES. (¡Preferí GMRES pero me gusta mucho BiCGStab!)
Todo este problema de preacondicionador y solucionador lineal es muy complejo. Puedo sugerir algunos libros para leer. Su punto de partida debe ser Plantillas para la solución de sistemas lineales. Este es un libro gratuito. En este libro se explican los suavizadores tanto como solucionadores independientes como preacondicionadores en solucionadores de Krylov. También puede consultar los "Métodos iterativos para sistemas lineales dispersos" de Yousef Saad. Es definitivo en la biblioteca de su institución. La primera edición también está disponible aquí .
Antes de concluir, le recomiendo que mire marcos como Petsc , Trilinos o incluso Hypre y también los archivos proporcionados por 1 . Proporcionan preacondicionadores con algo de programación. En realidad, hay más libros para ofrecer, pero también eche un vistazo a "Técnicas y aplicaciones de preacondicionamiento matricial" de Ke Chen. Los códigos de Matlab están disponibles con el libro.
Buena suerte en tu viaje, la necesitarás.