1 /*$Id: itcreate.c,v 1.206 2001/08/06 21:16:38 bsmith Exp $*/ 2 /* 3 The basic KSP routines, Create, View etc. are here. 4 */ 5 #include "src/ksp/ksp/kspimpl.h" /*I "petscksp.h" I*/ 6 #include "petscsys.h" 7 8 /* Logging support */ 9 int KSP_COOKIE = 0; 10 int KSP_GMRESOrthogonalization = 0, KSP_SetUp = 0, KSP_Solve = 0; 11 12 13 PetscTruth KSPRegisterAllCalled = PETSC_FALSE; 14 15 #undef __FUNCT__ 16 #define __FUNCT__ "KSPView" 17 /*@C 18 KSPView - Prints the KSP data structure. 19 20 Collective on KSP 21 22 Input Parameters: 23 + ksp - the Krylov space context 24 - viewer - visualization context 25 26 Note: 27 The available visualization contexts include 28 + PETSC_VIEWER_STDOUT_SELF - standard output (default) 29 - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 30 output where only the first processor opens 31 the file. All other processors send their 32 data to the first processor to print. 33 34 The user can open an alternative visualization context with 35 PetscViewerASCIIOpen() - output to a specified file. 36 37 Level: developer 38 39 .keywords: KSP, view 40 41 .seealso: PCView(), PetscViewerASCIIOpen() 42 @*/ 43 int KSPView(KSP ksp,PetscViewer viewer) 44 { 45 char *type; 46 int ierr; 47 PetscTruth isascii; 48 49 PetscFunctionBegin; 50 PetscValidHeaderSpecific(ksp,KSP_COOKIE); 51 if (!viewer) viewer = PETSC_VIEWER_STDOUT_(ksp->comm); 52 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_COOKIE); 53 PetscCheckSameComm(ksp,viewer); 54 55 ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);CHKERRQ(ierr); 56 if (isascii) { 57 ierr = KSPGetType(ksp,&type);CHKERRQ(ierr); 58 if (ksp->prefix) { 59 ierr = PetscViewerASCIIPrintf(viewer,"KSP Object:(%s)\n",ksp->prefix);CHKERRQ(ierr); 60 } else { 61 ierr = PetscViewerASCIIPrintf(viewer,"KSP Object:\n");CHKERRQ(ierr); 62 } 63 if (type) { 64 ierr = PetscViewerASCIIPrintf(viewer," type: %s\n",type);CHKERRQ(ierr); 65 } else { 66 ierr = PetscViewerASCIIPrintf(viewer," type: not yet set\n");CHKERRQ(ierr); 67 } 68 if (ksp->ops->view) { 69 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 70 ierr = (*ksp->ops->view)(ksp,viewer);CHKERRQ(ierr); 71 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 72 } 73 if (ksp->guess_zero) {ierr = PetscViewerASCIIPrintf(viewer," maximum iterations=%d, initial guess is zero\n",ksp->max_it);CHKERRQ(ierr);} 74 else {ierr = PetscViewerASCIIPrintf(viewer," maximum iterations=%d\n", ksp->max_it);CHKERRQ(ierr);} 75 if (ksp->guess_knoll) {ierr = PetscViewerASCIIPrintf(viewer," using preconditioner applied to right hand side for initial guess\n");CHKERRQ(ierr);} 76 ierr = PetscViewerASCIIPrintf(viewer," tolerances: relative=%g, absolute=%g, divergence=%g\n",ksp->rtol,ksp->atol,ksp->divtol);CHKERRQ(ierr); 77 if (ksp->pc_side == PC_RIGHT) {ierr = PetscViewerASCIIPrintf(viewer," right preconditioning\n");CHKERRQ(ierr);} 78 else if (ksp->pc_side == PC_SYMMETRIC) {ierr = PetscViewerASCIIPrintf(viewer," symmetric preconditioning\n");CHKERRQ(ierr);} 79 else {ierr = PetscViewerASCIIPrintf(viewer," left preconditioning\n");CHKERRQ(ierr);} 80 } else { 81 if (ksp->ops->view) { 82 ierr = (*ksp->ops->view)(ksp,viewer);CHKERRQ(ierr); 83 } 84 } 85 ierr = PCView(ksp->B,viewer);CHKERRQ(ierr); 86 PetscFunctionReturn(0); 87 } 88 89 /* 90 Contains the list of registered KSP routines 91 */ 92 PetscFList KSPList = 0; 93 94 #undef __FUNCT__ 95 #define __FUNCT__ "KSPSetNormType" 96 /*@C 97 KSPSetNormType - Sets the norm that is used for convergence testing. 98 99 Collective on KSP 100 101 Input Parameter: 102 + ksp - Krylov solver context 103 - normtype - one of 104 $ KSP_NO_NORM - skips computing the norm, this should only be used if you are using 105 $ the Krylov method as a smoother with a fixed small number of iterations. 106 $ You must also call KSPSetConvergenceTest(ksp,KSPSkipConverged,PETSC_NULL); 107 $ supported only by CG, Richardson, Bi-CG-stab, CR, and CGS methods. 108 $ KSP_PRECONDITIONED_NORM - the default for left preconditioned solves, uses the l2 norm 109 $ of the preconditioned residual 110 $ KSP_UNPRECONDITIONED_NORM - uses the l2 norm of the true b - Ax residual, supported only by 111 $ CG, CHEBYCHEV, and RICHARDSON 112 $ KSP_NATURAL_NORM - supported by cg, cr, and cgs 113 114 115 Options Database Key: 116 . -ksp_norm_type <none,preconditioned,unpreconditioned,natural> 117 118 Notes: 119 Currently only works with the CG, Richardson, Bi-CG-stab, CR, and CGS methods. 120 121 Level: advanced 122 123 .keywords: KSP, create, context, norms 124 125 .seealso: KSPSetUp(), KSPSolve(), KSPDestroy(), KSPSkipConverged() 126 @*/ 127 int KSPSetNormType(KSP ksp,KSPNormType normtype) 128 { 129 130 PetscFunctionBegin; 131 PetscValidHeaderSpecific(ksp,KSP_COOKIE); 132 ksp->normtype = normtype; 133 if (normtype == KSP_NO_NORM) { 134 PetscLogInfo(ksp,"KSPSetNormType:Warning seting KSPNormType to skip computing the norm\n\ 135 make sure you set the KSP convergence test to KSPSkipConvergence\n"); 136 } 137 PetscFunctionReturn(0); 138 } 139 140 #undef __FUNCT__ 141 #define __FUNCT__ "KSPPublish_Petsc" 142 static int KSPPublish_Petsc(PetscObject obj) 143 { 144 #if defined(PETSC_HAVE_AMS) 145 KSP v = (KSP) obj; 146 int ierr; 147 #endif 148 149 PetscFunctionBegin; 150 151 #if defined(PETSC_HAVE_AMS) 152 /* if it is already published then return */ 153 if (v->amem >=0) PetscFunctionReturn(0); 154 155 ierr = PetscObjectPublishBaseBegin(obj);CHKERRQ(ierr); 156 ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Iteration",&v->its,1,AMS_INT,AMS_READ, 157 AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 158 ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Residual",&v->rnorm,1,AMS_DOUBLE,AMS_READ, 159 AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 160 161 if (v->res_hist_max > 0) { 162 ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"ResidualNormsCount",&v->res_hist_len,1,AMS_INT,AMS_READ, 163 AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 164 ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"ResidualNormsCountMax",&v->res_hist_max,1,AMS_INT,AMS_READ, 165 AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 166 ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"ResidualNorms",v->res_hist,v->res_hist_max,AMS_DOUBLE,AMS_READ, 167 AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 168 } 169 170 ierr = PetscObjectPublishBaseEnd(obj);CHKERRQ(ierr); 171 #endif 172 PetscFunctionReturn(0); 173 } 174 175 #undef __FUNCT__ 176 #define __FUNCT__ "KSPSetOperators" 177 /*@ 178 KSPSetOperators - Sets the matrix associated with the linear system 179 and a (possibly) different one associated with the preconditioner. 180 181 Collective on KSP and Mat 182 183 Input Parameters: 184 + ksp - the KSP context 185 . Amat - the matrix associated with the linear system 186 . Pmat - the matrix to be used in constructing the preconditioner, usually the 187 same as Amat. 188 - flag - flag indicating information about the preconditioner matrix structure 189 during successive linear solves. This flag is ignored the first time a 190 linear system is solved, and thus is irrelevant when solving just one linear 191 system. 192 193 Notes: 194 The flag can be used to eliminate unnecessary work in the preconditioner 195 during the repeated solution of linear systems of the same size. The 196 available options are 197 $ SAME_PRECONDITIONER - 198 $ Pmat is identical during successive linear solves. 199 $ This option is intended for folks who are using 200 $ different Amat and Pmat matrices and want to reuse the 201 $ same preconditioner matrix. For example, this option 202 $ saves work by not recomputing incomplete factorization 203 $ for ILU/ICC preconditioners. 204 $ SAME_NONZERO_PATTERN - 205 $ Pmat has the same nonzero structure during 206 $ successive linear solves. 207 $ DIFFERENT_NONZERO_PATTERN - 208 $ Pmat does not have the same nonzero structure. 209 210 Caution: 211 If you specify SAME_NONZERO_PATTERN, PETSc believes your assertion 212 and does not check the structure of the matrix. If you erroneously 213 claim that the structure is the same when it actually is not, the new 214 preconditioner will not function correctly. Thus, use this optimization 215 feature carefully! 216 217 If in doubt about whether your preconditioner matrix has changed 218 structure or not, use the flag DIFFERENT_NONZERO_PATTERN. 219 220 Level: beginner 221 222 .keywords: KSP, set, operators, matrix, preconditioner, linear system 223 224 .seealso: KSPSolve(), KSPGetPC(), PCGetOperators(), PCSetOperators() 225 @*/ 226 int KSPSetOperators(KSP ksp,Mat Amat,Mat Pmat,MatStructure flag) 227 { 228 PetscFunctionBegin; 229 PetscValidHeaderSpecific(ksp,KSP_COOKIE); 230 PetscValidHeaderSpecific(Amat,MAT_COOKIE); 231 PetscValidHeaderSpecific(Pmat,MAT_COOKIE); 232 PCSetOperators(ksp->B,Amat,Pmat,flag); 233 if (ksp->setupcalled > 1) ksp->setupcalled = 1; /* so that next solve call will call setup */ 234 PetscFunctionReturn(0); 235 } 236 237 #undef __FUNCT__ 238 #define __FUNCT__ "KSPCreate" 239 /*@C 240 KSPCreate - Creates the default KSP context. 241 242 Collective on MPI_Comm 243 244 Input Parameter: 245 . comm - MPI communicator 246 247 Output Parameter: 248 . ksp - location to put the KSP context 249 250 Notes: 251 The default KSP type is GMRES with a restart of 30, using modified Gram-Schmidt 252 orthogonalization. 253 254 Level: developer 255 256 .keywords: KSP, create, context 257 258 .seealso: KSPSetUp(), KSPSolve(), KSPDestroy(), KSP 259 @*/ 260 int KSPCreate(MPI_Comm comm,KSP *inksp) 261 { 262 KSP ksp; 263 int ierr; 264 265 PetscFunctionBegin; 266 PetscValidPointer(inksp); 267 *inksp = 0; 268 #ifndef PETSC_USE_DYNAMIC_LIBRARIES 269 ierr = KSPInitializePackage(PETSC_NULL); CHKERRQ(ierr); 270 #endif 271 272 PetscHeaderCreate(ksp,_p_KSP,struct _KSPOps,KSP_COOKIE,-1,"KSP",comm,KSPDestroy,KSPView); 273 PetscLogObjectCreate(ksp); 274 *inksp = ksp; 275 ksp->bops->publish = KSPPublish_Petsc; 276 277 ksp->type = -1; 278 ksp->max_it = 10000; 279 ksp->pc_side = PC_LEFT; 280 ksp->rtol = 1.e-5; 281 ksp->atol = 1.e-50; 282 ksp->divtol = 1.e4; 283 284 ksp->normtype = KSP_PRECONDITIONED_NORM; 285 ksp->rnorm = 0.0; 286 ksp->its = 0; 287 ksp->guess_zero = PETSC_TRUE; 288 ksp->calc_sings = PETSC_FALSE; 289 ksp->res_hist = PETSC_NULL; 290 ksp->res_hist_len = 0; 291 ksp->res_hist_max = 0; 292 ksp->res_hist_reset = PETSC_TRUE; 293 ksp->numbermonitors = 0; 294 ksp->converged = KSPDefaultConverged; 295 ksp->ops->buildsolution = KSPDefaultBuildSolution; 296 ksp->ops->buildresidual = KSPDefaultBuildResidual; 297 298 ksp->ops->setfromoptions = 0; 299 300 ksp->vec_sol = 0; 301 ksp->vec_rhs = 0; 302 ksp->B = 0; 303 304 ksp->ops->solve = 0; 305 ksp->ops->setup = 0; 306 ksp->ops->destroy = 0; 307 308 ksp->data = 0; 309 ksp->nwork = 0; 310 ksp->work = 0; 311 312 ksp->cnvP = 0; 313 314 ksp->reason = KSP_CONVERGED_ITERATING; 315 316 ksp->setupcalled = 0; 317 ierr = PetscPublishAll(ksp);CHKERRQ(ierr); 318 ierr = PCCreate(comm,&ksp->B);CHKERRQ(ierr); 319 PetscFunctionReturn(0); 320 } 321 322 #undef __FUNCT__ 323 #define __FUNCT__ "KSPSetType" 324 /*@C 325 KSPSetType - Builds KSP for a particular solver. 326 327 Collective on KSP 328 329 Input Parameters: 330 + ksp - the Krylov space context 331 - type - a known method 332 333 Options Database Key: 334 . -ksp_type <method> - Sets the method; use -help for a list 335 of available methods (for instance, cg or gmres) 336 337 Notes: 338 See "petsc/include/petscksp.h" for available methods (for instance, 339 KSPCG or KSPGMRES). 340 341 Normally, it is best to use the KSPSetFromOptions() command and 342 then set the KSP type from the options database rather than by using 343 this routine. Using the options database provides the user with 344 maximum flexibility in evaluating the many different Krylov methods. 345 The KSPSetType() routine is provided for those situations where it 346 is necessary to set the iterative solver independently of the command 347 line or options database. This might be the case, for example, when 348 the choice of iterative solver changes during the execution of the 349 program, and the user's application is taking responsibility for 350 choosing the appropriate method. In other words, this routine is 351 not for beginners. 352 353 Level: intermediate 354 355 .keywords: KSP, set, method 356 357 .seealso: PCSetType(), KSPType 358 359 @*/ 360 int KSPSetType(KSP ksp,const KSPType type) 361 { 362 int ierr,(*r)(KSP); 363 PetscTruth match; 364 365 PetscFunctionBegin; 366 PetscValidHeaderSpecific(ksp,KSP_COOKIE); 367 PetscValidCharPointer(type); 368 369 ierr = PetscTypeCompare((PetscObject)ksp,type,&match);CHKERRQ(ierr); 370 if (match) PetscFunctionReturn(0); 371 372 if (ksp->data) { 373 /* destroy the old private KSP context */ 374 ierr = (*ksp->ops->destroy)(ksp);CHKERRQ(ierr); 375 ksp->data = 0; 376 } 377 /* Get the function pointers for the iterative method requested */ 378 if (!KSPRegisterAllCalled) {ierr = KSPRegisterAll(PETSC_NULL);CHKERRQ(ierr);} 379 380 ierr = PetscFListFind(ksp->comm,KSPList,type,(void (**)(void)) &r);CHKERRQ(ierr); 381 382 if (!r) SETERRQ1(1,"Unknown KSP type given: %s",type); 383 384 ksp->setupcalled = 0; 385 ierr = (*r)(ksp);CHKERRQ(ierr); 386 387 ierr = PetscObjectChangeTypeName((PetscObject)ksp,type);CHKERRQ(ierr); 388 PetscFunctionReturn(0); 389 } 390 391 #undef __FUNCT__ 392 #define __FUNCT__ "KSPRegisterDestroy" 393 /*@C 394 KSPRegisterDestroy - Frees the list of KSP methods that were 395 registered by KSPRegisterDynamic(). 396 397 Not Collective 398 399 Level: advanced 400 401 .keywords: KSP, register, destroy 402 403 .seealso: KSPRegisterDynamic(), KSPRegisterAll() 404 @*/ 405 int KSPRegisterDestroy(void) 406 { 407 int ierr; 408 409 PetscFunctionBegin; 410 if (KSPList) { 411 ierr = PetscFListDestroy(&KSPList);CHKERRQ(ierr); 412 KSPList = 0; 413 } 414 KSPRegisterAllCalled = PETSC_FALSE; 415 PetscFunctionReturn(0); 416 } 417 418 #undef __FUNCT__ 419 #define __FUNCT__ "KSPGetType" 420 /*@C 421 KSPGetType - Gets the KSP type as a string from the KSP object. 422 423 Not Collective 424 425 Input Parameter: 426 . ksp - Krylov context 427 428 Output Parameter: 429 . name - name of KSP method 430 431 Level: intermediate 432 433 .keywords: KSP, get, method, name 434 435 .seealso: KSPSetType() 436 @*/ 437 int KSPGetType(KSP ksp,KSPType *type) 438 { 439 PetscFunctionBegin; 440 PetscValidHeaderSpecific(ksp,KSP_COOKIE); 441 *type = ksp->type_name; 442 PetscFunctionReturn(0); 443 } 444 445 #undef __FUNCT__ 446 #define __FUNCT__ "KSPSetFromOptions" 447 /*@ 448 KSPSetFromOptions - Sets KSP options from the options database. 449 This routine must be called before KSPSetUp() if the user is to be 450 allowed to set the Krylov type. 451 452 Collective on KSP 453 454 Input Parameters: 455 . ksp - the Krylov space context 456 457 Options Database Keys: 458 + -ksp_max_it - maximum number of linear iterations 459 . -ksp_rtol rtol - relative tolerance used in default determination of convergence, i.e. 460 if residual norm decreases by this factor than convergence is declared 461 . -ksp_atol atol - absolute tolerance used in default convergence test, i.e. if residual 462 norm is less than this then convergence is declared 463 . -ksp_divtol tol - if residual norm increases by this factor than divergence is declared 464 . -ksp_norm_type - none - skip norms used in convergence tests (useful only when not using 465 $ convergence test (say you always want to run with 5 iterations) to 466 $ save on communication overhead 467 $ preconditioned - default for left preconditioning 468 $ unpreconditioned - see KSPSetNormType() 469 $ natural - see KSPSetNormType() 470 . -ksp_knoll - compute initial guess by applying the preconditioner to the right hand side 471 . -ksp_cancelmonitors - cancel all previous convergene monitor routines set 472 . -ksp_monitor - print residual norm at each iteration 473 . -ksp_xmonitor - plot residual norm at each iteration 474 . -ksp_vecmonitor - plot solution at each iteration 475 - -ksp_singmonitor - monitor extremem singular values at each iteration 476 477 Notes: 478 To see all options, run your program with the -help option 479 or consult the users manual. 480 481 Level: developer 482 483 .keywords: KSP, set, from, options, database 484 485 .seealso: 486 @*/ 487 int KSPSetFromOptions(KSP ksp) 488 { 489 int ierr,indx; 490 char type[256]; 491 const char *stype[] = {"none","preconditioned","unpreconditioned","natural"}; 492 PetscTruth flg; 493 494 PetscFunctionBegin; 495 PetscValidHeaderSpecific(ksp,KSP_COOKIE); 496 ierr = PCSetFromOptions(ksp->B);CHKERRQ(ierr); 497 498 if (!KSPRegisterAllCalled) {ierr = KSPRegisterAll(PETSC_NULL);CHKERRQ(ierr);} 499 ierr = PetscOptionsBegin(ksp->comm,ksp->prefix,"Krylov Method (KSP) Options","KSP");CHKERRQ(ierr); 500 ierr = PetscOptionsList("-ksp_type","Krylov method","KSPSetType",KSPList,(char*)(ksp->type_name?ksp->type_name:KSPGMRES),type,256,&flg);CHKERRQ(ierr); 501 if (flg) { 502 ierr = KSPSetType(ksp,type);CHKERRQ(ierr); 503 } 504 /* 505 Set the type if it was never set. 506 */ 507 if (!ksp->type_name) { 508 ierr = KSPSetType(ksp,KSPGMRES);CHKERRQ(ierr); 509 } 510 511 ierr = PetscOptionsInt("-ksp_max_it","Maximum number of iterations","KSPSetTolerances",ksp->max_it,&ksp->max_it,PETSC_NULL);CHKERRQ(ierr); 512 ierr = PetscOptionsReal("-ksp_rtol","Relative decrease in residual norm","KSPSetTolerances",ksp->rtol,&ksp->rtol,PETSC_NULL);CHKERRQ(ierr); 513 ierr = PetscOptionsReal("-ksp_atol","Absolute value of residual norm","KSPSetTolerances",ksp->atol,&ksp->atol,PETSC_NULL);CHKERRQ(ierr); 514 ierr = PetscOptionsReal("-ksp_divtol","Residual norm increase cause divergence","KSPSetTolerances",ksp->divtol,&ksp->divtol,PETSC_NULL);CHKERRQ(ierr); 515 ierr = PetscOptionsLogical("-ksp_knoll","Use preconditioner applied to b for initial guess","KSPSetInitialGuessKnoll",ksp->guess_knoll, 516 &ksp->guess_knoll,PETSC_NULL);CHKERRQ(ierr); 517 518 ierr = PetscOptionsEList("-ksp_norm_type","KSP Norm type","KSPSetNormType",stype,4,"preconditioned",&indx,&flg);CHKERRQ(ierr); 519 if (flg) { 520 switch (indx) { 521 case 0: 522 ierr = KSPSetNormType(ksp,KSP_NO_NORM);CHKERRQ(ierr); 523 ierr = KSPSetConvergenceTest(ksp,KSPSkipConverged,0);CHKERRQ(ierr); 524 break; 525 case 1: 526 ierr = KSPSetNormType(ksp,KSP_PRECONDITIONED_NORM);CHKERRQ(ierr); 527 break; 528 case 2: 529 ierr = KSPSetNormType(ksp,KSP_UNPRECONDITIONED_NORM);CHKERRQ(ierr); 530 break; 531 case 3: 532 ierr = KSPSetNormType(ksp,KSP_NATURAL_NORM);CHKERRQ(ierr); 533 break; 534 } 535 } 536 537 ierr = PetscOptionsName("-ksp_diagonal_scale","Diagonal scale matrix before building preconditioner","KSPSetDiagonalScale",&flg);CHKERRQ(ierr); 538 if (flg) { 539 ierr = KSPSetDiagonalScale(ksp,PETSC_TRUE);CHKERRQ(ierr); 540 } 541 ierr = PetscOptionsName("-ksp_diagonal_scale_fix","Fix diagonaled scaled matrix after solve","KSPSetDiagonalScaleFix",&flg);CHKERRQ(ierr); 542 if (flg) { 543 ierr = KSPSetDiagonalScaleFix(ksp,PETSC_TRUE);CHKERRQ(ierr); 544 } 545 546 /* 547 Prints reason for convergence or divergence of each linear solve 548 */ 549 ierr = PetscOptionsName("-ksp_converged_reason","Print reason for converged or diverged","KSPSolve",&flg);CHKERRQ(ierr); 550 if (flg) { 551 ksp->printreason = PETSC_TRUE; 552 } 553 554 ierr = PetscOptionsName("-ksp_cancelmonitors","Remove any hardwired monitor routines","KSPClearMonitor",&flg);CHKERRQ(ierr); 555 /* -----------------------------------------------------------------------*/ 556 /* 557 Cancels all monitors hardwired into code before call to KSPSetFromOptions() 558 */ 559 if (flg) { 560 ierr = KSPClearMonitor(ksp);CHKERRQ(ierr); 561 } 562 /* 563 Prints preconditioned residual norm at each iteration 564 */ 565 ierr = PetscOptionsName("-ksp_monitor","Monitor preconditioned residual norm","KSPSetMonitor",&flg);CHKERRQ(ierr); 566 if (flg) { 567 ierr = KSPSetMonitor(ksp,KSPDefaultMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 568 } 569 /* 570 Plots the vector solution 571 */ 572 ierr = PetscOptionsName("-ksp_vecmonitor","Monitor solution graphically","KSPSetMonitor",&flg);CHKERRQ(ierr); 573 if (flg) { 574 ierr = KSPSetMonitor(ksp,KSPVecViewMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 575 } 576 /* 577 Prints preconditioned and true residual norm at each iteration 578 */ 579 ierr = PetscOptionsName("-ksp_truemonitor","Monitor true (unpreconditioned) residual norm","KSPSetMonitor",&flg);CHKERRQ(ierr); 580 if (flg) { 581 ierr = KSPSetMonitor(ksp,KSPTrueMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 582 } 583 /* 584 Prints extreme eigenvalue estimates at each iteration 585 */ 586 ierr = PetscOptionsName("-ksp_singmonitor","Monitor singular values","KSPSetMonitor",&flg);CHKERRQ(ierr); 587 if (flg) { 588 ierr = KSPSetComputeSingularValues(ksp,PETSC_TRUE);CHKERRQ(ierr); 589 ierr = KSPSetMonitor(ksp,KSPSingularValueMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 590 } 591 /* 592 Prints preconditioned residual norm with fewer digits 593 */ 594 ierr = PetscOptionsName("-ksp_smonitor","Monitor preconditioned residual norm with fewer digitis","KSPSetMonitor",&flg);CHKERRQ(ierr); 595 if (flg) { 596 ierr = KSPSetMonitor(ksp,KSPDefaultSMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 597 } 598 /* 599 Graphically plots preconditioned residual norm 600 */ 601 ierr = PetscOptionsName("-ksp_xmonitor","Monitor graphically preconditioned residual norm","KSPSetMonitor",&flg);CHKERRQ(ierr); 602 if (flg) { 603 ierr = KSPSetMonitor(ksp,KSPLGMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 604 } 605 /* 606 Graphically plots preconditioned and true residual norm 607 */ 608 ierr = PetscOptionsName("-ksp_xtruemonitor","Monitor graphically true residual norm","KSPSetMonitor",&flg);CHKERRQ(ierr); 609 if (flg){ 610 ierr = KSPSetMonitor(ksp,KSPLGTrueMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 611 } 612 613 /* -----------------------------------------------------------------------*/ 614 615 ierr = PetscOptionsLogicalGroupBegin("-ksp_left_pc","Use left preconditioning","KSPSetPreconditionerSide",&flg);CHKERRQ(ierr); 616 if (flg) { ierr = KSPSetPreconditionerSide(ksp,PC_LEFT);CHKERRQ(ierr); } 617 ierr = PetscOptionsLogicalGroup("-ksp_right_pc","Use right preconditioning","KSPSetPreconditionerSide",&flg);CHKERRQ(ierr); 618 if (flg) { ierr = KSPSetPreconditionerSide(ksp,PC_RIGHT);CHKERRQ(ierr);} 619 ierr = PetscOptionsLogicalGroupEnd("-ksp_symmetric_pc","Use symmetric (factorized) preconditioning","KSPSetPreconditionerSide",&flg);CHKERRQ(ierr); 620 if (flg) { ierr = KSPSetPreconditionerSide(ksp,PC_SYMMETRIC);CHKERRQ(ierr);} 621 622 ierr = PetscOptionsName("-ksp_compute_singularvalues","Compute singular values of preconditioned operator","KSPSetComputeSingularValues",&flg);CHKERRQ(ierr); 623 if (flg) { ierr = KSPSetComputeSingularValues(ksp,PETSC_TRUE);CHKERRQ(ierr); } 624 ierr = PetscOptionsName("-ksp_compute_eigenvalues","Compute eigenvalues of preconditioned operator","KSPSetComputeSingularValues",&flg);CHKERRQ(ierr); 625 if (flg) { ierr = KSPSetComputeSingularValues(ksp,PETSC_TRUE);CHKERRQ(ierr); } 626 ierr = PetscOptionsName("-ksp_plot_eigenvalues","Scatter plot extreme eigenvalues","KSPSetComputeSingularValues",&flg);CHKERRQ(ierr); 627 if (flg) { ierr = KSPSetComputeSingularValues(ksp,PETSC_TRUE);CHKERRQ(ierr); } 628 629 if (ksp->ops->setfromoptions) { 630 ierr = (*ksp->ops->setfromoptions)(ksp);CHKERRQ(ierr); 631 } 632 ierr = PetscOptionsName("-ksp_view","View linear solver parameters","KSPView",&flg);CHKERRQ(ierr); 633 ierr = PetscOptionsEnd();CHKERRQ(ierr); 634 PetscFunctionReturn(0); 635 } 636 637 638 #undef __FUNCT__ 639 #define __FUNCT__ "KSPRegister" 640 /*@C 641 KSPRegister - See KSPRegisterDynamic() 642 643 Level: advanced 644 @*/ 645 int KSPRegister(const char sname[],const char path[],const char name[],int (*function)(KSP)) 646 { 647 int ierr; 648 char fullname[256]; 649 650 PetscFunctionBegin; 651 ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr); 652 ierr = PetscFListAdd(&KSPList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); 653 PetscFunctionReturn(0); 654 } 655