Um pré-condicionador, digamos M, é uma aproximação na matriz do sistema, digamos A, que transforma o problema em outro problema com melhor espectro de autovalores. Um pré-condicionador perfeito seria inverso de A ie inv (M) = A.
Infelizmente, esse inverso normalmente não está disponível, é complicado demais para calcular, requer mais espaço para armazenar devido aos preenchimentos introduzidos durante a fatoração e também pode sofrer erros de arredondamento. Portanto, um pré-condicionador deve ser fácil de calcular e aplicar, mas eficaz.
Além dos pré-condicionadores básicos como Jacobi ou Gauss-Seidel (ou SOR), um dos pré-condicionadores mais freqüentes é o ILU (IC em problemas simétricos - você está trabalhando em CFD para sistemas ou não simétricos)
A seleção do pré-condicionador normalmente depende do seu problema. A ILU possui muitas variantes, como ILUT, ILUS, MILU etc. Você pode consultar a literatura que adicionei no final. Para problemas com dificuldade leve, a ILU (0) pode ser usada, mas à medida que os problemas ficam mais difíceis, ou seja, o número de Reynolds está aumentando mais preenchimentos (por exemplo, ILU (1)) com estratégias de limiar (ILUT). O problema é que os usos avançados da ILU requerem mais memória e a determinação do padrão de escarsidade, que agora é diferente da matriz do sistema. Nesse caso, você deve calcular o padrão de espartisidade simbolicamente primeiro e numericamente depois.
Existem várias idéias para reduzir o trabalho de computação,
- uso de pré-condicionadores com atraso nos quais você evita recalcular o pré-condicionador, mesmo se o sistema linear variar.
- uso do LU-SGS como pré-condicionador que pode ser implementado eficientemente com algoritmos de divisão de fluxo.
- uso de métodos sem matriz - o que eu preferia no meu trabalho de doutorado. Os solucionadores de Newton-Krylov, onde o jacobiano não é necessário, esperam um pré-condicionador, que normalmente é calculado com uma aproximação de ordem baixa e provavelmente com algoritmos baseados em cores (mais difícil em problemas não estruturados).
- uso de apenas operadores de difusão como Laplacian e evitando termos convectivos (não eficiente na redução do número de iterações)
- multigrid, onde você usa um simples mais suave como w-Jacobi ou SOR em uma hierarquia de grade. para problemas não estruturados, você deve usar o multigrid algébrico (AMG) em vez de geométrico.
- e muitos outros (multiplique o número de minhas entradas por 10) ..
Como o problema não é simétrico, existem principalmente dois solucionadores para usar: GMRES ou BiCGStab. (QMR ou TFQMR são outra alternativa, mas acredito que seu desempenho esteja abaixo desses dois). O GMRES normalmente é um solucionador melhor se você ainda não tiver um problema de armazenamento devido aos vetores armazenados, é necessário reiniciar - esse é um problema, pois o pré-condicionador é ruim ou você tem um DOF muito grande. O BiCGStab requer apenas quatro produtos Matrix-Vector, bons para grandes problemas, mas normalmente inferiores ao GMRES. (Preferi o GMRES, mas gosto muito do BiCGStab!)
Todo esse problema pré-condicionador e linear do solucionador é muito complexo. Eu posso sugerir alguns livros para ler. Seu ponto de partida deve ser modelos para a solução de sistemas lineares. Este é um livro grátis. Smoothers, tanto como solucionadores independentes quanto como pré-condicionadores de solucionadores de Krylov, são explicados neste livro. Você também pode consultar os "Métodos iterativos para sistemas lineares esparsos" de Yousef Saad. É definitivo na biblioteca da sua instituição. A primeira edição também está disponível aqui .
Antes de concluir, recomendo que você analise estruturas como Petsc , Trilinos ou mesmo Hypre e também os arquivos fornecidos por 1 . Eles fornecem pré-condicionadores com alguma programação. Na verdade, existem mais livros para oferecer, mas também dê uma olhada nas "Técnicas e aplicações de pré-condicionamento de matriz de Ke Chen". Os códigos do Matlab estão disponíveis com o livro.
Boa sorte em sua jornada, você precisará dela.