xref: /petsc/src/ksp/ksp/interface/itcreate.c (revision f239ade3e5ed0f97b9a397c23cbf83f0163a134d)
1 
2 /*
3      The basic KSP routines, Create, View etc. are here.
4 */
5 #include <petsc/private/kspimpl.h>      /*I "petscksp.h" I*/
6 
7 /* Logging support */
8 PetscClassId  KSP_CLASSID;
9 PetscClassId  DMKSP_CLASSID;
10 PetscLogEvent KSP_GMRESOrthogonalization, KSP_SetUp, KSP_Solve;
11 
12 /*
13    Contains the list of registered KSP routines
14 */
15 PetscFunctionList KSPList              = 0;
16 PetscBool         KSPRegisterAllCalled = PETSC_FALSE;
17 
18 /*@C
19   KSPLoad - Loads a KSP that has been stored in binary  with KSPView().
20 
21   Collective on PetscViewer
22 
23   Input Parameters:
24 + newdm - the newly loaded KSP, this needs to have been created with KSPCreate() or
25            some related function before a call to KSPLoad().
26 - viewer - binary file viewer, obtained from PetscViewerBinaryOpen()
27 
28    Level: intermediate
29 
30   Notes:
31    The type is determined by the data in the file, any type set into the KSP before this call is ignored.
32 
33   Notes for advanced users:
34   Most users should not need to know the details of the binary storage
35   format, since KSPLoad() and KSPView() completely hide these details.
36   But for anyone who's interested, the standard binary matrix storage
37   format is
38 .vb
39      has not yet been determined
40 .ve
41 
42 .seealso: PetscViewerBinaryOpen(), KSPView(), MatLoad(), VecLoad()
43 @*/
44 PetscErrorCode  KSPLoad(KSP newdm, PetscViewer viewer)
45 {
46   PetscErrorCode ierr;
47   PetscBool      isbinary;
48   PetscInt       classid;
49   char           type[256];
50   PC             pc;
51 
52   PetscFunctionBegin;
53   PetscValidHeaderSpecific(newdm,KSP_CLASSID,1);
54   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
55   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
56   if (!isbinary) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid viewer; open viewer with PetscViewerBinaryOpen()");
57 
58   ierr = PetscViewerBinaryRead(viewer,&classid,1,NULL,PETSC_INT);CHKERRQ(ierr);
59   if (classid != KSP_FILE_CLASSID) SETERRQ(PetscObjectComm((PetscObject)newdm),PETSC_ERR_ARG_WRONG,"Not KSP next in file");
60   ierr = PetscViewerBinaryRead(viewer,type,256,NULL,PETSC_CHAR);CHKERRQ(ierr);
61   ierr = KSPSetType(newdm, type);CHKERRQ(ierr);
62   if (newdm->ops->load) {
63     ierr = (*newdm->ops->load)(newdm,viewer);CHKERRQ(ierr);
64   }
65   ierr = KSPGetPC(newdm,&pc);CHKERRQ(ierr);
66   ierr = PCLoad(pc,viewer);CHKERRQ(ierr);
67   PetscFunctionReturn(0);
68 }
69 
70 #include <petscdraw.h>
71 #if defined(PETSC_HAVE_SAWS)
72 #include <petscviewersaws.h>
73 #endif
74 /*@C
75    KSPView - Prints the KSP data structure.
76 
77    Collective on KSP
78 
79    Input Parameters:
80 +  ksp - the Krylov space context
81 -  viewer - visualization context
82 
83    Options Database Keys:
84 .  -ksp_view - print the ksp data structure at the end of a KSPSolve call
85 
86    Note:
87    The available visualization contexts include
88 +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
89 -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
90          output where only the first processor opens
91          the file.  All other processors send their
92          data to the first processor to print.
93 
94    The user can open an alternative visualization context with
95    PetscViewerASCIIOpen() - output to a specified file.
96 
97    Level: beginner
98 
99 .keywords: KSP, view
100 
101 .seealso: PCView(), PetscViewerASCIIOpen()
102 @*/
103 PetscErrorCode  KSPView(KSP ksp,PetscViewer viewer)
104 {
105   PetscErrorCode ierr;
106   PetscBool      iascii,isbinary,isdraw;
107 #if defined(PETSC_HAVE_SAWS)
108   PetscBool      issaws;
109 #endif
110 
111   PetscFunctionBegin;
112   PetscValidHeaderSpecific(ksp,KSP_CLASSID,1);
113   if (!viewer) {
114     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)ksp),&viewer);CHKERRQ(ierr);
115   }
116   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
117   PetscCheckSameComm(ksp,1,viewer,2);
118 
119   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
120   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
121   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
122 #if defined(PETSC_HAVE_SAWS)
123   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSAWS,&issaws);CHKERRQ(ierr);
124 #endif
125   if (iascii) {
126     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)ksp,viewer);CHKERRQ(ierr);
127     if (ksp->ops->view) {
128       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
129       ierr = (*ksp->ops->view)(ksp,viewer);CHKERRQ(ierr);
130       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
131     }
132     if (ksp->guess_zero) {
133       ierr = PetscViewerASCIIPrintf(viewer,"  maximum iterations=%D, initial guess is zero\n",ksp->max_it);CHKERRQ(ierr);
134     } else {
135       ierr = PetscViewerASCIIPrintf(viewer,"  maximum iterations=%D\n", ksp->max_it);CHKERRQ(ierr);
136     }
137     if (ksp->guess_knoll) {ierr = PetscViewerASCIIPrintf(viewer,"  using preconditioner applied to right hand side for initial guess\n");CHKERRQ(ierr);}
138     ierr = PetscViewerASCIIPrintf(viewer,"  tolerances:  relative=%g, absolute=%g, divergence=%g\n",(double)ksp->rtol,(double)ksp->abstol,(double)ksp->divtol);CHKERRQ(ierr);
139     if (ksp->pc_side == PC_RIGHT) {
140       ierr = PetscViewerASCIIPrintf(viewer,"  right preconditioning\n");CHKERRQ(ierr);
141     } else if (ksp->pc_side == PC_SYMMETRIC) {
142       ierr = PetscViewerASCIIPrintf(viewer,"  symmetric preconditioning\n");CHKERRQ(ierr);
143     } else {
144       ierr = PetscViewerASCIIPrintf(viewer,"  left preconditioning\n");CHKERRQ(ierr);
145     }
146     if (ksp->guess) {ierr = PetscViewerASCIIPrintf(viewer,"  using Fischers initial guess method %D with size %D\n",ksp->guess->method,ksp->guess->maxl);CHKERRQ(ierr);}
147     if (ksp->dscale) {ierr = PetscViewerASCIIPrintf(viewer,"  diagonally scaled system\n");CHKERRQ(ierr);}
148     if (!ksp->guess_zero) {ierr = PetscViewerASCIIPrintf(viewer,"  using nonzero initial guess\n");CHKERRQ(ierr);}
149     ierr = PetscViewerASCIIPrintf(viewer,"  using %s norm type for convergence test\n",KSPNormTypes[ksp->normtype]);CHKERRQ(ierr);
150   } else if (isbinary) {
151     PetscInt    classid = KSP_FILE_CLASSID;
152     MPI_Comm    comm;
153     PetscMPIInt rank;
154     char        type[256];
155 
156     ierr = PetscObjectGetComm((PetscObject)ksp,&comm);CHKERRQ(ierr);
157     ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
158     if (!rank) {
159       ierr = PetscViewerBinaryWrite(viewer,&classid,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
160       ierr = PetscStrncpy(type,((PetscObject)ksp)->type_name,256);CHKERRQ(ierr);
161       ierr = PetscViewerBinaryWrite(viewer,type,256,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr);
162     }
163     if (ksp->ops->view) {
164       ierr = (*ksp->ops->view)(ksp,viewer);CHKERRQ(ierr);
165     }
166   } else if (isdraw) {
167     PetscDraw draw;
168     char      str[36];
169     PetscReal x,y,bottom,h;
170     PetscBool flg;
171 
172     ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
173     ierr = PetscDrawGetCurrentPoint(draw,&x,&y);CHKERRQ(ierr);
174     ierr = PetscObjectTypeCompare((PetscObject)ksp,KSPPREONLY,&flg);CHKERRQ(ierr);
175     if (!flg) {
176       ierr   = PetscStrcpy(str,"KSP: ");CHKERRQ(ierr);
177       ierr   = PetscStrcat(str,((PetscObject)ksp)->type_name);CHKERRQ(ierr);
178       ierr   = PetscDrawStringBoxed(draw,x,y,PETSC_DRAW_RED,PETSC_DRAW_BLACK,str,NULL,&h);CHKERRQ(ierr);
179       bottom = y - h;
180     } else {
181       bottom = y;
182     }
183     ierr = PetscDrawPushCurrentPoint(draw,x,bottom);CHKERRQ(ierr);
184 #if defined(PETSC_HAVE_SAWS)
185   } else if (issaws) {
186     PetscMPIInt rank;
187     const char  *name;
188 
189     ierr = PetscObjectGetName((PetscObject)ksp,&name);CHKERRQ(ierr);
190     ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
191     if (!((PetscObject)ksp)->amsmem && !rank) {
192       char       dir[1024];
193 
194       ierr = PetscObjectViewSAWs((PetscObject)ksp,viewer);CHKERRQ(ierr);
195       ierr = PetscSNPrintf(dir,1024,"/PETSc/Objects/%s/its",name);CHKERRQ(ierr);
196       PetscStackCallSAWs(SAWs_Register,(dir,&ksp->its,1,SAWs_READ,SAWs_INT));
197       if (!ksp->res_hist) {
198         ierr = KSPSetResidualHistory(ksp,NULL,PETSC_DECIDE,PETSC_TRUE);CHKERRQ(ierr);
199       }
200       ierr = PetscSNPrintf(dir,1024,"/PETSc/Objects/%s/res_hist",name);CHKERRQ(ierr);
201       PetscStackCallSAWs(SAWs_Register,(dir,ksp->res_hist,10,SAWs_READ,SAWs_DOUBLE));
202     }
203 #endif
204   } else if (ksp->ops->view) {
205     ierr = (*ksp->ops->view)(ksp,viewer);CHKERRQ(ierr);
206   }
207   if (!ksp->skippcsetfromoptions) {
208     if (!ksp->pc) {ierr = KSPGetPC(ksp,&ksp->pc);CHKERRQ(ierr);}
209     ierr = PCView(ksp->pc,viewer);CHKERRQ(ierr);
210   }
211   if (isdraw) {
212     PetscDraw draw;
213     ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
214     ierr = PetscDrawPopCurrentPoint(draw);CHKERRQ(ierr);
215   }
216   PetscFunctionReturn(0);
217 }
218 
219 
220 /*@
221    KSPSetNormType - Sets the norm that is used for convergence testing.
222 
223    Logically Collective on KSP
224 
225    Input Parameter:
226 +  ksp - Krylov solver context
227 -  normtype - one of
228 $   KSP_NORM_NONE - skips computing the norm, this should only be used if you are using
229 $                 the Krylov method as a smoother with a fixed small number of iterations.
230 $                 Implicitly sets KSPConvergedSkip as KSP convergence test.
231 $   KSP_NORM_PRECONDITIONED - the default for left preconditioned solves, uses the l2 norm
232 $                 of the preconditioned residual P^{-1}(b - A x)
233 $   KSP_NORM_UNPRECONDITIONED - uses the l2 norm of the true b - Ax residual.
234 $   KSP_NORM_NATURAL - supported  by KSPCG, KSPCR, KSPCGNE, KSPCGS
235 
236 
237    Options Database Key:
238 .   -ksp_norm_type <none,preconditioned,unpreconditioned,natural>
239 
240    Notes:
241    Not all combinations of preconditioner side (see KSPSetPCSide()) and norm type are supported by all Krylov methods.
242    If only one is set, PETSc tries to automatically change the other to find a compatible pair.  If no such combination
243    is supported, PETSc will generate an error.
244 
245    Developer Notes:
246    Supported combinations of norm and preconditioner side are set using KSPSetSupportedNorm().
247 
248    Level: advanced
249 
250 .keywords: KSP, create, context, norms
251 
252 .seealso: KSPSetUp(), KSPSolve(), KSPDestroy(), KSPConvergedSkip(), KSPSetCheckNormIteration(), KSPSetPCSide(), KSPGetPCSide(), KSPNormType
253 @*/
254 PetscErrorCode  KSPSetNormType(KSP ksp,KSPNormType normtype)
255 {
256   PetscFunctionBegin;
257   PetscValidHeaderSpecific(ksp,KSP_CLASSID,1);
258   PetscValidLogicalCollectiveEnum(ksp,normtype,2);
259   ksp->normtype = ksp->normtype_set = normtype;
260   PetscFunctionReturn(0);
261 }
262 
263 /*@
264    KSPSetCheckNormIteration - Sets the first iteration at which the norm of the residual will be
265      computed and used in the convergence test.
266 
267    Logically Collective on KSP
268 
269    Input Parameter:
270 +  ksp - Krylov solver context
271 -  it  - use -1 to check at all iterations
272 
273    Notes:
274    Currently only works with KSPCG, KSPBCGS and KSPIBCGS
275 
276    Use KSPSetNormType(ksp,KSP_NORM_NONE) to never check the norm
277 
278    On steps where the norm is not computed, the previous norm is still in the variable, so if you run with, for example,
279     -ksp_monitor the residual norm will appear to be unchanged for several iterations (though it is not really unchanged).
280    Level: advanced
281 
282 .keywords: KSP, create, context, norms
283 
284 .seealso: KSPSetUp(), KSPSolve(), KSPDestroy(), KSPConvergedSkip(), KSPSetNormType()
285 @*/
286 PetscErrorCode  KSPSetCheckNormIteration(KSP ksp,PetscInt it)
287 {
288   PetscFunctionBegin;
289   PetscValidHeaderSpecific(ksp,KSP_CLASSID,1);
290   PetscValidLogicalCollectiveInt(ksp,it,2);
291   ksp->chknorm = it;
292   PetscFunctionReturn(0);
293 }
294 
295 /*@
296    KSPSetLagNorm - Lags the residual norm calculation so that it is computed as part of the MPI_Allreduce() for
297    computing the inner products for the next iteration.  This can reduce communication costs at the expense of doing
298    one additional iteration.
299 
300 
301    Logically Collective on KSP
302 
303    Input Parameter:
304 +  ksp - Krylov solver context
305 -  flg - PETSC_TRUE or PETSC_FALSE
306 
307    Options Database Keys:
308 .  -ksp_lag_norm - lag the calculated residual norm
309 
310    Notes:
311    Currently only works with KSPIBCGS.
312 
313    Use KSPSetNormType(ksp,KSP_NORM_NONE) to never check the norm
314 
315    If you lag the norm and run with, for example, -ksp_monitor, the residual norm reported will be the lagged one.
316    Level: advanced
317 
318 .keywords: KSP, create, context, norms
319 
320 .seealso: KSPSetUp(), KSPSolve(), KSPDestroy(), KSPConvergedSkip(), KSPSetNormType(), KSPSetCheckNormIteration()
321 @*/
322 PetscErrorCode  KSPSetLagNorm(KSP ksp,PetscBool flg)
323 {
324   PetscFunctionBegin;
325   PetscValidHeaderSpecific(ksp,KSP_CLASSID,1);
326   PetscValidLogicalCollectiveBool(ksp,flg,2);
327   ksp->lagnorm = flg;
328   PetscFunctionReturn(0);
329 }
330 
331 /*@
332    KSPSetSupportedNorm - Sets a norm and preconditioner side supported by a KSP
333 
334    Logically Collective
335 
336    Input Arguments:
337 +  ksp - Krylov method
338 .  normtype - supported norm type
339 .  pcside - preconditioner side that can be used with this norm
340 -  preference - integer preference for this combination, larger values have higher priority
341 
342    Level: developer
343 
344    Notes:
345    This function should be called from the implementation files KSPCreate_XXX() to declare
346    which norms and preconditioner sides are supported. Users should not need to call this
347    function.
348 
349    KSP_NORM_NONE is supported by default with all KSP methods and any PC side at priority 1.  If a KSP explicitly does
350    not support KSP_NORM_NONE, it should set this by setting priority=0.  Since defaulting to KSP_NORM_NONE is usually
351    undesirable, more desirable norms should usually have priority 2 or higher.
352 
353 .seealso: KSPSetNormType(), KSPSetPCSide()
354 @*/
355 PetscErrorCode KSPSetSupportedNorm(KSP ksp,KSPNormType normtype,PCSide pcside,PetscInt priority)
356 {
357 
358   PetscFunctionBegin;
359   PetscValidHeaderSpecific(ksp,KSP_CLASSID,1);
360   ksp->normsupporttable[normtype][pcside] = priority;
361   PetscFunctionReturn(0);
362 }
363 
364 PetscErrorCode KSPNormSupportTableReset_Private(KSP ksp)
365 {
366   PetscErrorCode ierr;
367 
368   PetscFunctionBegin;
369   ierr = PetscMemzero(ksp->normsupporttable,sizeof(ksp->normsupporttable));CHKERRQ(ierr);
370   ksp->pc_side  = ksp->pc_side_set;
371   ksp->normtype = ksp->normtype_set;
372   PetscFunctionReturn(0);
373 }
374 
375 PetscErrorCode KSPSetUpNorms_Private(KSP ksp,PetscBool errorifnotsupported,KSPNormType *normtype,PCSide *pcside)
376 {
377   PetscInt i,j,best,ibest = 0,jbest = 0;
378 
379   PetscFunctionBegin;
380   best = 0;
381   for (i=0; i<KSP_NORM_MAX; i++) {
382     for (j=0; j<PC_SIDE_MAX; j++) {
383       if ((ksp->normtype == KSP_NORM_DEFAULT || ksp->normtype == i) && (ksp->pc_side == PC_SIDE_DEFAULT || ksp->pc_side == j) && (ksp->normsupporttable[i][j] > best)) {
384         best  = ksp->normsupporttable[i][j];
385         ibest = i;
386         jbest = j;
387       }
388     }
389   }
390   if (best < 1 && errorifnotsupported) {
391     if (ksp->normtype == KSP_NORM_DEFAULT && ksp->pc_side == PC_SIDE_DEFAULT) SETERRQ1(PetscObjectComm((PetscObject)ksp),PETSC_ERR_PLIB,"The %s KSP implementation did not call KSPSetSupportedNorm()",((PetscObject)ksp)->type_name);
392     if (ksp->normtype == KSP_NORM_DEFAULT) SETERRQ2(PetscObjectComm((PetscObject)ksp),PETSC_ERR_SUP,"KSP %s does not support %s",((PetscObject)ksp)->type_name,PCSides[ksp->pc_side]);
393     if (ksp->pc_side == PC_SIDE_DEFAULT) SETERRQ2(PetscObjectComm((PetscObject)ksp),PETSC_ERR_SUP,"KSP %s does not support %s",((PetscObject)ksp)->type_name,KSPNormTypes[ksp->normtype]);
394     SETERRQ3(PetscObjectComm((PetscObject)ksp),PETSC_ERR_SUP,"KSP %s does not support %s with %s",((PetscObject)ksp)->type_name,KSPNormTypes[ksp->normtype],PCSides[ksp->pc_side]);
395   }
396   if (normtype) *normtype = (KSPNormType)ibest;
397   if (pcside)   *pcside   = (PCSide)jbest;
398   PetscFunctionReturn(0);
399 }
400 
401 /*@
402    KSPGetNormType - Gets the norm that is used for convergence testing.
403 
404    Not Collective
405 
406    Input Parameter:
407 .  ksp - Krylov solver context
408 
409    Output Parameter:
410 .  normtype - norm that is used for convergence testing
411 
412    Level: advanced
413 
414 .keywords: KSP, create, context, norms
415 
416 .seealso: KSPNormType, KSPSetNormType(), KSPConvergedSkip()
417 @*/
418 PetscErrorCode  KSPGetNormType(KSP ksp, KSPNormType *normtype)
419 {
420   PetscErrorCode ierr;
421 
422   PetscFunctionBegin;
423   PetscValidHeaderSpecific(ksp,KSP_CLASSID,1);
424   PetscValidPointer(normtype,2);
425   ierr      = KSPSetUpNorms_Private(ksp,PETSC_TRUE,&ksp->normtype,&ksp->pc_side);CHKERRQ(ierr);
426   *normtype = ksp->normtype;
427   PetscFunctionReturn(0);
428 }
429 
430 #if defined(PETSC_HAVE_SAWS)
431 #include <petscviewersaws.h>
432 #endif
433 
434 /*@
435    KSPSetOperators - Sets the matrix associated with the linear system
436    and a (possibly) different one associated with the preconditioner.
437 
438    Collective on KSP and Mat
439 
440    Input Parameters:
441 +  ksp - the KSP context
442 .  Amat - the matrix that defines the linear system
443 -  Pmat - the matrix to be used in constructing the preconditioner, usually the same as Amat.
444 
445    Notes:
446 
447     If you know the operator Amat has a null space you can use MatSetNullSpace() and MatSetTransposeNullSpace() to supply the null
448     space to Amat and the KSP solvers will automatically use that null space as needed during the solution process.
449 
450     All future calls to KSPSetOperators() must use the same size matrices!
451 
452     Passing a NULL for Amat or Pmat removes the matrix that is currently used.
453 
454     If you wish to replace either Amat or Pmat but leave the other one untouched then
455     first call KSPGetOperators() to get the one you wish to keep, call PetscObjectReference()
456     on it and then pass it back in in your call to KSPSetOperators().
457 
458     Level: beginner
459 
460    Alternative usage: If the operators have NOT been set with KSP/PCSetOperators() then the operators
461       are created in PC and returned to the user. In this case, if both operators
462       mat and pmat are requested, two DIFFERENT operators will be returned. If
463       only one is requested both operators in the PC will be the same (i.e. as
464       if one had called KSP/PCSetOperators() with the same argument for both Mats).
465       The user must set the sizes of the returned matrices and their type etc just
466       as if the user created them with MatCreate(). For example,
467 
468 $         KSP/PCGetOperators(ksp/pc,&mat,NULL); is equivalent to
469 $           set size, type, etc of mat
470 
471 $         MatCreate(comm,&mat);
472 $         KSP/PCSetOperators(ksp/pc,mat,mat);
473 $         PetscObjectDereference((PetscObject)mat);
474 $           set size, type, etc of mat
475 
476      and
477 
478 $         KSP/PCGetOperators(ksp/pc,&mat,&pmat); is equivalent to
479 $           set size, type, etc of mat and pmat
480 
481 $         MatCreate(comm,&mat);
482 $         MatCreate(comm,&pmat);
483 $         KSP/PCSetOperators(ksp/pc,mat,pmat);
484 $         PetscObjectDereference((PetscObject)mat);
485 $         PetscObjectDereference((PetscObject)pmat);
486 $           set size, type, etc of mat and pmat
487 
488     The rational for this support is so that when creating a TS, SNES, or KSP the hierarchy
489     of underlying objects (i.e. SNES, KSP, PC, Mat) and their livespans can be completely
490     managed by the top most level object (i.e. the TS, SNES, or KSP). Another way to look
491     at this is when you create a SNES you do not NEED to create a KSP and attach it to
492     the SNES object (the SNES object manages it for you). Similarly when you create a KSP
493     you do not need to attach a PC to it (the KSP object manages the PC object for you).
494     Thus, why should YOU have to create the Mat and attach it to the SNES/KSP/PC, when
495     it can be created for you?
496 
497 .keywords: KSP, set, operators, matrix, preconditioner, linear system
498 
499 .seealso: KSPSolve(), KSPGetPC(), PCGetOperators(), PCSetOperators(), KSPGetOperators(), KSPSetComputeOperators(), KSPSetComputeInitialGuess(), KSPSetComputeRHS()
500 @*/
501 PetscErrorCode  KSPSetOperators(KSP ksp,Mat Amat,Mat Pmat)
502 {
503   PetscErrorCode ierr;
504 
505   PetscFunctionBegin;
506   PetscValidHeaderSpecific(ksp,KSP_CLASSID,1);
507   if (Amat) PetscValidHeaderSpecific(Amat,MAT_CLASSID,2);
508   if (Pmat) PetscValidHeaderSpecific(Pmat,MAT_CLASSID,3);
509   if (Amat) PetscCheckSameComm(ksp,1,Amat,2);
510   if (Pmat) PetscCheckSameComm(ksp,1,Pmat,3);
511   if (!ksp->pc) {ierr = KSPGetPC(ksp,&ksp->pc);CHKERRQ(ierr);}
512   ierr = PCSetOperators(ksp->pc,Amat,Pmat);CHKERRQ(ierr);
513   if (ksp->setupstage == KSP_SETUP_NEWRHS) ksp->setupstage = KSP_SETUP_NEWMATRIX;  /* so that next solve call will call PCSetUp() on new matrix */
514   if (ksp->guess) {
515     ierr = KSPFischerGuessReset(ksp->guess);CHKERRQ(ierr);
516   }
517   PetscFunctionReturn(0);
518 }
519 
520 /*@
521    KSPGetOperators - Gets the matrix associated with the linear system
522    and a (possibly) different one associated with the preconditioner.
523 
524    Collective on KSP and Mat
525 
526    Input Parameter:
527 .  ksp - the KSP context
528 
529    Output Parameters:
530 +  Amat - the matrix that defines the linear system
531 -  Pmat - the matrix to be used in constructing the preconditioner, usually the same as Amat.
532 
533     Level: intermediate
534 
535    Notes: DOES NOT increase the reference counts of the matrix, so you should NOT destroy them.
536 
537 .keywords: KSP, set, get, operators, matrix, preconditioner, linear system
538 
539 .seealso: KSPSolve(), KSPGetPC(), PCGetOperators(), PCSetOperators(), KSPSetOperators(), KSPGetOperatorsSet()
540 @*/
541 PetscErrorCode  KSPGetOperators(KSP ksp,Mat *Amat,Mat *Pmat)
542 {
543   PetscErrorCode ierr;
544 
545   PetscFunctionBegin;
546   PetscValidHeaderSpecific(ksp,KSP_CLASSID,1);
547   if (!ksp->pc) {ierr = KSPGetPC(ksp,&ksp->pc);CHKERRQ(ierr);}
548   ierr = PCGetOperators(ksp->pc,Amat,Pmat);CHKERRQ(ierr);
549   PetscFunctionReturn(0);
550 }
551 
552 /*@C
553    KSPGetOperatorsSet - Determines if the matrix associated with the linear system and
554    possibly a different one associated with the preconditioner have been set in the KSP.
555 
556    Not collective, though the results on all processes should be the same
557 
558    Input Parameter:
559 .  pc - the KSP context
560 
561    Output Parameters:
562 +  mat - the matrix associated with the linear system was set
563 -  pmat - matrix associated with the preconditioner was set, usually the same
564 
565    Level: intermediate
566 
567 .keywords: KSP, get, operators, matrix, linear system
568 
569 .seealso: PCSetOperators(), KSPGetOperators(), KSPSetOperators(), PCGetOperators(), PCGetOperatorsSet()
570 @*/
571 PetscErrorCode  KSPGetOperatorsSet(KSP ksp,PetscBool  *mat,PetscBool  *pmat)
572 {
573   PetscErrorCode ierr;
574 
575   PetscFunctionBegin;
576   PetscValidHeaderSpecific(ksp,KSP_CLASSID,1);
577   if (!ksp->pc) {ierr = KSPGetPC(ksp,&ksp->pc);CHKERRQ(ierr);}
578   ierr = PCGetOperatorsSet(ksp->pc,mat,pmat);CHKERRQ(ierr);
579   PetscFunctionReturn(0);
580 }
581 
582 /*@C
583    KSPSetPreSolve - Sets a function that is called before every KSPSolve() is started
584 
585    Logically Collective on KSP
586 
587    Input Parameters:
588 +   ksp - the solver object
589 .   presolve - the function to call before the solve
590 -   prectx - any context needed by the function
591 
592    Level: developer
593 
594 .keywords: KSP, create, context
595 
596 .seealso: KSPSetUp(), KSPSolve(), KSPDestroy(), KSP, KSPSetPostSolve()
597 @*/
598 PetscErrorCode  KSPSetPreSolve(KSP ksp,PetscErrorCode (*presolve)(KSP,Vec,Vec,void*),void *prectx)
599 {
600   PetscFunctionBegin;
601   PetscValidHeaderSpecific(ksp,KSP_CLASSID,1);
602   ksp->presolve = presolve;
603   ksp->prectx   = prectx;
604   PetscFunctionReturn(0);
605 }
606 
607 /*@C
608    KSPSetPostSolve - Sets a function that is called after every KSPSolve() completes (whether it converges or not)
609 
610    Logically Collective on KSP
611 
612    Input Parameters:
613 +   ksp - the solver object
614 .   postsolve - the function to call after the solve
615 -   postctx - any context needed by the function
616 
617    Level: developer
618 
619 .keywords: KSP, create, context
620 
621 .seealso: KSPSetUp(), KSPSolve(), KSPDestroy(), KSP, KSPSetPreSolve()
622 @*/
623 PetscErrorCode  KSPSetPostSolve(KSP ksp,PetscErrorCode (*postsolve)(KSP,Vec,Vec,void*),void *postctx)
624 {
625   PetscFunctionBegin;
626   PetscValidHeaderSpecific(ksp,KSP_CLASSID,1);
627   ksp->postsolve = postsolve;
628   ksp->postctx   = postctx;
629   PetscFunctionReturn(0);
630 }
631 
632 /*@
633    KSPCreate - Creates the default KSP context.
634 
635    Collective on MPI_Comm
636 
637    Input Parameter:
638 .  comm - MPI communicator
639 
640    Output Parameter:
641 .  ksp - location to put the KSP context
642 
643    Notes:
644    The default KSP type is GMRES with a restart of 30, using modified Gram-Schmidt
645    orthogonalization.
646 
647    Level: beginner
648 
649 .keywords: KSP, create, context
650 
651 .seealso: KSPSetUp(), KSPSolve(), KSPDestroy(), KSP
652 @*/
653 PetscErrorCode  KSPCreate(MPI_Comm comm,KSP *inksp)
654 {
655   KSP            ksp;
656   PetscErrorCode ierr;
657   void           *ctx;
658 
659   PetscFunctionBegin;
660   PetscValidPointer(inksp,2);
661   *inksp = 0;
662   ierr = KSPInitializePackage();CHKERRQ(ierr);
663 
664   ierr = PetscHeaderCreate(ksp,KSP_CLASSID,"KSP","Krylov Method","KSP",comm,KSPDestroy,KSPView);CHKERRQ(ierr);
665 
666   ksp->max_it  = 10000;
667   ksp->pc_side = ksp->pc_side_set = PC_SIDE_DEFAULT;
668   ksp->rtol    = 1.e-5;
669 #if defined(PETSC_USE_REAL_SINGLE)
670   ksp->abstol  = 1.e-25;
671 #else
672   ksp->abstol  = 1.e-50;
673 #endif
674   ksp->divtol  = 1.e4;
675 
676   ksp->chknorm        = -1;
677   ksp->normtype       = ksp->normtype_set = KSP_NORM_DEFAULT;
678   ksp->rnorm          = 0.0;
679   ksp->its            = 0;
680   ksp->guess_zero     = PETSC_TRUE;
681   ksp->calc_sings     = PETSC_FALSE;
682   ksp->res_hist       = NULL;
683   ksp->res_hist_alloc = NULL;
684   ksp->res_hist_len   = 0;
685   ksp->res_hist_max   = 0;
686   ksp->res_hist_reset = PETSC_TRUE;
687   ksp->numbermonitors = 0;
688 
689   ierr                    = KSPConvergedDefaultCreate(&ctx);CHKERRQ(ierr);
690   ierr                    = KSPSetConvergenceTest(ksp,KSPConvergedDefault,ctx,KSPConvergedDefaultDestroy);CHKERRQ(ierr);
691   ksp->ops->buildsolution = KSPBuildSolutionDefault;
692   ksp->ops->buildresidual = KSPBuildResidualDefault;
693 
694   ksp->vec_sol    = 0;
695   ksp->vec_rhs    = 0;
696   ksp->pc         = 0;
697   ksp->data       = 0;
698   ksp->nwork      = 0;
699   ksp->work       = 0;
700   ksp->reason     = KSP_CONVERGED_ITERATING;
701   ksp->setupstage = KSP_SETUP_NEW;
702 
703   ierr = KSPNormSupportTableReset_Private(ksp);CHKERRQ(ierr);
704 
705   *inksp = ksp;
706   PetscFunctionReturn(0);
707 }
708 
709 /*@C
710    KSPSetType - Builds KSP for a particular solver.
711 
712    Logically Collective on KSP
713 
714    Input Parameters:
715 +  ksp      - the Krylov space context
716 -  type - a known method
717 
718    Options Database Key:
719 .  -ksp_type  <method> - Sets the method; use -help for a list
720     of available methods (for instance, cg or gmres)
721 
722    Notes:
723    See "petsc/include/petscksp.h" for available methods (for instance,
724    KSPCG or KSPGMRES).
725 
726   Normally, it is best to use the KSPSetFromOptions() command and
727   then set the KSP type from the options database rather than by using
728   this routine.  Using the options database provides the user with
729   maximum flexibility in evaluating the many different Krylov methods.
730   The KSPSetType() routine is provided for those situations where it
731   is necessary to set the iterative solver independently of the command
732   line or options database.  This might be the case, for example, when
733   the choice of iterative solver changes during the execution of the
734   program, and the user's application is taking responsibility for
735   choosing the appropriate method.  In other words, this routine is
736   not for beginners.
737 
738   Level: intermediate
739 
740   Developer Note: KSPRegister() is used to add Krylov types to KSPList from which they
741   are accessed by KSPSetType().
742 
743 .keywords: KSP, set, method
744 
745 .seealso: PCSetType(), KSPType, KSPRegister(), KSPCreate()
746 
747 @*/
748 PetscErrorCode  KSPSetType(KSP ksp, KSPType type)
749 {
750   PetscErrorCode ierr,(*r)(KSP);
751   PetscBool      match;
752 
753   PetscFunctionBegin;
754   PetscValidHeaderSpecific(ksp,KSP_CLASSID,1);
755   PetscValidCharPointer(type,2);
756 
757   ierr = PetscObjectTypeCompare((PetscObject)ksp,type,&match);CHKERRQ(ierr);
758   if (match) PetscFunctionReturn(0);
759 
760   ierr =  PetscFunctionListFind(KSPList,type,&r);CHKERRQ(ierr);
761   if (!r) SETERRQ1(PetscObjectComm((PetscObject)ksp),PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested KSP type %s",type);
762   /* Destroy the previous private KSP context */
763   if (ksp->ops->destroy) {
764     ierr              = (*ksp->ops->destroy)(ksp);CHKERRQ(ierr);
765     ksp->ops->destroy = NULL;
766   }
767   /* Reinitialize function pointers in KSPOps structure */
768   ierr                    = PetscMemzero(ksp->ops,sizeof(struct _KSPOps));CHKERRQ(ierr);
769   ksp->ops->buildsolution = KSPBuildSolutionDefault;
770   ksp->ops->buildresidual = KSPBuildResidualDefault;
771   ierr                    = KSPNormSupportTableReset_Private(ksp);CHKERRQ(ierr);
772   /* Call the KSPCreate_XXX routine for this particular Krylov solver */
773   ksp->setupstage = KSP_SETUP_NEW;
774   ierr            = PetscObjectChangeTypeName((PetscObject)ksp,type);CHKERRQ(ierr);
775   ierr            = (*r)(ksp);CHKERRQ(ierr);
776   PetscFunctionReturn(0);
777 }
778 
779 /*@C
780    KSPGetType - Gets the KSP type as a string from the KSP object.
781 
782    Not Collective
783 
784    Input Parameter:
785 .  ksp - Krylov context
786 
787    Output Parameter:
788 .  name - name of KSP method
789 
790    Level: intermediate
791 
792 .keywords: KSP, get, method, name
793 
794 .seealso: KSPSetType()
795 @*/
796 PetscErrorCode  KSPGetType(KSP ksp,KSPType *type)
797 {
798   PetscFunctionBegin;
799   PetscValidHeaderSpecific(ksp,KSP_CLASSID,1);
800   PetscValidPointer(type,2);
801   *type = ((PetscObject)ksp)->type_name;
802   PetscFunctionReturn(0);
803 }
804 
805 /*@C
806   KSPRegister -  Adds a method to the Krylov subspace solver package.
807 
808    Not Collective
809 
810    Input Parameters:
811 +  name_solver - name of a new user-defined solver
812 -  routine_create - routine to create method context
813 
814    Notes:
815    KSPRegister() may be called multiple times to add several user-defined solvers.
816 
817    Sample usage:
818 .vb
819    KSPRegister("my_solver",MySolverCreate);
820 .ve
821 
822    Then, your solver can be chosen with the procedural interface via
823 $     KSPSetType(ksp,"my_solver")
824    or at runtime via the option
825 $     -ksp_type my_solver
826 
827    Level: advanced
828 
829 .keywords: KSP, register
830 
831 .seealso: KSPRegisterAll(), KSPRegisterDestroy()
832 
833 @*/
834 PetscErrorCode  KSPRegister(const char sname[],PetscErrorCode (*function)(KSP))
835 {
836   PetscErrorCode ierr;
837 
838   PetscFunctionBegin;
839   ierr = PetscFunctionListAdd(&KSPList,sname,function);CHKERRQ(ierr);
840   PetscFunctionReturn(0);
841 }
842