¿Cómo puedo calcular el complemento Schur en PETSc?

8

¿Cómo puedo calcular el complemento Schur?

S=Ksisi-KsiunaKunauna-1Kunasi

dónde

K=(KunaunaKunasiKsiunaKsisi)

(en algún orden) es una matriz PETSc ( Mat)?

Peter Brune
fuente

Respuestas:

13

Es muy costoso calcular el complemento de Schur de una matriz y muy rara vez se necesita en la práctica. PETSc recomienda encarecidamente evitar los algoritmos que lo necesitan. El complemento de Schur de una matriz (densa o escasa) es esencialmente siempre denso, así que comience por:

  • formando una matriz densa ,Ksiuna
  • También cree otra matriz densa del mismo tamaño.T
  • Luego, la matriz directamente con o , o use seguido de seguido por si desea usar un paquete de solucionador externo como SuperLU_Dist. Llama al resultado .KunaunaMatLUFactor()MatCholeskyFactor()MatGetFactor()MatLUFactorSymbolic()MatLUFactorNumeric()A
  • Entonces llama MatMatSolve(A,Kba,T).
  • Entonces llama MatMatMult(Kab,T,MAT_INITIAL_MATRIX,1.0,&S).
  • Ahora llama MatAXPY(S,-1.0,Kbb,MAT_SUBSET_NONZERO).
  • Seguido por MatScale(S,-1.0)

Para computar complementos de Schur como este no tiene sentido usar los KSPsolucionadores iterativos ya que para resolver muchos problemas de tamaño moderado, usar una factorización directa es mucho más rápido que los solucionadores iterativos. Como puede ver, esto requiere una gran cantidad de espacio de trabajo y cómputo, por lo que es mejor evitarlo. Sin embargo, no es necesario ensamblar el complemento Schur para resolver sistemas con él. Se usa para crear una matriz que aplica la acción de (usar para resolver con ), pero no se ensambla.SMatCreateSchurComplement(Kaa,Kaa_pre,Kab,Kba,Kbb,&S)SKaa_preKaa

Alternativamente, si ya tiene una matriz de bloques (en algún orden), entonces puede cree conjuntos de índices ( ) isa e isb para abordar cada bloque, luego use para crear el complemento de Schur y / o una aproximación adecuada para el preacondicionamiento. Como es generalmente denso, los métodos de preacondicionamiento estándar no se pueden aplicar directamente a los complementos de Schur. Existen muchos enfoques para el preacondicionamiento de los complementos de Schur, incluido el uso de la aproximación SIMPLE para crear una matriz dispersa que se aproxime al Complemento Schur (esto se devuelve por defecto para la matriz opcional de "preacondicionamiento" ).

K=(KunaunaKunasiKsiunaKsisi)
ISMatGetSchurComplement()SKsisi-Ksiunadiag(Kunauna)-1KunasiMatGetSchurComplement()

Otra alternativa es interpretar las matrices como operadores diferenciales y aplicar argumentos de conmutador aproximados para encontrar una operación espectralmente equivalente que pueda aplicarse eficientemente (vea los preacondicionadores "PCD" de Elman, Silvester y Wathen). Una variante de esto es el conmutador de mínimos cuadrados, que está estrechamente relacionado con el pseudoinverso de Moore-Penrose, y está disponible en el PCLSCque opera en matrices de tipo MATSCHURCOMPLEMENT.

Sean Farley
fuente
2
A riesgo de reabrir una pregunta resuelta, creo que esta respuesta es demasiado pesimista. Creo que calcular un complemento schur puede ser algo razonable en algunas circunstancias (subestructuración / descomposición del dominio en particular) y hay otros algoritmos que pueden calcularlos con una complejidad de tiempo menor que la que se describe aquí. Visite scicomp.stackexchange.com/questions/28934 para obtener inspiración.
rchilton1980