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