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