xref: /petsc/src/ksp/ksp/interface/itcreate.c (revision 09f382308e660e6aeafeafa6047bab56e09352c9)
1 #define PETSCKSP_DLL
2 
3 /*
4      The basic KSP routines, Create, View etc. are here.
5 */
6 #include "src/ksp/ksp/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__ "KSPPublish_Petsc"
148 static PetscErrorCode KSPPublish_Petsc(PetscObject obj)
149 {
150   PetscFunctionBegin;
151   PetscFunctionReturn(0);
152 }
153 
154 #undef __FUNCT__
155 #define __FUNCT__ "KSPSetOperators"
156 /*@
157    KSPSetOperators - Sets the matrix associated with the linear system
158    and a (possibly) different one associated with the preconditioner.
159 
160    Collective on KSP and Mat
161 
162    Input Parameters:
163 +  ksp - the KSP context
164 .  Amat - the matrix associated with the linear system
165 .  Pmat - the matrix to be used in constructing the preconditioner, usually the
166           same as Amat.
167 -  flag - flag indicating information about the preconditioner matrix structure
168    during successive linear solves.  This flag is ignored the first time a
169    linear system is solved, and thus is irrelevant when solving just one linear
170    system.
171 
172    Notes:
173    The flag can be used to eliminate unnecessary work in the preconditioner
174    during the repeated solution of linear systems of the same size.  The
175    available options are
176 $    SAME_PRECONDITIONER -
177 $      Pmat is identical during successive linear solves.
178 $      This option is intended for folks who are using
179 $      different Amat and Pmat matrices and want to reuse the
180 $      same preconditioner matrix.  For example, this option
181 $      saves work by not recomputing incomplete factorization
182 $      for ILU/ICC preconditioners.
183 $    SAME_NONZERO_PATTERN -
184 $      Pmat has the same nonzero structure during
185 $      successive linear solves.
186 $    DIFFERENT_NONZERO_PATTERN -
187 $      Pmat does not have the same nonzero structure.
188 
189     Caution:
190     If you specify SAME_NONZERO_PATTERN, PETSc believes your assertion
191     and does not check the structure of the matrix.  If you erroneously
192     claim that the structure is the same when it actually is not, the new
193     preconditioner will not function correctly.  Thus, use this optimization
194     feature carefully!
195 
196     If in doubt about whether your preconditioner matrix has changed
197     structure or not, use the flag DIFFERENT_NONZERO_PATTERN.
198 
199     Level: beginner
200 
201 .keywords: KSP, set, operators, matrix, preconditioner, linear system
202 
203 .seealso: KSPSolve(), KSPGetPC(), PCGetOperators(), PCSetOperators(), KSPGetOperators()
204 @*/
205 PetscErrorCode PETSCKSP_DLLEXPORT KSPSetOperators(KSP ksp,Mat Amat,Mat Pmat,MatStructure flag)
206 {
207   PetscErrorCode ierr;
208 
209   PetscFunctionBegin;
210   PetscValidHeaderSpecific(ksp,KSP_COOKIE,1);
211   if (Amat) PetscValidHeaderSpecific(Amat,MAT_COOKIE,2);
212   if (Pmat) PetscValidHeaderSpecific(Pmat,MAT_COOKIE,3);
213   if (Amat) PetscCheckSameComm(ksp,1,Amat,2);
214   if (Pmat) PetscCheckSameComm(ksp,1,Pmat,3);
215   ierr = PCSetOperators(ksp->pc,Amat,Pmat,flag);CHKERRQ(ierr);
216   if (ksp->setupcalled > 1) ksp->setupcalled = 1;  /* so that next solve call will call setup */
217   PetscFunctionReturn(0);
218 }
219 
220 #undef __FUNCT__
221 #define __FUNCT__ "KSPGetOperators"
222 /*@
223    KSPGetOperators - Gets the matrix associated with the linear system
224    and a (possibly) different one associated with the preconditioner.
225 
226    Collective on KSP and Mat
227 
228    Input Parameter:
229 .  ksp - the KSP context
230 
231    Output Parameters:
232 +  Amat - the matrix associated with the linear system
233 .  Pmat - the matrix to be used in constructing the preconditioner, usually the
234           same as Amat.
235 -  flag - flag indicating information about the preconditioner matrix structure
236    during successive linear solves.  This flag is ignored the first time a
237    linear system is solved, and thus is irrelevant when solving just one linear
238    system.
239 
240     Level: intermediate
241 
242 .keywords: KSP, set, get, operators, matrix, preconditioner, linear system
243 
244 .seealso: KSPSolve(), KSPGetPC(), PCGetOperators(), PCSetOperators(), KSPSetOperators()
245 @*/
246 PetscErrorCode PETSCKSP_DLLEXPORT KSPGetOperators(KSP ksp,Mat *Amat,Mat *Pmat,MatStructure *flag)
247 {
248   PetscErrorCode ierr;
249 
250   PetscFunctionBegin;
251   PetscValidHeaderSpecific(ksp,KSP_COOKIE,1);
252   ierr = PCGetOperators(ksp->pc,Amat,Pmat,flag);CHKERRQ(ierr);
253   PetscFunctionReturn(0);
254 }
255 
256 #undef __FUNCT__
257 #define __FUNCT__ "KSPCreate"
258 /*@
259    KSPCreate - Creates the default KSP context.
260 
261    Collective on MPI_Comm
262 
263    Input Parameter:
264 .  comm - MPI communicator
265 
266    Output Parameter:
267 .  ksp - location to put the KSP context
268 
269    Notes:
270    The default KSP type is GMRES with a restart of 30, using modified Gram-Schmidt
271    orthogonalization.
272 
273    Level: beginner
274 
275 .keywords: KSP, create, context
276 
277 .seealso: KSPSetUp(), KSPSolve(), KSPDestroy(), KSP
278 @*/
279 PetscErrorCode PETSCKSP_DLLEXPORT KSPCreate(MPI_Comm comm,KSP *inksp)
280 {
281   KSP            ksp;
282   PetscErrorCode ierr;
283 
284   PetscFunctionBegin;
285   PetscValidPointer(inksp,2);
286   *inksp = 0;
287 #ifndef PETSC_USE_DYNAMIC_LIBRARIES
288   ierr = KSPInitializePackage(PETSC_NULL);CHKERRQ(ierr);
289 #endif
290 
291   ierr = PetscHeaderCreate(ksp,_p_KSP,struct _KSPOps,KSP_COOKIE,-1,"KSP",comm,KSPDestroy,KSPView);CHKERRQ(ierr);
292   *inksp             = ksp;
293   ksp->bops->publish = KSPPublish_Petsc;
294 
295   ksp->type          = -1;
296   ksp->max_it        = 10000;
297   ksp->pc_side       = PC_LEFT;
298   ksp->rtol          = 1.e-5;
299   ksp->abstol          = 1.e-50;
300   ksp->divtol        = 1.e4;
301 
302   ksp->normtype            = KSP_PRECONDITIONED_NORM;
303   ksp->rnorm               = 0.0;
304   ksp->its                 = 0;
305   ksp->guess_zero          = PETSC_TRUE;
306   ksp->calc_sings          = PETSC_FALSE;
307   ksp->res_hist            = PETSC_NULL;
308   ksp->res_hist_len        = 0;
309   ksp->res_hist_max        = 0;
310   ksp->res_hist_reset      = PETSC_TRUE;
311   ksp->numbermonitors      = 0;
312   ksp->converged           = KSPDefaultConverged;
313   ksp->ops->buildsolution  = KSPDefaultBuildSolution;
314   ksp->ops->buildresidual  = KSPDefaultBuildResidual;
315 
316   ksp->ops->setfromoptions = 0;
317 
318   ksp->vec_sol         = 0;
319   ksp->vec_rhs         = 0;
320   ksp->pc              = 0;
321 
322   ksp->ops->solve      = 0;
323   ksp->ops->setup      = 0;
324   ksp->ops->destroy    = 0;
325 
326   ksp->data            = 0;
327   ksp->nwork           = 0;
328   ksp->work            = 0;
329 
330   ksp->cnvP            = 0;
331 
332   ksp->reason          = KSP_CONVERGED_ITERATING;
333 
334   ksp->setupcalled     = 0;
335   ierr = PetscPublishAll(ksp);CHKERRQ(ierr);
336   ierr = PCCreate(comm,&ksp->pc);CHKERRQ(ierr);
337   PetscFunctionReturn(0);
338 }
339 
340 #undef __FUNCT__
341 #define __FUNCT__ "KSPSetType"
342 /*@C
343    KSPSetType - Builds KSP for a particular solver.
344 
345    Collective on KSP
346 
347    Input Parameters:
348 +  ksp      - the Krylov space context
349 -  type - a known method
350 
351    Options Database Key:
352 .  -ksp_type  <method> - Sets the method; use -help for a list
353     of available methods (for instance, cg or gmres)
354 
355    Notes:
356    See "petsc/include/petscksp.h" for available methods (for instance,
357    KSPCG or KSPGMRES).
358 
359   Normally, it is best to use the KSPSetFromOptions() command and
360   then set the KSP type from the options database rather than by using
361   this routine.  Using the options database provides the user with
362   maximum flexibility in evaluating the many different Krylov methods.
363   The KSPSetType() routine is provided for those situations where it
364   is necessary to set the iterative solver independently of the command
365   line or options database.  This might be the case, for example, when
366   the choice of iterative solver changes during the execution of the
367   program, and the user's application is taking responsibility for
368   choosing the appropriate method.  In other words, this routine is
369   not for beginners.
370 
371   Level: intermediate
372 
373 .keywords: KSP, set, method
374 
375 .seealso: PCSetType(), KSPType
376 
377 @*/
378 PetscErrorCode PETSCKSP_DLLEXPORT KSPSetType(KSP ksp, KSPType type)
379 {
380   PetscErrorCode ierr,(*r)(KSP);
381   PetscTruth     match;
382 
383   PetscFunctionBegin;
384   PetscValidHeaderSpecific(ksp,KSP_COOKIE,1);
385   PetscValidCharPointer(type,2);
386 
387   ierr = PetscTypeCompare((PetscObject)ksp,type,&match);CHKERRQ(ierr);
388   if (match) PetscFunctionReturn(0);
389 
390   if (ksp->data) {
391     /* destroy the old private KSP context */
392     ierr = (*ksp->ops->destroy)(ksp);CHKERRQ(ierr);
393     ksp->data = 0;
394   }
395   /* Get the function pointers for the iterative method requested */
396   if (!KSPRegisterAllCalled) {ierr = KSPRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
397   ierr =  PetscFListFind(ksp->comm,KSPList,type,(void (**)(void)) &r);CHKERRQ(ierr);
398   if (!r) SETERRQ1(PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown KSP type given: %s",type);
399   ksp->setupcalled = 0;
400   ierr = (*r)(ksp);CHKERRQ(ierr);
401   ierr = PetscObjectChangeTypeName((PetscObject)ksp,type);CHKERRQ(ierr);
402   PetscFunctionReturn(0);
403 }
404 
405 #undef __FUNCT__
406 #define __FUNCT__ "KSPRegisterDestroy"
407 /*@
408    KSPRegisterDestroy - Frees the list of KSP methods that were
409    registered by KSPRegisterDynamic().
410 
411    Not Collective
412 
413    Level: advanced
414 
415 .keywords: KSP, register, destroy
416 
417 .seealso: KSPRegisterDynamic(), KSPRegisterAll()
418 @*/
419 PetscErrorCode PETSCKSP_DLLEXPORT KSPRegisterDestroy(void)
420 {
421   PetscErrorCode ierr;
422 
423   PetscFunctionBegin;
424   if (KSPList) {
425     ierr = PetscFListDestroy(&KSPList);CHKERRQ(ierr);
426     KSPList = 0;
427   }
428   KSPRegisterAllCalled = PETSC_FALSE;
429   PetscFunctionReturn(0);
430 }
431 
432 #undef __FUNCT__
433 #define __FUNCT__ "KSPGetType"
434 /*@C
435    KSPGetType - Gets the KSP type as a string from the KSP object.
436 
437    Not Collective
438 
439    Input Parameter:
440 .  ksp - Krylov context
441 
442    Output Parameter:
443 .  name - name of KSP method
444 
445    Level: intermediate
446 
447 .keywords: KSP, get, method, name
448 
449 .seealso: KSPSetType()
450 @*/
451 PetscErrorCode PETSCKSP_DLLEXPORT KSPGetType(KSP ksp,KSPType *type)
452 {
453   PetscFunctionBegin;
454   PetscValidHeaderSpecific(ksp,KSP_COOKIE,1);
455   PetscValidPointer(type,2);
456   *type = ksp->type_name;
457   PetscFunctionReturn(0);
458 }
459 
460 #undef __FUNCT__
461 #define __FUNCT__ "KSPRegister"
462 /*@C
463   KSPRegister - See KSPRegisterDynamic()
464 
465   Level: advanced
466 @*/
467 PetscErrorCode PETSCKSP_DLLEXPORT KSPRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(KSP))
468 {
469   PetscErrorCode ierr;
470   char           fullname[PETSC_MAX_PATH_LEN];
471 
472   PetscFunctionBegin;
473   ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr);
474   ierr = PetscFListAdd(&KSPList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
475   PetscFunctionReturn(0);
476 }
477 
478 #undef __FUNCT__
479 #define __FUNCT__ "KSPSetNullSpace"
480 /*@
481   KSPSetNullSpace - Sets the null space of the operator
482 
483   Collective on KSP
484 
485   Input Parameters:
486 +  ksp - the Krylov space object
487 -  nullsp - the null space of the operator
488 
489   Level: advanced
490 
491 .seealso: KSPSetOperators(), MatNullSpaceCreate(), KSPGetNullSpace()
492 @*/
493 PetscErrorCode PETSCKSP_DLLEXPORT KSPSetNullSpace(KSP ksp,MatNullSpace nullsp)
494 {
495   PetscErrorCode ierr;
496 
497   PetscFunctionBegin;
498   if (ksp->nullsp) {
499     ierr = MatNullSpaceDestroy(ksp->nullsp);CHKERRQ(ierr);
500   }
501   ksp->nullsp = nullsp;
502   ierr = PetscObjectReference((PetscObject)ksp->nullsp);CHKERRQ(ierr);
503   PetscFunctionReturn(0);
504 }
505 
506 #undef __FUNCT__
507 #define __FUNCT__ "KSPGetNullSpace"
508 /*@
509   KSPGetNullSpace - Gets the null space of the operator
510 
511   Collective on KSP
512 
513   Input Parameters:
514 +  ksp - the Krylov space object
515 -  nullsp - the null space of the operator
516 
517   Level: advanced
518 
519 .seealso: KSPSetOperators(), MatNullSpaceCreate(), KSPSetNullSpace()
520 @*/
521 PetscErrorCode PETSCKSP_DLLEXPORT KSPGetNullSpace(KSP ksp,MatNullSpace *nullsp)
522 {
523   PetscFunctionBegin;
524   *nullsp = ksp->nullsp;
525   PetscFunctionReturn(0);
526 }
527 
528