SuperLU
5.2.0
|
Example #2 showing how to use ILU to precondition GMRES. More...
#include "slu_zdefs.h"
Functions | |
void | zpsolve (int n, doublecomplex x[], doublecomplex y[]) |
void | zmatvec_mult (doublecomplex alpha, doublecomplex x[], doublecomplex beta, doublecomplex y[]) |
int | main (int argc, char *argv[]) |
Variables | |
char * | GLOBAL_EQUED |
superlu_options_t * | GLOBAL_OPTIONS |
double * | GLOBAL_R |
double * | GLOBAL_C |
int * | GLOBAL_PERM_C |
int * | GLOBAL_PERM_R |
SuperMatrix * | GLOBAL_A |
SuperMatrix * | GLOBAL_A_ORIG |
SuperMatrix * | GLOBAL_L |
SuperMatrix * | GLOBAL_U |
SuperLUStat_t * | GLOBAL_STAT |
mem_usage_t * | GLOBAL_MEM_USAGE |
Copyright (c) 2003, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from U.S. Dept. of Energy)
All rights reserved.
The source code is distributed under BSD license, see the file License.txt at the top-level directory.
– SuperLU routine (version 5.0) – Lawrence Berkeley National Laboratory November, 2010 August, 2011
This example shows that ILU is computed from the equilibrated matrix, but the preconditioned GMRES is applied to the original system. The driver routine ZGSISX is called twice to perform factorization and apply preconditioner separately.
Note that ZGSISX performs the following factorization: Pr*Dr*A*Dc*Pc^T ~= LU with Pr being obtained from MC64 statically then partial pivoting dynamically. On return, A is overwritten as A1 = Dr*A*Dc.
We need to save a copy of the original matrix A, then solve the original system, A*x = B, using FGMRES. Each GMRES step requires requires 2 procedures: 1) Apply preconditioner M^{-1} = Dc*Pc^T*U^{-1}*L^{-1}*Pr*Dr 2) Matrix-vector multiplication: w = A*v
int main | ( | int | argc, |
char * | argv[] | ||
) |
void zmatvec_mult | ( | doublecomplex | alpha, |
doublecomplex | x[], | ||
doublecomplex | beta, | ||
doublecomplex | y[] | ||
) |
void zpsolve | ( | int | n, |
doublecomplex | x[], | ||
doublecomplex | y[] | ||
) |
SuperMatrix* GLOBAL_A |
SuperMatrix * GLOBAL_A_ORIG |
double * GLOBAL_C |
char* GLOBAL_EQUED |
SuperMatrix * GLOBAL_L |
mem_usage_t* GLOBAL_MEM_USAGE |
superlu_options_t* GLOBAL_OPTIONS |
int* GLOBAL_PERM_C |
int * GLOBAL_PERM_R |
double* GLOBAL_R |
SuperLUStat_t* GLOBAL_STAT |
SuperMatrix * GLOBAL_U |