1*37eeb815SJakub Kruzik 2*37eeb815SJakub Kruzik /* -------------------------------------------------------------------- 3*37eeb815SJakub Kruzik 4*37eeb815SJakub Kruzik This file implements a Deflation preconditioner in PETSc as part of PC. 5*37eeb815SJakub Kruzik You can use this as a starting point for implementing your own 6*37eeb815SJakub Kruzik preconditioner that is not provided with PETSc. (You might also consider 7*37eeb815SJakub Kruzik just using PCSHELL) 8*37eeb815SJakub Kruzik 9*37eeb815SJakub Kruzik The following basic routines are required for each preconditioner. 10*37eeb815SJakub Kruzik PCCreate_XXX() - Creates a preconditioner context 11*37eeb815SJakub Kruzik PCSetFromOptions_XXX() - Sets runtime options 12*37eeb815SJakub Kruzik PCApply_XXX() - Applies the preconditioner 13*37eeb815SJakub Kruzik PCDestroy_XXX() - Destroys the preconditioner context 14*37eeb815SJakub Kruzik where the suffix "_XXX" denotes a particular implementation, in 15*37eeb815SJakub Kruzik this case we use _Deflation (e.g., PCCreate_Deflation, PCApply_Deflation). 16*37eeb815SJakub Kruzik These routines are actually called via the common user interface 17*37eeb815SJakub Kruzik routines PCCreate(), PCSetFromOptions(), PCApply(), and PCDestroy(), 18*37eeb815SJakub Kruzik so the application code interface remains identical for all 19*37eeb815SJakub Kruzik preconditioners. 20*37eeb815SJakub Kruzik 21*37eeb815SJakub Kruzik Another key routine is: 22*37eeb815SJakub Kruzik PCSetUp_XXX() - Prepares for the use of a preconditioner 23*37eeb815SJakub Kruzik by setting data structures and options. The interface routine PCSetUp() 24*37eeb815SJakub Kruzik is not usually called directly by the user, but instead is called by 25*37eeb815SJakub Kruzik PCApply() if necessary. 26*37eeb815SJakub Kruzik 27*37eeb815SJakub Kruzik Additional basic routines are: 28*37eeb815SJakub Kruzik PCView_XXX() - Prints details of runtime options that 29*37eeb815SJakub Kruzik have actually been used. 30*37eeb815SJakub Kruzik These are called by application codes via the interface routines 31*37eeb815SJakub Kruzik PCView(). 32*37eeb815SJakub Kruzik 33*37eeb815SJakub Kruzik The various types of solvers (preconditioners, Krylov subspace methods, 34*37eeb815SJakub Kruzik nonlinear solvers, timesteppers) are all organized similarly, so the 35*37eeb815SJakub Kruzik above description applies to these categories also. One exception is 36*37eeb815SJakub Kruzik that the analogues of PCApply() for these components are KSPSolve(), 37*37eeb815SJakub Kruzik SNESSolve(), and TSSolve(). 38*37eeb815SJakub Kruzik 39*37eeb815SJakub Kruzik Additional optional functionality unique to preconditioners is left and 40*37eeb815SJakub Kruzik right symmetric preconditioner application via PCApplySymmetricLeft() 41*37eeb815SJakub Kruzik and PCApplySymmetricRight(). The Deflation implementation is 42*37eeb815SJakub Kruzik PCApplySymmetricLeftOrRight_Deflation(). 43*37eeb815SJakub Kruzik 44*37eeb815SJakub Kruzik -------------------------------------------------------------------- */ 45*37eeb815SJakub Kruzik 46*37eeb815SJakub Kruzik /* 47*37eeb815SJakub Kruzik Include files needed for the Deflation preconditioner: 48*37eeb815SJakub Kruzik pcimpl.h - private include file intended for use by all preconditioners 49*37eeb815SJakub Kruzik */ 50*37eeb815SJakub Kruzik 51*37eeb815SJakub Kruzik #include <petsc/private/pcimpl.h> /*I "petscpc.h" I*/ 52*37eeb815SJakub Kruzik 53*37eeb815SJakub Kruzik const char *const PCDeflationTypes[] = {"INIT","PRE","POST","PCDeflationType","PC_DEFLATION_",0}; 54*37eeb815SJakub Kruzik 55*37eeb815SJakub Kruzik /* 56*37eeb815SJakub Kruzik Private context (data structure) for the deflation preconditioner. 57*37eeb815SJakub Kruzik */ 58*37eeb815SJakub Kruzik typedef struct { 59*37eeb815SJakub Kruzik PetscBool init; /* do only init step - error correction of direction is omitted */ 60*37eeb815SJakub Kruzik PetscBool pre; /* start with x0 being the solution in the deflation space */ 61*37eeb815SJakub Kruzik PetscBool correct; /* add CP (Qr) correction to descent direction */ 62*37eeb815SJakub Kruzik PetscBool truenorm; 63*37eeb815SJakub Kruzik PetscBool adaptiveconv; 64*37eeb815SJakub Kruzik PetscReal adaptiveconst; 65*37eeb815SJakub Kruzik PetscInt reductionfact; 66*37eeb815SJakub Kruzik Mat W,Wt,AW,WtAW; /* deflation space, coarse problem mats */ 67*37eeb815SJakub Kruzik KSP WtAWinv; /* deflation coarse problem */ 68*37eeb815SJakub Kruzik Vec *work; 69*37eeb815SJakub Kruzik 70*37eeb815SJakub Kruzik PCDEFLATIONSpaceType spacetype; 71*37eeb815SJakub Kruzik PetscInt spacesize; 72*37eeb815SJakub Kruzik PetscInt nestedlvl; 73*37eeb815SJakub Kruzik PetscInt maxnestedlvl; 74*37eeb815SJakub Kruzik PetscBool extendsp; 75*37eeb815SJakub Kruzik } PC_Deflation; 76*37eeb815SJakub Kruzik 77*37eeb815SJakub Kruzik static PetscErrorCode PCDeflationSetType_Deflation(PC pc,PCDeflationType type) 78*37eeb815SJakub Kruzik { 79*37eeb815SJakub Kruzik PC_Deflation *def = (PC_Deflation*)pc->data; 80*37eeb815SJakub Kruzik 81*37eeb815SJakub Kruzik PetscFunctionBegin; 82*37eeb815SJakub Kruzik def->init = PETSC_FALSE; 83*37eeb815SJakub Kruzik def->pre = PETSC_FALSE; 84*37eeb815SJakub Kruzik if (type == PC_DEFLATION_INIT) { 85*37eeb815SJakub Kruzik def->init = PETSC_TRUE; 86*37eeb815SJakub Kruzik def->pre = PETSC_TRUE; 87*37eeb815SJakub Kruzik } else if (type == PC_DEFLATION_PRE) { 88*37eeb815SJakub Kruzik def->pre = PETSC_TRUE; 89*37eeb815SJakub Kruzik } 90*37eeb815SJakub Kruzik PetscFunctionReturn(0); 91*37eeb815SJakub Kruzik } 92*37eeb815SJakub Kruzik 93*37eeb815SJakub Kruzik static PetscErrorCode PCDeflationGetType_Deflation(PC pc,PCDeflationType *type) 94*37eeb815SJakub Kruzik { 95*37eeb815SJakub Kruzik PC_Deflation *def = (PC_Deflation*)pc->data; 96*37eeb815SJakub Kruzik 97*37eeb815SJakub Kruzik PetscFunctionBegin; 98*37eeb815SJakub Kruzik if (def->init) { 99*37eeb815SJakub Kruzik *type = PC_DEFLATION_INIT; 100*37eeb815SJakub Kruzik } else if (def->pre) { 101*37eeb815SJakub Kruzik *type = PC_DEFLATION_PRE; 102*37eeb815SJakub Kruzik } else { 103*37eeb815SJakub Kruzik *type = PC_DEFLATION_POST; 104*37eeb815SJakub Kruzik } 105*37eeb815SJakub Kruzik PetscFunctionReturn(0); 106*37eeb815SJakub Kruzik } 107*37eeb815SJakub Kruzik 108*37eeb815SJakub Kruzik /* -------------------------------------------------------------------------- */ 109*37eeb815SJakub Kruzik /* 110*37eeb815SJakub Kruzik PCSetUp_Deflation - Prepares for the use of the Deflation preconditioner 111*37eeb815SJakub Kruzik by setting data structures and options. 112*37eeb815SJakub Kruzik 113*37eeb815SJakub Kruzik Input Parameter: 114*37eeb815SJakub Kruzik . pc - the preconditioner context 115*37eeb815SJakub Kruzik 116*37eeb815SJakub Kruzik Application Interface Routine: PCSetUp() 117*37eeb815SJakub Kruzik 118*37eeb815SJakub Kruzik Notes: 119*37eeb815SJakub Kruzik The interface routine PCSetUp() is not usually called directly by 120*37eeb815SJakub Kruzik the user, but instead is called by PCApply() if necessary. 121*37eeb815SJakub Kruzik */ 122*37eeb815SJakub Kruzik static PetscErrorCode PCSetUp_Deflation(PC pc) 123*37eeb815SJakub Kruzik { 124*37eeb815SJakub Kruzik PC_Deflation *jac = (PC_Deflation*)pc->data; 125*37eeb815SJakub Kruzik Vec diag,diagsqrt; 126*37eeb815SJakub Kruzik PetscErrorCode ierr; 127*37eeb815SJakub Kruzik PetscInt n,i; 128*37eeb815SJakub Kruzik PetscScalar *x; 129*37eeb815SJakub Kruzik PetscBool zeroflag = PETSC_FALSE; 130*37eeb815SJakub Kruzik 131*37eeb815SJakub Kruzik PetscFunctionBegin; 132*37eeb815SJakub Kruzik /* 133*37eeb815SJakub Kruzik For most preconditioners the code would begin here something like 134*37eeb815SJakub Kruzik 135*37eeb815SJakub Kruzik if (pc->setupcalled == 0) { allocate space the first time this is ever called 136*37eeb815SJakub Kruzik ierr = MatCreateVecs(pc->mat,&jac->diag);CHKERRQ(ierr); 137*37eeb815SJakub Kruzik PetscLogObjectParent((PetscObject)pc,(PetscObject)jac->diag); 138*37eeb815SJakub Kruzik } 139*37eeb815SJakub Kruzik 140*37eeb815SJakub Kruzik But for this preconditioner we want to support use of both the matrix' diagonal 141*37eeb815SJakub Kruzik elements (for left or right preconditioning) and square root of diagonal elements 142*37eeb815SJakub Kruzik (for symmetric preconditioning). Hence we do not allocate space here, since we 143*37eeb815SJakub Kruzik don't know at this point which will be needed (diag and/or diagsqrt) until the user 144*37eeb815SJakub Kruzik applies the preconditioner, and we don't want to allocate BOTH unless we need 145*37eeb815SJakub Kruzik them both. Thus, the diag and diagsqrt are allocated in PCSetUp_Deflation_NonSymmetric() 146*37eeb815SJakub Kruzik and PCSetUp_Deflation_Symmetric(), respectively. 147*37eeb815SJakub Kruzik */ 148*37eeb815SJakub Kruzik 149*37eeb815SJakub Kruzik /* 150*37eeb815SJakub Kruzik Here we set up the preconditioner; that is, we copy the diagonal values from 151*37eeb815SJakub Kruzik the matrix and put them into a format to make them quick to apply as a preconditioner. 152*37eeb815SJakub Kruzik */ 153*37eeb815SJakub Kruzik if (zeroflag) { 154*37eeb815SJakub Kruzik ierr = PetscInfo(pc,"Zero detected in diagonal of matrix, using 1 at those locations\n");CHKERRQ(ierr); 155*37eeb815SJakub Kruzik } 156*37eeb815SJakub Kruzik PetscFunctionReturn(0); 157*37eeb815SJakub Kruzik } 158*37eeb815SJakub Kruzik /* -------------------------------------------------------------------------- */ 159*37eeb815SJakub Kruzik /* 160*37eeb815SJakub Kruzik PCApply_Deflation - Applies the Deflation preconditioner to a vector. 161*37eeb815SJakub Kruzik 162*37eeb815SJakub Kruzik Input Parameters: 163*37eeb815SJakub Kruzik . pc - the preconditioner context 164*37eeb815SJakub Kruzik . x - input vector 165*37eeb815SJakub Kruzik 166*37eeb815SJakub Kruzik Output Parameter: 167*37eeb815SJakub Kruzik . y - output vector 168*37eeb815SJakub Kruzik 169*37eeb815SJakub Kruzik Application Interface Routine: PCApply() 170*37eeb815SJakub Kruzik */ 171*37eeb815SJakub Kruzik static PetscErrorCode PCApply_Deflation(PC pc,Vec x,Vec y) 172*37eeb815SJakub Kruzik { 173*37eeb815SJakub Kruzik PC_Deflation *jac = (PC_Deflation*)pc->data; 174*37eeb815SJakub Kruzik PetscErrorCode ierr; 175*37eeb815SJakub Kruzik 176*37eeb815SJakub Kruzik PetscFunctionBegin; 177*37eeb815SJakub Kruzik PetscFunctionReturn(0); 178*37eeb815SJakub Kruzik } 179*37eeb815SJakub Kruzik /* -------------------------------------------------------------------------- */ 180*37eeb815SJakub Kruzik static PetscErrorCode PCReset_Deflation(PC pc) 181*37eeb815SJakub Kruzik { 182*37eeb815SJakub Kruzik PC_Deflation *jac = (PC_Deflation*)pc->data; 183*37eeb815SJakub Kruzik PetscErrorCode ierr; 184*37eeb815SJakub Kruzik 185*37eeb815SJakub Kruzik PetscFunctionBegin; 186*37eeb815SJakub Kruzik PetscFunctionReturn(0); 187*37eeb815SJakub Kruzik } 188*37eeb815SJakub Kruzik 189*37eeb815SJakub Kruzik /* 190*37eeb815SJakub Kruzik PCDestroy_Deflation - Destroys the private context for the Deflation preconditioner 191*37eeb815SJakub Kruzik that was created with PCCreate_Deflation(). 192*37eeb815SJakub Kruzik 193*37eeb815SJakub Kruzik Input Parameter: 194*37eeb815SJakub Kruzik . pc - the preconditioner context 195*37eeb815SJakub Kruzik 196*37eeb815SJakub Kruzik Application Interface Routine: PCDestroy() 197*37eeb815SJakub Kruzik */ 198*37eeb815SJakub Kruzik static PetscErrorCode PCDestroy_Deflation(PC pc) 199*37eeb815SJakub Kruzik { 200*37eeb815SJakub Kruzik PetscErrorCode ierr; 201*37eeb815SJakub Kruzik 202*37eeb815SJakub Kruzik PetscFunctionBegin; 203*37eeb815SJakub Kruzik ierr = PCReset_Deflation(pc);CHKERRQ(ierr); 204*37eeb815SJakub Kruzik 205*37eeb815SJakub Kruzik /* 206*37eeb815SJakub Kruzik Free the private data structure that was hanging off the PC 207*37eeb815SJakub Kruzik */ 208*37eeb815SJakub Kruzik ierr = PetscFree(pc->data);CHKERRQ(ierr); 209*37eeb815SJakub Kruzik PetscFunctionReturn(0); 210*37eeb815SJakub Kruzik } 211*37eeb815SJakub Kruzik 212*37eeb815SJakub Kruzik static PetscErrorCode PCSetFromOptions_Deflation(PetscOptionItems *PetscOptionsObject,PC pc) 213*37eeb815SJakub Kruzik { 214*37eeb815SJakub Kruzik PC_Deflation *jac = (PC_Deflation*)pc->data; 215*37eeb815SJakub Kruzik PetscErrorCode ierr; 216*37eeb815SJakub Kruzik PetscBool flg; 217*37eeb815SJakub Kruzik PCDeflationType deflt,type; 218*37eeb815SJakub Kruzik 219*37eeb815SJakub Kruzik PetscFunctionBegin; 220*37eeb815SJakub Kruzik ierr = PCDeflationGetType(pc,&deflt);CHKERRQ(ierr); 221*37eeb815SJakub Kruzik ierr = PetscOptionsHead(PetscOptionsObject,"Deflation options");CHKERRQ(ierr); 222*37eeb815SJakub Kruzik ierr = PetscOptionsEnum("-pc_jacobi_type","How to construct diagonal matrix","PCDeflationSetType",PCDeflationTypes,(PetscEnum)deflt,(PetscEnum*)&type,&flg);CHKERRQ(ierr); 223*37eeb815SJakub Kruzik if (flg) { 224*37eeb815SJakub Kruzik ierr = PCDeflationSetType(pc,type);CHKERRQ(ierr); 225*37eeb815SJakub Kruzik } 226*37eeb815SJakub Kruzik ierr = PetscOptionsTail();CHKERRQ(ierr); 227*37eeb815SJakub Kruzik PetscFunctionReturn(0); 228*37eeb815SJakub Kruzik } 229*37eeb815SJakub Kruzik 230*37eeb815SJakub Kruzik /* -------------------------------------------------------------------------- */ 231*37eeb815SJakub Kruzik /* 232*37eeb815SJakub Kruzik PCCreate_Deflation - Creates a Deflation preconditioner context, PC_DeflationPC_Deflation, 233*37eeb815SJakub Kruzik and sets this as the private data within the generic preconditioning 234*37eeb815SJakub Kruzik context, PC, that was created within PCCreate(). 235*37eeb815SJakub Kruzik 236*37eeb815SJakub Kruzik Input Parameter: 237*37eeb815SJakub Kruzik . pc - the preconditioner context 238*37eeb815SJakub Kruzik 239*37eeb815SJakub Kruzik Application Interface Routine: PCCreate() 240*37eeb815SJakub Kruzik */ 241*37eeb815SJakub Kruzik 242*37eeb815SJakub Kruzik /*MC 243*37eeb815SJakub Kruzik PCDEFLATION - Deflation (i.e. diagonal scaling preconditioning) 244*37eeb815SJakub Kruzik 245*37eeb815SJakub Kruzik Options Database Key: 246*37eeb815SJakub Kruzik + -pc_jacobi_type <diagonal,rowmax,rowsum> - approach for forming the preconditioner 247*37eeb815SJakub Kruzik - -pc_jacobi_abs - use the absolute value of the diagonal entry 248*37eeb815SJakub Kruzik 249*37eeb815SJakub Kruzik Level: beginner 250*37eeb815SJakub Kruzik 251*37eeb815SJakub Kruzik Concepts: Deflation, diagonal scaling, preconditioners 252*37eeb815SJakub Kruzik 253*37eeb815SJakub Kruzik Notes: 254*37eeb815SJakub Kruzik By using KSPSetPCSide(ksp,PC_SYMMETRIC) or -ksp_pc_side symmetric 255*37eeb815SJakub Kruzik can scale each side of the matrix by the square root of the diagonal entries. 256*37eeb815SJakub Kruzik 257*37eeb815SJakub Kruzik Zero entries along the diagonal are replaced with the value 1.0 258*37eeb815SJakub Kruzik 259*37eeb815SJakub Kruzik See PCPBDEFLATION for a point-block Deflation preconditioner 260*37eeb815SJakub Kruzik 261*37eeb815SJakub Kruzik .seealso: PCCreate(), PCSetType(), PCType (for list of available types), PC, 262*37eeb815SJakub Kruzik PCDeflationSetType(), PCDeflationSetUseAbs(), PCDeflationGetUseAbs(), PCPBDEFLATION 263*37eeb815SJakub Kruzik M*/ 264*37eeb815SJakub Kruzik 265*37eeb815SJakub Kruzik PETSC_EXTERN PetscErrorCode PCCreate_Deflation(PC pc) 266*37eeb815SJakub Kruzik { 267*37eeb815SJakub Kruzik PC_Deflation *def; 268*37eeb815SJakub Kruzik PetscErrorCode ierr; 269*37eeb815SJakub Kruzik 270*37eeb815SJakub Kruzik PetscFunctionBegin; 271*37eeb815SJakub Kruzik /* 272*37eeb815SJakub Kruzik Creates the private data structure for this preconditioner and 273*37eeb815SJakub Kruzik attach it to the PC object. 274*37eeb815SJakub Kruzik */ 275*37eeb815SJakub Kruzik ierr = PetscNewLog(pc,&def);CHKERRQ(ierr); 276*37eeb815SJakub Kruzik pc->data = (void*)def; 277*37eeb815SJakub Kruzik 278*37eeb815SJakub Kruzik /* 279*37eeb815SJakub Kruzik Initialize the pointers to vectors to ZERO; these will be used to store 280*37eeb815SJakub Kruzik diagonal entries of the matrix for fast preconditioner application. 281*37eeb815SJakub Kruzik */ 282*37eeb815SJakub Kruzik //jac->diag = 0; 283*37eeb815SJakub Kruzik //jac->diagsqrt = 0; 284*37eeb815SJakub Kruzik //jac->userowmax = PETSC_FALSE; 285*37eeb815SJakub Kruzik //jac->userowsum = PETSC_FALSE; 286*37eeb815SJakub Kruzik //jac->useabs = PETSC_FALSE; 287*37eeb815SJakub Kruzik 288*37eeb815SJakub Kruzik /* 289*37eeb815SJakub Kruzik Set the pointers for the functions that are provided above. 290*37eeb815SJakub Kruzik Now when the user-level routines (such as PCApply(), PCDestroy(), etc.) 291*37eeb815SJakub Kruzik are called, they will automatically call these functions. Note we 292*37eeb815SJakub Kruzik choose not to provide a couple of these functions since they are 293*37eeb815SJakub Kruzik not needed. 294*37eeb815SJakub Kruzik */ 295*37eeb815SJakub Kruzik pc->ops->apply = PCApply_Deflation; 296*37eeb815SJakub Kruzik pc->ops->applytranspose = PCApply_Deflation; 297*37eeb815SJakub Kruzik pc->ops->setup = PCSetUp_Deflation; 298*37eeb815SJakub Kruzik pc->ops->reset = PCReset_Deflation; 299*37eeb815SJakub Kruzik pc->ops->destroy = PCDestroy_Deflation; 300*37eeb815SJakub Kruzik pc->ops->setfromoptions = PCSetFromOptions_Deflation; 301*37eeb815SJakub Kruzik pc->ops->view = 0; 302*37eeb815SJakub Kruzik pc->ops->applyrichardson = 0; 303*37eeb815SJakub Kruzik pc->ops->applysymmetricleft = 0; 304*37eeb815SJakub Kruzik pc->ops->applysymmetricright = 0; 305*37eeb815SJakub Kruzik 306*37eeb815SJakub Kruzik ierr = PetscObjectComposeFunction((PetscObject)pc,"PCDeflationSetType_C",PCDeflationSetType_Deflation);CHKERRQ(ierr); 307*37eeb815SJakub Kruzik ierr = PetscObjectComposeFunction((PetscObject)pc,"PCDeflationGetType_C",PCDeflationGetType_Deflation);CHKERRQ(ierr); 308*37eeb815SJakub Kruzik PetscFunctionReturn(0); 309*37eeb815SJakub Kruzik } 310*37eeb815SJakub Kruzik 311*37eeb815SJakub Kruzik /*@ 312*37eeb815SJakub Kruzik PCDeflationSetType - Causes the deflation preconditioner to use only a special 313*37eeb815SJakub Kruzik initial gues or pre/post solve solution update 314*37eeb815SJakub Kruzik 315*37eeb815SJakub Kruzik Logically Collective on PC 316*37eeb815SJakub Kruzik 317*37eeb815SJakub Kruzik Input Parameters: 318*37eeb815SJakub Kruzik + pc - the preconditioner context 319*37eeb815SJakub Kruzik - type - PC_DEFLATION_PRE, PC_DEFLATION_INIT, PC_DEFLATION_POST 320*37eeb815SJakub Kruzik 321*37eeb815SJakub Kruzik Options Database Key: 322*37eeb815SJakub Kruzik . -pc_deflation_type <pre,init,post> 323*37eeb815SJakub Kruzik 324*37eeb815SJakub Kruzik Level: intermediate 325*37eeb815SJakub Kruzik 326*37eeb815SJakub Kruzik Concepts: Deflation preconditioner 327*37eeb815SJakub Kruzik 328*37eeb815SJakub Kruzik .seealso: PCDeflationGetType() 329*37eeb815SJakub Kruzik @*/ 330*37eeb815SJakub Kruzik PetscErrorCode PCDeflationSetType(PC pc,PCDeflationType type) 331*37eeb815SJakub Kruzik { 332*37eeb815SJakub Kruzik PetscErrorCode ierr; 333*37eeb815SJakub Kruzik 334*37eeb815SJakub Kruzik PetscFunctionBegin; 335*37eeb815SJakub Kruzik PetscValidHeaderSpecific(pc,PC_CLASSID,1); 336*37eeb815SJakub Kruzik ierr = PetscTryMethod(pc,"PCDeflationSetType_C",(PC,PCDeflationType),(pc,type));CHKERRQ(ierr); 337*37eeb815SJakub Kruzik PetscFunctionReturn(0); 338*37eeb815SJakub Kruzik } 339*37eeb815SJakub Kruzik 340*37eeb815SJakub Kruzik /*@ 341*37eeb815SJakub Kruzik PCDeflationGetType - Gets how the diagonal matrix is produced for the preconditioner 342*37eeb815SJakub Kruzik 343*37eeb815SJakub Kruzik Not Collective on PC 344*37eeb815SJakub Kruzik 345*37eeb815SJakub Kruzik Input Parameter: 346*37eeb815SJakub Kruzik . pc - the preconditioner context 347*37eeb815SJakub Kruzik 348*37eeb815SJakub Kruzik Output Parameter: 349*37eeb815SJakub Kruzik - type - PC_DEFLATION_PRE, PC_DEFLATION_INIT, PC_DEFLATION_POST 350*37eeb815SJakub Kruzik 351*37eeb815SJakub Kruzik Level: intermediate 352*37eeb815SJakub Kruzik 353*37eeb815SJakub Kruzik Concepts: Deflation preconditioner 354*37eeb815SJakub Kruzik 355*37eeb815SJakub Kruzik .seealso: PCDeflationSetType() 356*37eeb815SJakub Kruzik @*/ 357*37eeb815SJakub Kruzik PetscErrorCode PCDeflationGetType(PC pc,PCDeflationType *type) 358*37eeb815SJakub Kruzik { 359*37eeb815SJakub Kruzik PetscErrorCode ierr; 360*37eeb815SJakub Kruzik 361*37eeb815SJakub Kruzik PetscFunctionBegin; 362*37eeb815SJakub Kruzik PetscValidHeaderSpecific(pc,PC_CLASSID,1); 363*37eeb815SJakub Kruzik ierr = PetscUseMethod(pc,"PCDeflationGetType_C",(PC,PCDeflationType*),(pc,type));CHKERRQ(ierr); 364*37eeb815SJakub Kruzik PetscFunctionReturn(0); 365*37eeb815SJakub Kruzik } 366