xref: /petsc/src/ksp/pc/impls/deflation/deflation.c (revision 37eeb8152ec6a2cf24186d3591c2c5de5dfd8fa5)
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