¿Cómo puedo calcular el complemento Schur?
dónde
(en algún orden) es una matriz PETSc ( Mat
)?
fuente
¿Cómo puedo calcular el complemento Schur?
dónde
(en algún orden) es una matriz PETSc ( Mat
)?
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:
MatLUFactor()
MatCholeskyFactor()
MatGetFactor()
MatLUFactorSymbolic()
MatLUFactorNumeric()
A
MatMatSolve(A,Kba,T)
.MatMatMult(Kab,T,MAT_INITIAL_MATRIX,1.0,&S)
.MatAXPY(S,-1.0,Kbb,MAT_SUBSET_NONZERO)
.MatScale(S,-1.0)
Para computar complementos de Schur como este no tiene sentido usar los KSP
solucionadores 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.MatCreateSchurComplement(Kaa,Kaa_pre,Kab,Kba,Kbb,&S)
S
Kaa_pre
Kaa
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" ).
IS
MatGetSchurComplement()
MatGetSchurComplement()
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 PCLSC
que opera en matrices de tipo MATSCHURCOMPLEMENT
.