Como posso calcular o complemento Schur no PETSc?


8

Como posso calcular o complemento Schur:

S=Kbb-KbumaKumauma-1Kumab

Onde

K=(KumaumaKumabKbumaKbb)

(em alguns pedidos) é uma matriz PETSc ( Mat)?

Respostas:


13

É muito caro calcular o complemento de Schur de uma matriz e raramente é necessário na prática. O PETSc recomenda evitar algoritmos necessários. O complemento Schur de uma matriz (denso ou esparso) é essencialmente sempre denso; portanto, comece por:

  • formando uma matriz densa ,Kbuma
  • Também crie outra matriz densa do mesmo tamanho.T
  • Então, a matriz diretamente com ou , ou use seguido de seguido por se desejar usar um pacote de solucionador externo como SuperLU_Dist. Ligue para o resultado .KumaumaMatLUFactor()MatCholeskyFactor()MatGetFactor()MatLUFactorSymbolic()MatLUFactorNumeric()A
  • Então ligue MatMatSolve(A,Kba,T).
  • Então ligue MatMatMult(Kab,T,MAT_INITIAL_MATRIX,1.0,&S).
  • Agora ligue MatAXPY(S,-1.0,Kbb,MAT_SUBSET_NONZERO).
  • Seguido por MatScale(S,-1.0)

Para computar complementos Schur como esse, não faz sentido usar os KSPsolucionadores iterativos, pois para solucionar muitos problemas de tamanho moderado, usar uma fatoração direta é muito mais rápido que os solucionadores iterativos. Como você pode ver, isso requer uma grande quantidade de espaço de trabalho e computação, portanto é melhor evitar. No entanto, não é necessário montar o complemento Schur para resolver sistemas com ele. Use para criar uma matriz que aplique a ação de (usando para resolver com ), mas não seja montada.SMatCreateSchurComplement(Kaa,Kaa_pre,Kab,Kba,Kbb,&S)SKaa_preKaa

Como alternativa, se você já possui uma matriz de blocos (em alguns pedidos), é possível crie conjuntos de índices ( ) isa e isb para endereçar cada bloco e use para criar o complemento Schur e / ou uma aproximação adequada para o pré-condicionamento. Como é geralmente denso, os métodos padrão de pré-condicionamento geralmente não podem ser aplicados diretamente aos complementos de Schur. Existem muitas abordagens para pré-condicionar os complementos de Schur, incluindo o uso da aproximação SIMPLE para criar uma matriz esparsa que se aproxima da Complemento Schur (retornado por padrão para a matriz "pré-condicionada" opcional ).

K=(KumaumaKumabKbumaKbb)
ISMatGetSchurComplement()SKbb-Kbumadiag(Kumauma)-1KumabMatGetSchurComplement()

Outra alternativa é interpretar as matrizes como operadores diferenciais e aplicar argumentos aproximados do comutador para encontrar uma operação espectral equivalente que possa ser aplicada com eficiência (consulte os pré-condicionadores "PCD" de Elman, Silvester e Wathen). Uma variante disso é o comutador de mínimos quadrados, que está intimamente relacionado ao pseudoinverso de Moore-Penrose e está disponível no PCLSCqual opera em matrizes do tipo MATSCHURCOMPLEMENT.


2
Correndo o risco de reabrir uma pergunta resolvida, acho que essa resposta é muito pessimista. Eu acho que computar um complemento schur pode ser algo razoável em algumas circunstâncias (subestruturação / decomposição de domínio em particular) e existem outros algoritmos que podem computá-los com menor complexidade de tempo do que o descrito aqui. Consulte scicomp.stackexchange.com/questions/28934 para obter inspiração.
precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.