xref: /petsc/src/ksp/pc/impls/jacobi/jacobi.c (revision f155c23239e6d3f7c7ec79ff00b4f28519d0ce99)
1 
2 /*  --------------------------------------------------------------------
3 
4      This file implements a Jacobi preconditioner in PETSc as part of PC.
5      You can use this as a starting point for implementing your own
6      preconditioner that is not provided with PETSc. (You might also consider
7      just using PCSHELL)
8 
9      The following basic routines are required for each preconditioner.
10           PCCreate_XXX()          - Creates a preconditioner context
11           PCSetFromOptions_XXX()  - Sets runtime options
12           PCApply_XXX()           - Applies the preconditioner
13           PCDestroy_XXX()         - Destroys the preconditioner context
14      where the suffix "_XXX" denotes a particular implementation, in
15      this case we use _Jacobi (e.g., PCCreate_Jacobi, PCApply_Jacobi).
16      These routines are actually called via the common user interface
17      routines PCCreate(), PCSetFromOptions(), PCApply(), and PCDestroy(),
18      so the application code interface remains identical for all
19      preconditioners.
20 
21      Another key routine is:
22           PCSetUp_XXX()           - Prepares for the use of a preconditioner
23      by setting data structures and options.   The interface routine PCSetUp()
24      is not usually called directly by the user, but instead is called by
25      PCApply() if necessary.
26 
27      Additional basic routines are:
28           PCView_XXX()            - Prints details of runtime options that
29                                     have actually been used.
30      These are called by application codes via the interface routines
31      PCView().
32 
33      The various types of solvers (preconditioners, Krylov subspace methods,
34      nonlinear solvers, timesteppers) are all organized similarly, so the
35      above description applies to these categories also.  One exception is
36      that the analogues of PCApply() for these components are KSPSolve(),
37      SNESSolve(), and TSSolve().
38 
39      Additional optional functionality unique to preconditioners is left and
40      right symmetric preconditioner application via PCApplySymmetricLeft()
41      and PCApplySymmetricRight().  The Jacobi implementation is
42      PCApplySymmetricLeftOrRight_Jacobi().
43 
44     -------------------------------------------------------------------- */
45 
46 /*
47    Include files needed for the Jacobi preconditioner:
48      pcimpl.h - private include file intended for use by all preconditioners
49 */
50 
51 #include <petsc/private/pcimpl.h>   /*I "petscpc.h" I*/
52 
53 const char *const PCJacobiTypes[]    = {"DIAGONAL","ROWMAX","ROWSUM","PCJacobiType","PC_JACOBI_",NULL};
54 
55 /*
56    Private context (data structure) for the Jacobi preconditioner.
57 */
58 typedef struct {
59   Vec diag;                      /* vector containing the reciprocals of the diagonal elements of the preconditioner matrix */
60   Vec diagsqrt;                  /* vector containing the reciprocals of the square roots of
61                                     the diagonal elements of the preconditioner matrix (used
62                                     only for symmetric preconditioner application) */
63   PetscBool userowmax;           /* set with PCJacobiSetType() */
64   PetscBool userowsum;
65   PetscBool useabs;              /* use the absolute values of the diagonal entries */
66   PetscBool fixdiag;             /* fix zero diagonal terms */
67 } PC_Jacobi;
68 
69 static PetscErrorCode  PCJacobiSetType_Jacobi(PC pc,PCJacobiType type)
70 {
71   PC_Jacobi *j = (PC_Jacobi*)pc->data;
72 
73   PetscFunctionBegin;
74   j->userowmax = PETSC_FALSE;
75   j->userowsum = PETSC_FALSE;
76   if (type == PC_JACOBI_ROWMAX) {
77     j->userowmax = PETSC_TRUE;
78   } else if (type == PC_JACOBI_ROWSUM) {
79     j->userowsum = PETSC_TRUE;
80   }
81   PetscFunctionReturn(0);
82 }
83 
84 static PetscErrorCode  PCJacobiGetType_Jacobi(PC pc,PCJacobiType *type)
85 {
86   PC_Jacobi *j = (PC_Jacobi*)pc->data;
87 
88   PetscFunctionBegin;
89   if (j->userowmax) {
90     *type = PC_JACOBI_ROWMAX;
91   } else if (j->userowsum) {
92     *type = PC_JACOBI_ROWSUM;
93   } else {
94     *type = PC_JACOBI_DIAGONAL;
95   }
96   PetscFunctionReturn(0);
97 }
98 
99 static PetscErrorCode  PCJacobiSetUseAbs_Jacobi(PC pc,PetscBool flg)
100 {
101   PC_Jacobi *j = (PC_Jacobi*)pc->data;
102 
103   PetscFunctionBegin;
104   j->useabs = flg;
105   PetscFunctionReturn(0);
106 }
107 
108 static PetscErrorCode  PCJacobiGetUseAbs_Jacobi(PC pc,PetscBool *flg)
109 {
110   PC_Jacobi *j = (PC_Jacobi*)pc->data;
111 
112   PetscFunctionBegin;
113   *flg = j->useabs;
114   PetscFunctionReturn(0);
115 }
116 
117 static PetscErrorCode  PCJacobiSetFixDiagonal_Jacobi(PC pc,PetscBool flg)
118 {
119   PC_Jacobi *j = (PC_Jacobi*)pc->data;
120 
121   PetscFunctionBegin;
122   j->fixdiag = flg;
123   PetscFunctionReturn(0);
124 }
125 
126 static PetscErrorCode  PCJacobiGetFixDiagonal_Jacobi(PC pc,PetscBool *flg)
127 {
128   PC_Jacobi *j = (PC_Jacobi*)pc->data;
129 
130   PetscFunctionBegin;
131   *flg = j->fixdiag;
132   PetscFunctionReturn(0);
133 }
134 
135 /* -------------------------------------------------------------------------- */
136 /*
137    PCSetUp_Jacobi - Prepares for the use of the Jacobi preconditioner
138                     by setting data structures and options.
139 
140    Input Parameter:
141 .  pc - the preconditioner context
142 
143    Application Interface Routine: PCSetUp()
144 
145    Notes:
146    The interface routine PCSetUp() is not usually called directly by
147    the user, but instead is called by PCApply() if necessary.
148 */
149 static PetscErrorCode PCSetUp_Jacobi(PC pc)
150 {
151   PC_Jacobi      *jac = (PC_Jacobi*)pc->data;
152   Vec            diag,diagsqrt;
153   PetscErrorCode ierr;
154   PetscInt       n,i;
155   PetscScalar    *x;
156   PetscBool      zeroflag = PETSC_FALSE;
157 
158   PetscFunctionBegin;
159   /*
160        For most preconditioners the code would begin here something like
161 
162   if (pc->setupcalled == 0) { allocate space the first time this is ever called
163     ierr = MatCreateVecs(pc->mat,&jac->diag);CHKERRQ(ierr);
164     PetscLogObjectParent((PetscObject)pc,(PetscObject)jac->diag);
165   }
166 
167     But for this preconditioner we want to support use of both the matrix' diagonal
168     elements (for left or right preconditioning) and square root of diagonal elements
169     (for symmetric preconditioning).  Hence we do not allocate space here, since we
170     don't know at this point which will be needed (diag and/or diagsqrt) until the user
171     applies the preconditioner, and we don't want to allocate BOTH unless we need
172     them both.  Thus, the diag and diagsqrt are allocated in PCSetUp_Jacobi_NonSymmetric()
173     and PCSetUp_Jacobi_Symmetric(), respectively.
174   */
175 
176   /*
177     Here we set up the preconditioner; that is, we copy the diagonal values from
178     the matrix and put them into a format to make them quick to apply as a preconditioner.
179   */
180   diag     = jac->diag;
181   diagsqrt = jac->diagsqrt;
182 
183   if (diag) {
184     PetscBool isspd;
185 
186     if (jac->userowmax) {
187       ierr = MatGetRowMaxAbs(pc->pmat,diag,NULL);CHKERRQ(ierr);
188     } else if (jac->userowsum) {
189       ierr = MatGetRowSum(pc->pmat,diag);CHKERRQ(ierr);
190     } else {
191       ierr = MatGetDiagonal(pc->pmat,diag);CHKERRQ(ierr);
192     }
193     ierr = VecReciprocal(diag);CHKERRQ(ierr);
194     if (jac->useabs) {
195       ierr = VecAbs(diag);CHKERRQ(ierr);
196     }
197     ierr = MatGetOption(pc->pmat,MAT_SPD,&isspd);CHKERRQ(ierr);
198     if (jac->fixdiag && !isspd) {
199       ierr = VecGetLocalSize(diag,&n);CHKERRQ(ierr);
200       ierr = VecGetArray(diag,&x);CHKERRQ(ierr);
201       for (i=0; i<n; i++) {
202         if (x[i] == 0.0) {
203           x[i]     = 1.0;
204           zeroflag = PETSC_TRUE;
205         }
206       }
207       ierr = VecRestoreArray(diag,&x);CHKERRQ(ierr);
208     }
209   }
210   if (diagsqrt) {
211     if (jac->userowmax) {
212       ierr = MatGetRowMaxAbs(pc->pmat,diagsqrt,NULL);CHKERRQ(ierr);
213     } else if (jac->userowsum) {
214       ierr = MatGetRowSum(pc->pmat,diagsqrt);CHKERRQ(ierr);
215     } else {
216       ierr = MatGetDiagonal(pc->pmat,diagsqrt);CHKERRQ(ierr);
217     }
218     ierr = VecGetLocalSize(diagsqrt,&n);CHKERRQ(ierr);
219     ierr = VecGetArray(diagsqrt,&x);CHKERRQ(ierr);
220     for (i=0; i<n; i++) {
221       if (x[i] != 0.0) x[i] = 1.0/PetscSqrtReal(PetscAbsScalar(x[i]));
222       else {
223         x[i]     = 1.0;
224         zeroflag = PETSC_TRUE;
225       }
226     }
227     ierr = VecRestoreArray(diagsqrt,&x);CHKERRQ(ierr);
228   }
229   if (zeroflag) {
230     ierr = PetscInfo(pc,"Zero detected in diagonal of matrix, using 1 at those locations\n");CHKERRQ(ierr);
231   }
232   PetscFunctionReturn(0);
233 }
234 /* -------------------------------------------------------------------------- */
235 /*
236    PCSetUp_Jacobi_Symmetric - Allocates the vector needed to store the
237    inverse of the square root of the diagonal entries of the matrix.  This
238    is used for symmetric application of the Jacobi preconditioner.
239 
240    Input Parameter:
241 .  pc - the preconditioner context
242 */
243 static PetscErrorCode PCSetUp_Jacobi_Symmetric(PC pc)
244 {
245   PetscErrorCode ierr;
246   PC_Jacobi      *jac = (PC_Jacobi*)pc->data;
247 
248   PetscFunctionBegin;
249   ierr = MatCreateVecs(pc->pmat,&jac->diagsqrt,NULL);CHKERRQ(ierr);
250   ierr = PetscLogObjectParent((PetscObject)pc,(PetscObject)jac->diagsqrt);CHKERRQ(ierr);
251   ierr = PCSetUp_Jacobi(pc);CHKERRQ(ierr);
252   PetscFunctionReturn(0);
253 }
254 /* -------------------------------------------------------------------------- */
255 /*
256    PCSetUp_Jacobi_NonSymmetric - Allocates the vector needed to store the
257    inverse of the diagonal entries of the matrix.  This is used for left of
258    right application of the Jacobi preconditioner.
259 
260    Input Parameter:
261 .  pc - the preconditioner context
262 */
263 static PetscErrorCode PCSetUp_Jacobi_NonSymmetric(PC pc)
264 {
265   PetscErrorCode ierr;
266   PC_Jacobi      *jac = (PC_Jacobi*)pc->data;
267 
268   PetscFunctionBegin;
269   ierr = MatCreateVecs(pc->pmat,&jac->diag,NULL);CHKERRQ(ierr);
270   ierr = PetscLogObjectParent((PetscObject)pc,(PetscObject)jac->diag);CHKERRQ(ierr);
271   ierr = PCSetUp_Jacobi(pc);CHKERRQ(ierr);
272   PetscFunctionReturn(0);
273 }
274 /* -------------------------------------------------------------------------- */
275 /*
276    PCApply_Jacobi - Applies the Jacobi preconditioner to a vector.
277 
278    Input Parameters:
279 .  pc - the preconditioner context
280 .  x - input vector
281 
282    Output Parameter:
283 .  y - output vector
284 
285    Application Interface Routine: PCApply()
286  */
287 static PetscErrorCode PCApply_Jacobi(PC pc,Vec x,Vec y)
288 {
289   PC_Jacobi      *jac = (PC_Jacobi*)pc->data;
290   PetscErrorCode ierr;
291 
292   PetscFunctionBegin;
293   if (!jac->diag) {
294     ierr = PCSetUp_Jacobi_NonSymmetric(pc);CHKERRQ(ierr);
295   }
296   ierr = VecPointwiseMult(y,x,jac->diag);CHKERRQ(ierr);
297   PetscFunctionReturn(0);
298 }
299 /* -------------------------------------------------------------------------- */
300 /*
301    PCApplySymmetricLeftOrRight_Jacobi - Applies the left or right part of a
302    symmetric preconditioner to a vector.
303 
304    Input Parameters:
305 .  pc - the preconditioner context
306 .  x - input vector
307 
308    Output Parameter:
309 .  y - output vector
310 
311    Application Interface Routines: PCApplySymmetricLeft(), PCApplySymmetricRight()
312 */
313 static PetscErrorCode PCApplySymmetricLeftOrRight_Jacobi(PC pc,Vec x,Vec y)
314 {
315   PetscErrorCode ierr;
316   PC_Jacobi      *jac = (PC_Jacobi*)pc->data;
317 
318   PetscFunctionBegin;
319   if (!jac->diagsqrt) {
320     ierr = PCSetUp_Jacobi_Symmetric(pc);CHKERRQ(ierr);
321   }
322   ierr = VecPointwiseMult(y,x,jac->diagsqrt);CHKERRQ(ierr);
323   PetscFunctionReturn(0);
324 }
325 
326 /* -------------------------------------------------------------------------- */
327 static PetscErrorCode PCReset_Jacobi(PC pc)
328 {
329   PC_Jacobi      *jac = (PC_Jacobi*)pc->data;
330   PetscErrorCode ierr;
331 
332   PetscFunctionBegin;
333   ierr = VecDestroy(&jac->diag);CHKERRQ(ierr);
334   ierr = VecDestroy(&jac->diagsqrt);CHKERRQ(ierr);
335   PetscFunctionReturn(0);
336 }
337 
338 /*
339    PCDestroy_Jacobi - Destroys the private context for the Jacobi preconditioner
340    that was created with PCCreate_Jacobi().
341 
342    Input Parameter:
343 .  pc - the preconditioner context
344 
345    Application Interface Routine: PCDestroy()
346 */
347 static PetscErrorCode PCDestroy_Jacobi(PC pc)
348 {
349   PetscErrorCode ierr;
350 
351   PetscFunctionBegin;
352   ierr = PCReset_Jacobi(pc);CHKERRQ(ierr);
353   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCJacobiSetType_C",NULL);CHKERRQ(ierr);
354   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCJacobiGetType_C",NULL);CHKERRQ(ierr);
355   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCJacobiSetUseAbs_C",NULL);CHKERRQ(ierr);
356   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCJacobiGetUseAbs_C",NULL);CHKERRQ(ierr);
357   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCJacobiSetFixDiagonal_C",NULL);CHKERRQ(ierr);
358   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCJacobiGetFixDiagonal_C",NULL);CHKERRQ(ierr);
359 
360   /*
361       Free the private data structure that was hanging off the PC
362   */
363   ierr = PetscFree(pc->data);CHKERRQ(ierr);
364   PetscFunctionReturn(0);
365 }
366 
367 static PetscErrorCode PCSetFromOptions_Jacobi(PetscOptionItems *PetscOptionsObject,PC pc)
368 {
369   PC_Jacobi      *jac = (PC_Jacobi*)pc->data;
370   PetscErrorCode ierr;
371   PetscBool      flg;
372   PCJacobiType   deflt,type;
373 
374   PetscFunctionBegin;
375   ierr = PCJacobiGetType(pc,&deflt);CHKERRQ(ierr);
376   ierr = PetscOptionsHead(PetscOptionsObject,"Jacobi options");CHKERRQ(ierr);
377   ierr = PetscOptionsEnum("-pc_jacobi_type","How to construct diagonal matrix","PCJacobiSetType",PCJacobiTypes,(PetscEnum)deflt,(PetscEnum*)&type,&flg);CHKERRQ(ierr);
378   if (flg) {
379     ierr = PCJacobiSetType(pc,type);CHKERRQ(ierr);
380   }
381   ierr = PetscOptionsBool("-pc_jacobi_abs","Use absolute values of diagonal entries","PCJacobiSetUseAbs",jac->useabs,&jac->useabs,NULL);CHKERRQ(ierr);
382   ierr = PetscOptionsBool("-pc_jacobi_fixdiagonal","Fix null terms on diagonal","PCJacobiSetFixDiagonal",jac->fixdiag,&jac->fixdiag,NULL);CHKERRQ(ierr);
383   ierr = PetscOptionsTail();CHKERRQ(ierr);
384   PetscFunctionReturn(0);
385 }
386 
387 static PetscErrorCode PCView_Jacobi(PC pc, PetscViewer viewer)
388 {
389   PC_Jacobi     *jac = (PC_Jacobi *) pc->data;
390   PetscBool      iascii;
391   PetscErrorCode ierr;
392 
393   PetscFunctionBegin;
394   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr);
395   if (iascii) {
396     PCJacobiType      type;
397     PetscBool         useAbs,fixdiag;
398     PetscViewerFormat format;
399 
400     ierr = PCJacobiGetType(pc, &type);CHKERRQ(ierr);
401     ierr = PCJacobiGetUseAbs(pc, &useAbs);CHKERRQ(ierr);
402     ierr = PCJacobiGetFixDiagonal(pc, &fixdiag);CHKERRQ(ierr);
403     ierr = PetscViewerASCIIPrintf(viewer, "  type %s%s%s\n", PCJacobiTypes[type], useAbs ? ", using absolute value of entries" : "", !fixdiag ? ", not checking null diagonal entries" : "");CHKERRQ(ierr);
404     ierr = PetscViewerGetFormat(viewer, &format);CHKERRQ(ierr);
405     if (format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
406       ierr = VecView(jac->diag, viewer);CHKERRQ(ierr);
407     }
408   }
409   PetscFunctionReturn(0);
410 }
411 
412 /* -------------------------------------------------------------------------- */
413 /*
414    PCCreate_Jacobi - Creates a Jacobi preconditioner context, PC_Jacobi,
415    and sets this as the private data within the generic preconditioning
416    context, PC, that was created within PCCreate().
417 
418    Input Parameter:
419 .  pc - the preconditioner context
420 
421    Application Interface Routine: PCCreate()
422 */
423 
424 /*MC
425      PCJACOBI - Jacobi (i.e. diagonal scaling preconditioning)
426 
427    Options Database Key:
428 +    -pc_jacobi_type <diagonal,rowmax,rowsum> - approach for forming the preconditioner
429 .    -pc_jacobi_abs - use the absolute value of the diagonal entry
430 -    -pc_jacobi_fixdiag - fix for zero diagonal terms by placing 1.0 in those locations
431 
432    Level: beginner
433 
434   Notes:
435     By using KSPSetPCSide(ksp,PC_SYMMETRIC) or -ksp_pc_side symmetric
436     can scale each side of the matrix by the square root of the diagonal entries.
437 
438     Zero entries along the diagonal are replaced with the value 1.0
439 
440     See PCPBJACOBI for a point-block Jacobi preconditioner
441 
442 .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
443            PCJacobiSetType(), PCJacobiSetUseAbs(), PCJacobiGetUseAbs(),
444            PCJacobiSetFixDiagonal(), PCJacobiGetFixDiagonal(), PCPBJACOBI
445 M*/
446 
447 PETSC_EXTERN PetscErrorCode PCCreate_Jacobi(PC pc)
448 {
449   PC_Jacobi      *jac;
450   PetscErrorCode ierr;
451 
452   PetscFunctionBegin;
453   /*
454      Creates the private data structure for this preconditioner and
455      attach it to the PC object.
456   */
457   ierr     = PetscNewLog(pc,&jac);CHKERRQ(ierr);
458   pc->data = (void*)jac;
459 
460   /*
461      Initialize the pointers to vectors to ZERO; these will be used to store
462      diagonal entries of the matrix for fast preconditioner application.
463   */
464   jac->diag      = NULL;
465   jac->diagsqrt  = NULL;
466   jac->userowmax = PETSC_FALSE;
467   jac->userowsum = PETSC_FALSE;
468   jac->useabs    = PETSC_FALSE;
469   jac->fixdiag   = PETSC_TRUE;
470 
471   /*
472       Set the pointers for the functions that are provided above.
473       Now when the user-level routines (such as PCApply(), PCDestroy(), etc.)
474       are called, they will automatically call these functions.  Note we
475       choose not to provide a couple of these functions since they are
476       not needed.
477   */
478   pc->ops->apply               = PCApply_Jacobi;
479   pc->ops->applytranspose      = PCApply_Jacobi;
480   pc->ops->setup               = PCSetUp_Jacobi;
481   pc->ops->reset               = PCReset_Jacobi;
482   pc->ops->destroy             = PCDestroy_Jacobi;
483   pc->ops->setfromoptions      = PCSetFromOptions_Jacobi;
484   pc->ops->view                = PCView_Jacobi;
485   pc->ops->applyrichardson     = NULL;
486   pc->ops->applysymmetricleft  = PCApplySymmetricLeftOrRight_Jacobi;
487   pc->ops->applysymmetricright = PCApplySymmetricLeftOrRight_Jacobi;
488 
489   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCJacobiSetType_C",PCJacobiSetType_Jacobi);CHKERRQ(ierr);
490   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCJacobiGetType_C",PCJacobiGetType_Jacobi);CHKERRQ(ierr);
491   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCJacobiSetUseAbs_C",PCJacobiSetUseAbs_Jacobi);CHKERRQ(ierr);
492   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCJacobiGetUseAbs_C",PCJacobiGetUseAbs_Jacobi);CHKERRQ(ierr);
493   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCJacobiSetFixDiagonal_C",PCJacobiSetFixDiagonal_Jacobi);CHKERRQ(ierr);
494   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCJacobiGetFixDiagonal_C",PCJacobiGetFixDiagonal_Jacobi);CHKERRQ(ierr);
495   PetscFunctionReturn(0);
496 }
497 
498 /*@
499    PCJacobiSetUseAbs - Causes the Jacobi preconditioner to use the
500       absolute values of the diagonal divisors in the preconditioner
501 
502    Logically Collective on PC
503 
504    Input Parameters:
505 +  pc - the preconditioner context
506 -  flg - whether to use absolute values or not
507 
508    Options Database Key:
509 .  -pc_jacobi_abs <bool> - use absolute values
510 
511    Notes:
512     This takes affect at the next construction of the preconditioner
513 
514    Level: intermediate
515 
516 .seealso: PCJacobiaSetType(), PCJacobiGetUseAbs()
517 
518 @*/
519 PetscErrorCode  PCJacobiSetUseAbs(PC pc,PetscBool flg)
520 {
521   PetscErrorCode ierr;
522 
523   PetscFunctionBegin;
524   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
525   ierr = PetscTryMethod(pc,"PCJacobiSetUseAbs_C",(PC,PetscBool),(pc,flg));CHKERRQ(ierr);
526   PetscFunctionReturn(0);
527 }
528 
529 /*@
530    PCJacobiGetUseAbs - Determines if the Jacobi preconditioner uses the
531       absolute values of the diagonal divisors in the preconditioner
532 
533    Logically Collective on PC
534 
535    Input Parameter:
536 .  pc - the preconditioner context
537 
538    Output Parameter:
539 .  flg - whether to use absolute values or not
540 
541    Level: intermediate
542 
543 .seealso: PCJacobiaSetType(), PCJacobiSetUseAbs(), PCJacobiGetType()
544 
545 @*/
546 PetscErrorCode  PCJacobiGetUseAbs(PC pc,PetscBool *flg)
547 {
548   PetscErrorCode ierr;
549 
550   PetscFunctionBegin;
551   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
552   ierr = PetscUseMethod(pc,"PCJacobiGetUseAbs_C",(PC,PetscBool*),(pc,flg));CHKERRQ(ierr);
553   PetscFunctionReturn(0);
554 }
555 
556 /*@
557    PCJacobiSetFixDiagonal - Check for zero values on the diagonal and replace them with 1.0
558 
559    Logically Collective on PC
560 
561    Input Parameters:
562 +  pc - the preconditioner context
563 -  flg - the boolean flag
564 
565    Options Database Key:
566 .  -pc_jacobi_fixdiagonal <bool> - check for zero values on the diagonal
567 
568    Notes:
569     This takes affect at the next construction of the preconditioner
570 
571    Level: intermediate
572 
573 .seealso: PCJacobiSetType(), PCJacobiGetFixDiagonal()
574 
575 @*/
576 PetscErrorCode  PCJacobiSetFixDiagonal(PC pc,PetscBool flg)
577 {
578   PetscErrorCode ierr;
579 
580   PetscFunctionBegin;
581   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
582   ierr = PetscTryMethod(pc,"PCJacobiSetFixDiagonal_C",(PC,PetscBool),(pc,flg));CHKERRQ(ierr);
583   PetscFunctionReturn(0);
584 }
585 
586 /*@
587    PCJacobiGetFixDiagonal - Determines if the Jacobi preconditioner checks for zero diagonal terms
588 
589    Logically Collective on PC
590 
591    Input Parameter:
592 .  pc - the preconditioner context
593 
594    Output Parameter:
595 .  flg - the boolean flag
596 
597    Options Database Key:
598 .  -pc_jacobi_fixdiagonal <bool> - Fix 0 terms on diagonal by using 1
599 
600    Level: intermediate
601 
602 .seealso: PCJacobiSetType(), PCJacobiSetFixDiagonal()
603 
604 @*/
605 PetscErrorCode  PCJacobiGetFixDiagonal(PC pc,PetscBool *flg)
606 {
607   PetscErrorCode ierr;
608 
609   PetscFunctionBegin;
610   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
611   ierr = PetscUseMethod(pc,"PCJacobiGetFixDiagonal_C",(PC,PetscBool*),(pc,flg));CHKERRQ(ierr);
612   PetscFunctionReturn(0);
613 }
614 
615 /*@
616    PCJacobiSetType - Causes the Jacobi preconditioner to use either the diagonal, the maximum entry in each row,
617       of the sum of rows entries for the diagonal preconditioner
618 
619    Logically Collective on PC
620 
621    Input Parameters:
622 +  pc - the preconditioner context
623 -  type - PC_JACOBI_DIAGONAL, PC_JACOBI_ROWMAX, PC_JACOBI_ROWSUM
624 
625    Options Database Key:
626 .  -pc_jacobi_type <diagonal,rowmax,rowsum> - the type of diagonal matrix to use for Jacobi
627 
628    Level: intermediate
629 
630 .seealso: PCJacobiaUseAbs(), PCJacobiGetType()
631 @*/
632 PetscErrorCode  PCJacobiSetType(PC pc,PCJacobiType type)
633 {
634   PetscErrorCode ierr;
635 
636   PetscFunctionBegin;
637   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
638   ierr = PetscTryMethod(pc,"PCJacobiSetType_C",(PC,PCJacobiType),(pc,type));CHKERRQ(ierr);
639   PetscFunctionReturn(0);
640 }
641 
642 /*@
643    PCJacobiGetType - Gets how the diagonal matrix is produced for the preconditioner
644 
645    Not Collective on PC
646 
647    Input Parameter:
648 .  pc - the preconditioner context
649 
650    Output Parameter:
651 .  type - PC_JACOBI_DIAGONAL, PC_JACOBI_ROWMAX, PC_JACOBI_ROWSUM
652 
653    Level: intermediate
654 
655 .seealso: PCJacobiaUseAbs(), PCJacobiSetType()
656 @*/
657 PetscErrorCode  PCJacobiGetType(PC pc,PCJacobiType *type)
658 {
659   PetscErrorCode ierr;
660 
661   PetscFunctionBegin;
662   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
663   ierr = PetscUseMethod(pc,"PCJacobiGetType_C",(PC,PCJacobiType*),(pc,type));CHKERRQ(ierr);
664   PetscFunctionReturn(0);
665 }
666