xref: /petsc/src/snes/interface/snes.c (revision dc822a44ec0b4af7e2f62e6ca6d137ad3d044f83)
1 
2 #include <petsc/private/snesimpl.h>      /*I "petscsnes.h"  I*/
3 #include <petscdmshell.h>
4 #include <petscdraw.h>
5 #include <petscds.h>
6 #include <petscconvest.h>
7 
8 PetscBool         SNESRegisterAllCalled = PETSC_FALSE;
9 PetscFunctionList SNESList              = NULL;
10 
11 /* Logging support */
12 PetscClassId  SNES_CLASSID, DMSNES_CLASSID;
13 PetscLogEvent SNES_Solve, SNES_FunctionEval, SNES_JacobianEval, SNES_NGSEval, SNES_NGSFuncEval, SNES_NPCSolve, SNES_ObjectiveEval;
14 
15 /*@
16    SNESSetErrorIfNotConverged - Causes SNESSolve() to generate an error if the solver has not converged.
17 
18    Logically Collective on SNES
19 
20    Input Parameters:
21 +  snes - iterative context obtained from SNESCreate()
22 -  flg - PETSC_TRUE indicates you want the error generated
23 
24    Options database keys:
25 .  -snes_error_if_not_converged : this takes an optional truth value (0/1/no/yes/true/false)
26 
27    Level: intermediate
28 
29    Notes:
30     Normally PETSc continues if a linear solver fails to converge, you can call SNESGetConvergedReason() after a SNESSolve()
31     to determine if it has converged.
32 
33 .keywords: SNES, set, initial guess, nonzero
34 
35 .seealso: SNESGetErrorIfNotConverged(), KSPGetErrorIfNotConverged(), KSPSetErrorIFNotConverged()
36 @*/
37 PetscErrorCode  SNESSetErrorIfNotConverged(SNES snes,PetscBool flg)
38 {
39   PetscFunctionBegin;
40   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
41   PetscValidLogicalCollectiveBool(snes,flg,2);
42   snes->errorifnotconverged = flg;
43   PetscFunctionReturn(0);
44 }
45 
46 /*@
47    SNESGetErrorIfNotConverged - Will SNESSolve() generate an error if the solver does not converge?
48 
49    Not Collective
50 
51    Input Parameter:
52 .  snes - iterative context obtained from SNESCreate()
53 
54    Output Parameter:
55 .  flag - PETSC_TRUE if it will generate an error, else PETSC_FALSE
56 
57    Level: intermediate
58 
59 .keywords: SNES, set, initial guess, nonzero
60 
61 .seealso:  SNESSetErrorIfNotConverged(), KSPGetErrorIfNotConverged(), KSPSetErrorIFNotConverged()
62 @*/
63 PetscErrorCode  SNESGetErrorIfNotConverged(SNES snes,PetscBool  *flag)
64 {
65   PetscFunctionBegin;
66   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
67   PetscValidPointer(flag,2);
68   *flag = snes->errorifnotconverged;
69   PetscFunctionReturn(0);
70 }
71 
72 /*@
73     SNESSetAlwaysComputesFinalResidual - does the SNES always compute the residual at the final solution?
74 
75    Logically Collective on SNES
76 
77     Input Parameters:
78 +   snes - the shell SNES
79 -   flg - is the residual computed?
80 
81    Level: advanced
82 
83 .seealso: SNESGetAlwaysComputesFinalResidual()
84 @*/
85 PetscErrorCode  SNESSetAlwaysComputesFinalResidual(SNES snes, PetscBool flg)
86 {
87   PetscFunctionBegin;
88   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
89   snes->alwayscomputesfinalresidual = flg;
90   PetscFunctionReturn(0);
91 }
92 
93 /*@
94     SNESGetAlwaysComputesFinalResidual - does the SNES always compute the residual at the final solution?
95 
96    Logically Collective on SNES
97 
98     Input Parameter:
99 .   snes - the shell SNES
100 
101     Output Parameter:
102 .   flg - is the residual computed?
103 
104    Level: advanced
105 
106 .seealso: SNESSetAlwaysComputesFinalResidual()
107 @*/
108 PetscErrorCode  SNESGetAlwaysComputesFinalResidual(SNES snes, PetscBool *flg)
109 {
110   PetscFunctionBegin;
111   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
112   *flg = snes->alwayscomputesfinalresidual;
113   PetscFunctionReturn(0);
114 }
115 
116 /*@
117    SNESSetFunctionDomainError - tells SNES that the input vector to your SNESFunction is not
118      in the functions domain. For example, negative pressure.
119 
120    Logically Collective on SNES
121 
122    Input Parameters:
123 .  snes - the SNES context
124 
125    Level: advanced
126 
127 .keywords: SNES, view
128 
129 .seealso: SNESCreate(), SNESSetFunction(), SNESFunction
130 @*/
131 PetscErrorCode  SNESSetFunctionDomainError(SNES snes)
132 {
133   PetscFunctionBegin;
134   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
135   if (snes->errorifnotconverged) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"User code indicates input vector is not in the function domain");
136   snes->domainerror = PETSC_TRUE;
137   PetscFunctionReturn(0);
138 }
139 
140 /*@
141    SNESGetFunctionDomainError - Gets the status of the domain error after a call to SNESComputeFunction;
142 
143    Logically Collective on SNES
144 
145    Input Parameters:
146 .  snes - the SNES context
147 
148    Output Parameters:
149 .  domainerror - Set to PETSC_TRUE if there's a domain error; PETSC_FALSE otherwise.
150 
151    Level: advanced
152 
153 .keywords: SNES, view
154 
155 .seealso: SNESSetFunctionDomainError(), SNESComputeFunction()
156 @*/
157 PetscErrorCode  SNESGetFunctionDomainError(SNES snes, PetscBool *domainerror)
158 {
159   PetscFunctionBegin;
160   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
161   PetscValidPointer(domainerror, 2);
162   *domainerror = snes->domainerror;
163   PetscFunctionReturn(0);
164 }
165 
166 /*@C
167   SNESLoad - Loads a SNES that has been stored in binary  with SNESView().
168 
169   Collective on PetscViewer
170 
171   Input Parameters:
172 + newdm - the newly loaded SNES, this needs to have been created with SNESCreate() or
173            some related function before a call to SNESLoad().
174 - viewer - binary file viewer, obtained from PetscViewerBinaryOpen()
175 
176    Level: intermediate
177 
178   Notes:
179    The type is determined by the data in the file, any type set into the SNES before this call is ignored.
180 
181   Notes for advanced users:
182   Most users should not need to know the details of the binary storage
183   format, since SNESLoad() and TSView() completely hide these details.
184   But for anyone who's interested, the standard binary matrix storage
185   format is
186 .vb
187      has not yet been determined
188 .ve
189 
190 .seealso: PetscViewerBinaryOpen(), SNESView(), MatLoad(), VecLoad()
191 @*/
192 PetscErrorCode  SNESLoad(SNES snes, PetscViewer viewer)
193 {
194   PetscErrorCode ierr;
195   PetscBool      isbinary;
196   PetscInt       classid;
197   char           type[256];
198   KSP            ksp;
199   DM             dm;
200   DMSNES         dmsnes;
201 
202   PetscFunctionBegin;
203   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
204   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
205   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
206   if (!isbinary) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid viewer; open viewer with PetscViewerBinaryOpen()");
207 
208   ierr = PetscViewerBinaryRead(viewer,&classid,1,NULL,PETSC_INT);CHKERRQ(ierr);
209   if (classid != SNES_FILE_CLASSID) SETERRQ(PetscObjectComm((PetscObject)snes),PETSC_ERR_ARG_WRONG,"Not SNES next in file");
210   ierr = PetscViewerBinaryRead(viewer,type,256,NULL,PETSC_CHAR);CHKERRQ(ierr);
211   ierr = SNESSetType(snes, type);CHKERRQ(ierr);
212   if (snes->ops->load) {
213     ierr = (*snes->ops->load)(snes,viewer);CHKERRQ(ierr);
214   }
215   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
216   ierr = DMGetDMSNES(dm,&dmsnes);CHKERRQ(ierr);
217   ierr = DMSNESLoad(dmsnes,viewer);CHKERRQ(ierr);
218   ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr);
219   ierr = KSPLoad(ksp,viewer);CHKERRQ(ierr);
220   PetscFunctionReturn(0);
221 }
222 
223 #include <petscdraw.h>
224 #if defined(PETSC_HAVE_SAWS)
225 #include <petscviewersaws.h>
226 #endif
227 /*@C
228    SNESView - Prints the SNES data structure.
229 
230    Collective on SNES
231 
232    Input Parameters:
233 +  SNES - the SNES context
234 -  viewer - visualization context
235 
236    Options Database Key:
237 .  -snes_view - Calls SNESView() at end of SNESSolve()
238 
239    Notes:
240    The available visualization contexts include
241 +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
242 -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
243          output where only the first processor opens
244          the file.  All other processors send their
245          data to the first processor to print.
246 
247    The user can open an alternative visualization context with
248    PetscViewerASCIIOpen() - output to a specified file.
249 
250    Level: beginner
251 
252 .keywords: SNES, view
253 
254 .seealso: PetscViewerASCIIOpen()
255 @*/
256 PetscErrorCode  SNESView(SNES snes,PetscViewer viewer)
257 {
258   SNESKSPEW      *kctx;
259   PetscErrorCode ierr;
260   KSP            ksp;
261   SNESLineSearch linesearch;
262   PetscBool      iascii,isstring,isbinary,isdraw;
263   DMSNES         dmsnes;
264 #if defined(PETSC_HAVE_SAWS)
265   PetscBool      issaws;
266 #endif
267 
268   PetscFunctionBegin;
269   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
270   if (!viewer) {
271     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)snes),&viewer);CHKERRQ(ierr);
272   }
273   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
274   PetscCheckSameComm(snes,1,viewer,2);
275 
276   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
277   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSTRING,&isstring);CHKERRQ(ierr);
278   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
279   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
280 #if defined(PETSC_HAVE_SAWS)
281   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSAWS,&issaws);CHKERRQ(ierr);
282 #endif
283   if (iascii) {
284     SNESNormSchedule normschedule;
285 
286     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)snes,viewer);CHKERRQ(ierr);
287     if (!snes->setupcalled) {
288       ierr = PetscViewerASCIIPrintf(viewer,"  SNES has not been set up so information may be incomplete\n");CHKERRQ(ierr);
289     }
290     if (snes->ops->view) {
291       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
292       ierr = (*snes->ops->view)(snes,viewer);CHKERRQ(ierr);
293       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
294     }
295     ierr = PetscViewerASCIIPrintf(viewer,"  maximum iterations=%D, maximum function evaluations=%D\n",snes->max_its,snes->max_funcs);CHKERRQ(ierr);
296     ierr = PetscViewerASCIIPrintf(viewer,"  tolerances: relative=%g, absolute=%g, solution=%g\n",(double)snes->rtol,(double)snes->abstol,(double)snes->stol);CHKERRQ(ierr);
297     if (snes->usesksp) {
298       ierr = PetscViewerASCIIPrintf(viewer,"  total number of linear solver iterations=%D\n",snes->linear_its);CHKERRQ(ierr);
299     }
300     ierr = PetscViewerASCIIPrintf(viewer,"  total number of function evaluations=%D\n",snes->nfuncs);CHKERRQ(ierr);
301     ierr = SNESGetNormSchedule(snes, &normschedule);CHKERRQ(ierr);
302     if (normschedule > 0) {ierr = PetscViewerASCIIPrintf(viewer,"  norm schedule %s\n",SNESNormSchedules[normschedule]);CHKERRQ(ierr);}
303     if (snes->gridsequence) {
304       ierr = PetscViewerASCIIPrintf(viewer,"  total number of grid sequence refinements=%D\n",snes->gridsequence);CHKERRQ(ierr);
305     }
306     if (snes->ksp_ewconv) {
307       kctx = (SNESKSPEW*)snes->kspconvctx;
308       if (kctx) {
309         ierr = PetscViewerASCIIPrintf(viewer,"  Eisenstat-Walker computation of KSP relative tolerance (version %D)\n",kctx->version);CHKERRQ(ierr);
310         ierr = PetscViewerASCIIPrintf(viewer,"    rtol_0=%g, rtol_max=%g, threshold=%g\n",(double)kctx->rtol_0,(double)kctx->rtol_max,(double)kctx->threshold);CHKERRQ(ierr);
311         ierr = PetscViewerASCIIPrintf(viewer,"    gamma=%g, alpha=%g, alpha2=%g\n",(double)kctx->gamma,(double)kctx->alpha,(double)kctx->alpha2);CHKERRQ(ierr);
312       }
313     }
314     if (snes->lagpreconditioner == -1) {
315       ierr = PetscViewerASCIIPrintf(viewer,"  Preconditioned is never rebuilt\n");CHKERRQ(ierr);
316     } else if (snes->lagpreconditioner > 1) {
317       ierr = PetscViewerASCIIPrintf(viewer,"  Preconditioned is rebuilt every %D new Jacobians\n",snes->lagpreconditioner);CHKERRQ(ierr);
318     }
319     if (snes->lagjacobian == -1) {
320       ierr = PetscViewerASCIIPrintf(viewer,"  Jacobian is never rebuilt\n");CHKERRQ(ierr);
321     } else if (snes->lagjacobian > 1) {
322       ierr = PetscViewerASCIIPrintf(viewer,"  Jacobian is rebuilt every %D SNES iterations\n",snes->lagjacobian);CHKERRQ(ierr);
323     }
324   } else if (isstring) {
325     const char *type;
326     ierr = SNESGetType(snes,&type);CHKERRQ(ierr);
327     ierr = PetscViewerStringSPrintf(viewer," %-3.3s",type);CHKERRQ(ierr);
328   } else if (isbinary) {
329     PetscInt    classid = SNES_FILE_CLASSID;
330     MPI_Comm    comm;
331     PetscMPIInt rank;
332     char        type[256];
333 
334     ierr = PetscObjectGetComm((PetscObject)snes,&comm);CHKERRQ(ierr);
335     ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
336     if (!rank) {
337       ierr = PetscViewerBinaryWrite(viewer,&classid,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
338       ierr = PetscStrncpy(type,((PetscObject)snes)->type_name,sizeof(type));CHKERRQ(ierr);
339       ierr = PetscViewerBinaryWrite(viewer,type,sizeof(type),PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr);
340     }
341     if (snes->ops->view) {
342       ierr = (*snes->ops->view)(snes,viewer);CHKERRQ(ierr);
343     }
344   } else if (isdraw) {
345     PetscDraw draw;
346     char      str[36];
347     PetscReal x,y,bottom,h;
348 
349     ierr   = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
350     ierr   = PetscDrawGetCurrentPoint(draw,&x,&y);CHKERRQ(ierr);
351     ierr   = PetscStrcpy(str,"SNES: ");CHKERRQ(ierr);
352     ierr   = PetscStrcat(str,((PetscObject)snes)->type_name);CHKERRQ(ierr);
353     ierr   = PetscDrawStringBoxed(draw,x,y,PETSC_DRAW_BLUE,PETSC_DRAW_BLACK,str,NULL,&h);CHKERRQ(ierr);
354     bottom = y - h;
355     ierr   = PetscDrawPushCurrentPoint(draw,x,bottom);CHKERRQ(ierr);
356     if (snes->ops->view) {
357       ierr = (*snes->ops->view)(snes,viewer);CHKERRQ(ierr);
358     }
359 #if defined(PETSC_HAVE_SAWS)
360   } else if (issaws) {
361     PetscMPIInt rank;
362     const char *name;
363 
364     ierr = PetscObjectGetName((PetscObject)snes,&name);CHKERRQ(ierr);
365     ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
366     if (!((PetscObject)snes)->amsmem && !rank) {
367       char       dir[1024];
368 
369       ierr = PetscObjectViewSAWs((PetscObject)snes,viewer);CHKERRQ(ierr);
370       ierr = PetscSNPrintf(dir,1024,"/PETSc/Objects/%s/its",name);CHKERRQ(ierr);
371       PetscStackCallSAWs(SAWs_Register,(dir,&snes->iter,1,SAWs_READ,SAWs_INT));
372       if (!snes->conv_hist) {
373         ierr = SNESSetConvergenceHistory(snes,NULL,NULL,PETSC_DECIDE,PETSC_TRUE);CHKERRQ(ierr);
374       }
375       ierr = PetscSNPrintf(dir,1024,"/PETSc/Objects/%s/conv_hist",name);CHKERRQ(ierr);
376       PetscStackCallSAWs(SAWs_Register,(dir,snes->conv_hist,10,SAWs_READ,SAWs_DOUBLE));
377     }
378 #endif
379   }
380   if (snes->linesearch) {
381     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
382     ierr = SNESGetLineSearch(snes, &linesearch);CHKERRQ(ierr);
383     ierr = SNESLineSearchView(linesearch, viewer);CHKERRQ(ierr);
384     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
385   }
386   if (snes->npc && snes->usesnpc) {
387     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
388     ierr = SNESView(snes->npc, viewer);CHKERRQ(ierr);
389     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
390   }
391   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
392   ierr = DMGetDMSNES(snes->dm,&dmsnes);CHKERRQ(ierr);
393   ierr = DMSNESView(dmsnes, viewer);CHKERRQ(ierr);
394   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
395   if (snes->usesksp) {
396     ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr);
397     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
398     ierr = KSPView(ksp,viewer);CHKERRQ(ierr);
399     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
400   }
401   if (isdraw) {
402     PetscDraw draw;
403     ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
404     ierr = PetscDrawPopCurrentPoint(draw);CHKERRQ(ierr);
405   }
406   PetscFunctionReturn(0);
407 }
408 
409 /*
410   We retain a list of functions that also take SNES command
411   line options. These are called at the end SNESSetFromOptions()
412 */
413 #define MAXSETFROMOPTIONS 5
414 static PetscInt numberofsetfromoptions;
415 static PetscErrorCode (*othersetfromoptions[MAXSETFROMOPTIONS])(SNES);
416 
417 /*@C
418   SNESAddOptionsChecker - Adds an additional function to check for SNES options.
419 
420   Not Collective
421 
422   Input Parameter:
423 . snescheck - function that checks for options
424 
425   Level: developer
426 
427 .seealso: SNESSetFromOptions()
428 @*/
429 PetscErrorCode  SNESAddOptionsChecker(PetscErrorCode (*snescheck)(SNES))
430 {
431   PetscFunctionBegin;
432   if (numberofsetfromoptions >= MAXSETFROMOPTIONS) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE, "Too many options checkers, only %D allowed", MAXSETFROMOPTIONS);
433   othersetfromoptions[numberofsetfromoptions++] = snescheck;
434   PetscFunctionReturn(0);
435 }
436 
437 extern PetscErrorCode  SNESDefaultMatrixFreeCreate2(SNES,Vec,Mat*);
438 
439 static PetscErrorCode SNESSetUpMatrixFree_Private(SNES snes, PetscBool hasOperator, PetscInt version)
440 {
441   Mat            J;
442   KSP            ksp;
443   PC             pc;
444   PetscBool      match;
445   PetscErrorCode ierr;
446   MatNullSpace   nullsp;
447 
448   PetscFunctionBegin;
449   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
450 
451   if (!snes->vec_func && (snes->jacobian || snes->jacobian_pre)) {
452     Mat A = snes->jacobian, B = snes->jacobian_pre;
453     ierr = MatCreateVecs(A ? A : B, NULL,&snes->vec_func);CHKERRQ(ierr);
454   }
455 
456   if (version == 1) {
457     ierr = MatCreateSNESMF(snes,&J);CHKERRQ(ierr);
458     ierr = MatMFFDSetOptionsPrefix(J,((PetscObject)snes)->prefix);CHKERRQ(ierr);
459     ierr = MatSetFromOptions(J);CHKERRQ(ierr);
460   } else if (version == 2) {
461     if (!snes->vec_func) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"SNESSetFunction() must be called first");
462 #if !defined(PETSC_USE_COMPLEX) && !defined(PETSC_USE_REAL_SINGLE) && !defined(PETSC_USE_REAL___FLOAT128) && !defined(PETSC_USE_REAL___FP16)
463     ierr = SNESDefaultMatrixFreeCreate2(snes,snes->vec_func,&J);CHKERRQ(ierr);
464 #else
465     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP, "matrix-free operator rutines (version 2)");
466 #endif
467   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE, "matrix-free operator rutines, only version 1 and 2");
468 
469   /* attach any user provided null space that was on Amat to the newly created matrix free matrix */
470   if (snes->jacobian) {
471     ierr = MatGetNullSpace(snes->jacobian,&nullsp);CHKERRQ(ierr);
472     if (nullsp) {
473       ierr = MatSetNullSpace(J,nullsp);CHKERRQ(ierr);
474     }
475   }
476 
477   ierr = PetscInfo1(snes,"Setting default matrix-free operator routines (version %D)\n", version);CHKERRQ(ierr);
478   if (hasOperator) {
479 
480     /* This version replaces the user provided Jacobian matrix with a
481        matrix-free version but still employs the user-provided preconditioner matrix. */
482     ierr = SNESSetJacobian(snes,J,0,0,0);CHKERRQ(ierr);
483   } else {
484     /* This version replaces both the user-provided Jacobian and the user-
485      provided preconditioner Jacobian with the default matrix free version. */
486     if ((snes->npcside== PC_LEFT) && snes->npc) {
487       if (!snes->jacobian){ierr = SNESSetJacobian(snes,J,0,0,0);CHKERRQ(ierr);}
488     } else {
489       ierr = SNESSetJacobian(snes,J,J,MatMFFDComputeJacobian,0);CHKERRQ(ierr);
490     }
491     /* Force no preconditioner */
492     ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr);
493     ierr = KSPGetPC(ksp,&pc);CHKERRQ(ierr);
494     ierr = PetscObjectTypeCompare((PetscObject)pc,PCSHELL,&match);CHKERRQ(ierr);
495     if (!match) {
496       ierr = PetscInfo(snes,"Setting default matrix-free preconditioner routines\nThat is no preconditioner is being used\n");CHKERRQ(ierr);
497       ierr = PCSetType(pc,PCNONE);CHKERRQ(ierr);
498     }
499   }
500   ierr = MatDestroy(&J);CHKERRQ(ierr);
501   PetscFunctionReturn(0);
502 }
503 
504 static PetscErrorCode DMRestrictHook_SNESVecSol(DM dmfine,Mat Restrict,Vec Rscale,Mat Inject,DM dmcoarse,void *ctx)
505 {
506   SNES           snes = (SNES)ctx;
507   PetscErrorCode ierr;
508   Vec            Xfine,Xfine_named = NULL,Xcoarse;
509 
510   PetscFunctionBegin;
511   if (PetscLogPrintInfo) {
512     PetscInt finelevel,coarselevel,fineclevel,coarseclevel;
513     ierr = DMGetRefineLevel(dmfine,&finelevel);CHKERRQ(ierr);
514     ierr = DMGetCoarsenLevel(dmfine,&fineclevel);CHKERRQ(ierr);
515     ierr = DMGetRefineLevel(dmcoarse,&coarselevel);CHKERRQ(ierr);
516     ierr = DMGetCoarsenLevel(dmcoarse,&coarseclevel);CHKERRQ(ierr);
517     ierr = PetscInfo4(dmfine,"Restricting SNES solution vector from level %D-%D to level %D-%D\n",finelevel,fineclevel,coarselevel,coarseclevel);CHKERRQ(ierr);
518   }
519   if (dmfine == snes->dm) Xfine = snes->vec_sol;
520   else {
521     ierr  = DMGetNamedGlobalVector(dmfine,"SNESVecSol",&Xfine_named);CHKERRQ(ierr);
522     Xfine = Xfine_named;
523   }
524   ierr = DMGetNamedGlobalVector(dmcoarse,"SNESVecSol",&Xcoarse);CHKERRQ(ierr);
525   if (Inject) {
526     ierr = MatRestrict(Inject,Xfine,Xcoarse);CHKERRQ(ierr);
527   } else {
528     ierr = MatRestrict(Restrict,Xfine,Xcoarse);CHKERRQ(ierr);
529     ierr = VecPointwiseMult(Xcoarse,Xcoarse,Rscale);CHKERRQ(ierr);
530   }
531   ierr = DMRestoreNamedGlobalVector(dmcoarse,"SNESVecSol",&Xcoarse);CHKERRQ(ierr);
532   if (Xfine_named) {ierr = DMRestoreNamedGlobalVector(dmfine,"SNESVecSol",&Xfine_named);CHKERRQ(ierr);}
533   PetscFunctionReturn(0);
534 }
535 
536 static PetscErrorCode DMCoarsenHook_SNESVecSol(DM dm,DM dmc,void *ctx)
537 {
538   PetscErrorCode ierr;
539 
540   PetscFunctionBegin;
541   ierr = DMCoarsenHookAdd(dmc,DMCoarsenHook_SNESVecSol,DMRestrictHook_SNESVecSol,ctx);CHKERRQ(ierr);
542   PetscFunctionReturn(0);
543 }
544 
545 /* This may be called to rediscretize the operator on levels of linear multigrid. The DM shuffle is so the user can
546  * safely call SNESGetDM() in their residual evaluation routine. */
547 static PetscErrorCode KSPComputeOperators_SNES(KSP ksp,Mat A,Mat B,void *ctx)
548 {
549   SNES           snes = (SNES)ctx;
550   PetscErrorCode ierr;
551   Mat            Asave = A,Bsave = B;
552   Vec            X,Xnamed = NULL;
553   DM             dmsave;
554   void           *ctxsave;
555   PetscErrorCode (*jac)(SNES,Vec,Mat,Mat,void*);
556 
557   PetscFunctionBegin;
558   dmsave = snes->dm;
559   ierr   = KSPGetDM(ksp,&snes->dm);CHKERRQ(ierr);
560   if (dmsave == snes->dm) X = snes->vec_sol; /* We are on the finest level */
561   else {                                     /* We are on a coarser level, this vec was initialized using a DM restrict hook */
562     ierr = DMGetNamedGlobalVector(snes->dm,"SNESVecSol",&Xnamed);CHKERRQ(ierr);
563     X    = Xnamed;
564     ierr = SNESGetJacobian(snes,NULL,NULL,&jac,&ctxsave);CHKERRQ(ierr);
565     /* If the DM's don't match up, the MatFDColoring context needed for the jacobian won't match up either -- fixit. */
566     if (jac == SNESComputeJacobianDefaultColor) {
567       ierr = SNESSetJacobian(snes,NULL,NULL,SNESComputeJacobianDefaultColor,0);CHKERRQ(ierr);
568     }
569   }
570   /* put the previous context back */
571 
572   ierr = SNESComputeJacobian(snes,X,A,B);CHKERRQ(ierr);
573   if (snes->dm != dmsave && jac == SNESComputeJacobianDefaultColor) {
574     ierr = SNESSetJacobian(snes,NULL,NULL,jac,ctxsave);CHKERRQ(ierr);
575   }
576 
577   if (A != Asave || B != Bsave) SETERRQ(PetscObjectComm((PetscObject)snes),PETSC_ERR_SUP,"No support for changing matrices at this time");
578   if (Xnamed) {
579     ierr = DMRestoreNamedGlobalVector(snes->dm,"SNESVecSol",&Xnamed);CHKERRQ(ierr);
580   }
581   snes->dm = dmsave;
582   PetscFunctionReturn(0);
583 }
584 
585 /*@
586    SNESSetUpMatrices - ensures that matrices are available for SNES, to be called by SNESSetUp_XXX()
587 
588    Collective
589 
590    Input Arguments:
591 .  snes - snes to configure
592 
593    Level: developer
594 
595 .seealso: SNESSetUp()
596 @*/
597 PetscErrorCode SNESSetUpMatrices(SNES snes)
598 {
599   PetscErrorCode ierr;
600   DM             dm;
601   DMSNES         sdm;
602 
603   PetscFunctionBegin;
604   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
605   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
606   if (!sdm->ops->computejacobian) SETERRQ(PetscObjectComm((PetscObject)snes),PETSC_ERR_PLIB,"DMSNES not properly configured");
607   else if (!snes->jacobian && snes->mf) {
608     Mat  J;
609     void *functx;
610     ierr = MatCreateSNESMF(snes,&J);CHKERRQ(ierr);
611     ierr = MatMFFDSetOptionsPrefix(J,((PetscObject)snes)->prefix);CHKERRQ(ierr);
612     ierr = MatSetFromOptions(J);CHKERRQ(ierr);
613     ierr = SNESGetFunction(snes,NULL,NULL,&functx);CHKERRQ(ierr);
614     ierr = SNESSetJacobian(snes,J,J,0,0);CHKERRQ(ierr);
615     ierr = MatDestroy(&J);CHKERRQ(ierr);
616   } else if (snes->mf_operator && !snes->jacobian_pre && !snes->jacobian) {
617     Mat J,B;
618     ierr = MatCreateSNESMF(snes,&J);CHKERRQ(ierr);
619     ierr = MatMFFDSetOptionsPrefix(J,((PetscObject)snes)->prefix);CHKERRQ(ierr);
620     ierr = MatSetFromOptions(J);CHKERRQ(ierr);
621     ierr = DMCreateMatrix(snes->dm,&B);CHKERRQ(ierr);
622     /* sdm->computejacobian was already set to reach here */
623     ierr = SNESSetJacobian(snes,J,B,NULL,NULL);CHKERRQ(ierr);
624     ierr = MatDestroy(&J);CHKERRQ(ierr);
625     ierr = MatDestroy(&B);CHKERRQ(ierr);
626   } else if (!snes->jacobian_pre) {
627     PetscDS   prob;
628     Mat       J, B;
629     PetscBool hasPrec = PETSC_FALSE;
630 
631     J    = snes->jacobian;
632     ierr = DMGetDS(dm, &prob);CHKERRQ(ierr);
633     if (prob) {ierr = PetscDSHasJacobianPreconditioner(prob, &hasPrec);CHKERRQ(ierr);}
634     if (J)            {ierr = PetscObjectReference((PetscObject) J);CHKERRQ(ierr);}
635     else if (hasPrec) {ierr = DMCreateMatrix(snes->dm, &J);CHKERRQ(ierr);}
636     ierr = DMCreateMatrix(snes->dm, &B);CHKERRQ(ierr);
637     ierr = SNESSetJacobian(snes, J ? J : B, B, NULL, NULL);CHKERRQ(ierr);
638     ierr = MatDestroy(&J);CHKERRQ(ierr);
639     ierr = MatDestroy(&B);CHKERRQ(ierr);
640   }
641   {
642     KSP ksp;
643     ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr);
644     ierr = KSPSetComputeOperators(ksp,KSPComputeOperators_SNES,snes);CHKERRQ(ierr);
645     ierr = DMCoarsenHookAdd(snes->dm,DMCoarsenHook_SNESVecSol,DMRestrictHook_SNESVecSol,snes);CHKERRQ(ierr);
646   }
647   PetscFunctionReturn(0);
648 }
649 
650 /*@C
651    SNESMonitorSetFromOptions - Sets a monitor function and viewer appropriate for the type indicated by the user
652 
653    Collective on SNES
654 
655    Input Parameters:
656 +  snes - SNES object you wish to monitor
657 .  name - the monitor type one is seeking
658 .  help - message indicating what monitoring is done
659 .  manual - manual page for the monitor
660 .  monitor - the monitor function
661 -  monitorsetup - a function that is called once ONLY if the user selected this monitor that may set additional features of the SNES or PetscViewer objects
662 
663    Level: developer
664 
665 .seealso: PetscOptionsGetViewer(), PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(),
666           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
667           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
668           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
669           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
670           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
671           PetscOptionsFList(), PetscOptionsEList()
672 @*/
673 PetscErrorCode  SNESMonitorSetFromOptions(SNES snes,const char name[],const char help[], const char manual[],PetscErrorCode (*monitor)(SNES,PetscInt,PetscReal,PetscViewerAndFormat*),PetscErrorCode (*monitorsetup)(SNES,PetscViewerAndFormat*))
674 {
675   PetscErrorCode    ierr;
676   PetscViewer       viewer;
677   PetscViewerFormat format;
678   PetscBool         flg;
679 
680   PetscFunctionBegin;
681   ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject)snes),((PetscObject)snes)->prefix,name,&viewer,&format,&flg);CHKERRQ(ierr);
682   if (flg) {
683     PetscViewerAndFormat *vf;
684     ierr = PetscViewerAndFormatCreate(viewer,format,&vf);CHKERRQ(ierr);
685     ierr = PetscObjectDereference((PetscObject)viewer);CHKERRQ(ierr);
686     if (monitorsetup) {
687       ierr = (*monitorsetup)(snes,vf);CHKERRQ(ierr);
688     }
689     ierr = SNESMonitorSet(snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))monitor,vf,(PetscErrorCode (*)(void**))PetscViewerAndFormatDestroy);CHKERRQ(ierr);
690   }
691   PetscFunctionReturn(0);
692 }
693 
694 /*@
695    SNESSetFromOptions - Sets various SNES and KSP parameters from user options.
696 
697    Collective on SNES
698 
699    Input Parameter:
700 .  snes - the SNES context
701 
702    Options Database Keys:
703 +  -snes_type <type> - newtonls, newtontr, ngmres, ncg, nrichardson, qn, vi, fas, SNESType for complete list
704 .  -snes_stol - convergence tolerance in terms of the norm
705                 of the change in the solution between steps
706 .  -snes_atol <abstol> - absolute tolerance of residual norm
707 .  -snes_rtol <rtol> - relative decrease in tolerance norm from initial
708 .  -snes_divergence_tolerance <divtol> - if the residual goes above divtol*rnorm0, exit with divergence
709 .  -snes_force_iteration <force> - force SNESSolve() to take at least one iteration
710 .  -snes_max_it <max_it> - maximum number of iterations
711 .  -snes_max_funcs <max_funcs> - maximum number of function evaluations
712 .  -snes_max_fail <max_fail> - maximum number of line search failures allowed before stopping, default is none
713 .  -snes_max_linear_solve_fail - number of linear solver failures before SNESSolve() stops
714 .  -snes_lag_preconditioner <lag> - how often preconditioner is rebuilt (use -1 to never rebuild)
715 .  -snes_lag_jacobian <lag> - how often Jacobian is rebuilt (use -1 to never rebuild)
716 .  -snes_trtol <trtol> - trust region tolerance
717 .  -snes_no_convergence_test - skip convergence test in nonlinear
718                                solver; hence iterations will continue until max_it
719                                or some other criterion is reached. Saves expense
720                                of convergence test
721 .  -snes_monitor [ascii][:filename][:viewer format] - prints residual norm at each iteration. if no filename given prints to stdout
722 .  -snes_monitor_solution [ascii binary draw][:filename][:viewer format] - plots solution at each iteration
723 .  -snes_monitor_residual [ascii binary draw][:filename][:viewer format] - plots residual (not its norm) at each iteration
724 .  -snes_monitor_solution_update [ascii binary draw][:filename][:viewer format] - plots update to solution at each iteration
725 .  -snes_monitor_lg_residualnorm - plots residual norm at each iteration
726 .  -snes_monitor_lg_range - plots residual norm at each iteration
727 .  -snes_fd - use finite differences to compute Jacobian; very slow, only for testing
728 .  -snes_fd_color - use finite differences with coloring to compute Jacobian
729 .  -snes_mf_ksp_monitor - if using matrix-free multiply then print h at each KSP iteration
730 -  -snes_converged_reason - print the reason for convergence/divergence after each solve
731 
732     Options Database for Eisenstat-Walker method:
733 +  -snes_ksp_ew - use Eisenstat-Walker method for determining linear system convergence
734 .  -snes_ksp_ew_version ver - version of  Eisenstat-Walker method
735 .  -snes_ksp_ew_rtol0 <rtol0> - Sets rtol0
736 .  -snes_ksp_ew_rtolmax <rtolmax> - Sets rtolmax
737 .  -snes_ksp_ew_gamma <gamma> - Sets gamma
738 .  -snes_ksp_ew_alpha <alpha> - Sets alpha
739 .  -snes_ksp_ew_alpha2 <alpha2> - Sets alpha2
740 -  -snes_ksp_ew_threshold <threshold> - Sets threshold
741 
742    Notes:
743    To see all options, run your program with the -help option or consult
744    Users-Manual: ch_snes
745 
746    Level: beginner
747 
748 .keywords: SNES, nonlinear, set, options, database
749 
750 .seealso: SNESSetOptionsPrefix()
751 @*/
752 PetscErrorCode  SNESSetFromOptions(SNES snes)
753 {
754   PetscBool      flg,pcset,persist,set;
755   PetscInt       i,indx,lag,grids;
756   const char     *deft        = SNESNEWTONLS;
757   const char     *convtests[] = {"default","skip"};
758   SNESKSPEW      *kctx        = NULL;
759   char           type[256], monfilename[PETSC_MAX_PATH_LEN];
760   PetscErrorCode ierr;
761   PCSide         pcside;
762   const char     *optionsprefix;
763 
764   PetscFunctionBegin;
765   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
766   ierr = SNESRegisterAll();CHKERRQ(ierr);
767   ierr = PetscObjectOptionsBegin((PetscObject)snes);CHKERRQ(ierr);
768   if (((PetscObject)snes)->type_name) deft = ((PetscObject)snes)->type_name;
769   ierr = PetscOptionsFList("-snes_type","Nonlinear solver method","SNESSetType",SNESList,deft,type,256,&flg);CHKERRQ(ierr);
770   if (flg) {
771     ierr = SNESSetType(snes,type);CHKERRQ(ierr);
772   } else if (!((PetscObject)snes)->type_name) {
773     ierr = SNESSetType(snes,deft);CHKERRQ(ierr);
774   }
775   ierr = PetscOptionsReal("-snes_stol","Stop if step length less than","SNESSetTolerances",snes->stol,&snes->stol,NULL);CHKERRQ(ierr);
776   ierr = PetscOptionsReal("-snes_atol","Stop if function norm less than","SNESSetTolerances",snes->abstol,&snes->abstol,NULL);CHKERRQ(ierr);
777 
778   ierr = PetscOptionsReal("-snes_rtol","Stop if decrease in function norm less than","SNESSetTolerances",snes->rtol,&snes->rtol,NULL);CHKERRQ(ierr);
779   ierr = PetscOptionsReal("-snes_divergence_tolerance","Stop if residual norm increases by this factor","SNESSetDivergenceTolerance",snes->divtol,&snes->divtol,NULL);CHKERRQ(ierr);
780   ierr = PetscOptionsInt("-snes_max_it","Maximum iterations","SNESSetTolerances",snes->max_its,&snes->max_its,NULL);CHKERRQ(ierr);
781   ierr = PetscOptionsInt("-snes_max_funcs","Maximum function evaluations","SNESSetTolerances",snes->max_funcs,&snes->max_funcs,NULL);CHKERRQ(ierr);
782   ierr = PetscOptionsInt("-snes_max_fail","Maximum nonlinear step failures","SNESSetMaxNonlinearStepFailures",snes->maxFailures,&snes->maxFailures,NULL);CHKERRQ(ierr);
783   ierr = PetscOptionsInt("-snes_max_linear_solve_fail","Maximum failures in linear solves allowed","SNESSetMaxLinearSolveFailures",snes->maxLinearSolveFailures,&snes->maxLinearSolveFailures,NULL);CHKERRQ(ierr);
784   ierr = PetscOptionsBool("-snes_error_if_not_converged","Generate error if solver does not converge","SNESSetErrorIfNotConverged",snes->errorifnotconverged,&snes->errorifnotconverged,NULL);CHKERRQ(ierr);
785   ierr = PetscOptionsBool("-snes_force_iteration","Force SNESSolve() to take at least one iteration","SNESForceIteration",snes->forceiteration,&snes->forceiteration,NULL);CHKERRQ(ierr);
786 
787   ierr = PetscOptionsInt("-snes_lag_preconditioner","How often to rebuild preconditioner","SNESSetLagPreconditioner",snes->lagpreconditioner,&lag,&flg);CHKERRQ(ierr);
788   if (flg) {
789     ierr = SNESSetLagPreconditioner(snes,lag);CHKERRQ(ierr);
790   }
791   ierr = PetscOptionsBool("-snes_lag_preconditioner_persists","Preconditioner lagging through multiple solves","SNESSetLagPreconditionerPersists",snes->lagjac_persist,&persist,&flg);CHKERRQ(ierr);
792   if (flg) {
793     ierr = SNESSetLagPreconditionerPersists(snes,persist);CHKERRQ(ierr);
794   }
795   ierr = PetscOptionsInt("-snes_lag_jacobian","How often to rebuild Jacobian","SNESSetLagJacobian",snes->lagjacobian,&lag,&flg);CHKERRQ(ierr);
796   if (flg) {
797     ierr = SNESSetLagJacobian(snes,lag);CHKERRQ(ierr);
798   }
799   ierr = PetscOptionsBool("-snes_lag_jacobian_persists","Jacobian lagging through multiple solves","SNESSetLagJacobianPersists",snes->lagjac_persist,&persist,&flg);CHKERRQ(ierr);
800   if (flg) {
801     ierr = SNESSetLagJacobianPersists(snes,persist);CHKERRQ(ierr);
802   }
803 
804   ierr = PetscOptionsInt("-snes_grid_sequence","Use grid sequencing to generate initial guess","SNESSetGridSequence",snes->gridsequence,&grids,&flg);CHKERRQ(ierr);
805   if (flg) {
806     ierr = SNESSetGridSequence(snes,grids);CHKERRQ(ierr);
807   }
808 
809   ierr = PetscOptionsEList("-snes_convergence_test","Convergence test","SNESSetConvergenceTest",convtests,2,"default",&indx,&flg);CHKERRQ(ierr);
810   if (flg) {
811     switch (indx) {
812     case 0: ierr = SNESSetConvergenceTest(snes,SNESConvergedDefault,NULL,NULL);CHKERRQ(ierr); break;
813     case 1: ierr = SNESSetConvergenceTest(snes,SNESConvergedSkip,NULL,NULL);CHKERRQ(ierr);    break;
814     }
815   }
816 
817   ierr = PetscOptionsEList("-snes_norm_schedule","SNES Norm schedule","SNESSetNormSchedule",SNESNormSchedules,5,"function",&indx,&flg);CHKERRQ(ierr);
818   if (flg) { ierr = SNESSetNormSchedule(snes,(SNESNormSchedule)indx);CHKERRQ(ierr); }
819 
820   ierr = PetscOptionsEList("-snes_function_type","SNES Norm schedule","SNESSetFunctionType",SNESFunctionTypes,2,"unpreconditioned",&indx,&flg);CHKERRQ(ierr);
821   if (flg) { ierr = SNESSetFunctionType(snes,(SNESFunctionType)indx);CHKERRQ(ierr); }
822 
823   kctx = (SNESKSPEW*)snes->kspconvctx;
824 
825   ierr = PetscOptionsBool("-snes_ksp_ew","Use Eisentat-Walker linear system convergence test","SNESKSPSetUseEW",snes->ksp_ewconv,&snes->ksp_ewconv,NULL);CHKERRQ(ierr);
826 
827   ierr = PetscOptionsInt("-snes_ksp_ew_version","Version 1, 2 or 3","SNESKSPSetParametersEW",kctx->version,&kctx->version,NULL);CHKERRQ(ierr);
828   ierr = PetscOptionsReal("-snes_ksp_ew_rtol0","0 <= rtol0 < 1","SNESKSPSetParametersEW",kctx->rtol_0,&kctx->rtol_0,NULL);CHKERRQ(ierr);
829   ierr = PetscOptionsReal("-snes_ksp_ew_rtolmax","0 <= rtolmax < 1","SNESKSPSetParametersEW",kctx->rtol_max,&kctx->rtol_max,NULL);CHKERRQ(ierr);
830   ierr = PetscOptionsReal("-snes_ksp_ew_gamma","0 <= gamma <= 1","SNESKSPSetParametersEW",kctx->gamma,&kctx->gamma,NULL);CHKERRQ(ierr);
831   ierr = PetscOptionsReal("-snes_ksp_ew_alpha","1 < alpha <= 2","SNESKSPSetParametersEW",kctx->alpha,&kctx->alpha,NULL);CHKERRQ(ierr);
832   ierr = PetscOptionsReal("-snes_ksp_ew_alpha2","alpha2","SNESKSPSetParametersEW",kctx->alpha2,&kctx->alpha2,NULL);CHKERRQ(ierr);
833   ierr = PetscOptionsReal("-snes_ksp_ew_threshold","0 < threshold < 1","SNESKSPSetParametersEW",kctx->threshold,&kctx->threshold,NULL);CHKERRQ(ierr);
834 
835   flg  = PETSC_FALSE;
836   ierr = PetscOptionsBool("-snes_check_jacobian","Check each Jacobian with a differenced one","SNESUpdateCheckJacobian",flg,&flg,&set);CHKERRQ(ierr);
837   if (set && flg) {
838     ierr = SNESSetUpdate(snes,SNESUpdateCheckJacobian);CHKERRQ(ierr);
839   }
840 
841   flg  = PETSC_FALSE;
842   ierr = PetscOptionsBool("-snes_monitor_cancel","Remove all monitors","SNESMonitorCancel",flg,&flg,&set);CHKERRQ(ierr);
843   if (set && flg) {ierr = SNESMonitorCancel(snes);CHKERRQ(ierr);}
844 
845   ierr = SNESMonitorSetFromOptions(snes,"-snes_monitor","Monitor norm of function","SNESMonitorDefault",SNESMonitorDefault,NULL);CHKERRQ(ierr);
846   ierr = SNESMonitorSetFromOptions(snes,"-snes_monitor_short","Monitor norm of function with fewer digits","SNESMonitorDefaultShort",SNESMonitorDefaultShort,NULL);CHKERRQ(ierr);
847   ierr = SNESMonitorSetFromOptions(snes,"-snes_monitor_range","Monitor range of elements of function","SNESMonitorRange",SNESMonitorRange,NULL);CHKERRQ(ierr);
848 
849   ierr = SNESMonitorSetFromOptions(snes,"-snes_monitor_ratio","Monitor ratios of the norm of function for consecutive steps","SNESMonitorRatio",SNESMonitorRatio,SNESMonitorRatioSetUp);CHKERRQ(ierr);
850   ierr = SNESMonitorSetFromOptions(snes,"-snes_monitor_field","Monitor norm of function (split into fields)","SNESMonitorDefaultField",SNESMonitorDefaultField,NULL);CHKERRQ(ierr);
851   ierr = SNESMonitorSetFromOptions(snes,"-snes_monitor_solution","View solution at each iteration","SNESMonitorSolution",SNESMonitorSolution,NULL);CHKERRQ(ierr);
852   ierr = SNESMonitorSetFromOptions(snes,"-snes_monitor_solution_update","View correction at each iteration","SNESMonitorSolutionUpdate",SNESMonitorSolutionUpdate,NULL);CHKERRQ(ierr);
853   ierr = SNESMonitorSetFromOptions(snes,"-snes_monitor_residual","View residual at each iteration","SNESMonitorResidual",SNESMonitorResidual,NULL);CHKERRQ(ierr);
854   ierr = SNESMonitorSetFromOptions(snes,"-snes_monitor_jacupdate_spectrum","Print the change in the spectrum of the Jacobian","SNESMonitorJacUpdateSpectrum",SNESMonitorJacUpdateSpectrum,NULL);CHKERRQ(ierr);
855   ierr = SNESMonitorSetFromOptions(snes,"-snes_monitor_fields","Monitor norm of function per field","SNESMonitorSet",SNESMonitorFields,NULL);CHKERRQ(ierr);
856 
857   ierr = PetscOptionsString("-snes_monitor_python","Use Python function","SNESMonitorSet",0,monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
858   if (flg) {ierr = PetscPythonMonitorSet((PetscObject)snes,monfilename);CHKERRQ(ierr);}
859 
860 
861   flg  = PETSC_FALSE;
862   ierr = PetscOptionsBool("-snes_monitor_lg_residualnorm","Plot function norm at each iteration","SNESMonitorLGResidualNorm",flg,&flg,NULL);CHKERRQ(ierr);
863   if (flg) {
864     PetscDrawLG ctx;
865 
866     ierr = SNESMonitorLGCreate(PetscObjectComm((PetscObject)snes),NULL,NULL,PETSC_DECIDE,PETSC_DECIDE,400,300,&ctx);CHKERRQ(ierr);
867     ierr = SNESMonitorSet(snes,SNESMonitorLGResidualNorm,ctx,(PetscErrorCode (*)(void**))PetscDrawLGDestroy);CHKERRQ(ierr);
868   }
869   flg  = PETSC_FALSE;
870   ierr = PetscOptionsBool("-snes_monitor_lg_range","Plot function range at each iteration","SNESMonitorLGRange",flg,&flg,NULL);CHKERRQ(ierr);
871   if (flg) {
872     PetscViewer ctx;
873 
874     ierr = PetscViewerDrawOpen(PetscObjectComm((PetscObject)snes),NULL,NULL,PETSC_DECIDE,PETSC_DECIDE,400,300,&ctx);CHKERRQ(ierr);
875     ierr = SNESMonitorSet(snes,SNESMonitorLGRange,ctx,(PetscErrorCode (*)(void**))PetscViewerDestroy);CHKERRQ(ierr);
876   }
877 
878 
879 
880   flg  = PETSC_FALSE;
881   ierr = PetscOptionsBool("-snes_fd","Use finite differences (slow) to compute Jacobian","SNESComputeJacobianDefault",flg,&flg,NULL);CHKERRQ(ierr);
882   if (flg) {
883     void    *functx;
884     DM      dm;
885     DMSNES  sdm;
886     ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
887     ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
888     sdm->jacobianctx = NULL;
889     ierr = SNESGetFunction(snes,NULL,NULL,&functx);CHKERRQ(ierr);
890     ierr = SNESSetJacobian(snes,snes->jacobian,snes->jacobian_pre,SNESComputeJacobianDefault,functx);CHKERRQ(ierr);
891     ierr = PetscInfo(snes,"Setting default finite difference Jacobian matrix\n");CHKERRQ(ierr);
892   }
893 
894   flg  = PETSC_FALSE;
895   ierr = PetscOptionsBool("-snes_fd_function","Use finite differences (slow) to compute function from user objective","SNESObjectiveComputeFunctionDefaultFD",flg,&flg,NULL);CHKERRQ(ierr);
896   if (flg) {
897     ierr = SNESSetFunction(snes,NULL,SNESObjectiveComputeFunctionDefaultFD,NULL);CHKERRQ(ierr);
898   }
899 
900   flg  = PETSC_FALSE;
901   ierr = PetscOptionsBool("-snes_fd_color","Use finite differences with coloring to compute Jacobian","SNESComputeJacobianDefaultColor",flg,&flg,NULL);CHKERRQ(ierr);
902   if (flg) {
903     DM             dm;
904     DMSNES         sdm;
905     ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
906     ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
907     sdm->jacobianctx = NULL;
908     ierr = SNESSetJacobian(snes,snes->jacobian,snes->jacobian_pre,SNESComputeJacobianDefaultColor,0);CHKERRQ(ierr);
909     ierr = PetscInfo(snes,"Setting default finite difference coloring Jacobian matrix\n");CHKERRQ(ierr);
910   }
911 
912   flg  = PETSC_FALSE;
913   ierr = PetscOptionsBool("-snes_mf_operator","Use a Matrix-Free Jacobian with user-provided preconditioner matrix","SNESSetUseMatrixFree",PETSC_FALSE,&snes->mf_operator,&flg);CHKERRQ(ierr);
914   if (flg && snes->mf_operator) {
915     snes->mf_operator = PETSC_TRUE;
916     snes->mf          = PETSC_TRUE;
917   }
918   flg  = PETSC_FALSE;
919   ierr = PetscOptionsBool("-snes_mf","Use a Matrix-Free Jacobian with no preconditioner matrix","SNESSetUseMatrixFree",PETSC_FALSE,&snes->mf,&flg);CHKERRQ(ierr);
920   if (!flg && snes->mf_operator) snes->mf = PETSC_TRUE;
921   ierr = PetscOptionsInt("-snes_mf_version","Matrix-Free routines version 1 or 2","None",snes->mf_version,&snes->mf_version,0);CHKERRQ(ierr);
922 
923   flg  = PETSC_FALSE;
924   ierr = SNESGetNPCSide(snes,&pcside);CHKERRQ(ierr);
925   ierr = PetscOptionsEnum("-snes_npc_side","SNES nonlinear preconditioner side","SNESSetNPCSide",PCSides,(PetscEnum)pcside,(PetscEnum*)&pcside,&flg);CHKERRQ(ierr);
926   if (flg) {ierr = SNESSetNPCSide(snes,pcside);CHKERRQ(ierr);}
927 
928 #if defined(PETSC_HAVE_SAWS)
929   /*
930     Publish convergence information using SAWs
931   */
932   flg  = PETSC_FALSE;
933   ierr = PetscOptionsBool("-snes_monitor_saws","Publish SNES progress using SAWs","SNESMonitorSet",flg,&flg,NULL);CHKERRQ(ierr);
934   if (flg) {
935     void *ctx;
936     ierr = SNESMonitorSAWsCreate(snes,&ctx);CHKERRQ(ierr);
937     ierr = SNESMonitorSet(snes,SNESMonitorSAWs,ctx,SNESMonitorSAWsDestroy);CHKERRQ(ierr);
938   }
939 #endif
940 #if defined(PETSC_HAVE_SAWS)
941   {
942   PetscBool set;
943   flg  = PETSC_FALSE;
944   ierr = PetscOptionsBool("-snes_saws_block","Block for SAWs at end of SNESSolve","PetscObjectSAWsBlock",((PetscObject)snes)->amspublishblock,&flg,&set);CHKERRQ(ierr);
945   if (set) {
946     ierr = PetscObjectSAWsSetBlock((PetscObject)snes,flg);CHKERRQ(ierr);
947   }
948   }
949 #endif
950 
951   for (i = 0; i < numberofsetfromoptions; i++) {
952     ierr = (*othersetfromoptions[i])(snes);CHKERRQ(ierr);
953   }
954 
955   if (snes->ops->setfromoptions) {
956     ierr = (*snes->ops->setfromoptions)(PetscOptionsObject,snes);CHKERRQ(ierr);
957   }
958 
959   /* process any options handlers added with PetscObjectAddOptionsHandler() */
960   ierr = PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject)snes);CHKERRQ(ierr);
961   ierr = PetscOptionsEnd();CHKERRQ(ierr);
962 
963   if (!snes->linesearch) {
964     ierr = SNESGetLineSearch(snes, &snes->linesearch);CHKERRQ(ierr);
965   }
966   ierr = SNESLineSearchSetFromOptions(snes->linesearch);CHKERRQ(ierr);
967 
968   if (!snes->ksp) {ierr = SNESGetKSP(snes,&snes->ksp);CHKERRQ(ierr);}
969   ierr = KSPSetOperators(snes->ksp,snes->jacobian,snes->jacobian_pre);CHKERRQ(ierr);
970   ierr = KSPSetFromOptions(snes->ksp);CHKERRQ(ierr);
971 
972   /* if someone has set the SNES NPC type, create it. */
973   ierr = SNESGetOptionsPrefix(snes, &optionsprefix);CHKERRQ(ierr);
974   ierr = PetscOptionsHasName(((PetscObject)snes)->options,optionsprefix, "-npc_snes_type", &pcset);CHKERRQ(ierr);
975   if (pcset && (!snes->npc)) {
976     ierr = SNESGetNPC(snes, &snes->npc);CHKERRQ(ierr);
977   }
978   PetscFunctionReturn(0);
979 }
980 
981 /*@C
982    SNESSetComputeApplicationContext - Sets an optional function to compute a user-defined context for
983    the nonlinear solvers.
984 
985    Logically Collective on SNES
986 
987    Input Parameters:
988 +  snes - the SNES context
989 .  compute - function to compute the context
990 -  destroy - function to destroy the context
991 
992    Level: intermediate
993 
994    Notes:
995    This function is currently not available from Fortran.
996 
997 .keywords: SNES, nonlinear, set, application, context
998 
999 .seealso: SNESGetApplicationContext(), SNESSetComputeApplicationContext(), SNESGetApplicationContext()
1000 @*/
1001 PetscErrorCode  SNESSetComputeApplicationContext(SNES snes,PetscErrorCode (*compute)(SNES,void**),PetscErrorCode (*destroy)(void**))
1002 {
1003   PetscFunctionBegin;
1004   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1005   snes->ops->usercompute = compute;
1006   snes->ops->userdestroy = destroy;
1007   PetscFunctionReturn(0);
1008 }
1009 
1010 /*@
1011    SNESSetApplicationContext - Sets the optional user-defined context for
1012    the nonlinear solvers.
1013 
1014    Logically Collective on SNES
1015 
1016    Input Parameters:
1017 +  snes - the SNES context
1018 -  usrP - optional user context
1019 
1020    Level: intermediate
1021 
1022    Fortran Notes: To use this from Fortran you must write a Fortran interface definition for this
1023     function that tells Fortran the Fortran derived data type that you are passing in as the ctx argument.
1024 
1025 .keywords: SNES, nonlinear, set, application, context
1026 
1027 .seealso: SNESGetApplicationContext()
1028 @*/
1029 PetscErrorCode  SNESSetApplicationContext(SNES snes,void *usrP)
1030 {
1031   PetscErrorCode ierr;
1032   KSP            ksp;
1033 
1034   PetscFunctionBegin;
1035   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1036   ierr       = SNESGetKSP(snes,&ksp);CHKERRQ(ierr);
1037   ierr       = KSPSetApplicationContext(ksp,usrP);CHKERRQ(ierr);
1038   snes->user = usrP;
1039   PetscFunctionReturn(0);
1040 }
1041 
1042 /*@
1043    SNESGetApplicationContext - Gets the user-defined context for the
1044    nonlinear solvers.
1045 
1046    Not Collective
1047 
1048    Input Parameter:
1049 .  snes - SNES context
1050 
1051    Output Parameter:
1052 .  usrP - user context
1053 
1054    Fortran Notes: To use this from Fortran you must write a Fortran interface definition for this
1055     function that tells Fortran the Fortran derived data type that you are passing in as the ctx argument.
1056 
1057    Level: intermediate
1058 
1059 .keywords: SNES, nonlinear, get, application, context
1060 
1061 .seealso: SNESSetApplicationContext()
1062 @*/
1063 PetscErrorCode  SNESGetApplicationContext(SNES snes,void *usrP)
1064 {
1065   PetscFunctionBegin;
1066   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1067   *(void**)usrP = snes->user;
1068   PetscFunctionReturn(0);
1069 }
1070 
1071 /*@
1072    SNESSetUseMatrixFree - indicates that SNES should use matrix free finite difference matrix vector products internally to apply
1073                           the Jacobian.
1074 
1075    Collective on SNES
1076 
1077    Input Parameters:
1078 +  snes - SNES context
1079 .  mf - use matrix-free for both the Amat and Pmat used by SNESSetJacobian(), both the Amat and Pmat set in SNESSetJacobian() will be ignored
1080 -  mf_operator - use matrix-free only for the Amat used by SNESSetJacobian(), this means the user provided Pmat will continue to be used
1081 
1082    Options Database:
1083 + -snes_mf - use matrix free for both the mat and pmat operator
1084 - -snes_mf_operator - use matrix free only for the mat operator
1085 
1086    Level: intermediate
1087 
1088 .keywords: SNES, nonlinear, get, iteration, number,
1089 
1090 .seealso:   SNESGetUseMatrixFree(), MatCreateSNESMF()
1091 @*/
1092 PetscErrorCode  SNESSetUseMatrixFree(SNES snes,PetscBool mf_operator,PetscBool mf)
1093 {
1094   PetscFunctionBegin;
1095   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1096   if (mf && !mf_operator) SETERRQ(PetscObjectComm((PetscObject)snes),PETSC_ERR_ARG_INCOMP,"If using mf must also use mf_operator");
1097   snes->mf          = mf;
1098   snes->mf_operator = mf_operator;
1099   PetscFunctionReturn(0);
1100 }
1101 
1102 /*@
1103    SNESGetUseMatrixFree - indicates if the SNES uses matrix free finite difference matrix vector products to apply
1104                           the Jacobian.
1105 
1106    Collective on SNES
1107 
1108    Input Parameter:
1109 .  snes - SNES context
1110 
1111    Output Parameters:
1112 +  mf - use matrix-free for both the Amat and Pmat used by SNESSetJacobian(), both the Amat and Pmat set in SNESSetJacobian() will be ignored
1113 -  mf_operator - use matrix-free only for the Amat used by SNESSetJacobian(), this means the user provided Pmat will continue to be used
1114 
1115    Options Database:
1116 + -snes_mf - use matrix free for both the mat and pmat operator
1117 - -snes_mf_operator - use matrix free only for the mat operator
1118 
1119    Level: intermediate
1120 
1121 .keywords: SNES, nonlinear, get, iteration, number,
1122 
1123 .seealso:   SNESSetUseMatrixFree(), MatCreateSNESMF()
1124 @*/
1125 PetscErrorCode  SNESGetUseMatrixFree(SNES snes,PetscBool *mf_operator,PetscBool *mf)
1126 {
1127   PetscFunctionBegin;
1128   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1129   if (mf)          *mf          = snes->mf;
1130   if (mf_operator) *mf_operator = snes->mf_operator;
1131   PetscFunctionReturn(0);
1132 }
1133 
1134 /*@
1135    SNESGetIterationNumber - Gets the number of nonlinear iterations completed
1136    at this time.
1137 
1138    Not Collective
1139 
1140    Input Parameter:
1141 .  snes - SNES context
1142 
1143    Output Parameter:
1144 .  iter - iteration number
1145 
1146    Notes:
1147    For example, during the computation of iteration 2 this would return 1.
1148 
1149    This is useful for using lagged Jacobians (where one does not recompute the
1150    Jacobian at each SNES iteration). For example, the code
1151 .vb
1152       ierr = SNESGetIterationNumber(snes,&it);
1153       if (!(it % 2)) {
1154         [compute Jacobian here]
1155       }
1156 .ve
1157    can be used in your ComputeJacobian() function to cause the Jacobian to be
1158    recomputed every second SNES iteration.
1159 
1160    Level: intermediate
1161 
1162 .keywords: SNES, nonlinear, get, iteration, number,
1163 
1164 .seealso:   SNESGetLinearSolveIterations()
1165 @*/
1166 PetscErrorCode  SNESGetIterationNumber(SNES snes,PetscInt *iter)
1167 {
1168   PetscFunctionBegin;
1169   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1170   PetscValidIntPointer(iter,2);
1171   *iter = snes->iter;
1172   PetscFunctionReturn(0);
1173 }
1174 
1175 /*@
1176    SNESSetIterationNumber - Sets the current iteration number.
1177 
1178    Not Collective
1179 
1180    Input Parameter:
1181 .  snes - SNES context
1182 .  iter - iteration number
1183 
1184    Level: developer
1185 
1186 .keywords: SNES, nonlinear, set, iteration, number,
1187 
1188 .seealso:   SNESGetLinearSolveIterations()
1189 @*/
1190 PetscErrorCode  SNESSetIterationNumber(SNES snes,PetscInt iter)
1191 {
1192   PetscErrorCode ierr;
1193 
1194   PetscFunctionBegin;
1195   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1196   ierr       = PetscObjectSAWsTakeAccess((PetscObject)snes);CHKERRQ(ierr);
1197   snes->iter = iter;
1198   ierr       = PetscObjectSAWsGrantAccess((PetscObject)snes);CHKERRQ(ierr);
1199   PetscFunctionReturn(0);
1200 }
1201 
1202 /*@
1203    SNESGetNonlinearStepFailures - Gets the number of unsuccessful steps
1204    attempted by the nonlinear solver.
1205 
1206    Not Collective
1207 
1208    Input Parameter:
1209 .  snes - SNES context
1210 
1211    Output Parameter:
1212 .  nfails - number of unsuccessful steps attempted
1213 
1214    Notes:
1215    This counter is reset to zero for each successive call to SNESSolve().
1216 
1217    Level: intermediate
1218 
1219 .keywords: SNES, nonlinear, get, number, unsuccessful, steps
1220 
1221 .seealso: SNESGetMaxLinearSolveFailures(), SNESGetLinearSolveIterations(), SNESSetMaxLinearSolveFailures(), SNESGetLinearSolveFailures(),
1222           SNESSetMaxNonlinearStepFailures(), SNESGetMaxNonlinearStepFailures()
1223 @*/
1224 PetscErrorCode  SNESGetNonlinearStepFailures(SNES snes,PetscInt *nfails)
1225 {
1226   PetscFunctionBegin;
1227   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1228   PetscValidIntPointer(nfails,2);
1229   *nfails = snes->numFailures;
1230   PetscFunctionReturn(0);
1231 }
1232 
1233 /*@
1234    SNESSetMaxNonlinearStepFailures - Sets the maximum number of unsuccessful steps
1235    attempted by the nonlinear solver before it gives up.
1236 
1237    Not Collective
1238 
1239    Input Parameters:
1240 +  snes     - SNES context
1241 -  maxFails - maximum of unsuccessful steps
1242 
1243    Level: intermediate
1244 
1245 .keywords: SNES, nonlinear, set, maximum, unsuccessful, steps
1246 
1247 .seealso: SNESGetMaxLinearSolveFailures(), SNESGetLinearSolveIterations(), SNESSetMaxLinearSolveFailures(), SNESGetLinearSolveFailures(),
1248           SNESGetMaxNonlinearStepFailures(), SNESGetNonlinearStepFailures()
1249 @*/
1250 PetscErrorCode  SNESSetMaxNonlinearStepFailures(SNES snes, PetscInt maxFails)
1251 {
1252   PetscFunctionBegin;
1253   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1254   snes->maxFailures = maxFails;
1255   PetscFunctionReturn(0);
1256 }
1257 
1258 /*@
1259    SNESGetMaxNonlinearStepFailures - Gets the maximum number of unsuccessful steps
1260    attempted by the nonlinear solver before it gives up.
1261 
1262    Not Collective
1263 
1264    Input Parameter:
1265 .  snes     - SNES context
1266 
1267    Output Parameter:
1268 .  maxFails - maximum of unsuccessful steps
1269 
1270    Level: intermediate
1271 
1272 .keywords: SNES, nonlinear, get, maximum, unsuccessful, steps
1273 
1274 .seealso: SNESGetMaxLinearSolveFailures(), SNESGetLinearSolveIterations(), SNESSetMaxLinearSolveFailures(), SNESGetLinearSolveFailures(),
1275           SNESSetMaxNonlinearStepFailures(), SNESGetNonlinearStepFailures()
1276 
1277 @*/
1278 PetscErrorCode  SNESGetMaxNonlinearStepFailures(SNES snes, PetscInt *maxFails)
1279 {
1280   PetscFunctionBegin;
1281   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1282   PetscValidIntPointer(maxFails,2);
1283   *maxFails = snes->maxFailures;
1284   PetscFunctionReturn(0);
1285 }
1286 
1287 /*@
1288    SNESGetNumberFunctionEvals - Gets the number of user provided function evaluations
1289      done by SNES.
1290 
1291    Not Collective
1292 
1293    Input Parameter:
1294 .  snes     - SNES context
1295 
1296    Output Parameter:
1297 .  nfuncs - number of evaluations
1298 
1299    Level: intermediate
1300 
1301    Notes: Reset every time SNESSolve is called unless SNESSetCountersReset() is used.
1302 
1303 .keywords: SNES, nonlinear, get, maximum, unsuccessful, steps
1304 
1305 .seealso: SNESGetMaxLinearSolveFailures(), SNESGetLinearSolveIterations(), SNESSetMaxLinearSolveFailures(), SNESGetLinearSolveFailures(), SNESSetCountersReset()
1306 @*/
1307 PetscErrorCode  SNESGetNumberFunctionEvals(SNES snes, PetscInt *nfuncs)
1308 {
1309   PetscFunctionBegin;
1310   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1311   PetscValidIntPointer(nfuncs,2);
1312   *nfuncs = snes->nfuncs;
1313   PetscFunctionReturn(0);
1314 }
1315 
1316 /*@
1317    SNESGetLinearSolveFailures - Gets the number of failed (non-converged)
1318    linear solvers.
1319 
1320    Not Collective
1321 
1322    Input Parameter:
1323 .  snes - SNES context
1324 
1325    Output Parameter:
1326 .  nfails - number of failed solves
1327 
1328    Level: intermediate
1329 
1330    Options Database Keys:
1331 . -snes_max_linear_solve_fail <num> - The number of failures before the solve is terminated
1332 
1333    Notes:
1334    This counter is reset to zero for each successive call to SNESSolve().
1335 
1336 .keywords: SNES, nonlinear, get, number, unsuccessful, steps
1337 
1338 .seealso: SNESGetMaxLinearSolveFailures(), SNESGetLinearSolveIterations(), SNESSetMaxLinearSolveFailures()
1339 @*/
1340 PetscErrorCode  SNESGetLinearSolveFailures(SNES snes,PetscInt *nfails)
1341 {
1342   PetscFunctionBegin;
1343   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1344   PetscValidIntPointer(nfails,2);
1345   *nfails = snes->numLinearSolveFailures;
1346   PetscFunctionReturn(0);
1347 }
1348 
1349 /*@
1350    SNESSetMaxLinearSolveFailures - the number of failed linear solve attempts
1351    allowed before SNES returns with a diverged reason of SNES_DIVERGED_LINEAR_SOLVE
1352 
1353    Logically Collective on SNES
1354 
1355    Input Parameters:
1356 +  snes     - SNES context
1357 -  maxFails - maximum allowed linear solve failures
1358 
1359    Level: intermediate
1360 
1361    Options Database Keys:
1362 . -snes_max_linear_solve_fail <num> - The number of failures before the solve is terminated
1363 
1364    Notes: By default this is 0; that is SNES returns on the first failed linear solve
1365 
1366 .keywords: SNES, nonlinear, set, maximum, unsuccessful, steps
1367 
1368 .seealso: SNESGetLinearSolveFailures(), SNESGetMaxLinearSolveFailures(), SNESGetLinearSolveIterations()
1369 @*/
1370 PetscErrorCode  SNESSetMaxLinearSolveFailures(SNES snes, PetscInt maxFails)
1371 {
1372   PetscFunctionBegin;
1373   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1374   PetscValidLogicalCollectiveInt(snes,maxFails,2);
1375   snes->maxLinearSolveFailures = maxFails;
1376   PetscFunctionReturn(0);
1377 }
1378 
1379 /*@
1380    SNESGetMaxLinearSolveFailures - gets the maximum number of linear solve failures that
1381      are allowed before SNES terminates
1382 
1383    Not Collective
1384 
1385    Input Parameter:
1386 .  snes     - SNES context
1387 
1388    Output Parameter:
1389 .  maxFails - maximum of unsuccessful solves allowed
1390 
1391    Level: intermediate
1392 
1393    Notes: By default this is 1; that is SNES returns on the first failed linear solve
1394 
1395 .keywords: SNES, nonlinear, get, maximum, unsuccessful, steps
1396 
1397 .seealso: SNESGetLinearSolveFailures(), SNESGetLinearSolveIterations(), SNESSetMaxLinearSolveFailures(),
1398 @*/
1399 PetscErrorCode  SNESGetMaxLinearSolveFailures(SNES snes, PetscInt *maxFails)
1400 {
1401   PetscFunctionBegin;
1402   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1403   PetscValidIntPointer(maxFails,2);
1404   *maxFails = snes->maxLinearSolveFailures;
1405   PetscFunctionReturn(0);
1406 }
1407 
1408 /*@
1409    SNESGetLinearSolveIterations - Gets the total number of linear iterations
1410    used by the nonlinear solver.
1411 
1412    Not Collective
1413 
1414    Input Parameter:
1415 .  snes - SNES context
1416 
1417    Output Parameter:
1418 .  lits - number of linear iterations
1419 
1420    Notes:
1421    This counter is reset to zero for each successive call to SNESSolve() unless SNESSetCountersReset() is used.
1422 
1423    If the linear solver fails inside the SNESSolve() the iterations for that call to the linear solver are not included. If you wish to count them
1424    then call KSPGetIterationNumber() after the failed solve.
1425 
1426    Level: intermediate
1427 
1428 .keywords: SNES, nonlinear, get, number, linear, iterations
1429 
1430 .seealso:  SNESGetIterationNumber(), SNESGetLinearSolveFailures(), SNESGetMaxLinearSolveFailures(), SNESSetCountersReset()
1431 @*/
1432 PetscErrorCode  SNESGetLinearSolveIterations(SNES snes,PetscInt *lits)
1433 {
1434   PetscFunctionBegin;
1435   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1436   PetscValidIntPointer(lits,2);
1437   *lits = snes->linear_its;
1438   PetscFunctionReturn(0);
1439 }
1440 
1441 /*@
1442    SNESSetCountersReset - Sets whether or not the counters for linear iterations and function evaluations
1443    are reset every time SNESSolve() is called.
1444 
1445    Logically Collective on SNES
1446 
1447    Input Parameter:
1448 +  snes - SNES context
1449 -  reset - whether to reset the counters or not
1450 
1451    Notes:
1452    This defaults to PETSC_TRUE
1453 
1454    Level: developer
1455 
1456 .keywords: SNES, nonlinear, set, reset, number, linear, iterations
1457 
1458 .seealso:  SNESGetNumberFunctionEvals(), SNESGetLinearSolveIterations(), SNESGetNPC()
1459 @*/
1460 PetscErrorCode  SNESSetCountersReset(SNES snes,PetscBool reset)
1461 {
1462   PetscFunctionBegin;
1463   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1464   PetscValidLogicalCollectiveBool(snes,reset,2);
1465   snes->counters_reset = reset;
1466   PetscFunctionReturn(0);
1467 }
1468 
1469 
1470 /*@
1471    SNESSetKSP - Sets a KSP context for the SNES object to use
1472 
1473    Not Collective, but the SNES and KSP objects must live on the same MPI_Comm
1474 
1475    Input Parameters:
1476 +  snes - the SNES context
1477 -  ksp - the KSP context
1478 
1479    Notes:
1480    The SNES object already has its KSP object, you can obtain with SNESGetKSP()
1481    so this routine is rarely needed.
1482 
1483    The KSP object that is already in the SNES object has its reference count
1484    decreased by one.
1485 
1486    Level: developer
1487 
1488 .keywords: SNES, nonlinear, get, KSP, context
1489 
1490 .seealso: KSPGetPC(), SNESCreate(), KSPCreate(), SNESSetKSP()
1491 @*/
1492 PetscErrorCode  SNESSetKSP(SNES snes,KSP ksp)
1493 {
1494   PetscErrorCode ierr;
1495 
1496   PetscFunctionBegin;
1497   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1498   PetscValidHeaderSpecific(ksp,KSP_CLASSID,2);
1499   PetscCheckSameComm(snes,1,ksp,2);
1500   ierr = PetscObjectReference((PetscObject)ksp);CHKERRQ(ierr);
1501   if (snes->ksp) {ierr = PetscObjectDereference((PetscObject)snes->ksp);CHKERRQ(ierr);}
1502   snes->ksp = ksp;
1503   PetscFunctionReturn(0);
1504 }
1505 
1506 /* -----------------------------------------------------------*/
1507 /*@
1508    SNESCreate - Creates a nonlinear solver context.
1509 
1510    Collective on MPI_Comm
1511 
1512    Input Parameters:
1513 .  comm - MPI communicator
1514 
1515    Output Parameter:
1516 .  outsnes - the new SNES context
1517 
1518    Options Database Keys:
1519 +   -snes_mf - Activates default matrix-free Jacobian-vector products,
1520                and no preconditioning matrix
1521 .   -snes_mf_operator - Activates default matrix-free Jacobian-vector
1522                products, and a user-provided preconditioning matrix
1523                as set by SNESSetJacobian()
1524 -   -snes_fd - Uses (slow!) finite differences to compute Jacobian
1525 
1526    Level: beginner
1527 
1528    Developer Notes: SNES always creates a KSP object even though many SNES methods do not use it. This is
1529                     unfortunate and should be fixed at some point. The flag snes->usesksp indicates if the
1530                     particular method does use KSP and regulates if the information about the KSP is printed
1531                     in SNESView(). TSSetFromOptions() does call SNESSetFromOptions() which can lead to users being confused
1532                     by help messages about meaningless SNES options.
1533 
1534                     SNES always creates the snes->kspconvctx even though it is used by only one type. This should
1535                     be fixed.
1536 
1537 .keywords: SNES, nonlinear, create, context
1538 
1539 .seealso: SNESSolve(), SNESDestroy(), SNES, SNESSetLagPreconditioner()
1540 
1541 @*/
1542 PetscErrorCode  SNESCreate(MPI_Comm comm,SNES *outsnes)
1543 {
1544   PetscErrorCode ierr;
1545   SNES           snes;
1546   SNESKSPEW      *kctx;
1547 
1548   PetscFunctionBegin;
1549   PetscValidPointer(outsnes,2);
1550   *outsnes = NULL;
1551   ierr = SNESInitializePackage();CHKERRQ(ierr);
1552 
1553   ierr = PetscHeaderCreate(snes,SNES_CLASSID,"SNES","Nonlinear solver","SNES",comm,SNESDestroy,SNESView);CHKERRQ(ierr);
1554 
1555   snes->ops->converged    = SNESConvergedDefault;
1556   snes->usesksp           = PETSC_TRUE;
1557   snes->tolerancesset     = PETSC_FALSE;
1558   snes->max_its           = 50;
1559   snes->max_funcs         = 10000;
1560   snes->norm              = 0.0;
1561   snes->normschedule      = SNES_NORM_ALWAYS;
1562   snes->functype          = SNES_FUNCTION_DEFAULT;
1563 #if defined(PETSC_USE_REAL_SINGLE)
1564   snes->rtol              = 1.e-5;
1565 #else
1566   snes->rtol              = 1.e-8;
1567 #endif
1568   snes->ttol              = 0.0;
1569 #if defined(PETSC_USE_REAL_SINGLE)
1570   snes->abstol            = 1.e-25;
1571 #else
1572   snes->abstol            = 1.e-50;
1573 #endif
1574 #if defined(PETSC_USE_REAL_SINGLE)
1575   snes->stol              = 1.e-5;
1576 #else
1577   snes->stol              = 1.e-8;
1578 #endif
1579 #if defined(PETSC_USE_REAL_SINGLE)
1580   snes->deltatol          = 1.e-6;
1581 #else
1582   snes->deltatol          = 1.e-12;
1583 #endif
1584   snes->divtol            = 1.e4;
1585   snes->rnorm0            = 0;
1586   snes->nfuncs            = 0;
1587   snes->numFailures       = 0;
1588   snes->maxFailures       = 1;
1589   snes->linear_its        = 0;
1590   snes->lagjacobian       = 1;
1591   snes->jac_iter          = 0;
1592   snes->lagjac_persist    = PETSC_FALSE;
1593   snes->lagpreconditioner = 1;
1594   snes->pre_iter          = 0;
1595   snes->lagpre_persist    = PETSC_FALSE;
1596   snes->numbermonitors    = 0;
1597   snes->data              = 0;
1598   snes->setupcalled       = PETSC_FALSE;
1599   snes->ksp_ewconv        = PETSC_FALSE;
1600   snes->nwork             = 0;
1601   snes->work              = 0;
1602   snes->nvwork            = 0;
1603   snes->vwork             = 0;
1604   snes->conv_hist_len     = 0;
1605   snes->conv_hist_max     = 0;
1606   snes->conv_hist         = NULL;
1607   snes->conv_hist_its     = NULL;
1608   snes->conv_hist_reset   = PETSC_TRUE;
1609   snes->counters_reset    = PETSC_TRUE;
1610   snes->vec_func_init_set = PETSC_FALSE;
1611   snes->reason            = SNES_CONVERGED_ITERATING;
1612   snes->npcside           = PC_RIGHT;
1613 
1614   snes->mf          = PETSC_FALSE;
1615   snes->mf_operator = PETSC_FALSE;
1616   snes->mf_version  = 1;
1617 
1618   snes->numLinearSolveFailures = 0;
1619   snes->maxLinearSolveFailures = 1;
1620 
1621   snes->vizerotolerance = 1.e-8;
1622 
1623   /* Set this to true if the implementation of SNESSolve_XXX does compute the residual at the final solution. */
1624   snes->alwayscomputesfinalresidual = PETSC_FALSE;
1625 
1626   /* Create context to compute Eisenstat-Walker relative tolerance for KSP */
1627   ierr = PetscNewLog(snes,&kctx);CHKERRQ(ierr);
1628 
1629   snes->kspconvctx  = (void*)kctx;
1630   kctx->version     = 2;
1631   kctx->rtol_0      = .3; /* Eisenstat and Walker suggest rtol_0=.5, but
1632                              this was too large for some test cases */
1633   kctx->rtol_last   = 0.0;
1634   kctx->rtol_max    = .9;
1635   kctx->gamma       = 1.0;
1636   kctx->alpha       = .5*(1.0 + PetscSqrtReal(5.0));
1637   kctx->alpha2      = kctx->alpha;
1638   kctx->threshold   = .1;
1639   kctx->lresid_last = 0.0;
1640   kctx->norm_last   = 0.0;
1641 
1642   *outsnes = snes;
1643   PetscFunctionReturn(0);
1644 }
1645 
1646 /*MC
1647     SNESFunction - Functional form used to convey the nonlinear function to be solved by SNES
1648 
1649      Synopsis:
1650      #include "petscsnes.h"
1651      PetscErrorCode SNESFunction(SNES snes,Vec x,Vec f,void *ctx);
1652 
1653      Input Parameters:
1654 +     snes - the SNES context
1655 .     x    - state at which to evaluate residual
1656 -     ctx     - optional user-defined function context, passed in with SNESSetFunction()
1657 
1658      Output Parameter:
1659 .     f  - vector to put residual (function value)
1660 
1661    Level: intermediate
1662 
1663 .seealso:   SNESSetFunction(), SNESGetFunction()
1664 M*/
1665 
1666 /*@C
1667    SNESSetFunction - Sets the function evaluation routine and function
1668    vector for use by the SNES routines in solving systems of nonlinear
1669    equations.
1670 
1671    Logically Collective on SNES
1672 
1673    Input Parameters:
1674 +  snes - the SNES context
1675 .  r - vector to store function value
1676 .  f - function evaluation routine; see SNESFunction for calling sequence details
1677 -  ctx - [optional] user-defined context for private data for the
1678          function evaluation routine (may be NULL)
1679 
1680    Notes:
1681    The Newton-like methods typically solve linear systems of the form
1682 $      f'(x) x = -f(x),
1683    where f'(x) denotes the Jacobian matrix and f(x) is the function.
1684 
1685    Level: beginner
1686 
1687 .keywords: SNES, nonlinear, set, function
1688 
1689 .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian(), SNESSetPicard(), SNESFunction
1690 @*/
1691 PetscErrorCode  SNESSetFunction(SNES snes,Vec r,PetscErrorCode (*f)(SNES,Vec,Vec,void*),void *ctx)
1692 {
1693   PetscErrorCode ierr;
1694   DM             dm;
1695 
1696   PetscFunctionBegin;
1697   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1698   if (r) {
1699     PetscValidHeaderSpecific(r,VEC_CLASSID,2);
1700     PetscCheckSameComm(snes,1,r,2);
1701     ierr = PetscObjectReference((PetscObject)r);CHKERRQ(ierr);
1702     ierr = VecDestroy(&snes->vec_func);CHKERRQ(ierr);
1703 
1704     snes->vec_func = r;
1705   }
1706   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
1707   ierr = DMSNESSetFunction(dm,f,ctx);CHKERRQ(ierr);
1708   PetscFunctionReturn(0);
1709 }
1710 
1711 
1712 /*@C
1713    SNESSetInitialFunction - Sets the function vector to be used as the
1714    function norm at the initialization of the method.  In some
1715    instances, the user has precomputed the function before calling
1716    SNESSolve.  This function allows one to avoid a redundant call
1717    to SNESComputeFunction in that case.
1718 
1719    Logically Collective on SNES
1720 
1721    Input Parameters:
1722 +  snes - the SNES context
1723 -  f - vector to store function value
1724 
1725    Notes:
1726    This should not be modified during the solution procedure.
1727 
1728    This is used extensively in the SNESFAS hierarchy and in nonlinear preconditioning.
1729 
1730    Level: developer
1731 
1732 .keywords: SNES, nonlinear, set, function
1733 
1734 .seealso: SNESSetFunction(), SNESComputeFunction(), SNESSetInitialFunctionNorm()
1735 @*/
1736 PetscErrorCode  SNESSetInitialFunction(SNES snes, Vec f)
1737 {
1738   PetscErrorCode ierr;
1739   Vec            vec_func;
1740 
1741   PetscFunctionBegin;
1742   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1743   PetscValidHeaderSpecific(f,VEC_CLASSID,2);
1744   PetscCheckSameComm(snes,1,f,2);
1745   if (snes->npcside== PC_LEFT && snes->functype == SNES_FUNCTION_PRECONDITIONED) {
1746     snes->vec_func_init_set = PETSC_FALSE;
1747     PetscFunctionReturn(0);
1748   }
1749   ierr = SNESGetFunction(snes,&vec_func,NULL,NULL);CHKERRQ(ierr);
1750   ierr = VecCopy(f, vec_func);CHKERRQ(ierr);
1751 
1752   snes->vec_func_init_set = PETSC_TRUE;
1753   PetscFunctionReturn(0);
1754 }
1755 
1756 /*@
1757    SNESSetNormSchedule - Sets the SNESNormSchedule used in covergence and monitoring
1758    of the SNES method.
1759 
1760    Logically Collective on SNES
1761 
1762    Input Parameters:
1763 +  snes - the SNES context
1764 -  normschedule - the frequency of norm computation
1765 
1766    Options Database Key:
1767 .  -snes_norm_schedule <none, always, initialonly, finalonly, initalfinalonly>
1768 
1769    Notes:
1770    Only certain SNES methods support certain SNESNormSchedules.  Most require evaluation
1771    of the nonlinear function and the taking of its norm at every iteration to
1772    even ensure convergence at all.  However, methods such as custom Gauss-Seidel methods
1773    (SNESNGS) and the like do not require the norm of the function to be computed, and therfore
1774    may either be monitored for convergence or not.  As these are often used as nonlinear
1775    preconditioners, monitoring the norm of their error is not a useful enterprise within
1776    their solution.
1777 
1778    Level: developer
1779 
1780 .keywords: SNES, nonlinear, set, function, norm, type
1781 
1782 .seealso: SNESGetNormSchedule(), SNESComputeFunction(), VecNorm(), SNESSetFunction(), SNESSetInitialFunction(), SNESNormSchedule
1783 @*/
1784 PetscErrorCode  SNESSetNormSchedule(SNES snes, SNESNormSchedule normschedule)
1785 {
1786   PetscFunctionBegin;
1787   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1788   snes->normschedule = normschedule;
1789   PetscFunctionReturn(0);
1790 }
1791 
1792 
1793 /*@
1794    SNESGetNormSchedule - Gets the SNESNormSchedule used in covergence and monitoring
1795    of the SNES method.
1796 
1797    Logically Collective on SNES
1798 
1799    Input Parameters:
1800 +  snes - the SNES context
1801 -  normschedule - the type of the norm used
1802 
1803    Level: advanced
1804 
1805 .keywords: SNES, nonlinear, set, function, norm, type
1806 
1807 .seealso: SNESSetNormSchedule(), SNESComputeFunction(), VecNorm(), SNESSetFunction(), SNESSetInitialFunction(), SNESNormSchedule
1808 @*/
1809 PetscErrorCode  SNESGetNormSchedule(SNES snes, SNESNormSchedule *normschedule)
1810 {
1811   PetscFunctionBegin;
1812   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1813   *normschedule = snes->normschedule;
1814   PetscFunctionReturn(0);
1815 }
1816 
1817 
1818 /*@
1819   SNESSetFunctionNorm - Sets the last computed residual norm.
1820 
1821   Logically Collective on SNES
1822 
1823   Input Parameters:
1824 + snes - the SNES context
1825 
1826 - normschedule - the frequency of norm computation
1827 
1828   Level: developer
1829 
1830 .keywords: SNES, nonlinear, set, function, norm, type
1831 .seealso: SNESGetNormSchedule(), SNESComputeFunction(), VecNorm(), SNESSetFunction(), SNESSetInitialFunction(), SNESNormSchedule
1832 @*/
1833 PetscErrorCode SNESSetFunctionNorm(SNES snes, PetscReal norm)
1834 {
1835   PetscFunctionBegin;
1836   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1837   snes->norm = norm;
1838   PetscFunctionReturn(0);
1839 }
1840 
1841 /*@
1842   SNESGetFunctionNorm - Gets the last computed norm of the residual
1843 
1844   Not Collective
1845 
1846   Input Parameter:
1847 . snes - the SNES context
1848 
1849   Output Parameter:
1850 . norm - the last computed residual norm
1851 
1852   Level: developer
1853 
1854 .keywords: SNES, nonlinear, set, function, norm, type
1855 .seealso: SNESSetNormSchedule(), SNESComputeFunction(), VecNorm(), SNESSetFunction(), SNESSetInitialFunction(), SNESNormSchedule
1856 @*/
1857 PetscErrorCode SNESGetFunctionNorm(SNES snes, PetscReal *norm)
1858 {
1859   PetscFunctionBegin;
1860   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1861   PetscValidPointer(norm, 2);
1862   *norm = snes->norm;
1863   PetscFunctionReturn(0);
1864 }
1865 
1866 /*@C
1867    SNESSetFunctionType - Sets the SNESNormSchedule used in covergence and monitoring
1868    of the SNES method.
1869 
1870    Logically Collective on SNES
1871 
1872    Input Parameters:
1873 +  snes - the SNES context
1874 -  normschedule - the frequency of norm computation
1875 
1876    Notes:
1877    Only certain SNES methods support certain SNESNormSchedules.  Most require evaluation
1878    of the nonlinear function and the taking of its norm at every iteration to
1879    even ensure convergence at all.  However, methods such as custom Gauss-Seidel methods
1880    (SNESNGS) and the like do not require the norm of the function to be computed, and therfore
1881    may either be monitored for convergence or not.  As these are often used as nonlinear
1882    preconditioners, monitoring the norm of their error is not a useful enterprise within
1883    their solution.
1884 
1885    Level: developer
1886 
1887 .keywords: SNES, nonlinear, set, function, norm, type
1888 
1889 .seealso: SNESGetNormSchedule(), SNESComputeFunction(), VecNorm(), SNESSetFunction(), SNESSetInitialFunction(), SNESNormSchedule
1890 @*/
1891 PetscErrorCode  SNESSetFunctionType(SNES snes, SNESFunctionType type)
1892 {
1893   PetscFunctionBegin;
1894   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1895   snes->functype = type;
1896   PetscFunctionReturn(0);
1897 }
1898 
1899 
1900 /*@C
1901    SNESGetFunctionType - Gets the SNESNormSchedule used in covergence and monitoring
1902    of the SNES method.
1903 
1904    Logically Collective on SNES
1905 
1906    Input Parameters:
1907 +  snes - the SNES context
1908 -  normschedule - the type of the norm used
1909 
1910    Level: advanced
1911 
1912 .keywords: SNES, nonlinear, set, function, norm, type
1913 
1914 .seealso: SNESSetNormSchedule(), SNESComputeFunction(), VecNorm(), SNESSetFunction(), SNESSetInitialFunction(), SNESNormSchedule
1915 @*/
1916 PetscErrorCode  SNESGetFunctionType(SNES snes, SNESFunctionType *type)
1917 {
1918   PetscFunctionBegin;
1919   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1920   *type = snes->functype;
1921   PetscFunctionReturn(0);
1922 }
1923 
1924 /*MC
1925     SNESNGSFunction - function used to convey a Gauss-Seidel sweep on the nonlinear function
1926 
1927      Synopsis:
1928      #include <petscsnes.h>
1929 $    SNESNGSFunction(SNES snes,Vec x,Vec b,void *ctx);
1930 
1931 +  X   - solution vector
1932 .  B   - RHS vector
1933 -  ctx - optional user-defined Gauss-Seidel context
1934 
1935    Level: intermediate
1936 
1937 .seealso:   SNESSetNGS(), SNESGetNGS()
1938 M*/
1939 
1940 /*@C
1941    SNESSetNGS - Sets the user nonlinear Gauss-Seidel routine for
1942    use with composed nonlinear solvers.
1943 
1944    Input Parameters:
1945 +  snes   - the SNES context
1946 .  f - function evaluation routine to apply Gauss-Seidel see SNESNGSFunction
1947 -  ctx    - [optional] user-defined context for private data for the
1948             smoother evaluation routine (may be NULL)
1949 
1950    Notes:
1951    The NGS routines are used by the composed nonlinear solver to generate
1952     a problem appropriate update to the solution, particularly FAS.
1953 
1954    Level: intermediate
1955 
1956 .keywords: SNES, nonlinear, set, Gauss-Seidel
1957 
1958 .seealso: SNESGetFunction(), SNESComputeNGS()
1959 @*/
1960 PetscErrorCode SNESSetNGS(SNES snes,PetscErrorCode (*f)(SNES,Vec,Vec,void*),void *ctx)
1961 {
1962   PetscErrorCode ierr;
1963   DM             dm;
1964 
1965   PetscFunctionBegin;
1966   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1967   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
1968   ierr = DMSNESSetNGS(dm,f,ctx);CHKERRQ(ierr);
1969   PetscFunctionReturn(0);
1970 }
1971 
1972 PETSC_EXTERN PetscErrorCode SNESPicardComputeFunction(SNES snes,Vec x,Vec f,void *ctx)
1973 {
1974   PetscErrorCode ierr;
1975   DM             dm;
1976   DMSNES         sdm;
1977 
1978   PetscFunctionBegin;
1979   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
1980   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
1981   /*  A(x)*x - b(x) */
1982   if (sdm->ops->computepfunction) {
1983     ierr = (*sdm->ops->computepfunction)(snes,x,f,sdm->pctx);CHKERRQ(ierr);
1984   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE, "Must call SNESSetPicard() to provide Picard function.");
1985 
1986   if (sdm->ops->computepjacobian) {
1987     ierr = (*sdm->ops->computepjacobian)(snes,x,snes->jacobian,snes->jacobian_pre,sdm->pctx);CHKERRQ(ierr);
1988   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE, "Must call SNESSetPicard() to provide Picard matrix.");
1989   ierr = VecScale(f,-1.0);CHKERRQ(ierr);
1990   ierr = MatMultAdd(snes->jacobian,x,f,f);CHKERRQ(ierr);
1991   PetscFunctionReturn(0);
1992 }
1993 
1994 PETSC_EXTERN PetscErrorCode SNESPicardComputeJacobian(SNES snes,Vec x1,Mat J,Mat B,void *ctx)
1995 {
1996   PetscFunctionBegin;
1997   /* the jacobian matrix should be pre-filled in SNESPicardComputeFunction */
1998   PetscFunctionReturn(0);
1999 }
2000 
2001 /*@C
2002    SNESSetPicard - Use SNES to solve the semilinear-system A(x) x = b(x) via a Picard type iteration (Picard linearization)
2003 
2004    Logically Collective on SNES
2005 
2006    Input Parameters:
2007 +  snes - the SNES context
2008 .  r - vector to store function value
2009 .  b - function evaluation routine
2010 .  Amat - matrix with which A(x) x - b(x) is to be computed
2011 .  Pmat - matrix from which preconditioner is computed (usually the same as Amat)
2012 .  J  - function to compute matrix value, see SNESJacobianFunction for details on its calling sequence
2013 -  ctx - [optional] user-defined context for private data for the
2014          function evaluation routine (may be NULL)
2015 
2016    Notes:
2017     We do not recomemend using this routine. It is far better to provide the nonlinear function F() and some approximation to the Jacobian and use
2018     an approximate Newton solver. This interface is provided to allow porting/testing a previous Picard based code in PETSc before converting it to approximate Newton.
2019 
2020     One can call SNESSetPicard() or SNESSetFunction() (and possibly SNESSetJacobian()) but cannot call both
2021 
2022 $     Solves the equation A(x) x = b(x) via the defect correction algorithm A(x^{n}) (x^{n+1} - x^{n}) = b(x^{n}) - A(x^{n})x^{n}
2023 $     Note that when an exact solver is used this corresponds to the "classic" Picard A(x^{n}) x^{n+1} = b(x^{n}) iteration.
2024 
2025      Run with -snes_mf_operator to solve the system with Newton's method using A(x^{n}) to construct the preconditioner.
2026 
2027    We implement the defect correction form of the Picard iteration because it converges much more generally when inexact linear solvers are used then
2028    the direct Picard iteration A(x^n) x^{n+1} = b(x^n)
2029 
2030    There is some controversity over the definition of a Picard iteration for nonlinear systems but almost everyone agrees that it involves a linear solve and some
2031    believe it is the iteration  A(x^{n}) x^{n+1} = b(x^{n}) hence we use the name Picard. If anyone has an authoritative  reference that defines the Picard iteration
2032    different please contact us at petsc-dev@mcs.anl.gov and we'll have an entirely new argument :-).
2033 
2034    Level: intermediate
2035 
2036 .keywords: SNES, nonlinear, set, function
2037 
2038 .seealso: SNESGetFunction(), SNESSetFunction(), SNESComputeFunction(), SNESSetJacobian(), SNESGetPicard(), SNESLineSearchPreCheckPicard(), SNESJacobianFunction
2039 @*/
2040 PetscErrorCode  SNESSetPicard(SNES snes,Vec r,PetscErrorCode (*b)(SNES,Vec,Vec,void*),Mat Amat, Mat Pmat, PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx)
2041 {
2042   PetscErrorCode ierr;
2043   DM             dm;
2044 
2045   PetscFunctionBegin;
2046   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2047   ierr = SNESGetDM(snes, &dm);CHKERRQ(ierr);
2048   ierr = DMSNESSetPicard(dm,b,J,ctx);CHKERRQ(ierr);
2049   ierr = SNESSetFunction(snes,r,SNESPicardComputeFunction,ctx);CHKERRQ(ierr);
2050   ierr = SNESSetJacobian(snes,Amat,Pmat,SNESPicardComputeJacobian,ctx);CHKERRQ(ierr);
2051   PetscFunctionReturn(0);
2052 }
2053 
2054 /*@C
2055    SNESGetPicard - Returns the context for the Picard iteration
2056 
2057    Not Collective, but Vec is parallel if SNES is parallel. Collective if Vec is requested, but has not been created yet.
2058 
2059    Input Parameter:
2060 .  snes - the SNES context
2061 
2062    Output Parameter:
2063 +  r - the function (or NULL)
2064 .  f - the function (or NULL); see SNESFunction for calling sequence details
2065 .  Amat - the matrix used to defined the operation A(x) x - b(x) (or NULL)
2066 .  Pmat  - the matrix from which the preconditioner will be constructed (or NULL)
2067 .  J - the function for matrix evaluation (or NULL); see SNESJacobianFunction for calling sequence details
2068 -  ctx - the function context (or NULL)
2069 
2070    Level: advanced
2071 
2072 .keywords: SNES, nonlinear, get, function
2073 
2074 .seealso: SNESSetPicard(), SNESGetFunction(), SNESGetJacobian(), SNESGetDM(), SNESFunction, SNESJacobianFunction
2075 @*/
2076 PetscErrorCode  SNESGetPicard(SNES snes,Vec *r,PetscErrorCode (**f)(SNES,Vec,Vec,void*),Mat *Amat, Mat *Pmat, PetscErrorCode (**J)(SNES,Vec,Mat,Mat,void*),void **ctx)
2077 {
2078   PetscErrorCode ierr;
2079   DM             dm;
2080 
2081   PetscFunctionBegin;
2082   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2083   ierr = SNESGetFunction(snes,r,NULL,NULL);CHKERRQ(ierr);
2084   ierr = SNESGetJacobian(snes,Amat,Pmat,NULL,NULL);CHKERRQ(ierr);
2085   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
2086   ierr = DMSNESGetPicard(dm,f,J,ctx);CHKERRQ(ierr);
2087   PetscFunctionReturn(0);
2088 }
2089 
2090 /*@C
2091    SNESSetComputeInitialGuess - Sets a routine used to compute an initial guess for the problem
2092 
2093    Logically Collective on SNES
2094 
2095    Input Parameters:
2096 +  snes - the SNES context
2097 .  func - function evaluation routine
2098 -  ctx - [optional] user-defined context for private data for the
2099          function evaluation routine (may be NULL)
2100 
2101    Calling sequence of func:
2102 $    func (SNES snes,Vec x,void *ctx);
2103 
2104 .  f - function vector
2105 -  ctx - optional user-defined function context
2106 
2107    Level: intermediate
2108 
2109 .keywords: SNES, nonlinear, set, function
2110 
2111 .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian()
2112 @*/
2113 PetscErrorCode  SNESSetComputeInitialGuess(SNES snes,PetscErrorCode (*func)(SNES,Vec,void*),void *ctx)
2114 {
2115   PetscFunctionBegin;
2116   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2117   if (func) snes->ops->computeinitialguess = func;
2118   if (ctx)  snes->initialguessP            = ctx;
2119   PetscFunctionReturn(0);
2120 }
2121 
2122 /* --------------------------------------------------------------- */
2123 /*@C
2124    SNESGetRhs - Gets the vector for solving F(x) = rhs. If rhs is not set
2125    it assumes a zero right hand side.
2126 
2127    Logically Collective on SNES
2128 
2129    Input Parameter:
2130 .  snes - the SNES context
2131 
2132    Output Parameter:
2133 .  rhs - the right hand side vector or NULL if the right hand side vector is null
2134 
2135    Level: intermediate
2136 
2137 .keywords: SNES, nonlinear, get, function, right hand side
2138 
2139 .seealso: SNESGetSolution(), SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian(), SNESSetFunction()
2140 @*/
2141 PetscErrorCode  SNESGetRhs(SNES snes,Vec *rhs)
2142 {
2143   PetscFunctionBegin;
2144   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2145   PetscValidPointer(rhs,2);
2146   *rhs = snes->vec_rhs;
2147   PetscFunctionReturn(0);
2148 }
2149 
2150 /*@
2151    SNESComputeFunction - Calls the function that has been set with SNESSetFunction().
2152 
2153    Collective on SNES
2154 
2155    Input Parameters:
2156 +  snes - the SNES context
2157 -  x - input vector
2158 
2159    Output Parameter:
2160 .  y - function vector, as set by SNESSetFunction()
2161 
2162    Notes:
2163    SNESComputeFunction() is typically used within nonlinear solvers
2164    implementations, so most users would not generally call this routine
2165    themselves.
2166 
2167    Level: developer
2168 
2169 .keywords: SNES, nonlinear, compute, function
2170 
2171 .seealso: SNESSetFunction(), SNESGetFunction()
2172 @*/
2173 PetscErrorCode  SNESComputeFunction(SNES snes,Vec x,Vec y)
2174 {
2175   PetscErrorCode ierr;
2176   DM             dm;
2177   DMSNES         sdm;
2178 
2179   PetscFunctionBegin;
2180   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2181   PetscValidHeaderSpecific(x,VEC_CLASSID,2);
2182   PetscValidHeaderSpecific(y,VEC_CLASSID,3);
2183   PetscCheckSameComm(snes,1,x,2);
2184   PetscCheckSameComm(snes,1,y,3);
2185   ierr = VecValidValues(x,2,PETSC_TRUE);CHKERRQ(ierr);
2186 
2187   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
2188   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
2189   if (sdm->ops->computefunction) {
2190     if (sdm->ops->computefunction != SNESObjectiveComputeFunctionDefaultFD) {
2191       ierr = PetscLogEventBegin(SNES_FunctionEval,snes,x,y,0);CHKERRQ(ierr);
2192     }
2193     ierr = VecLockPush(x);CHKERRQ(ierr);
2194     PetscStackPush("SNES user function");
2195     ierr = (*sdm->ops->computefunction)(snes,x,y,sdm->functionctx);CHKERRQ(ierr);
2196     PetscStackPop;
2197     ierr = VecLockPop(x);CHKERRQ(ierr);
2198     if (sdm->ops->computefunction != SNESObjectiveComputeFunctionDefaultFD) {
2199       ierr = PetscLogEventEnd(SNES_FunctionEval,snes,x,y,0);CHKERRQ(ierr);
2200     }
2201   } else if (snes->vec_rhs) {
2202     ierr = MatMult(snes->jacobian, x, y);CHKERRQ(ierr);
2203   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE, "Must call SNESSetFunction() or SNESSetDM() before SNESComputeFunction(), likely called from SNESSolve().");
2204   if (snes->vec_rhs) {
2205     ierr = VecAXPY(y,-1.0,snes->vec_rhs);CHKERRQ(ierr);
2206   }
2207   snes->nfuncs++;
2208   /*
2209      domainerror might not be set on all processes; so we tag vector locally with Inf and the next inner product or norm will
2210      propagate the value to all processes
2211   */
2212   if (snes->domainerror) {
2213     ierr = VecSetInf(y);CHKERRQ(ierr);
2214   }
2215   PetscFunctionReturn(0);
2216 }
2217 
2218 /*@
2219    SNESComputeNGS - Calls the Gauss-Seidel function that has been set with  SNESSetNGS().
2220 
2221    Collective on SNES
2222 
2223    Input Parameters:
2224 +  snes - the SNES context
2225 .  x - input vector
2226 -  b - rhs vector
2227 
2228    Output Parameter:
2229 .  x - new solution vector
2230 
2231    Notes:
2232    SNESComputeNGS() is typically used within composed nonlinear solver
2233    implementations, so most users would not generally call this routine
2234    themselves.
2235 
2236    Level: developer
2237 
2238 .keywords: SNES, nonlinear, compute, function
2239 
2240 .seealso: SNESSetNGS(), SNESComputeFunction()
2241 @*/
2242 PetscErrorCode  SNESComputeNGS(SNES snes,Vec b,Vec x)
2243 {
2244   PetscErrorCode ierr;
2245   DM             dm;
2246   DMSNES         sdm;
2247 
2248   PetscFunctionBegin;
2249   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2250   PetscValidHeaderSpecific(x,VEC_CLASSID,2);
2251   if (b) PetscValidHeaderSpecific(b,VEC_CLASSID,3);
2252   PetscCheckSameComm(snes,1,x,2);
2253   if (b) PetscCheckSameComm(snes,1,b,3);
2254   if (b) {ierr = VecValidValues(b,2,PETSC_TRUE);CHKERRQ(ierr);}
2255   ierr = PetscLogEventBegin(SNES_NGSEval,snes,x,b,0);CHKERRQ(ierr);
2256   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
2257   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
2258   if (sdm->ops->computegs) {
2259     if (b) {ierr = VecLockPush(b);CHKERRQ(ierr);}
2260     PetscStackPush("SNES user NGS");
2261     ierr = (*sdm->ops->computegs)(snes,x,b,sdm->gsctx);CHKERRQ(ierr);
2262     PetscStackPop;
2263     if (b) {ierr = VecLockPop(b);CHKERRQ(ierr);}
2264   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE, "Must call SNESSetNGS() before SNESComputeNGS(), likely called from SNESSolve().");
2265   ierr = PetscLogEventEnd(SNES_NGSEval,snes,x,b,0);CHKERRQ(ierr);
2266   PetscFunctionReturn(0);
2267 }
2268 
2269 /*@
2270    SNESComputeJacobian - Computes the Jacobian matrix that has been set with SNESSetJacobian().
2271 
2272    Collective on SNES and Mat
2273 
2274    Input Parameters:
2275 +  snes - the SNES context
2276 -  x - input vector
2277 
2278    Output Parameters:
2279 +  A - Jacobian matrix
2280 -  B - optional preconditioning matrix
2281 
2282   Options Database Keys:
2283 +    -snes_lag_preconditioner <lag>
2284 .    -snes_lag_jacobian <lag>
2285 .    -snes_compare_explicit - Compare the computed Jacobian to the finite difference Jacobian and output the differences
2286 .    -snes_compare_explicit_draw  - Compare the computed Jacobian to the finite difference Jacobian and draw the result
2287 .    -snes_compare_explicit_contour  - Compare the computed Jacobian to the finite difference Jacobian and draw a contour plot with the result
2288 .    -snes_compare_operator  - Make the comparison options above use the operator instead of the preconditioning matrix
2289 .    -snes_compare_coloring - Compute the finite difference Jacobian using coloring and display norms of difference
2290 .    -snes_compare_coloring_display - Compute the finite differece Jacobian using coloring and display verbose differences
2291 .    -snes_compare_coloring_threshold - Display only those matrix entries that differ by more than a given threshold
2292 .    -snes_compare_coloring_threshold_atol - Absolute tolerance for difference in matrix entries to be displayed by -snes_compare_coloring_threshold
2293 .    -snes_compare_coloring_threshold_rtol - Relative tolerance for difference in matrix entries to be displayed by -snes_compare_coloring_threshold
2294 .    -snes_compare_coloring_draw - Compute the finite differece Jacobian using coloring and draw differences
2295 -    -snes_compare_coloring_draw_contour - Compute the finite differece Jacobian using coloring and show contours of matrices and differences
2296 
2297 
2298    Notes:
2299    Most users should not need to explicitly call this routine, as it
2300    is used internally within the nonlinear solvers.
2301 
2302    Level: developer
2303 
2304 .keywords: SNES, compute, Jacobian, matrix
2305 
2306 .seealso:  SNESSetJacobian(), KSPSetOperators(), MatStructure, SNESSetLagPreconditioner(), SNESSetLagJacobian()
2307 @*/
2308 PetscErrorCode  SNESComputeJacobian(SNES snes,Vec X,Mat A,Mat B)
2309 {
2310   PetscErrorCode ierr;
2311   PetscBool      flag;
2312   DM             dm;
2313   DMSNES         sdm;
2314   KSP            ksp;
2315 
2316   PetscFunctionBegin;
2317   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2318   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
2319   PetscCheckSameComm(snes,1,X,2);
2320   ierr = VecValidValues(X,2,PETSC_TRUE);CHKERRQ(ierr);
2321   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
2322   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
2323 
2324   if (!sdm->ops->computejacobian) SETERRQ(PetscObjectComm((PetscObject)snes),PETSC_ERR_USER,"Must call SNESSetJacobian(), DMSNESSetJacobian(), DMDASNESSetJacobianLocal(), etc");
2325 
2326   /* make sure that MatAssemblyBegin/End() is called on A matrix if it is matrix free */
2327 
2328   if (snes->lagjacobian == -2) {
2329     snes->lagjacobian = -1;
2330 
2331     ierr = PetscInfo(snes,"Recomputing Jacobian/preconditioner because lag is -2 (means compute Jacobian, but then never again) \n");CHKERRQ(ierr);
2332   } else if (snes->lagjacobian == -1) {
2333     ierr = PetscInfo(snes,"Reusing Jacobian/preconditioner because lag is -1\n");CHKERRQ(ierr);
2334     ierr = PetscObjectTypeCompare((PetscObject)A,MATMFFD,&flag);CHKERRQ(ierr);
2335     if (flag) {
2336       ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2337       ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2338     }
2339     PetscFunctionReturn(0);
2340   } else if (snes->lagjacobian > 1 && (snes->iter + snes->jac_iter) % snes->lagjacobian) {
2341     ierr = PetscInfo2(snes,"Reusing Jacobian/preconditioner because lag is %D and SNES iteration is %D\n",snes->lagjacobian,snes->iter);CHKERRQ(ierr);
2342     ierr = PetscObjectTypeCompare((PetscObject)A,MATMFFD,&flag);CHKERRQ(ierr);
2343     if (flag) {
2344       ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2345       ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2346     }
2347     PetscFunctionReturn(0);
2348   }
2349   if (snes->npc && snes->npcside== PC_LEFT) {
2350       ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2351       ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2352       PetscFunctionReturn(0);
2353   }
2354 
2355   ierr = PetscLogEventBegin(SNES_JacobianEval,snes,X,A,B);CHKERRQ(ierr);
2356   ierr = VecLockPush(X);CHKERRQ(ierr);
2357   PetscStackPush("SNES user Jacobian function");
2358   ierr = (*sdm->ops->computejacobian)(snes,X,A,B,sdm->jacobianctx);CHKERRQ(ierr);
2359   PetscStackPop;
2360   ierr = VecLockPop(X);CHKERRQ(ierr);
2361   ierr = PetscLogEventEnd(SNES_JacobianEval,snes,X,A,B);CHKERRQ(ierr);
2362 
2363   /* the next line ensures that snes->ksp exists */
2364   ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr);
2365   if (snes->lagpreconditioner == -2) {
2366     ierr = PetscInfo(snes,"Rebuilding preconditioner exactly once since lag is -2\n");CHKERRQ(ierr);
2367     ierr = KSPSetReusePreconditioner(snes->ksp,PETSC_FALSE);CHKERRQ(ierr);
2368     snes->lagpreconditioner = -1;
2369   } else if (snes->lagpreconditioner == -1) {
2370     ierr = PetscInfo(snes,"Reusing preconditioner because lag is -1\n");CHKERRQ(ierr);
2371     ierr = KSPSetReusePreconditioner(snes->ksp,PETSC_TRUE);CHKERRQ(ierr);
2372   } else if (snes->lagpreconditioner > 1 && (snes->iter + snes->pre_iter) % snes->lagpreconditioner) {
2373     ierr = PetscInfo2(snes,"Reusing preconditioner because lag is %D and SNES iteration is %D\n",snes->lagpreconditioner,snes->iter);CHKERRQ(ierr);
2374     ierr = KSPSetReusePreconditioner(snes->ksp,PETSC_TRUE);CHKERRQ(ierr);
2375   } else {
2376     ierr = PetscInfo(snes,"Rebuilding preconditioner\n");CHKERRQ(ierr);
2377     ierr = KSPSetReusePreconditioner(snes->ksp,PETSC_FALSE);CHKERRQ(ierr);
2378   }
2379 
2380   /* make sure user returned a correct Jacobian and preconditioner */
2381   /* PetscValidHeaderSpecific(A,MAT_CLASSID,3);
2382     PetscValidHeaderSpecific(B,MAT_CLASSID,4);   */
2383   {
2384     PetscBool flag = PETSC_FALSE,flag_draw = PETSC_FALSE,flag_contour = PETSC_FALSE,flag_operator = PETSC_FALSE;
2385     ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject)snes),((PetscObject)snes)->prefix,"-snes_compare_explicit",NULL,NULL,&flag);CHKERRQ(ierr);
2386     ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject)snes),((PetscObject)snes)->prefix,"-snes_compare_explicit_draw",NULL,NULL,&flag_draw);CHKERRQ(ierr);
2387     ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject)snes),((PetscObject)snes)->prefix,"-snes_compare_explicit_draw_contour",NULL,NULL,&flag_contour);CHKERRQ(ierr);
2388     ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject)snes),((PetscObject)snes)->prefix,"-snes_compare_operator",NULL,NULL,&flag_operator);CHKERRQ(ierr);
2389     if (flag || flag_draw || flag_contour) {
2390       Mat          Bexp_mine = NULL,Bexp,FDexp;
2391       PetscViewer  vdraw,vstdout;
2392       PetscBool    flg;
2393       if (flag_operator) {
2394         ierr = MatComputeExplicitOperator(A,&Bexp_mine);CHKERRQ(ierr);
2395         Bexp = Bexp_mine;
2396       } else {
2397         /* See if the preconditioning matrix can be viewed and added directly */
2398         ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQAIJ,MATMPIAIJ,MATSEQDENSE,MATMPIDENSE,MATSEQBAIJ,MATMPIBAIJ,MATSEQSBAIJ,MATMPIBAIJ,"");CHKERRQ(ierr);
2399         if (flg) Bexp = B;
2400         else {
2401           /* If the "preconditioning" matrix is itself MATSHELL or some other type without direct support */
2402           ierr = MatComputeExplicitOperator(B,&Bexp_mine);CHKERRQ(ierr);
2403           Bexp = Bexp_mine;
2404         }
2405       }
2406       ierr = MatConvert(Bexp,MATSAME,MAT_INITIAL_MATRIX,&FDexp);CHKERRQ(ierr);
2407       ierr = SNESComputeJacobianDefault(snes,X,FDexp,FDexp,NULL);CHKERRQ(ierr);
2408       ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)snes),&vstdout);CHKERRQ(ierr);
2409       if (flag_draw || flag_contour) {
2410         ierr = PetscViewerDrawOpen(PetscObjectComm((PetscObject)snes),0,"Explicit Jacobians",PETSC_DECIDE,PETSC_DECIDE,300,300,&vdraw);CHKERRQ(ierr);
2411         if (flag_contour) {ierr = PetscViewerPushFormat(vdraw,PETSC_VIEWER_DRAW_CONTOUR);CHKERRQ(ierr);}
2412       } else vdraw = NULL;
2413       ierr = PetscViewerASCIIPrintf(vstdout,"Explicit %s\n",flag_operator ? "Jacobian" : "preconditioning Jacobian");CHKERRQ(ierr);
2414       if (flag) {ierr = MatView(Bexp,vstdout);CHKERRQ(ierr);}
2415       if (vdraw) {ierr = MatView(Bexp,vdraw);CHKERRQ(ierr);}
2416       ierr = PetscViewerASCIIPrintf(vstdout,"Finite difference Jacobian\n");CHKERRQ(ierr);
2417       if (flag) {ierr = MatView(FDexp,vstdout);CHKERRQ(ierr);}
2418       if (vdraw) {ierr = MatView(FDexp,vdraw);CHKERRQ(ierr);}
2419       ierr = MatAYPX(FDexp,-1.0,Bexp,SAME_NONZERO_PATTERN);CHKERRQ(ierr);
2420       ierr = PetscViewerASCIIPrintf(vstdout,"User-provided matrix minus finite difference Jacobian\n");CHKERRQ(ierr);
2421       if (flag) {ierr = MatView(FDexp,vstdout);CHKERRQ(ierr);}
2422       if (vdraw) {              /* Always use contour for the difference */
2423         ierr = PetscViewerPushFormat(vdraw,PETSC_VIEWER_DRAW_CONTOUR);CHKERRQ(ierr);
2424         ierr = MatView(FDexp,vdraw);CHKERRQ(ierr);
2425         ierr = PetscViewerPopFormat(vdraw);CHKERRQ(ierr);
2426       }
2427       if (flag_contour) {ierr = PetscViewerPopFormat(vdraw);CHKERRQ(ierr);}
2428       ierr = PetscViewerDestroy(&vdraw);CHKERRQ(ierr);
2429       ierr = MatDestroy(&Bexp_mine);CHKERRQ(ierr);
2430       ierr = MatDestroy(&FDexp);CHKERRQ(ierr);
2431     }
2432   }
2433   {
2434     PetscBool flag = PETSC_FALSE,flag_display = PETSC_FALSE,flag_draw = PETSC_FALSE,flag_contour = PETSC_FALSE,flag_threshold = PETSC_FALSE;
2435     PetscReal threshold_atol = PETSC_SQRT_MACHINE_EPSILON,threshold_rtol = 10*PETSC_SQRT_MACHINE_EPSILON;
2436     ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject)snes),((PetscObject)snes)->prefix,"-snes_compare_coloring",NULL,NULL,&flag);CHKERRQ(ierr);
2437     ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject)snes),((PetscObject)snes)->prefix,"-snes_compare_coloring_display",NULL,NULL,&flag_display);CHKERRQ(ierr);
2438     ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject)snes),((PetscObject)snes)->prefix,"-snes_compare_coloring_draw",NULL,NULL,&flag_draw);CHKERRQ(ierr);
2439     ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject)snes),((PetscObject)snes)->prefix,"-snes_compare_coloring_draw_contour",NULL,NULL,&flag_contour);CHKERRQ(ierr);
2440     ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject)snes),((PetscObject)snes)->prefix,"-snes_compare_coloring_threshold",NULL,NULL,&flag_threshold);CHKERRQ(ierr);
2441     if (flag_threshold) {
2442       ierr = PetscOptionsGetReal(((PetscObject)snes)->options,((PetscObject)snes)->prefix,"-snes_compare_coloring_threshold_rtol",&threshold_rtol,NULL);CHKERRQ(ierr);
2443       ierr = PetscOptionsGetReal(((PetscObject)snes)->options,((PetscObject)snes)->prefix,"-snes_compare_coloring_threshold_atol",&threshold_atol,NULL);CHKERRQ(ierr);
2444     }
2445     if (flag || flag_display || flag_draw || flag_contour || flag_threshold) {
2446       Mat            Bfd;
2447       PetscViewer    vdraw,vstdout;
2448       MatColoring    coloring;
2449       ISColoring     iscoloring;
2450       MatFDColoring  matfdcoloring;
2451       PetscErrorCode (*func)(SNES,Vec,Vec,void*);
2452       void           *funcctx;
2453       PetscReal      norm1,norm2,normmax;
2454 
2455       ierr = MatDuplicate(B,MAT_DO_NOT_COPY_VALUES,&Bfd);CHKERRQ(ierr);
2456       ierr = MatColoringCreate(Bfd,&coloring);CHKERRQ(ierr);
2457       ierr = MatColoringSetType(coloring,MATCOLORINGSL);CHKERRQ(ierr);
2458       ierr = MatColoringSetFromOptions(coloring);CHKERRQ(ierr);
2459       ierr = MatColoringApply(coloring,&iscoloring);CHKERRQ(ierr);
2460       ierr = MatColoringDestroy(&coloring);CHKERRQ(ierr);
2461       ierr = MatFDColoringCreate(Bfd,iscoloring,&matfdcoloring);CHKERRQ(ierr);
2462       ierr = MatFDColoringSetFromOptions(matfdcoloring);CHKERRQ(ierr);
2463       ierr = MatFDColoringSetUp(Bfd,iscoloring,matfdcoloring);CHKERRQ(ierr);
2464       ierr = ISColoringDestroy(&iscoloring);CHKERRQ(ierr);
2465 
2466       /* This method of getting the function is currently unreliable since it doesn't work for DM local functions. */
2467       ierr = SNESGetFunction(snes,NULL,&func,&funcctx);CHKERRQ(ierr);
2468       ierr = MatFDColoringSetFunction(matfdcoloring,(PetscErrorCode (*)(void))func,funcctx);CHKERRQ(ierr);
2469       ierr = PetscObjectSetOptionsPrefix((PetscObject)matfdcoloring,((PetscObject)snes)->prefix);CHKERRQ(ierr);
2470       ierr = PetscObjectAppendOptionsPrefix((PetscObject)matfdcoloring,"coloring_");CHKERRQ(ierr);
2471       ierr = MatFDColoringSetFromOptions(matfdcoloring);CHKERRQ(ierr);
2472       ierr = MatFDColoringApply(Bfd,matfdcoloring,X,snes);CHKERRQ(ierr);
2473       ierr = MatFDColoringDestroy(&matfdcoloring);CHKERRQ(ierr);
2474 
2475       ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)snes),&vstdout);CHKERRQ(ierr);
2476       if (flag_draw || flag_contour) {
2477         ierr = PetscViewerDrawOpen(PetscObjectComm((PetscObject)snes),0,"Colored Jacobians",PETSC_DECIDE,PETSC_DECIDE,300,300,&vdraw);CHKERRQ(ierr);
2478         if (flag_contour) {ierr = PetscViewerPushFormat(vdraw,PETSC_VIEWER_DRAW_CONTOUR);CHKERRQ(ierr);}
2479       } else vdraw = NULL;
2480       ierr = PetscViewerASCIIPrintf(vstdout,"Explicit preconditioning Jacobian\n");CHKERRQ(ierr);
2481       if (flag_display) {ierr = MatView(B,vstdout);CHKERRQ(ierr);}
2482       if (vdraw) {ierr = MatView(B,vdraw);CHKERRQ(ierr);}
2483       ierr = PetscViewerASCIIPrintf(vstdout,"Colored Finite difference Jacobian\n");CHKERRQ(ierr);
2484       if (flag_display) {ierr = MatView(Bfd,vstdout);CHKERRQ(ierr);}
2485       if (vdraw) {ierr = MatView(Bfd,vdraw);CHKERRQ(ierr);}
2486       ierr = MatAYPX(Bfd,-1.0,B,SAME_NONZERO_PATTERN);CHKERRQ(ierr);
2487       ierr = MatNorm(Bfd,NORM_1,&norm1);CHKERRQ(ierr);
2488       ierr = MatNorm(Bfd,NORM_FROBENIUS,&norm2);CHKERRQ(ierr);
2489       ierr = MatNorm(Bfd,NORM_MAX,&normmax);CHKERRQ(ierr);
2490       ierr = PetscViewerASCIIPrintf(vstdout,"User-provided matrix minus finite difference Jacobian, norm1=%g normFrob=%g normmax=%g\n",(double)norm1,(double)norm2,(double)normmax);CHKERRQ(ierr);
2491       if (flag_display) {ierr = MatView(Bfd,vstdout);CHKERRQ(ierr);}
2492       if (vdraw) {              /* Always use contour for the difference */
2493         ierr = PetscViewerPushFormat(vdraw,PETSC_VIEWER_DRAW_CONTOUR);CHKERRQ(ierr);
2494         ierr = MatView(Bfd,vdraw);CHKERRQ(ierr);
2495         ierr = PetscViewerPopFormat(vdraw);CHKERRQ(ierr);
2496       }
2497       if (flag_contour) {ierr = PetscViewerPopFormat(vdraw);CHKERRQ(ierr);}
2498 
2499       if (flag_threshold) {
2500         PetscInt bs,rstart,rend,i;
2501         ierr = MatGetBlockSize(B,&bs);CHKERRQ(ierr);
2502         ierr = MatGetOwnershipRange(B,&rstart,&rend);CHKERRQ(ierr);
2503         for (i=rstart; i<rend; i++) {
2504           const PetscScalar *ba,*ca;
2505           const PetscInt    *bj,*cj;
2506           PetscInt          bn,cn,j,maxentrycol = -1,maxdiffcol = -1,maxrdiffcol = -1;
2507           PetscReal         maxentry = 0,maxdiff = 0,maxrdiff = 0;
2508           ierr = MatGetRow(B,i,&bn,&bj,&ba);CHKERRQ(ierr);
2509           ierr = MatGetRow(Bfd,i,&cn,&cj,&ca);CHKERRQ(ierr);
2510           if (bn != cn) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_PLIB,"Unexpected different nonzero pattern in -snes_compare_coloring_threshold");
2511           for (j=0; j<bn; j++) {
2512             PetscReal rdiff = PetscAbsScalar(ca[j]) / (threshold_atol + threshold_rtol*PetscAbsScalar(ba[j]));
2513             if (PetscAbsScalar(ba[j]) > PetscAbs(maxentry)) {
2514               maxentrycol = bj[j];
2515               maxentry    = PetscRealPart(ba[j]);
2516             }
2517             if (PetscAbsScalar(ca[j]) > PetscAbs(maxdiff)) {
2518               maxdiffcol = bj[j];
2519               maxdiff    = PetscRealPart(ca[j]);
2520             }
2521             if (rdiff > maxrdiff) {
2522               maxrdiffcol = bj[j];
2523               maxrdiff    = rdiff;
2524             }
2525           }
2526           if (maxrdiff > 1) {
2527             ierr = PetscViewerASCIIPrintf(vstdout,"row %D (maxentry=%g at %D, maxdiff=%g at %D, maxrdiff=%g at %D):",i,(double)maxentry,maxentrycol,(double)maxdiff,maxdiffcol,(double)maxrdiff,maxrdiffcol);CHKERRQ(ierr);
2528             for (j=0; j<bn; j++) {
2529               PetscReal rdiff;
2530               rdiff = PetscAbsScalar(ca[j]) / (threshold_atol + threshold_rtol*PetscAbsScalar(ba[j]));
2531               if (rdiff > 1) {
2532                 ierr = PetscViewerASCIIPrintf(vstdout," (%D,%g:%g)",bj[j],(double)PetscRealPart(ba[j]),(double)PetscRealPart(ca[j]));CHKERRQ(ierr);
2533               }
2534             }
2535             ierr = PetscViewerASCIIPrintf(vstdout,"\n",i,maxentry,maxdiff,maxrdiff);CHKERRQ(ierr);
2536           }
2537           ierr = MatRestoreRow(B,i,&bn,&bj,&ba);CHKERRQ(ierr);
2538           ierr = MatRestoreRow(Bfd,i,&cn,&cj,&ca);CHKERRQ(ierr);
2539         }
2540       }
2541       ierr = PetscViewerDestroy(&vdraw);CHKERRQ(ierr);
2542       ierr = MatDestroy(&Bfd);CHKERRQ(ierr);
2543     }
2544   }
2545   PetscFunctionReturn(0);
2546 }
2547 
2548 /*MC
2549     SNESJacobianFunction - Function used to convey the nonlinear Jacobian of the function to be solved by SNES
2550 
2551      Synopsis:
2552      #include "petscsnes.h"
2553      PetscErrorCode SNESJacobianFunction(SNES snes,Vec x,Mat Amat,Mat Pmat,void *ctx);
2554 
2555 +  x - input vector
2556 .  Amat - the matrix that defines the (approximate) Jacobian
2557 .  Pmat - the matrix to be used in constructing the preconditioner, usually the same as Amat.
2558 -  ctx - [optional] user-defined Jacobian context
2559 
2560    Level: intermediate
2561 
2562 .seealso:   SNESSetFunction(), SNESGetFunction(), SNESSetJacobian(), SNESGetJacobian()
2563 M*/
2564 
2565 /*@C
2566    SNESSetJacobian - Sets the function to compute Jacobian as well as the
2567    location to store the matrix.
2568 
2569    Logically Collective on SNES and Mat
2570 
2571    Input Parameters:
2572 +  snes - the SNES context
2573 .  Amat - the matrix that defines the (approximate) Jacobian
2574 .  Pmat - the matrix to be used in constructing the preconditioner, usually the same as Amat.
2575 .  J - Jacobian evaluation routine (if NULL then SNES retains any previously set value), see SNESJacobianFunction for details
2576 -  ctx - [optional] user-defined context for private data for the
2577          Jacobian evaluation routine (may be NULL) (if NULL then SNES retains any previously set value)
2578 
2579    Notes:
2580    If the Amat matrix and Pmat matrix are different you must call MatAssemblyBegin/End() on
2581    each matrix.
2582 
2583    If you know the operator Amat has a null space you can use MatSetNullSpace() and MatSetTransposeNullSpace() to supply the null
2584    space to Amat and the KSP solvers will automatically use that null space as needed during the solution process.
2585 
2586    If using SNESComputeJacobianDefaultColor() to assemble a Jacobian, the ctx argument
2587    must be a MatFDColoring.
2588 
2589    Other defect-correction schemes can be used by computing a different matrix in place of the Jacobian.  One common
2590    example is to use the "Picard linearization" which only differentiates through the highest order parts of each term.
2591 
2592    Level: beginner
2593 
2594 .keywords: SNES, nonlinear, set, Jacobian, matrix
2595 
2596 .seealso: KSPSetOperators(), SNESSetFunction(), MatMFFDComputeJacobian(), SNESComputeJacobianDefaultColor(), MatStructure, J,
2597           SNESSetPicard(), SNESJacobianFunction
2598 @*/
2599 PetscErrorCode  SNESSetJacobian(SNES snes,Mat Amat,Mat Pmat,PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx)
2600 {
2601   PetscErrorCode ierr;
2602   DM             dm;
2603 
2604   PetscFunctionBegin;
2605   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2606   if (Amat) PetscValidHeaderSpecific(Amat,MAT_CLASSID,2);
2607   if (Pmat) PetscValidHeaderSpecific(Pmat,MAT_CLASSID,3);
2608   if (Amat) PetscCheckSameComm(snes,1,Amat,2);
2609   if (Pmat) PetscCheckSameComm(snes,1,Pmat,3);
2610   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
2611   ierr = DMSNESSetJacobian(dm,J,ctx);CHKERRQ(ierr);
2612   if (Amat) {
2613     ierr = PetscObjectReference((PetscObject)Amat);CHKERRQ(ierr);
2614     ierr = MatDestroy(&snes->jacobian);CHKERRQ(ierr);
2615 
2616     snes->jacobian = Amat;
2617   }
2618   if (Pmat) {
2619     ierr = PetscObjectReference((PetscObject)Pmat);CHKERRQ(ierr);
2620     ierr = MatDestroy(&snes->jacobian_pre);CHKERRQ(ierr);
2621 
2622     snes->jacobian_pre = Pmat;
2623   }
2624   PetscFunctionReturn(0);
2625 }
2626 
2627 /*@C
2628    SNESGetJacobian - Returns the Jacobian matrix and optionally the user
2629    provided context for evaluating the Jacobian.
2630 
2631    Not Collective, but Mat object will be parallel if SNES object is
2632 
2633    Input Parameter:
2634 .  snes - the nonlinear solver context
2635 
2636    Output Parameters:
2637 +  Amat - location to stash (approximate) Jacobian matrix (or NULL)
2638 .  Pmat - location to stash matrix used to compute the preconditioner (or NULL)
2639 .  J - location to put Jacobian function (or NULL), see SNESJacobianFunction for details on its calling sequence
2640 -  ctx - location to stash Jacobian ctx (or NULL)
2641 
2642    Level: advanced
2643 
2644 .seealso: SNESSetJacobian(), SNESComputeJacobian(), SNESJacobianFunction, SNESGetFunction()
2645 @*/
2646 PetscErrorCode SNESGetJacobian(SNES snes,Mat *Amat,Mat *Pmat,PetscErrorCode (**J)(SNES,Vec,Mat,Mat,void*),void **ctx)
2647 {
2648   PetscErrorCode ierr;
2649   DM             dm;
2650   DMSNES         sdm;
2651 
2652   PetscFunctionBegin;
2653   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2654   if (Amat) *Amat = snes->jacobian;
2655   if (Pmat) *Pmat = snes->jacobian_pre;
2656   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
2657   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
2658   if (J) *J = sdm->ops->computejacobian;
2659   if (ctx) *ctx = sdm->jacobianctx;
2660   PetscFunctionReturn(0);
2661 }
2662 
2663 /*@
2664    SNESSetUp - Sets up the internal data structures for the later use
2665    of a nonlinear solver.
2666 
2667    Collective on SNES
2668 
2669    Input Parameters:
2670 .  snes - the SNES context
2671 
2672    Notes:
2673    For basic use of the SNES solvers the user need not explicitly call
2674    SNESSetUp(), since these actions will automatically occur during
2675    the call to SNESSolve().  However, if one wishes to control this
2676    phase separately, SNESSetUp() should be called after SNESCreate()
2677    and optional routines of the form SNESSetXXX(), but before SNESSolve().
2678 
2679    Level: advanced
2680 
2681 .keywords: SNES, nonlinear, setup
2682 
2683 .seealso: SNESCreate(), SNESSolve(), SNESDestroy()
2684 @*/
2685 PetscErrorCode  SNESSetUp(SNES snes)
2686 {
2687   PetscErrorCode ierr;
2688   DM             dm;
2689   DMSNES         sdm;
2690   SNESLineSearch linesearch, pclinesearch;
2691   void           *lsprectx,*lspostctx;
2692   PetscErrorCode (*precheck)(SNESLineSearch,Vec,Vec,PetscBool*,void*);
2693   PetscErrorCode (*postcheck)(SNESLineSearch,Vec,Vec,Vec,PetscBool*,PetscBool*,void*);
2694   PetscErrorCode (*func)(SNES,Vec,Vec,void*);
2695   Vec            f,fpc;
2696   void           *funcctx;
2697   PetscErrorCode (*jac)(SNES,Vec,Mat,Mat,void*);
2698   void           *jacctx,*appctx;
2699   Mat            j,jpre;
2700 
2701   PetscFunctionBegin;
2702   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2703   if (snes->setupcalled) PetscFunctionReturn(0);
2704 
2705   if (!((PetscObject)snes)->type_name) {
2706     ierr = SNESSetType(snes,SNESNEWTONLS);CHKERRQ(ierr);
2707   }
2708 
2709   ierr = SNESGetFunction(snes,&snes->vec_func,NULL,NULL);CHKERRQ(ierr);
2710 
2711   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
2712   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
2713   if (!sdm->ops->computefunction) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Function never provided to SNES object");
2714   if (!sdm->ops->computejacobian) {
2715     ierr = DMSNESSetJacobian(dm,SNESComputeJacobianDefaultColor,NULL);CHKERRQ(ierr);
2716   }
2717   if (!snes->vec_func) {
2718     ierr = DMCreateGlobalVector(dm,&snes->vec_func);CHKERRQ(ierr);
2719   }
2720 
2721   if (!snes->ksp) {
2722     ierr = SNESGetKSP(snes, &snes->ksp);CHKERRQ(ierr);
2723   }
2724 
2725   if (!snes->linesearch) {
2726     ierr = SNESGetLineSearch(snes, &snes->linesearch);CHKERRQ(ierr);
2727   }
2728   ierr = SNESLineSearchSetFunction(snes->linesearch,SNESComputeFunction);CHKERRQ(ierr);
2729 
2730   if (snes->npc && (snes->npcside== PC_LEFT)) {
2731     snes->mf          = PETSC_TRUE;
2732     snes->mf_operator = PETSC_FALSE;
2733   }
2734 
2735   if (snes->npc) {
2736     /* copy the DM over */
2737     ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
2738     ierr = SNESSetDM(snes->npc,dm);CHKERRQ(ierr);
2739 
2740     ierr = SNESGetFunction(snes,&f,&func,&funcctx);CHKERRQ(ierr);
2741     ierr = VecDuplicate(f,&fpc);CHKERRQ(ierr);
2742     ierr = SNESSetFunction(snes->npc,fpc,func,funcctx);CHKERRQ(ierr);
2743     ierr = SNESGetJacobian(snes,&j,&jpre,&jac,&jacctx);CHKERRQ(ierr);
2744     ierr = SNESSetJacobian(snes->npc,j,jpre,jac,jacctx);CHKERRQ(ierr);
2745     ierr = SNESGetApplicationContext(snes,&appctx);CHKERRQ(ierr);
2746     ierr = SNESSetApplicationContext(snes->npc,appctx);CHKERRQ(ierr);
2747     ierr = VecDestroy(&fpc);CHKERRQ(ierr);
2748 
2749     /* copy the function pointers over */
2750     ierr = PetscObjectCopyFortranFunctionPointers((PetscObject)snes,(PetscObject)snes->npc);CHKERRQ(ierr);
2751 
2752     /* default to 1 iteration */
2753     ierr = SNESSetTolerances(snes->npc,0.0,0.0,0.0,1,snes->npc->max_funcs);CHKERRQ(ierr);
2754     if (snes->npcside==PC_RIGHT) {
2755       ierr = SNESSetNormSchedule(snes->npc,SNES_NORM_FINAL_ONLY);CHKERRQ(ierr);
2756     } else {
2757       ierr = SNESSetNormSchedule(snes->npc,SNES_NORM_NONE);CHKERRQ(ierr);
2758     }
2759     ierr = SNESSetFromOptions(snes->npc);CHKERRQ(ierr);
2760 
2761     /* copy the line search context over */
2762     ierr = SNESGetLineSearch(snes,&linesearch);CHKERRQ(ierr);
2763     ierr = SNESGetLineSearch(snes->npc,&pclinesearch);CHKERRQ(ierr);
2764     ierr = SNESLineSearchGetPreCheck(linesearch,&precheck,&lsprectx);CHKERRQ(ierr);
2765     ierr = SNESLineSearchGetPostCheck(linesearch,&postcheck,&lspostctx);CHKERRQ(ierr);
2766     ierr = SNESLineSearchSetPreCheck(pclinesearch,precheck,lsprectx);CHKERRQ(ierr);
2767     ierr = SNESLineSearchSetPostCheck(pclinesearch,postcheck,lspostctx);CHKERRQ(ierr);
2768     ierr = PetscObjectCopyFortranFunctionPointers((PetscObject)linesearch, (PetscObject)pclinesearch);CHKERRQ(ierr);
2769   }
2770   if (snes->mf) {
2771     ierr = SNESSetUpMatrixFree_Private(snes, snes->mf_operator, snes->mf_version);CHKERRQ(ierr);
2772   }
2773   if (snes->ops->usercompute && !snes->user) {
2774     ierr = (*snes->ops->usercompute)(snes,(void**)&snes->user);CHKERRQ(ierr);
2775   }
2776 
2777   snes->jac_iter = 0;
2778   snes->pre_iter = 0;
2779 
2780   if (snes->ops->setup) {
2781     ierr = (*snes->ops->setup)(snes);CHKERRQ(ierr);
2782   }
2783 
2784   if (snes->npc && (snes->npcside== PC_LEFT)) {
2785     if (snes->functype == SNES_FUNCTION_PRECONDITIONED) {
2786       ierr = SNESGetLineSearch(snes,&linesearch);CHKERRQ(ierr);
2787       ierr = SNESLineSearchSetFunction(linesearch,SNESComputeFunctionDefaultNPC);CHKERRQ(ierr);
2788     }
2789   }
2790 
2791   snes->setupcalled = PETSC_TRUE;
2792   PetscFunctionReturn(0);
2793 }
2794 
2795 /*@
2796    SNESReset - Resets a SNES context to the snessetupcalled = 0 state and removes any allocated Vecs and Mats
2797 
2798    Collective on SNES
2799 
2800    Input Parameter:
2801 .  snes - iterative context obtained from SNESCreate()
2802 
2803    Level: intermediate
2804 
2805    Notes: Also calls the application context destroy routine set with SNESSetComputeApplicationContext()
2806 
2807 .keywords: SNES, destroy
2808 
2809 .seealso: SNESCreate(), SNESSetUp(), SNESSolve()
2810 @*/
2811 PetscErrorCode  SNESReset(SNES snes)
2812 {
2813   PetscErrorCode ierr;
2814 
2815   PetscFunctionBegin;
2816   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2817   if (snes->ops->userdestroy && snes->user) {
2818     ierr       = (*snes->ops->userdestroy)((void**)&snes->user);CHKERRQ(ierr);
2819     snes->user = NULL;
2820   }
2821   if (snes->npc) {
2822     ierr = SNESReset(snes->npc);CHKERRQ(ierr);
2823   }
2824 
2825   if (snes->ops->reset) {
2826     ierr = (*snes->ops->reset)(snes);CHKERRQ(ierr);
2827   }
2828   if (snes->ksp) {
2829     ierr = KSPReset(snes->ksp);CHKERRQ(ierr);
2830   }
2831 
2832   if (snes->linesearch) {
2833     ierr = SNESLineSearchReset(snes->linesearch);CHKERRQ(ierr);
2834   }
2835 
2836   ierr = VecDestroy(&snes->vec_rhs);CHKERRQ(ierr);
2837   ierr = VecDestroy(&snes->vec_sol);CHKERRQ(ierr);
2838   ierr = VecDestroy(&snes->vec_sol_update);CHKERRQ(ierr);
2839   ierr = VecDestroy(&snes->vec_func);CHKERRQ(ierr);
2840   ierr = MatDestroy(&snes->jacobian);CHKERRQ(ierr);
2841   ierr = MatDestroy(&snes->jacobian_pre);CHKERRQ(ierr);
2842   ierr = VecDestroyVecs(snes->nwork,&snes->work);CHKERRQ(ierr);
2843   ierr = VecDestroyVecs(snes->nvwork,&snes->vwork);CHKERRQ(ierr);
2844 
2845   snes->alwayscomputesfinalresidual = PETSC_FALSE;
2846 
2847   snes->nwork       = snes->nvwork = 0;
2848   snes->setupcalled = PETSC_FALSE;
2849   PetscFunctionReturn(0);
2850 }
2851 
2852 /*@
2853    SNESDestroy - Destroys the nonlinear solver context that was created
2854    with SNESCreate().
2855 
2856    Collective on SNES
2857 
2858    Input Parameter:
2859 .  snes - the SNES context
2860 
2861    Level: beginner
2862 
2863 .keywords: SNES, nonlinear, destroy
2864 
2865 .seealso: SNESCreate(), SNESSolve()
2866 @*/
2867 PetscErrorCode  SNESDestroy(SNES *snes)
2868 {
2869   PetscErrorCode ierr;
2870 
2871   PetscFunctionBegin;
2872   if (!*snes) PetscFunctionReturn(0);
2873   PetscValidHeaderSpecific((*snes),SNES_CLASSID,1);
2874   if (--((PetscObject)(*snes))->refct > 0) {*snes = 0; PetscFunctionReturn(0);}
2875 
2876   ierr = SNESReset((*snes));CHKERRQ(ierr);
2877   ierr = SNESDestroy(&(*snes)->npc);CHKERRQ(ierr);
2878 
2879   /* if memory was published with SAWs then destroy it */
2880   ierr = PetscObjectSAWsViewOff((PetscObject)*snes);CHKERRQ(ierr);
2881   if ((*snes)->ops->destroy) {ierr = (*((*snes))->ops->destroy)((*snes));CHKERRQ(ierr);}
2882 
2883   ierr = DMCoarsenHookRemove((*snes)->dm,DMCoarsenHook_SNESVecSol,DMRestrictHook_SNESVecSol,*snes);CHKERRQ(ierr);
2884   ierr = DMDestroy(&(*snes)->dm);CHKERRQ(ierr);
2885   ierr = KSPDestroy(&(*snes)->ksp);CHKERRQ(ierr);
2886   ierr = SNESLineSearchDestroy(&(*snes)->linesearch);CHKERRQ(ierr);
2887 
2888   ierr = PetscFree((*snes)->kspconvctx);CHKERRQ(ierr);
2889   if ((*snes)->ops->convergeddestroy) {
2890     ierr = (*(*snes)->ops->convergeddestroy)((*snes)->cnvP);CHKERRQ(ierr);
2891   }
2892   if ((*snes)->conv_malloc) {
2893     ierr = PetscFree((*snes)->conv_hist);CHKERRQ(ierr);
2894     ierr = PetscFree((*snes)->conv_hist_its);CHKERRQ(ierr);
2895   }
2896   ierr = SNESMonitorCancel((*snes));CHKERRQ(ierr);
2897   ierr = PetscHeaderDestroy(snes);CHKERRQ(ierr);
2898   PetscFunctionReturn(0);
2899 }
2900 
2901 /* ----------- Routines to set solver parameters ---------- */
2902 
2903 /*@
2904    SNESSetLagPreconditioner - Determines when the preconditioner is rebuilt in the nonlinear solve.
2905 
2906    Logically Collective on SNES
2907 
2908    Input Parameters:
2909 +  snes - the SNES context
2910 -  lag - -1 indicates NEVER rebuild, 1 means rebuild every time the Jacobian is computed within a single nonlinear solve, 2 means every second time
2911          the Jacobian is built etc. -2 indicates rebuild preconditioner at next chance but then never rebuild after that
2912 
2913    Options Database Keys:
2914 .    -snes_lag_preconditioner <lag>
2915 
2916    Notes:
2917    The default is 1
2918    The preconditioner is ALWAYS built in the first iteration of a nonlinear solve unless lag is -1
2919    If  -1 is used before the very first nonlinear solve the preconditioner is still built because there is no previous preconditioner to use
2920 
2921    Level: intermediate
2922 
2923 .keywords: SNES, nonlinear, set, convergence, tolerances
2924 
2925 .seealso: SNESSetTrustRegionTolerance(), SNESGetLagPreconditioner(), SNESSetLagJacobian(), SNESGetLagJacobian()
2926 
2927 @*/
2928 PetscErrorCode  SNESSetLagPreconditioner(SNES snes,PetscInt lag)
2929 {
2930   PetscFunctionBegin;
2931   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2932   if (lag < -2) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Lag must be -2, -1, 1 or greater");
2933   if (!lag) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Lag cannot be 0");
2934   PetscValidLogicalCollectiveInt(snes,lag,2);
2935   snes->lagpreconditioner = lag;
2936   PetscFunctionReturn(0);
2937 }
2938 
2939 /*@
2940    SNESSetGridSequence - sets the number of steps of grid sequencing that SNES does
2941 
2942    Logically Collective on SNES
2943 
2944    Input Parameters:
2945 +  snes - the SNES context
2946 -  steps - the number of refinements to do, defaults to 0
2947 
2948    Options Database Keys:
2949 .    -snes_grid_sequence <steps>
2950 
2951    Level: intermediate
2952 
2953    Notes:
2954    Use SNESGetSolution() to extract the fine grid solution after grid sequencing.
2955 
2956 .keywords: SNES, nonlinear, set, convergence, tolerances
2957 
2958 .seealso: SNESSetTrustRegionTolerance(), SNESGetLagPreconditioner(), SNESSetLagJacobian(), SNESGetLagJacobian(), SNESGetGridSequence()
2959 
2960 @*/
2961 PetscErrorCode  SNESSetGridSequence(SNES snes,PetscInt steps)
2962 {
2963   PetscFunctionBegin;
2964   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2965   PetscValidLogicalCollectiveInt(snes,steps,2);
2966   snes->gridsequence = steps;
2967   PetscFunctionReturn(0);
2968 }
2969 
2970 /*@
2971    SNESGetGridSequence - gets the number of steps of grid sequencing that SNES does
2972 
2973    Logically Collective on SNES
2974 
2975    Input Parameter:
2976 .  snes - the SNES context
2977 
2978    Output Parameter:
2979 .  steps - the number of refinements to do, defaults to 0
2980 
2981    Options Database Keys:
2982 .    -snes_grid_sequence <steps>
2983 
2984    Level: intermediate
2985 
2986    Notes:
2987    Use SNESGetSolution() to extract the fine grid solution after grid sequencing.
2988 
2989 .keywords: SNES, nonlinear, set, convergence, tolerances
2990 
2991 .seealso: SNESSetTrustRegionTolerance(), SNESGetLagPreconditioner(), SNESSetLagJacobian(), SNESGetLagJacobian(), SNESSetGridSequence()
2992 
2993 @*/
2994 PetscErrorCode  SNESGetGridSequence(SNES snes,PetscInt *steps)
2995 {
2996   PetscFunctionBegin;
2997   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2998   *steps = snes->gridsequence;
2999   PetscFunctionReturn(0);
3000 }
3001 
3002 /*@
3003    SNESGetLagPreconditioner - Indicates how often the preconditioner is rebuilt
3004 
3005    Not Collective
3006 
3007    Input Parameter:
3008 .  snes - the SNES context
3009 
3010    Output Parameter:
3011 .   lag - -1 indicates NEVER rebuild, 1 means rebuild every time the Jacobian is computed within a single nonlinear solve, 2 means every second time
3012          the Jacobian is built etc. -2 indicates rebuild preconditioner at next chance but then never rebuild after that
3013 
3014    Options Database Keys:
3015 .    -snes_lag_preconditioner <lag>
3016 
3017    Notes:
3018    The default is 1
3019    The preconditioner is ALWAYS built in the first iteration of a nonlinear solve unless lag is -1
3020 
3021    Level: intermediate
3022 
3023 .keywords: SNES, nonlinear, set, convergence, tolerances
3024 
3025 .seealso: SNESSetTrustRegionTolerance(), SNESSetLagPreconditioner()
3026 
3027 @*/
3028 PetscErrorCode  SNESGetLagPreconditioner(SNES snes,PetscInt *lag)
3029 {
3030   PetscFunctionBegin;
3031   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3032   *lag = snes->lagpreconditioner;
3033   PetscFunctionReturn(0);
3034 }
3035 
3036 /*@
3037    SNESSetLagJacobian - Determines when the Jacobian is rebuilt in the nonlinear solve. See SNESSetLagPreconditioner() for determining how
3038      often the preconditioner is rebuilt.
3039 
3040    Logically Collective on SNES
3041 
3042    Input Parameters:
3043 +  snes - the SNES context
3044 -  lag - -1 indicates NEVER rebuild, 1 means rebuild every time the Jacobian is computed within a single nonlinear solve, 2 means every second time
3045          the Jacobian is built etc. -2 means rebuild at next chance but then never again
3046 
3047    Options Database Keys:
3048 .    -snes_lag_jacobian <lag>
3049 
3050    Notes:
3051    The default is 1
3052    The Jacobian is ALWAYS built in the first iteration of a nonlinear solve unless lag is -1
3053    If  -1 is used before the very first nonlinear solve the CODE WILL FAIL! because no Jacobian is used, use -2 to indicate you want it recomputed
3054    at the next Newton step but never again (unless it is reset to another value)
3055 
3056    Level: intermediate
3057 
3058 .keywords: SNES, nonlinear, set, convergence, tolerances
3059 
3060 .seealso: SNESSetTrustRegionTolerance(), SNESGetLagPreconditioner(), SNESSetLagPreconditioner(), SNESGetLagJacobian()
3061 
3062 @*/
3063 PetscErrorCode  SNESSetLagJacobian(SNES snes,PetscInt lag)
3064 {
3065   PetscFunctionBegin;
3066   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3067   if (lag < -2) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Lag must be -2, -1, 1 or greater");
3068   if (!lag) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Lag cannot be 0");
3069   PetscValidLogicalCollectiveInt(snes,lag,2);
3070   snes->lagjacobian = lag;
3071   PetscFunctionReturn(0);
3072 }
3073 
3074 /*@
3075    SNESGetLagJacobian - Indicates how often the Jacobian is rebuilt. See SNESGetLagPreconditioner() to determine when the preconditioner is rebuilt
3076 
3077    Not Collective
3078 
3079    Input Parameter:
3080 .  snes - the SNES context
3081 
3082    Output Parameter:
3083 .   lag - -1 indicates NEVER rebuild, 1 means rebuild every time the Jacobian is computed within a single nonlinear solve, 2 means every second time
3084          the Jacobian is built etc.
3085 
3086    Options Database Keys:
3087 .    -snes_lag_jacobian <lag>
3088 
3089    Notes:
3090    The default is 1
3091    The jacobian is ALWAYS built in the first iteration of a nonlinear solve unless lag is -1
3092 
3093    Level: intermediate
3094 
3095 .keywords: SNES, nonlinear, set, convergence, tolerances
3096 
3097 .seealso: SNESSetTrustRegionTolerance(), SNESSetLagJacobian(), SNESSetLagPreconditioner(), SNESGetLagPreconditioner()
3098 
3099 @*/
3100 PetscErrorCode  SNESGetLagJacobian(SNES snes,PetscInt *lag)
3101 {
3102   PetscFunctionBegin;
3103   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3104   *lag = snes->lagjacobian;
3105   PetscFunctionReturn(0);
3106 }
3107 
3108 /*@
3109    SNESSetLagJacobianPersists - Set whether or not the Jacobian lagging persists through multiple solves
3110 
3111    Logically collective on SNES
3112 
3113    Input Parameter:
3114 +  snes - the SNES context
3115 -   flg - jacobian lagging persists if true
3116 
3117    Options Database Keys:
3118 .    -snes_lag_jacobian_persists <flg>
3119 
3120    Notes: This is useful both for nonlinear preconditioning, where it's appropriate to have the Jacobian be stale by
3121    several solves, and for implicit time-stepping, where Jacobian lagging in the inner nonlinear solve over several
3122    timesteps may present huge efficiency gains.
3123 
3124    Level: developer
3125 
3126 .keywords: SNES, nonlinear, lag
3127 
3128 .seealso: SNESSetLagPreconditionerPersists(), SNESSetLagJacobian(), SNESGetLagJacobian(), SNESGetNPC()
3129 
3130 @*/
3131 PetscErrorCode  SNESSetLagJacobianPersists(SNES snes,PetscBool flg)
3132 {
3133   PetscFunctionBegin;
3134   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3135   PetscValidLogicalCollectiveBool(snes,flg,2);
3136   snes->lagjac_persist = flg;
3137   PetscFunctionReturn(0);
3138 }
3139 
3140 /*@
3141    SNESSetLagPreconditionerPersists - Set whether or not the preconditioner lagging persists through multiple solves
3142 
3143    Logically Collective on SNES
3144 
3145    Input Parameter:
3146 +  snes - the SNES context
3147 -   flg - preconditioner lagging persists if true
3148 
3149    Options Database Keys:
3150 .    -snes_lag_jacobian_persists <flg>
3151 
3152    Notes: This is useful both for nonlinear preconditioning, where it's appropriate to have the preconditioner be stale
3153    by several solves, and for implicit time-stepping, where preconditioner lagging in the inner nonlinear solve over
3154    several timesteps may present huge efficiency gains.
3155 
3156    Level: developer
3157 
3158 .keywords: SNES, nonlinear, lag
3159 
3160 .seealso: SNESSetLagJacobianPersists(), SNESSetLagJacobian(), SNESGetLagJacobian(), SNESGetNPC()
3161 
3162 @*/
3163 PetscErrorCode  SNESSetLagPreconditionerPersists(SNES snes,PetscBool flg)
3164 {
3165   PetscFunctionBegin;
3166   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3167   PetscValidLogicalCollectiveBool(snes,flg,2);
3168   snes->lagpre_persist = flg;
3169   PetscFunctionReturn(0);
3170 }
3171 
3172 /*@
3173    SNESSetForceIteration - force SNESSolve() to take at least one iteration regardless of the initial residual norm
3174 
3175    Logically Collective on SNES
3176 
3177    Input Parameters:
3178 +  snes - the SNES context
3179 -  force - PETSC_TRUE require at least one iteration
3180 
3181    Options Database Keys:
3182 .    -snes_force_iteration <force> - Sets forcing an iteration
3183 
3184    Notes:
3185    This is used sometimes with TS to prevent TS from detecting a false steady state solution
3186 
3187    Level: intermediate
3188 
3189 .keywords: SNES, nonlinear, set, convergence, tolerances
3190 
3191 .seealso: SNESSetTrustRegionTolerance(), SNESSetDivergenceTolerance()
3192 @*/
3193 PetscErrorCode  SNESSetForceIteration(SNES snes,PetscBool force)
3194 {
3195   PetscFunctionBegin;
3196   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3197   snes->forceiteration = force;
3198   PetscFunctionReturn(0);
3199 }
3200 
3201 
3202 /*@
3203    SNESSetTolerances - Sets various parameters used in convergence tests.
3204 
3205    Logically Collective on SNES
3206 
3207    Input Parameters:
3208 +  snes - the SNES context
3209 .  abstol - absolute convergence tolerance
3210 .  rtol - relative convergence tolerance
3211 .  stol -  convergence tolerance in terms of the norm of the change in the solution between steps,  || delta x || < stol*|| x ||
3212 .  maxit - maximum number of iterations
3213 -  maxf - maximum number of function evaluations
3214 
3215    Options Database Keys:
3216 +    -snes_atol <abstol> - Sets abstol
3217 .    -snes_rtol <rtol> - Sets rtol
3218 .    -snes_stol <stol> - Sets stol
3219 .    -snes_max_it <maxit> - Sets maxit
3220 -    -snes_max_funcs <maxf> - Sets maxf
3221 
3222    Notes:
3223    The default maximum number of iterations is 50.
3224    The default maximum number of function evaluations is 1000.
3225 
3226    Level: intermediate
3227 
3228 .keywords: SNES, nonlinear, set, convergence, tolerances
3229 
3230 .seealso: SNESSetTrustRegionTolerance(), SNESSetDivergenceTolerance(), SNESSetForceIteration()
3231 @*/
3232 PetscErrorCode  SNESSetTolerances(SNES snes,PetscReal abstol,PetscReal rtol,PetscReal stol,PetscInt maxit,PetscInt maxf)
3233 {
3234   PetscFunctionBegin;
3235   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3236   PetscValidLogicalCollectiveReal(snes,abstol,2);
3237   PetscValidLogicalCollectiveReal(snes,rtol,3);
3238   PetscValidLogicalCollectiveReal(snes,stol,4);
3239   PetscValidLogicalCollectiveInt(snes,maxit,5);
3240   PetscValidLogicalCollectiveInt(snes,maxf,6);
3241 
3242   if (abstol != PETSC_DEFAULT) {
3243     if (abstol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)snes),PETSC_ERR_ARG_OUTOFRANGE,"Absolute tolerance %g must be non-negative",(double)abstol);
3244     snes->abstol = abstol;
3245   }
3246   if (rtol != PETSC_DEFAULT) {
3247     if (rtol < 0.0 || 1.0 <= rtol) SETERRQ1(PetscObjectComm((PetscObject)snes),PETSC_ERR_ARG_OUTOFRANGE,"Relative tolerance %g must be non-negative and less than 1.0",(double)rtol);
3248     snes->rtol = rtol;
3249   }
3250   if (stol != PETSC_DEFAULT) {
3251     if (stol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)snes),PETSC_ERR_ARG_OUTOFRANGE,"Step tolerance %g must be non-negative",(double)stol);
3252     snes->stol = stol;
3253   }
3254   if (maxit != PETSC_DEFAULT) {
3255     if (maxit < 0) SETERRQ1(PetscObjectComm((PetscObject)snes),PETSC_ERR_ARG_OUTOFRANGE,"Maximum number of iterations %D must be non-negative",maxit);
3256     snes->max_its = maxit;
3257   }
3258   if (maxf != PETSC_DEFAULT) {
3259     if (maxf < 0) SETERRQ1(PetscObjectComm((PetscObject)snes),PETSC_ERR_ARG_OUTOFRANGE,"Maximum number of function evaluations %D must be non-negative",maxf);
3260     snes->max_funcs = maxf;
3261   }
3262   snes->tolerancesset = PETSC_TRUE;
3263   PetscFunctionReturn(0);
3264 }
3265 
3266 /*@
3267    SNESSetDivergenceTolerance - Sets the divergence tolerance used for the SNES divergence test.
3268 
3269    Logically Collective on SNES
3270 
3271    Input Parameters:
3272 +  snes - the SNES context
3273 -  divtol - the divergence tolerance. Use -1 to deactivate the test.
3274 
3275    Options Database Keys:
3276 +    -snes_divergence_tolerance <divtol> - Sets divtol
3277 
3278    Notes:
3279    The default divergence tolerance is 1e4.
3280 
3281    Level: intermediate
3282 
3283 .keywords: SNES, nonlinear, set, divergence, tolerance
3284 
3285 .seealso: SNESSetTolerances(), SNESGetDivergenceTolerance
3286 @*/
3287 PetscErrorCode  SNESSetDivergenceTolerance(SNES snes,PetscReal divtol)
3288 {
3289   PetscFunctionBegin;
3290   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3291   PetscValidLogicalCollectiveReal(snes,divtol,2);
3292 
3293   if (divtol != PETSC_DEFAULT) {
3294     snes->divtol = divtol;
3295   }
3296   else {
3297     snes->divtol = 1.0e4;
3298   }
3299   PetscFunctionReturn(0);
3300 }
3301 
3302 /*@
3303    SNESGetTolerances - Gets various parameters used in convergence tests.
3304 
3305    Not Collective
3306 
3307    Input Parameters:
3308 +  snes - the SNES context
3309 .  atol - absolute convergence tolerance
3310 .  rtol - relative convergence tolerance
3311 .  stol -  convergence tolerance in terms of the norm
3312            of the change in the solution between steps
3313 .  maxit - maximum number of iterations
3314 -  maxf - maximum number of function evaluations
3315 
3316    Notes:
3317    The user can specify NULL for any parameter that is not needed.
3318 
3319    Level: intermediate
3320 
3321 .keywords: SNES, nonlinear, get, convergence, tolerances
3322 
3323 .seealso: SNESSetTolerances()
3324 @*/
3325 PetscErrorCode  SNESGetTolerances(SNES snes,PetscReal *atol,PetscReal *rtol,PetscReal *stol,PetscInt *maxit,PetscInt *maxf)
3326 {
3327   PetscFunctionBegin;
3328   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3329   if (atol)  *atol  = snes->abstol;
3330   if (rtol)  *rtol  = snes->rtol;
3331   if (stol)  *stol  = snes->stol;
3332   if (maxit) *maxit = snes->max_its;
3333   if (maxf)  *maxf  = snes->max_funcs;
3334   PetscFunctionReturn(0);
3335 }
3336 
3337 /*@
3338    SNESGetDivergenceTolerance - Gets divergence tolerance used in divergence test.
3339 
3340    Not Collective
3341 
3342    Input Parameters:
3343 +  snes - the SNES context
3344 -  divtol - divergence tolerance
3345 
3346    Level: intermediate
3347 
3348 .keywords: SNES, nonlinear, get, divergence, tolerance
3349 
3350 .seealso: SNESSetDivergenceTolerance()
3351 @*/
3352 PetscErrorCode  SNESGetDivergenceTolerance(SNES snes,PetscReal *divtol)
3353 {
3354   PetscFunctionBegin;
3355   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3356   if (divtol) *divtol = snes->divtol;
3357   PetscFunctionReturn(0);
3358 }
3359 
3360 /*@
3361    SNESSetTrustRegionTolerance - Sets the trust region parameter tolerance.
3362 
3363    Logically Collective on SNES
3364 
3365    Input Parameters:
3366 +  snes - the SNES context
3367 -  tol - tolerance
3368 
3369    Options Database Key:
3370 .  -snes_trtol <tol> - Sets tol
3371 
3372    Level: intermediate
3373 
3374 .keywords: SNES, nonlinear, set, trust region, tolerance
3375 
3376 .seealso: SNESSetTolerances()
3377 @*/
3378 PetscErrorCode  SNESSetTrustRegionTolerance(SNES snes,PetscReal tol)
3379 {
3380   PetscFunctionBegin;
3381   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3382   PetscValidLogicalCollectiveReal(snes,tol,2);
3383   snes->deltatol = tol;
3384   PetscFunctionReturn(0);
3385 }
3386 
3387 /*
3388    Duplicate the lg monitors for SNES from KSP; for some reason with
3389    dynamic libraries things don't work under Sun4 if we just use
3390    macros instead of functions
3391 */
3392 PetscErrorCode  SNESMonitorLGResidualNorm(SNES snes,PetscInt it,PetscReal norm,void *ctx)
3393 {
3394   PetscErrorCode ierr;
3395 
3396   PetscFunctionBegin;
3397   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3398   ierr = KSPMonitorLGResidualNorm((KSP)snes,it,norm,ctx);CHKERRQ(ierr);
3399   PetscFunctionReturn(0);
3400 }
3401 
3402 PetscErrorCode  SNESMonitorLGCreate(MPI_Comm comm,const char host[],const char label[],int x,int y,int m,int n,PetscDrawLG *lgctx)
3403 {
3404   PetscErrorCode ierr;
3405 
3406   PetscFunctionBegin;
3407   ierr = KSPMonitorLGResidualNormCreate(comm,host,label,x,y,m,n,lgctx);CHKERRQ(ierr);
3408   PetscFunctionReturn(0);
3409 }
3410 
3411 PETSC_INTERN PetscErrorCode  SNESMonitorRange_Private(SNES,PetscInt,PetscReal*);
3412 
3413 PetscErrorCode  SNESMonitorLGRange(SNES snes,PetscInt n,PetscReal rnorm,void *monctx)
3414 {
3415   PetscDrawLG      lg;
3416   PetscErrorCode   ierr;
3417   PetscReal        x,y,per;
3418   PetscViewer      v = (PetscViewer)monctx;
3419   static PetscReal prev; /* should be in the context */
3420   PetscDraw        draw;
3421 
3422   PetscFunctionBegin;
3423   PetscValidHeaderSpecific(v,PETSC_VIEWER_CLASSID,4);
3424   ierr = PetscViewerDrawGetDrawLG(v,0,&lg);CHKERRQ(ierr);
3425   if (!n) {ierr = PetscDrawLGReset(lg);CHKERRQ(ierr);}
3426   ierr = PetscDrawLGGetDraw(lg,&draw);CHKERRQ(ierr);
3427   ierr = PetscDrawSetTitle(draw,"Residual norm");CHKERRQ(ierr);
3428   x    = (PetscReal)n;
3429   if (rnorm > 0.0) y = PetscLog10Real(rnorm);
3430   else y = -15.0;
3431   ierr = PetscDrawLGAddPoint(lg,&x,&y);CHKERRQ(ierr);
3432   if (n < 20 || !(n % 5) || snes->reason) {
3433     ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr);
3434     ierr = PetscDrawLGSave(lg);CHKERRQ(ierr);
3435   }
3436 
3437   ierr = PetscViewerDrawGetDrawLG(v,1,&lg);CHKERRQ(ierr);
3438   if (!n) {ierr = PetscDrawLGReset(lg);CHKERRQ(ierr);}
3439   ierr = PetscDrawLGGetDraw(lg,&draw);CHKERRQ(ierr);
3440   ierr = PetscDrawSetTitle(draw,"% elemts > .2*max elemt");CHKERRQ(ierr);
3441   ierr =  SNESMonitorRange_Private(snes,n,&per);CHKERRQ(ierr);
3442   x    = (PetscReal)n;
3443   y    = 100.0*per;
3444   ierr = PetscDrawLGAddPoint(lg,&x,&y);CHKERRQ(ierr);
3445   if (n < 20 || !(n % 5) || snes->reason) {
3446     ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr);
3447     ierr = PetscDrawLGSave(lg);CHKERRQ(ierr);
3448   }
3449 
3450   ierr = PetscViewerDrawGetDrawLG(v,2,&lg);CHKERRQ(ierr);
3451   if (!n) {prev = rnorm;ierr = PetscDrawLGReset(lg);CHKERRQ(ierr);}
3452   ierr = PetscDrawLGGetDraw(lg,&draw);CHKERRQ(ierr);
3453   ierr = PetscDrawSetTitle(draw,"(norm -oldnorm)/oldnorm");CHKERRQ(ierr);
3454   x    = (PetscReal)n;
3455   y    = (prev - rnorm)/prev;
3456   ierr = PetscDrawLGAddPoint(lg,&x,&y);CHKERRQ(ierr);
3457   if (n < 20 || !(n % 5) || snes->reason) {
3458     ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr);
3459     ierr = PetscDrawLGSave(lg);CHKERRQ(ierr);
3460   }
3461 
3462   ierr = PetscViewerDrawGetDrawLG(v,3,&lg);CHKERRQ(ierr);
3463   if (!n) {ierr = PetscDrawLGReset(lg);CHKERRQ(ierr);}
3464   ierr = PetscDrawLGGetDraw(lg,&draw);CHKERRQ(ierr);
3465   ierr = PetscDrawSetTitle(draw,"(norm -oldnorm)/oldnorm*(% > .2 max)");CHKERRQ(ierr);
3466   x    = (PetscReal)n;
3467   y    = (prev - rnorm)/(prev*per);
3468   if (n > 2) { /*skip initial crazy value */
3469     ierr = PetscDrawLGAddPoint(lg,&x,&y);CHKERRQ(ierr);
3470   }
3471   if (n < 20 || !(n % 5) || snes->reason) {
3472     ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr);
3473     ierr = PetscDrawLGSave(lg);CHKERRQ(ierr);
3474   }
3475   prev = rnorm;
3476   PetscFunctionReturn(0);
3477 }
3478 
3479 /*@
3480    SNESMonitor - runs the user provided monitor routines, if they exist
3481 
3482    Collective on SNES
3483 
3484    Input Parameters:
3485 +  snes - nonlinear solver context obtained from SNESCreate()
3486 .  iter - iteration number
3487 -  rnorm - relative norm of the residual
3488 
3489    Notes:
3490    This routine is called by the SNES implementations.
3491    It does not typically need to be called by the user.
3492 
3493    Level: developer
3494 
3495 .seealso: SNESMonitorSet()
3496 @*/
3497 PetscErrorCode  SNESMonitor(SNES snes,PetscInt iter,PetscReal rnorm)
3498 {
3499   PetscErrorCode ierr;
3500   PetscInt       i,n = snes->numbermonitors;
3501 
3502   PetscFunctionBegin;
3503   ierr = VecLockPush(snes->vec_sol);CHKERRQ(ierr);
3504   for (i=0; i<n; i++) {
3505     ierr = (*snes->monitor[i])(snes,iter,rnorm,snes->monitorcontext[i]);CHKERRQ(ierr);
3506   }
3507   ierr = VecLockPop(snes->vec_sol);CHKERRQ(ierr);
3508   PetscFunctionReturn(0);
3509 }
3510 
3511 /* ------------ Routines to set performance monitoring options ----------- */
3512 
3513 /*MC
3514     SNESMonitorFunction - functional form passed to SNESMonitorSet() to monitor convergence of nonlinear solver
3515 
3516      Synopsis:
3517      #include <petscsnes.h>
3518 $    PetscErrorCode SNESMonitorFunction(SNES snes,PetscInt its, PetscReal norm,void *mctx)
3519 
3520 +    snes - the SNES context
3521 .    its - iteration number
3522 .    norm - 2-norm function value (may be estimated)
3523 -    mctx - [optional] monitoring context
3524 
3525    Level: advanced
3526 
3527 .seealso:   SNESMonitorSet(), SNESMonitorGet()
3528 M*/
3529 
3530 /*@C
3531    SNESMonitorSet - Sets an ADDITIONAL function that is to be used at every
3532    iteration of the nonlinear solver to display the iteration's
3533    progress.
3534 
3535    Logically Collective on SNES
3536 
3537    Input Parameters:
3538 +  snes - the SNES context
3539 .  f - the monitor function, see SNESMonitorFunction for the calling sequence
3540 .  mctx - [optional] user-defined context for private data for the
3541           monitor routine (use NULL if no context is desired)
3542 -  monitordestroy - [optional] routine that frees monitor context
3543           (may be NULL)
3544 
3545    Options Database Keys:
3546 +    -snes_monitor        - sets SNESMonitorDefault()
3547 .    -snes_monitor_lg_residualnorm    - sets line graph monitor,
3548                             uses SNESMonitorLGCreate()
3549 -    -snes_monitor_cancel - cancels all monitors that have
3550                             been hardwired into a code by
3551                             calls to SNESMonitorSet(), but
3552                             does not cancel those set via
3553                             the options database.
3554 
3555    Notes:
3556    Several different monitoring routines may be set by calling
3557    SNESMonitorSet() multiple times; all will be called in the
3558    order in which they were set.
3559 
3560    Fortran notes: Only a single monitor function can be set for each SNES object
3561 
3562    Level: intermediate
3563 
3564 .keywords: SNES, nonlinear, set, monitor
3565 
3566 .seealso: SNESMonitorDefault(), SNESMonitorCancel(), SNESMonitorFunction
3567 @*/
3568 PetscErrorCode  SNESMonitorSet(SNES snes,PetscErrorCode (*f)(SNES,PetscInt,PetscReal,void*),void *mctx,PetscErrorCode (*monitordestroy)(void**))
3569 {
3570   PetscInt       i;
3571   PetscErrorCode ierr;
3572   PetscBool      identical;
3573 
3574   PetscFunctionBegin;
3575   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3576   for (i=0; i<snes->numbermonitors;i++) {
3577     ierr = PetscMonitorCompare((PetscErrorCode (*)(void))f,mctx,monitordestroy,(PetscErrorCode (*)(void))snes->monitor[i],snes->monitorcontext[i],snes->monitordestroy[i],&identical);CHKERRQ(ierr);
3578     if (identical) PetscFunctionReturn(0);
3579   }
3580   if (snes->numbermonitors >= MAXSNESMONITORS) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Too many monitors set");
3581   snes->monitor[snes->numbermonitors]          = f;
3582   snes->monitordestroy[snes->numbermonitors]   = monitordestroy;
3583   snes->monitorcontext[snes->numbermonitors++] = (void*)mctx;
3584   PetscFunctionReturn(0);
3585 }
3586 
3587 /*@
3588    SNESMonitorCancel - Clears all the monitor functions for a SNES object.
3589 
3590    Logically Collective on SNES
3591 
3592    Input Parameters:
3593 .  snes - the SNES context
3594 
3595    Options Database Key:
3596 .  -snes_monitor_cancel - cancels all monitors that have been hardwired
3597     into a code by calls to SNESMonitorSet(), but does not cancel those
3598     set via the options database
3599 
3600    Notes:
3601    There is no way to clear one specific monitor from a SNES object.
3602 
3603    Level: intermediate
3604 
3605 .keywords: SNES, nonlinear, set, monitor
3606 
3607 .seealso: SNESMonitorDefault(), SNESMonitorSet()
3608 @*/
3609 PetscErrorCode  SNESMonitorCancel(SNES snes)
3610 {
3611   PetscErrorCode ierr;
3612   PetscInt       i;
3613 
3614   PetscFunctionBegin;
3615   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3616   for (i=0; i<snes->numbermonitors; i++) {
3617     if (snes->monitordestroy[i]) {
3618       ierr = (*snes->monitordestroy[i])(&snes->monitorcontext[i]);CHKERRQ(ierr);
3619     }
3620   }
3621   snes->numbermonitors = 0;
3622   PetscFunctionReturn(0);
3623 }
3624 
3625 /*MC
3626     SNESConvergenceTestFunction - functional form used for testing of convergence of nonlinear solver
3627 
3628      Synopsis:
3629      #include <petscsnes.h>
3630 $     PetscErrorCode SNESConvergenceTest(SNES snes,PetscInt it,PetscReal xnorm,PetscReal gnorm,PetscReal f,SNESConvergedReason *reason,void *cctx)
3631 
3632 +    snes - the SNES context
3633 .    it - current iteration (0 is the first and is before any Newton step)
3634 .    cctx - [optional] convergence context
3635 .    reason - reason for convergence/divergence
3636 .    xnorm - 2-norm of current iterate
3637 .    gnorm - 2-norm of current step
3638 -    f - 2-norm of function
3639 
3640    Level: intermediate
3641 
3642 .seealso:   SNESSetConvergenceTest(), SNESGetConvergenceTest()
3643 M*/
3644 
3645 /*@C
3646    SNESSetConvergenceTest - Sets the function that is to be used
3647    to test for convergence of the nonlinear iterative solution.
3648 
3649    Logically Collective on SNES
3650 
3651    Input Parameters:
3652 +  snes - the SNES context
3653 .  SNESConvergenceTestFunction - routine to test for convergence
3654 .  cctx - [optional] context for private data for the convergence routine  (may be NULL)
3655 -  destroy - [optional] destructor for the context (may be NULL; NULL_FUNCTION in Fortran)
3656 
3657    Level: advanced
3658 
3659 .keywords: SNES, nonlinear, set, convergence, test
3660 
3661 .seealso: SNESConvergedDefault(), SNESConvergedSkip(), SNESConvergenceTestFunction
3662 @*/
3663 PetscErrorCode  SNESSetConvergenceTest(SNES snes,PetscErrorCode (*SNESConvergenceTestFunction)(SNES,PetscInt,PetscReal,PetscReal,PetscReal,SNESConvergedReason*,void*),void *cctx,PetscErrorCode (*destroy)(void*))
3664 {
3665   PetscErrorCode ierr;
3666 
3667   PetscFunctionBegin;
3668   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3669   if (!SNESConvergenceTestFunction) SNESConvergenceTestFunction = SNESConvergedSkip;
3670   if (snes->ops->convergeddestroy) {
3671     ierr = (*snes->ops->convergeddestroy)(snes->cnvP);CHKERRQ(ierr);
3672   }
3673   snes->ops->converged        = SNESConvergenceTestFunction;
3674   snes->ops->convergeddestroy = destroy;
3675   snes->cnvP                  = cctx;
3676   PetscFunctionReturn(0);
3677 }
3678 
3679 /*@
3680    SNESGetConvergedReason - Gets the reason the SNES iteration was stopped.
3681 
3682    Not Collective
3683 
3684    Input Parameter:
3685 .  snes - the SNES context
3686 
3687    Output Parameter:
3688 .  reason - negative value indicates diverged, positive value converged, see SNESConvergedReason or the
3689             manual pages for the individual convergence tests for complete lists
3690 
3691    Options Database:
3692 .   -snes_converged_reason - prints the reason to standard out
3693 
3694    Level: intermediate
3695 
3696    Notes: Should only be called after the call the SNESSolve() is complete, if it is called earlier it returns the value SNES__CONVERGED_ITERATING.
3697 
3698 .keywords: SNES, nonlinear, set, convergence, test
3699 
3700 .seealso: SNESSetConvergenceTest(), SNESSetConvergedReason(), SNESConvergedReason
3701 @*/
3702 PetscErrorCode SNESGetConvergedReason(SNES snes,SNESConvergedReason *reason)
3703 {
3704   PetscFunctionBegin;
3705   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3706   PetscValidPointer(reason,2);
3707   *reason = snes->reason;
3708   PetscFunctionReturn(0);
3709 }
3710 
3711 /*@
3712    SNESSetConvergedReason - Sets the reason the SNES iteration was stopped.
3713 
3714    Not Collective
3715 
3716    Input Parameters:
3717 +  snes - the SNES context
3718 -  reason - negative value indicates diverged, positive value converged, see SNESConvergedReason or the
3719             manual pages for the individual convergence tests for complete lists
3720 
3721    Level: intermediate
3722 
3723 .keywords: SNES, nonlinear, set, convergence, test
3724 .seealso: SNESGetConvergedReason(), SNESSetConvergenceTest(), SNESConvergedReason
3725 @*/
3726 PetscErrorCode SNESSetConvergedReason(SNES snes,SNESConvergedReason reason)
3727 {
3728   PetscFunctionBegin;
3729   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3730   snes->reason = reason;
3731   PetscFunctionReturn(0);
3732 }
3733 
3734 /*@
3735    SNESSetConvergenceHistory - Sets the array used to hold the convergence history.
3736 
3737    Logically Collective on SNES
3738 
3739    Input Parameters:
3740 +  snes - iterative context obtained from SNESCreate()
3741 .  a   - array to hold history, this array will contain the function norms computed at each step
3742 .  its - integer array holds the number of linear iterations for each solve.
3743 .  na  - size of a and its
3744 -  reset - PETSC_TRUE indicates each new nonlinear solve resets the history counter to zero,
3745            else it continues storing new values for new nonlinear solves after the old ones
3746 
3747    Notes:
3748    If 'a' and 'its' are NULL then space is allocated for the history. If 'na' PETSC_DECIDE or PETSC_DEFAULT then a
3749    default array of length 10000 is allocated.
3750 
3751    This routine is useful, e.g., when running a code for purposes
3752    of accurate performance monitoring, when no I/O should be done
3753    during the section of code that is being timed.
3754 
3755    Level: intermediate
3756 
3757 .keywords: SNES, set, convergence, history
3758 
3759 .seealso: SNESGetConvergenceHistory()
3760 
3761 @*/
3762 PetscErrorCode  SNESSetConvergenceHistory(SNES snes,PetscReal a[],PetscInt its[],PetscInt na,PetscBool reset)
3763 {
3764   PetscErrorCode ierr;
3765 
3766   PetscFunctionBegin;
3767   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3768   if (a) PetscValidScalarPointer(a,2);
3769   if (its) PetscValidIntPointer(its,3);
3770   if (!a) {
3771     if (na == PETSC_DECIDE || na == PETSC_DEFAULT) na = 1000;
3772     ierr = PetscCalloc1(na,&a);CHKERRQ(ierr);
3773     ierr = PetscCalloc1(na,&its);CHKERRQ(ierr);
3774 
3775     snes->conv_malloc = PETSC_TRUE;
3776   }
3777   snes->conv_hist       = a;
3778   snes->conv_hist_its   = its;
3779   snes->conv_hist_max   = na;
3780   snes->conv_hist_len   = 0;
3781   snes->conv_hist_reset = reset;
3782   PetscFunctionReturn(0);
3783 }
3784 
3785 #if defined(PETSC_HAVE_MATLAB_ENGINE)
3786 #include <engine.h>   /* MATLAB include file */
3787 #include <mex.h>      /* MATLAB include file */
3788 
3789 PETSC_EXTERN mxArray *SNESGetConvergenceHistoryMatlab(SNES snes)
3790 {
3791   mxArray   *mat;
3792   PetscInt  i;
3793   PetscReal *ar;
3794 
3795   PetscFunctionBegin;
3796   mat = mxCreateDoubleMatrix(snes->conv_hist_len,1,mxREAL);
3797   ar  = (PetscReal*) mxGetData(mat);
3798   for (i=0; i<snes->conv_hist_len; i++) ar[i] = snes->conv_hist[i];
3799   PetscFunctionReturn(mat);
3800 }
3801 #endif
3802 
3803 /*@C
3804    SNESGetConvergenceHistory - Gets the array used to hold the convergence history.
3805 
3806    Not Collective
3807 
3808    Input Parameter:
3809 .  snes - iterative context obtained from SNESCreate()
3810 
3811    Output Parameters:
3812 .  a   - array to hold history
3813 .  its - integer array holds the number of linear iterations (or
3814          negative if not converged) for each solve.
3815 -  na  - size of a and its
3816 
3817    Notes:
3818     The calling sequence for this routine in Fortran is
3819 $   call SNESGetConvergenceHistory(SNES snes, integer na, integer ierr)
3820 
3821    This routine is useful, e.g., when running a code for purposes
3822    of accurate performance monitoring, when no I/O should be done
3823    during the section of code that is being timed.
3824 
3825    Level: intermediate
3826 
3827 .keywords: SNES, get, convergence, history
3828 
3829 .seealso: SNESSetConvergencHistory()
3830 
3831 @*/
3832 PetscErrorCode  SNESGetConvergenceHistory(SNES snes,PetscReal *a[],PetscInt *its[],PetscInt *na)
3833 {
3834   PetscFunctionBegin;
3835   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3836   if (a)   *a   = snes->conv_hist;
3837   if (its) *its = snes->conv_hist_its;
3838   if (na)  *na  = snes->conv_hist_len;
3839   PetscFunctionReturn(0);
3840 }
3841 
3842 /*@C
3843   SNESSetUpdate - Sets the general-purpose update function called
3844   at the beginning of every iteration of the nonlinear solve. Specifically
3845   it is called just before the Jacobian is "evaluated".
3846 
3847   Logically Collective on SNES
3848 
3849   Input Parameters:
3850 . snes - The nonlinear solver context
3851 . func - The function
3852 
3853   Calling sequence of func:
3854 . func (SNES snes, PetscInt step);
3855 
3856 . step - The current step of the iteration
3857 
3858   Level: advanced
3859 
3860   Note: This is NOT what one uses to update the ghost points before a function evaluation, that should be done at the beginning of your FormFunction()
3861         This is not used by most users.
3862 
3863 .keywords: SNES, update
3864 
3865 .seealso SNESSetJacobian(), SNESSolve()
3866 @*/
3867 PetscErrorCode  SNESSetUpdate(SNES snes, PetscErrorCode (*func)(SNES, PetscInt))
3868 {
3869   PetscFunctionBegin;
3870   PetscValidHeaderSpecific(snes, SNES_CLASSID,1);
3871   snes->ops->update = func;
3872   PetscFunctionReturn(0);
3873 }
3874 
3875 /*
3876    SNESScaleStep_Private - Scales a step so that its length is less than the
3877    positive parameter delta.
3878 
3879     Input Parameters:
3880 +   snes - the SNES context
3881 .   y - approximate solution of linear system
3882 .   fnorm - 2-norm of current function
3883 -   delta - trust region size
3884 
3885     Output Parameters:
3886 +   gpnorm - predicted function norm at the new point, assuming local
3887     linearization.  The value is zero if the step lies within the trust
3888     region, and exceeds zero otherwise.
3889 -   ynorm - 2-norm of the step
3890 
3891     Note:
3892     For non-trust region methods such as SNESNEWTONLS, the parameter delta
3893     is set to be the maximum allowable step size.
3894 
3895 .keywords: SNES, nonlinear, scale, step
3896 */
3897 PetscErrorCode SNESScaleStep_Private(SNES snes,Vec y,PetscReal *fnorm,PetscReal *delta,PetscReal *gpnorm,PetscReal *ynorm)
3898 {
3899   PetscReal      nrm;
3900   PetscScalar    cnorm;
3901   PetscErrorCode ierr;
3902 
3903   PetscFunctionBegin;
3904   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3905   PetscValidHeaderSpecific(y,VEC_CLASSID,2);
3906   PetscCheckSameComm(snes,1,y,2);
3907 
3908   ierr = VecNorm(y,NORM_2,&nrm);CHKERRQ(ierr);
3909   if (nrm > *delta) {
3910     nrm     = *delta/nrm;
3911     *gpnorm = (1.0 - nrm)*(*fnorm);
3912     cnorm   = nrm;
3913     ierr    = VecScale(y,cnorm);CHKERRQ(ierr);
3914     *ynorm  = *delta;
3915   } else {
3916     *gpnorm = 0.0;
3917     *ynorm  = nrm;
3918   }
3919   PetscFunctionReturn(0);
3920 }
3921 
3922 /*@
3923    SNESReasonView - Displays the reason a SNES solve converged or diverged to a viewer
3924 
3925    Collective on SNES
3926 
3927    Parameter:
3928 +  snes - iterative context obtained from SNESCreate()
3929 -  viewer - the viewer to display the reason
3930 
3931 
3932    Options Database Keys:
3933 .  -snes_converged_reason - print reason for converged or diverged, also prints number of iterations
3934 
3935    Level: beginner
3936 
3937 .keywords: SNES, solve, linear system
3938 
3939 .seealso: SNESCreate(), SNESSetUp(), SNESDestroy(), SNESSetTolerances(), SNESConvergedDefault()
3940 
3941 @*/
3942 PetscErrorCode  SNESReasonView(SNES snes,PetscViewer viewer)
3943 {
3944   PetscErrorCode ierr;
3945   PetscBool      isAscii;
3946 
3947   PetscFunctionBegin;
3948   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isAscii);CHKERRQ(ierr);
3949   if (isAscii) {
3950     ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
3951     if (snes->reason > 0) {
3952       if (((PetscObject) snes)->prefix) {
3953         ierr = PetscViewerASCIIPrintf(viewer,"Nonlinear %s solve converged due to %s iterations %D\n",((PetscObject) snes)->prefix,SNESConvergedReasons[snes->reason],snes->iter);CHKERRQ(ierr);
3954       } else {
3955         ierr = PetscViewerASCIIPrintf(viewer,"Nonlinear solve converged due to %s iterations %D\n",SNESConvergedReasons[snes->reason],snes->iter);CHKERRQ(ierr);
3956       }
3957     } else {
3958       if (((PetscObject) snes)->prefix) {
3959         ierr = PetscViewerASCIIPrintf(viewer,"Nonlinear %s solve did not converge due to %s iterations %D\n",((PetscObject) snes)->prefix,SNESConvergedReasons[snes->reason],snes->iter);CHKERRQ(ierr);
3960       } else {
3961         ierr = PetscViewerASCIIPrintf(viewer,"Nonlinear solve did not converge due to %s iterations %D\n",SNESConvergedReasons[snes->reason],snes->iter);CHKERRQ(ierr);
3962       }
3963     }
3964     ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
3965   }
3966   PetscFunctionReturn(0);
3967 }
3968 
3969 /*@C
3970   SNESReasonViewFromOptions - Processes command line options to determine if/how a SNESReason is to be viewed.
3971 
3972   Collective on SNES
3973 
3974   Input Parameters:
3975 . snes   - the SNES object
3976 
3977   Level: intermediate
3978 
3979 @*/
3980 PetscErrorCode SNESReasonViewFromOptions(SNES snes)
3981 {
3982   PetscErrorCode    ierr;
3983   PetscViewer       viewer;
3984   PetscBool         flg;
3985   static PetscBool  incall = PETSC_FALSE;
3986   PetscViewerFormat format;
3987 
3988   PetscFunctionBegin;
3989   if (incall) PetscFunctionReturn(0);
3990   incall = PETSC_TRUE;
3991   ierr   = PetscOptionsGetViewer(PetscObjectComm((PetscObject)snes),((PetscObject)snes)->prefix,"-snes_converged_reason",&viewer,&format,&flg);CHKERRQ(ierr);
3992   if (flg) {
3993     ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr);
3994     ierr = SNESReasonView(snes,viewer);CHKERRQ(ierr);
3995     ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
3996     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
3997   }
3998   incall = PETSC_FALSE;
3999   PetscFunctionReturn(0);
4000 }
4001 
4002 /*@C
4003    SNESSolve - Solves a nonlinear system F(x) = b.
4004    Call SNESSolve() after calling SNESCreate() and optional routines of the form SNESSetXXX().
4005 
4006    Collective on SNES
4007 
4008    Input Parameters:
4009 +  snes - the SNES context
4010 .  b - the constant part of the equation F(x) = b, or NULL to use zero.
4011 -  x - the solution vector.
4012 
4013    Notes:
4014    The user should initialize the vector,x, with the initial guess
4015    for the nonlinear solve prior to calling SNESSolve.  In particular,
4016    to employ an initial guess of zero, the user should explicitly set
4017    this vector to zero by calling VecSet().
4018 
4019    Level: beginner
4020 
4021 .keywords: SNES, nonlinear, solve
4022 
4023 .seealso: SNESCreate(), SNESDestroy(), SNESSetFunction(), SNESSetJacobian(), SNESSetGridSequence(), SNESGetSolution()
4024 @*/
4025 PetscErrorCode  SNESSolve(SNES snes,Vec b,Vec x)
4026 {
4027   PetscErrorCode    ierr;
4028   PetscBool         flg;
4029   PetscInt          grid;
4030   Vec               xcreated = NULL;
4031   DM                dm;
4032 
4033   PetscFunctionBegin;
4034   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4035   if (x) PetscValidHeaderSpecific(x,VEC_CLASSID,3);
4036   if (x) PetscCheckSameComm(snes,1,x,3);
4037   if (b) PetscValidHeaderSpecific(b,VEC_CLASSID,2);
4038   if (b) PetscCheckSameComm(snes,1,b,2);
4039 
4040   {
4041     PetscViewer       viewer;
4042     PetscViewerFormat format;
4043     PetscBool         flg;
4044     static PetscBool  incall = PETSC_FALSE;
4045 
4046     if (!incall) {
4047       ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject) snes), ((PetscObject) snes)->prefix, "-snes_convergence_estimate", &viewer, &format, &flg);CHKERRQ(ierr);
4048       if (flg) {
4049         PetscConvEst conv;
4050         PetscReal    alpha; /* Convergence rate of the solution error in the L_2 norm */
4051 
4052         incall = PETSC_TRUE;
4053         ierr = PetscConvEstCreate(PetscObjectComm((PetscObject) snes), &conv);CHKERRQ(ierr);
4054         ierr = PetscConvEstSetSolver(conv, snes);CHKERRQ(ierr);
4055         ierr = PetscConvEstSetFromOptions(conv);CHKERRQ(ierr);
4056         ierr = PetscConvEstSetUp(conv);CHKERRQ(ierr);
4057         ierr = PetscConvEstGetConvRate(conv, &alpha);CHKERRQ(ierr);
4058         ierr = PetscViewerPushFormat(viewer, format);CHKERRQ(ierr);
4059         ierr = PetscConvEstRateView(conv, alpha, viewer);CHKERRQ(ierr);
4060         ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
4061         ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
4062         ierr = PetscConvEstDestroy(&conv);CHKERRQ(ierr);
4063         incall = PETSC_FALSE;
4064       }
4065     }
4066   }
4067   if (!x) {
4068     ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
4069     ierr = DMCreateGlobalVector(dm,&xcreated);CHKERRQ(ierr);
4070     x    = xcreated;
4071   }
4072   ierr = SNESViewFromOptions(snes,NULL,"-snes_view_pre");CHKERRQ(ierr);
4073 
4074   for (grid=0; grid<snes->gridsequence; grid++) {ierr = PetscViewerASCIIPushTab(PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)snes)));CHKERRQ(ierr);}
4075   for (grid=0; grid<snes->gridsequence+1; grid++) {
4076 
4077     /* set solution vector */
4078     if (!grid) {ierr = PetscObjectReference((PetscObject)x);CHKERRQ(ierr);}
4079     ierr          = VecDestroy(&snes->vec_sol);CHKERRQ(ierr);
4080     snes->vec_sol = x;
4081     ierr          = SNESGetDM(snes,&dm);CHKERRQ(ierr);
4082 
4083     /* set affine vector if provided */
4084     if (b) { ierr = PetscObjectReference((PetscObject)b);CHKERRQ(ierr); }
4085     ierr          = VecDestroy(&snes->vec_rhs);CHKERRQ(ierr);
4086     snes->vec_rhs = b;
4087 
4088     if (snes->vec_func == snes->vec_sol) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_IDN,"Solution vector cannot be function vector");
4089     if (snes->vec_rhs  == snes->vec_sol) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_IDN,"Solution vector cannot be right hand side vector");
4090     if (!snes->vec_sol_update /* && snes->vec_sol */) {
4091       ierr = VecDuplicate(snes->vec_sol,&snes->vec_sol_update);CHKERRQ(ierr);
4092       ierr = PetscLogObjectParent((PetscObject)snes,(PetscObject)snes->vec_sol_update);CHKERRQ(ierr);
4093     }
4094     ierr = DMShellSetGlobalVector(dm,snes->vec_sol);CHKERRQ(ierr);
4095     ierr = SNESSetUp(snes);CHKERRQ(ierr);
4096 
4097     if (!grid) {
4098       if (snes->ops->computeinitialguess) {
4099         ierr = (*snes->ops->computeinitialguess)(snes,snes->vec_sol,snes->initialguessP);CHKERRQ(ierr);
4100       }
4101     }
4102 
4103     if (snes->conv_hist_reset) snes->conv_hist_len = 0;
4104     if (snes->counters_reset) {snes->nfuncs = 0; snes->linear_its = 0; snes->numFailures = 0;}
4105 
4106     ierr = PetscLogEventBegin(SNES_Solve,snes,0,0,0);CHKERRQ(ierr);
4107     ierr = (*snes->ops->solve)(snes);CHKERRQ(ierr);
4108     ierr = PetscLogEventEnd(SNES_Solve,snes,0,0,0);CHKERRQ(ierr);
4109     if (!snes->reason) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Internal error, solver returned without setting converged reason");
4110     snes->domainerror = PETSC_FALSE; /* clear the flag if it has been set */
4111 
4112     if (snes->lagjac_persist) snes->jac_iter += snes->iter;
4113     if (snes->lagpre_persist) snes->pre_iter += snes->iter;
4114 
4115     ierr   = PetscOptionsGetViewer(PetscObjectComm((PetscObject)snes),((PetscObject)snes)->prefix,"-snes_test_local_min",NULL,NULL,&flg);CHKERRQ(ierr);
4116     if (flg && !PetscPreLoadingOn) { ierr = SNESTestLocalMin(snes);CHKERRQ(ierr); }
4117     ierr = SNESReasonViewFromOptions(snes);CHKERRQ(ierr);
4118 
4119     if (snes->errorifnotconverged && snes->reason < 0) SETERRQ(PetscObjectComm((PetscObject)snes),PETSC_ERR_NOT_CONVERGED,"SNESSolve has not converged");
4120     if (snes->reason < 0) break;
4121     if (grid <  snes->gridsequence) {
4122       DM  fine;
4123       Vec xnew;
4124       Mat interp;
4125 
4126       ierr = DMRefine(snes->dm,PetscObjectComm((PetscObject)snes),&fine);CHKERRQ(ierr);
4127       if (!fine) SETERRQ(PetscObjectComm((PetscObject)snes),PETSC_ERR_ARG_INCOMP,"DMRefine() did not perform any refinement, cannot continue grid sequencing");
4128       ierr = DMCreateInterpolation(snes->dm,fine,&interp,NULL);CHKERRQ(ierr);
4129       ierr = DMCreateGlobalVector(fine,&xnew);CHKERRQ(ierr);
4130       ierr = MatInterpolate(interp,x,xnew);CHKERRQ(ierr);
4131       ierr = DMInterpolate(snes->dm,interp,fine);CHKERRQ(ierr);
4132       ierr = MatDestroy(&interp);CHKERRQ(ierr);
4133       x    = xnew;
4134 
4135       ierr = SNESReset(snes);CHKERRQ(ierr);
4136       ierr = SNESSetDM(snes,fine);CHKERRQ(ierr);
4137       ierr = DMDestroy(&fine);CHKERRQ(ierr);
4138       ierr = PetscViewerASCIIPopTab(PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)snes)));CHKERRQ(ierr);
4139     }
4140   }
4141   ierr = SNESViewFromOptions(snes,NULL,"-snes_view");CHKERRQ(ierr);
4142   ierr = VecViewFromOptions(snes->vec_sol,(PetscObject)snes,"-snes_view_solution");CHKERRQ(ierr);
4143 
4144   ierr = VecDestroy(&xcreated);CHKERRQ(ierr);
4145   ierr = PetscObjectSAWsBlock((PetscObject)snes);CHKERRQ(ierr);
4146   PetscFunctionReturn(0);
4147 }
4148 
4149 /* --------- Internal routines for SNES Package --------- */
4150 
4151 /*@C
4152    SNESSetType - Sets the method for the nonlinear solver.
4153 
4154    Collective on SNES
4155 
4156    Input Parameters:
4157 +  snes - the SNES context
4158 -  type - a known method
4159 
4160    Options Database Key:
4161 .  -snes_type <type> - Sets the method; use -help for a list
4162    of available methods (for instance, newtonls or newtontr)
4163 
4164    Notes:
4165    See "petsc/include/petscsnes.h" for available methods (for instance)
4166 +    SNESNEWTONLS - Newton's method with line search
4167      (systems of nonlinear equations)
4168 .    SNESNEWTONTR - Newton's method with trust region
4169      (systems of nonlinear equations)
4170 
4171   Normally, it is best to use the SNESSetFromOptions() command and then
4172   set the SNES solver type from the options database rather than by using
4173   this routine.  Using the options database provides the user with
4174   maximum flexibility in evaluating the many nonlinear solvers.
4175   The SNESSetType() routine is provided for those situations where it
4176   is necessary to set the nonlinear solver independently of the command
4177   line or options database.  This might be the case, for example, when
4178   the choice of solver changes during the execution of the program,
4179   and the user's application is taking responsibility for choosing the
4180   appropriate method.
4181 
4182     Developer Notes: SNESRegister() adds a constructor for a new SNESType to SNESList, SNESSetType() locates
4183     the constructor in that list and calls it to create the spexific object.
4184 
4185   Level: intermediate
4186 
4187 .keywords: SNES, set, type
4188 
4189 .seealso: SNESType, SNESCreate(), SNESDestroy(), SNESGetType(), SNESSetFromOptions()
4190 
4191 @*/
4192 PetscErrorCode  SNESSetType(SNES snes,SNESType type)
4193 {
4194   PetscErrorCode ierr,(*r)(SNES);
4195   PetscBool      match;
4196 
4197   PetscFunctionBegin;
4198   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4199   PetscValidCharPointer(type,2);
4200 
4201   ierr = PetscObjectTypeCompare((PetscObject)snes,type,&match);CHKERRQ(ierr);
4202   if (match) PetscFunctionReturn(0);
4203 
4204   ierr =  PetscFunctionListFind(SNESList,type,&r);CHKERRQ(ierr);
4205   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested SNES type %s",type);
4206   /* Destroy the previous private SNES context */
4207   if (snes->ops->destroy) {
4208     ierr               = (*(snes)->ops->destroy)(snes);CHKERRQ(ierr);
4209     snes->ops->destroy = NULL;
4210   }
4211   /* Reinitialize function pointers in SNESOps structure */
4212   snes->ops->setup          = 0;
4213   snes->ops->solve          = 0;
4214   snes->ops->view           = 0;
4215   snes->ops->setfromoptions = 0;
4216   snes->ops->destroy        = 0;
4217   /* Call the SNESCreate_XXX routine for this particular Nonlinear solver */
4218   snes->setupcalled = PETSC_FALSE;
4219 
4220   ierr = PetscObjectChangeTypeName((PetscObject)snes,type);CHKERRQ(ierr);
4221   ierr = (*r)(snes);CHKERRQ(ierr);
4222   PetscFunctionReturn(0);
4223 }
4224 
4225 /*@C
4226    SNESGetType - Gets the SNES method type and name (as a string).
4227 
4228    Not Collective
4229 
4230    Input Parameter:
4231 .  snes - nonlinear solver context
4232 
4233    Output Parameter:
4234 .  type - SNES method (a character string)
4235 
4236    Level: intermediate
4237 
4238 .keywords: SNES, nonlinear, get, type, name
4239 @*/
4240 PetscErrorCode  SNESGetType(SNES snes,SNESType *type)
4241 {
4242   PetscFunctionBegin;
4243   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4244   PetscValidPointer(type,2);
4245   *type = ((PetscObject)snes)->type_name;
4246   PetscFunctionReturn(0);
4247 }
4248 
4249 /*@
4250   SNESSetSolution - Sets the solution vector for use by the SNES routines.
4251 
4252   Logically Collective on SNES and Vec
4253 
4254   Input Parameters:
4255 + snes - the SNES context obtained from SNESCreate()
4256 - u    - the solution vector
4257 
4258   Level: beginner
4259 
4260 .keywords: SNES, set, solution
4261 @*/
4262 PetscErrorCode SNESSetSolution(SNES snes, Vec u)
4263 {
4264   DM             dm;
4265   PetscErrorCode ierr;
4266 
4267   PetscFunctionBegin;
4268   PetscValidHeaderSpecific(snes, SNES_CLASSID, 1);
4269   PetscValidHeaderSpecific(u, VEC_CLASSID, 2);
4270   ierr = PetscObjectReference((PetscObject) u);CHKERRQ(ierr);
4271   ierr = VecDestroy(&snes->vec_sol);CHKERRQ(ierr);
4272 
4273   snes->vec_sol = u;
4274 
4275   ierr = SNESGetDM(snes, &dm);CHKERRQ(ierr);
4276   ierr = DMShellSetGlobalVector(dm, u);CHKERRQ(ierr);
4277   PetscFunctionReturn(0);
4278 }
4279 
4280 /*@
4281    SNESGetSolution - Returns the vector where the approximate solution is
4282    stored. This is the fine grid solution when using SNESSetGridSequence().
4283 
4284    Not Collective, but Vec is parallel if SNES is parallel
4285 
4286    Input Parameter:
4287 .  snes - the SNES context
4288 
4289    Output Parameter:
4290 .  x - the solution
4291 
4292    Level: intermediate
4293 
4294 .keywords: SNES, nonlinear, get, solution
4295 
4296 .seealso:  SNESGetSolutionUpdate(), SNESGetFunction()
4297 @*/
4298 PetscErrorCode  SNESGetSolution(SNES snes,Vec *x)
4299 {
4300   PetscFunctionBegin;
4301   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4302   PetscValidPointer(x,2);
4303   *x = snes->vec_sol;
4304   PetscFunctionReturn(0);
4305 }
4306 
4307 /*@
4308    SNESGetSolutionUpdate - Returns the vector where the solution update is
4309    stored.
4310 
4311    Not Collective, but Vec is parallel if SNES is parallel
4312 
4313    Input Parameter:
4314 .  snes - the SNES context
4315 
4316    Output Parameter:
4317 .  x - the solution update
4318 
4319    Level: advanced
4320 
4321 .keywords: SNES, nonlinear, get, solution, update
4322 
4323 .seealso: SNESGetSolution(), SNESGetFunction()
4324 @*/
4325 PetscErrorCode  SNESGetSolutionUpdate(SNES snes,Vec *x)
4326 {
4327   PetscFunctionBegin;
4328   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4329   PetscValidPointer(x,2);
4330   *x = snes->vec_sol_update;
4331   PetscFunctionReturn(0);
4332 }
4333 
4334 /*@C
4335    SNESGetFunction - Returns the vector where the function is stored.
4336 
4337    Not Collective, but Vec is parallel if SNES is parallel. Collective if Vec is requested, but has not been created yet.
4338 
4339    Input Parameter:
4340 .  snes - the SNES context
4341 
4342    Output Parameter:
4343 +  r - the vector that is used to store residuals (or NULL if you don't want it)
4344 .  f - the function (or NULL if you don't want it); see SNESFunction for calling sequence details
4345 -  ctx - the function context (or NULL if you don't want it)
4346 
4347    Level: advanced
4348 
4349 .keywords: SNES, nonlinear, get, function
4350 
4351 .seealso: SNESSetFunction(), SNESGetSolution(), SNESFunction
4352 @*/
4353 PetscErrorCode  SNESGetFunction(SNES snes,Vec *r,PetscErrorCode (**f)(SNES,Vec,Vec,void*),void **ctx)
4354 {
4355   PetscErrorCode ierr;
4356   DM             dm;
4357 
4358   PetscFunctionBegin;
4359   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4360   if (r) {
4361     if (!snes->vec_func) {
4362       if (snes->vec_rhs) {
4363         ierr = VecDuplicate(snes->vec_rhs,&snes->vec_func);CHKERRQ(ierr);
4364       } else if (snes->vec_sol) {
4365         ierr = VecDuplicate(snes->vec_sol,&snes->vec_func);CHKERRQ(ierr);
4366       } else if (snes->dm) {
4367         ierr = DMCreateGlobalVector(snes->dm,&snes->vec_func);CHKERRQ(ierr);
4368       }
4369     }
4370     *r = snes->vec_func;
4371   }
4372   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
4373   ierr = DMSNESGetFunction(dm,f,ctx);CHKERRQ(ierr);
4374   PetscFunctionReturn(0);
4375 }
4376 
4377 /*@C
4378    SNESGetNGS - Returns the NGS function and context.
4379 
4380    Input Parameter:
4381 .  snes - the SNES context
4382 
4383    Output Parameter:
4384 +  f - the function (or NULL) see SNESNGSFunction for details
4385 -  ctx    - the function context (or NULL)
4386 
4387    Level: advanced
4388 
4389 .keywords: SNES, nonlinear, get, function
4390 
4391 .seealso: SNESSetNGS(), SNESGetFunction()
4392 @*/
4393 
4394 PetscErrorCode SNESGetNGS (SNES snes, PetscErrorCode (**f)(SNES, Vec, Vec, void*), void ** ctx)
4395 {
4396   PetscErrorCode ierr;
4397   DM             dm;
4398 
4399   PetscFunctionBegin;
4400   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4401   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
4402   ierr = DMSNESGetNGS(dm,f,ctx);CHKERRQ(ierr);
4403   PetscFunctionReturn(0);
4404 }
4405 
4406 /*@C
4407    SNESSetOptionsPrefix - Sets the prefix used for searching for all
4408    SNES options in the database.
4409 
4410    Logically Collective on SNES
4411 
4412    Input Parameter:
4413 +  snes - the SNES context
4414 -  prefix - the prefix to prepend to all option names
4415 
4416    Notes:
4417    A hyphen (-) must NOT be given at the beginning of the prefix name.
4418    The first character of all runtime options is AUTOMATICALLY the hyphen.
4419 
4420    Level: advanced
4421 
4422 .keywords: SNES, set, options, prefix, database
4423 
4424 .seealso: SNESSetFromOptions()
4425 @*/
4426 PetscErrorCode  SNESSetOptionsPrefix(SNES snes,const char prefix[])
4427 {
4428   PetscErrorCode ierr;
4429 
4430   PetscFunctionBegin;
4431   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4432   ierr = PetscObjectSetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr);
4433   if (!snes->ksp) {ierr = SNESGetKSP(snes,&snes->ksp);CHKERRQ(ierr);}
4434   if (snes->linesearch) {
4435     ierr = SNESGetLineSearch(snes,&snes->linesearch);CHKERRQ(ierr);
4436     ierr = PetscObjectSetOptionsPrefix((PetscObject)snes->linesearch,prefix);CHKERRQ(ierr);
4437   }
4438   ierr = KSPSetOptionsPrefix(snes->ksp,prefix);CHKERRQ(ierr);
4439   PetscFunctionReturn(0);
4440 }
4441 
4442 /*@C
4443    SNESAppendOptionsPrefix - Appends to the prefix used for searching for all
4444    SNES options in the database.
4445 
4446    Logically Collective on SNES
4447 
4448    Input Parameters:
4449 +  snes - the SNES context
4450 -  prefix - the prefix to prepend to all option names
4451 
4452    Notes:
4453    A hyphen (-) must NOT be given at the beginning of the prefix name.
4454    The first character of all runtime options is AUTOMATICALLY the hyphen.
4455 
4456    Level: advanced
4457 
4458 .keywords: SNES, append, options, prefix, database
4459 
4460 .seealso: SNESGetOptionsPrefix()
4461 @*/
4462 PetscErrorCode  SNESAppendOptionsPrefix(SNES snes,const char prefix[])
4463 {
4464   PetscErrorCode ierr;
4465 
4466   PetscFunctionBegin;
4467   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4468   ierr = PetscObjectAppendOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr);
4469   if (!snes->ksp) {ierr = SNESGetKSP(snes,&snes->ksp);CHKERRQ(ierr);}
4470   if (snes->linesearch) {
4471     ierr = SNESGetLineSearch(snes,&snes->linesearch);CHKERRQ(ierr);
4472     ierr = PetscObjectAppendOptionsPrefix((PetscObject)snes->linesearch,prefix);CHKERRQ(ierr);
4473   }
4474   ierr = KSPAppendOptionsPrefix(snes->ksp,prefix);CHKERRQ(ierr);
4475   PetscFunctionReturn(0);
4476 }
4477 
4478 /*@C
4479    SNESGetOptionsPrefix - Sets the prefix used for searching for all
4480    SNES options in the database.
4481 
4482    Not Collective
4483 
4484    Input Parameter:
4485 .  snes - the SNES context
4486 
4487    Output Parameter:
4488 .  prefix - pointer to the prefix string used
4489 
4490    Notes: On the fortran side, the user should pass in a string 'prefix' of
4491    sufficient length to hold the prefix.
4492 
4493    Level: advanced
4494 
4495 .keywords: SNES, get, options, prefix, database
4496 
4497 .seealso: SNESAppendOptionsPrefix()
4498 @*/
4499 PetscErrorCode  SNESGetOptionsPrefix(SNES snes,const char *prefix[])
4500 {
4501   PetscErrorCode ierr;
4502 
4503   PetscFunctionBegin;
4504   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4505   ierr = PetscObjectGetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr);
4506   PetscFunctionReturn(0);
4507 }
4508 
4509 
4510 /*@C
4511   SNESRegister - Adds a method to the nonlinear solver package.
4512 
4513    Not collective
4514 
4515    Input Parameters:
4516 +  name_solver - name of a new user-defined solver
4517 -  routine_create - routine to create method context
4518 
4519    Notes:
4520    SNESRegister() may be called multiple times to add several user-defined solvers.
4521 
4522    Sample usage:
4523 .vb
4524    SNESRegister("my_solver",MySolverCreate);
4525 .ve
4526 
4527    Then, your solver can be chosen with the procedural interface via
4528 $     SNESSetType(snes,"my_solver")
4529    or at runtime via the option
4530 $     -snes_type my_solver
4531 
4532    Level: advanced
4533 
4534     Note: If your function is not being put into a shared library then use SNESRegister() instead
4535 
4536 .keywords: SNES, nonlinear, register
4537 
4538 .seealso: SNESRegisterAll(), SNESRegisterDestroy()
4539 
4540   Level: advanced
4541 @*/
4542 PetscErrorCode  SNESRegister(const char sname[],PetscErrorCode (*function)(SNES))
4543 {
4544   PetscErrorCode ierr;
4545 
4546   PetscFunctionBegin;
4547   ierr = PetscFunctionListAdd(&SNESList,sname,function);CHKERRQ(ierr);
4548   PetscFunctionReturn(0);
4549 }
4550 
4551 PetscErrorCode  SNESTestLocalMin(SNES snes)
4552 {
4553   PetscErrorCode ierr;
4554   PetscInt       N,i,j;
4555   Vec            u,uh,fh;
4556   PetscScalar    value;
4557   PetscReal      norm;
4558 
4559   PetscFunctionBegin;
4560   ierr = SNESGetSolution(snes,&u);CHKERRQ(ierr);
4561   ierr = VecDuplicate(u,&uh);CHKERRQ(ierr);
4562   ierr = VecDuplicate(u,&fh);CHKERRQ(ierr);
4563 
4564   /* currently only works for sequential */
4565   ierr = PetscPrintf(PETSC_COMM_WORLD,"Testing FormFunction() for local min\n");CHKERRQ(ierr);
4566   ierr = VecGetSize(u,&N);CHKERRQ(ierr);
4567   for (i=0; i<N; i++) {
4568     ierr = VecCopy(u,uh);CHKERRQ(ierr);
4569     ierr = PetscPrintf(PETSC_COMM_WORLD,"i = %D\n",i);CHKERRQ(ierr);
4570     for (j=-10; j<11; j++) {
4571       value = PetscSign(j)*PetscExpReal(PetscAbs(j)-10.0);
4572       ierr  = VecSetValue(uh,i,value,ADD_VALUES);CHKERRQ(ierr);
4573       ierr  = SNESComputeFunction(snes,uh,fh);CHKERRQ(ierr);
4574       ierr  = VecNorm(fh,NORM_2,&norm);CHKERRQ(ierr);
4575       ierr  = PetscPrintf(PETSC_COMM_WORLD,"       j norm %D %18.16e\n",j,norm);CHKERRQ(ierr);
4576       value = -value;
4577       ierr  = VecSetValue(uh,i,value,ADD_VALUES);CHKERRQ(ierr);
4578     }
4579   }
4580   ierr = VecDestroy(&uh);CHKERRQ(ierr);
4581   ierr = VecDestroy(&fh);CHKERRQ(ierr);
4582   PetscFunctionReturn(0);
4583 }
4584 
4585 /*@
4586    SNESKSPSetUseEW - Sets SNES use Eisenstat-Walker method for
4587    computing relative tolerance for linear solvers within an inexact
4588    Newton method.
4589 
4590    Logically Collective on SNES
4591 
4592    Input Parameters:
4593 +  snes - SNES context
4594 -  flag - PETSC_TRUE or PETSC_FALSE
4595 
4596     Options Database:
4597 +  -snes_ksp_ew - use Eisenstat-Walker method for determining linear system convergence
4598 .  -snes_ksp_ew_version ver - version of  Eisenstat-Walker method
4599 .  -snes_ksp_ew_rtol0 <rtol0> - Sets rtol0
4600 .  -snes_ksp_ew_rtolmax <rtolmax> - Sets rtolmax
4601 .  -snes_ksp_ew_gamma <gamma> - Sets gamma
4602 .  -snes_ksp_ew_alpha <alpha> - Sets alpha
4603 .  -snes_ksp_ew_alpha2 <alpha2> - Sets alpha2
4604 -  -snes_ksp_ew_threshold <threshold> - Sets threshold
4605 
4606    Notes:
4607    Currently, the default is to use a constant relative tolerance for
4608    the inner linear solvers.  Alternatively, one can use the
4609    Eisenstat-Walker method, where the relative convergence tolerance
4610    is reset at each Newton iteration according progress of the nonlinear
4611    solver.
4612 
4613    Level: advanced
4614 
4615    Reference:
4616    S. C. Eisenstat and H. F. Walker, "Choosing the forcing terms in an
4617    inexact Newton method", SISC 17 (1), pp.16-32, 1996.
4618 
4619 .keywords: SNES, KSP, Eisenstat, Walker, convergence, test, inexact, Newton
4620 
4621 .seealso: SNESKSPGetUseEW(), SNESKSPGetParametersEW(), SNESKSPSetParametersEW()
4622 @*/
4623 PetscErrorCode  SNESKSPSetUseEW(SNES snes,PetscBool flag)
4624 {
4625   PetscFunctionBegin;
4626   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4627   PetscValidLogicalCollectiveBool(snes,flag,2);
4628   snes->ksp_ewconv = flag;
4629   PetscFunctionReturn(0);
4630 }
4631 
4632 /*@
4633    SNESKSPGetUseEW - Gets if SNES is using Eisenstat-Walker method
4634    for computing relative tolerance for linear solvers within an
4635    inexact Newton method.
4636 
4637    Not Collective
4638 
4639    Input Parameter:
4640 .  snes - SNES context
4641 
4642    Output Parameter:
4643 .  flag - PETSC_TRUE or PETSC_FALSE
4644 
4645    Notes:
4646    Currently, the default is to use a constant relative tolerance for
4647    the inner linear solvers.  Alternatively, one can use the
4648    Eisenstat-Walker method, where the relative convergence tolerance
4649    is reset at each Newton iteration according progress of the nonlinear
4650    solver.
4651 
4652    Level: advanced
4653 
4654    Reference:
4655    S. C. Eisenstat and H. F. Walker, "Choosing the forcing terms in an
4656    inexact Newton method", SISC 17 (1), pp.16-32, 1996.
4657 
4658 .keywords: SNES, KSP, Eisenstat, Walker, convergence, test, inexact, Newton
4659 
4660 .seealso: SNESKSPSetUseEW(), SNESKSPGetParametersEW(), SNESKSPSetParametersEW()
4661 @*/
4662 PetscErrorCode  SNESKSPGetUseEW(SNES snes, PetscBool  *flag)
4663 {
4664   PetscFunctionBegin;
4665   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4666   PetscValidPointer(flag,2);
4667   *flag = snes->ksp_ewconv;
4668   PetscFunctionReturn(0);
4669 }
4670 
4671 /*@
4672    SNESKSPSetParametersEW - Sets parameters for Eisenstat-Walker
4673    convergence criteria for the linear solvers within an inexact
4674    Newton method.
4675 
4676    Logically Collective on SNES
4677 
4678    Input Parameters:
4679 +    snes - SNES context
4680 .    version - version 1, 2 (default is 2) or 3
4681 .    rtol_0 - initial relative tolerance (0 <= rtol_0 < 1)
4682 .    rtol_max - maximum relative tolerance (0 <= rtol_max < 1)
4683 .    gamma - multiplicative factor for version 2 rtol computation
4684              (0 <= gamma2 <= 1)
4685 .    alpha - power for version 2 rtol computation (1 < alpha <= 2)
4686 .    alpha2 - power for safeguard
4687 -    threshold - threshold for imposing safeguard (0 < threshold < 1)
4688 
4689    Note:
4690    Version 3 was contributed by Luis Chacon, June 2006.
4691 
4692    Use PETSC_DEFAULT to retain the default for any of the parameters.
4693 
4694    Level: advanced
4695 
4696    Reference:
4697    S. C. Eisenstat and H. F. Walker, "Choosing the forcing terms in an
4698    inexact Newton method", Utah State University Math. Stat. Dept. Res.
4699    Report 6/94/75, June, 1994, to appear in SIAM J. Sci. Comput.
4700 
4701 .keywords: SNES, KSP, Eisenstat, Walker, set, parameters
4702 
4703 .seealso: SNESKSPSetUseEW(), SNESKSPGetUseEW(), SNESKSPGetParametersEW()
4704 @*/
4705 PetscErrorCode  SNESKSPSetParametersEW(SNES snes,PetscInt version,PetscReal rtol_0,PetscReal rtol_max,PetscReal gamma,PetscReal alpha,PetscReal alpha2,PetscReal threshold)
4706 {
4707   SNESKSPEW *kctx;
4708 
4709   PetscFunctionBegin;
4710   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4711   kctx = (SNESKSPEW*)snes->kspconvctx;
4712   if (!kctx) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"No Eisenstat-Walker context existing");
4713   PetscValidLogicalCollectiveInt(snes,version,2);
4714   PetscValidLogicalCollectiveReal(snes,rtol_0,3);
4715   PetscValidLogicalCollectiveReal(snes,rtol_max,4);
4716   PetscValidLogicalCollectiveReal(snes,gamma,5);
4717   PetscValidLogicalCollectiveReal(snes,alpha,6);
4718   PetscValidLogicalCollectiveReal(snes,alpha2,7);
4719   PetscValidLogicalCollectiveReal(snes,threshold,8);
4720 
4721   if (version != PETSC_DEFAULT)   kctx->version   = version;
4722   if (rtol_0 != PETSC_DEFAULT)    kctx->rtol_0    = rtol_0;
4723   if (rtol_max != PETSC_DEFAULT)  kctx->rtol_max  = rtol_max;
4724   if (gamma != PETSC_DEFAULT)     kctx->gamma     = gamma;
4725   if (alpha != PETSC_DEFAULT)     kctx->alpha     = alpha;
4726   if (alpha2 != PETSC_DEFAULT)    kctx->alpha2    = alpha2;
4727   if (threshold != PETSC_DEFAULT) kctx->threshold = threshold;
4728 
4729   if (kctx->version < 1 || kctx->version > 3) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Only versions 1, 2 and 3 are supported: %D",kctx->version);
4730   if (kctx->rtol_0 < 0.0 || kctx->rtol_0 >= 1.0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"0.0 <= rtol_0 < 1.0: %g",(double)kctx->rtol_0);
4731   if (kctx->rtol_max < 0.0 || kctx->rtol_max >= 1.0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"0.0 <= rtol_max (%g) < 1.0\n",(double)kctx->rtol_max);
4732   if (kctx->gamma < 0.0 || kctx->gamma > 1.0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"0.0 <= gamma (%g) <= 1.0\n",(double)kctx->gamma);
4733   if (kctx->alpha <= 1.0 || kctx->alpha > 2.0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"1.0 < alpha (%g) <= 2.0\n",(double)kctx->alpha);
4734   if (kctx->threshold <= 0.0 || kctx->threshold >= 1.0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"0.0 < threshold (%g) < 1.0\n",(double)kctx->threshold);
4735   PetscFunctionReturn(0);
4736 }
4737 
4738 /*@
4739    SNESKSPGetParametersEW - Gets parameters for Eisenstat-Walker
4740    convergence criteria for the linear solvers within an inexact
4741    Newton method.
4742 
4743    Not Collective
4744 
4745    Input Parameters:
4746      snes - SNES context
4747 
4748    Output Parameters:
4749 +    version - version 1, 2 (default is 2) or 3
4750 .    rtol_0 - initial relative tolerance (0 <= rtol_0 < 1)
4751 .    rtol_max - maximum relative tolerance (0 <= rtol_max < 1)
4752 .    gamma - multiplicative factor for version 2 rtol computation (0 <= gamma2 <= 1)
4753 .    alpha - power for version 2 rtol computation (1 < alpha <= 2)
4754 .    alpha2 - power for safeguard
4755 -    threshold - threshold for imposing safeguard (0 < threshold < 1)
4756 
4757    Level: advanced
4758 
4759 .keywords: SNES, KSP, Eisenstat, Walker, get, parameters
4760 
4761 .seealso: SNESKSPSetUseEW(), SNESKSPGetUseEW(), SNESKSPSetParametersEW()
4762 @*/
4763 PetscErrorCode  SNESKSPGetParametersEW(SNES snes,PetscInt *version,PetscReal *rtol_0,PetscReal *rtol_max,PetscReal *gamma,PetscReal *alpha,PetscReal *alpha2,PetscReal *threshold)
4764 {
4765   SNESKSPEW *kctx;
4766 
4767   PetscFunctionBegin;
4768   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4769   kctx = (SNESKSPEW*)snes->kspconvctx;
4770   if (!kctx) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"No Eisenstat-Walker context existing");
4771   if (version)   *version   = kctx->version;
4772   if (rtol_0)    *rtol_0    = kctx->rtol_0;
4773   if (rtol_max)  *rtol_max  = kctx->rtol_max;
4774   if (gamma)     *gamma     = kctx->gamma;
4775   if (alpha)     *alpha     = kctx->alpha;
4776   if (alpha2)    *alpha2    = kctx->alpha2;
4777   if (threshold) *threshold = kctx->threshold;
4778   PetscFunctionReturn(0);
4779 }
4780 
4781  PetscErrorCode KSPPreSolve_SNESEW(KSP ksp, Vec b, Vec x, SNES snes)
4782 {
4783   PetscErrorCode ierr;
4784   SNESKSPEW      *kctx = (SNESKSPEW*)snes->kspconvctx;
4785   PetscReal      rtol  = PETSC_DEFAULT,stol;
4786 
4787   PetscFunctionBegin;
4788   if (!snes->ksp_ewconv) PetscFunctionReturn(0);
4789   if (!snes->iter) {
4790     rtol = kctx->rtol_0; /* first time in, so use the original user rtol */
4791     ierr = VecNorm(snes->vec_func,NORM_2,&kctx->norm_first);CHKERRQ(ierr);
4792   }
4793   else {
4794     if (kctx->version == 1) {
4795       rtol = (snes->norm - kctx->lresid_last)/kctx->norm_last;
4796       if (rtol < 0.0) rtol = -rtol;
4797       stol = PetscPowReal(kctx->rtol_last,kctx->alpha2);
4798       if (stol > kctx->threshold) rtol = PetscMax(rtol,stol);
4799     } else if (kctx->version == 2) {
4800       rtol = kctx->gamma * PetscPowReal(snes->norm/kctx->norm_last,kctx->alpha);
4801       stol = kctx->gamma * PetscPowReal(kctx->rtol_last,kctx->alpha);
4802       if (stol > kctx->threshold) rtol = PetscMax(rtol,stol);
4803     } else if (kctx->version == 3) { /* contributed by Luis Chacon, June 2006. */
4804       rtol = kctx->gamma * PetscPowReal(snes->norm/kctx->norm_last,kctx->alpha);
4805       /* safeguard: avoid sharp decrease of rtol */
4806       stol = kctx->gamma*PetscPowReal(kctx->rtol_last,kctx->alpha);
4807       stol = PetscMax(rtol,stol);
4808       rtol = PetscMin(kctx->rtol_0,stol);
4809       /* safeguard: avoid oversolving */
4810       stol = kctx->gamma*(kctx->norm_first*snes->rtol)/snes->norm;
4811       stol = PetscMax(rtol,stol);
4812       rtol = PetscMin(kctx->rtol_0,stol);
4813     } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Only versions 1, 2 or 3 are supported: %D",kctx->version);
4814   }
4815   /* safeguard: avoid rtol greater than one */
4816   rtol = PetscMin(rtol,kctx->rtol_max);
4817   ierr = KSPSetTolerances(ksp,rtol,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_DEFAULT);CHKERRQ(ierr);
4818   ierr = PetscInfo3(snes,"iter %D, Eisenstat-Walker (version %D) KSP rtol=%g\n",snes->iter,kctx->version,(double)rtol);CHKERRQ(ierr);
4819   PetscFunctionReturn(0);
4820 }
4821 
4822 PetscErrorCode KSPPostSolve_SNESEW(KSP ksp, Vec b, Vec x, SNES snes)
4823 {
4824   PetscErrorCode ierr;
4825   SNESKSPEW      *kctx = (SNESKSPEW*)snes->kspconvctx;
4826   PCSide         pcside;
4827   Vec            lres;
4828 
4829   PetscFunctionBegin;
4830   if (!snes->ksp_ewconv) PetscFunctionReturn(0);
4831   ierr = KSPGetTolerances(ksp,&kctx->rtol_last,0,0,0);CHKERRQ(ierr);
4832   kctx->norm_last = snes->norm;
4833   if (kctx->version == 1) {
4834     PC        pc;
4835     PetscBool isNone;
4836 
4837     ierr = KSPGetPC(ksp, &pc);CHKERRQ(ierr);
4838     ierr = PetscObjectTypeCompare((PetscObject) pc, PCNONE, &isNone);CHKERRQ(ierr);
4839     ierr = KSPGetPCSide(ksp,&pcside);CHKERRQ(ierr);
4840      if (pcside == PC_RIGHT || isNone) { /* XXX Should we also test KSP_UNPRECONDITIONED_NORM ? */
4841       /* KSP residual is true linear residual */
4842       ierr = KSPGetResidualNorm(ksp,&kctx->lresid_last);CHKERRQ(ierr);
4843     } else {
4844       /* KSP residual is preconditioned residual */
4845       /* compute true linear residual norm */
4846       ierr = VecDuplicate(b,&lres);CHKERRQ(ierr);
4847       ierr = MatMult(snes->jacobian,x,lres);CHKERRQ(ierr);
4848       ierr = VecAYPX(lres,-1.0,b);CHKERRQ(ierr);
4849       ierr = VecNorm(lres,NORM_2,&kctx->lresid_last);CHKERRQ(ierr);
4850       ierr = VecDestroy(&lres);CHKERRQ(ierr);
4851     }
4852   }
4853   PetscFunctionReturn(0);
4854 }
4855 
4856 /*@
4857    SNESGetKSP - Returns the KSP context for a SNES solver.
4858 
4859    Not Collective, but if SNES object is parallel, then KSP object is parallel
4860 
4861    Input Parameter:
4862 .  snes - the SNES context
4863 
4864    Output Parameter:
4865 .  ksp - the KSP context
4866 
4867    Notes:
4868    The user can then directly manipulate the KSP context to set various
4869    options, etc.  Likewise, the user can then extract and manipulate the
4870    PC contexts as well.
4871 
4872    Level: beginner
4873 
4874 .keywords: SNES, nonlinear, get, KSP, context
4875 
4876 .seealso: KSPGetPC(), SNESCreate(), KSPCreate(), SNESSetKSP()
4877 @*/
4878 PetscErrorCode  SNESGetKSP(SNES snes,KSP *ksp)
4879 {
4880   PetscErrorCode ierr;
4881 
4882   PetscFunctionBegin;
4883   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4884   PetscValidPointer(ksp,2);
4885 
4886   if (!snes->ksp) {
4887     PetscBool monitor = PETSC_FALSE;
4888 
4889     ierr = KSPCreate(PetscObjectComm((PetscObject)snes),&snes->ksp);CHKERRQ(ierr);
4890     ierr = PetscObjectIncrementTabLevel((PetscObject)snes->ksp,(PetscObject)snes,1);CHKERRQ(ierr);
4891     ierr = PetscLogObjectParent((PetscObject)snes,(PetscObject)snes->ksp);CHKERRQ(ierr);
4892 
4893     ierr = KSPSetPreSolve(snes->ksp,(PetscErrorCode (*)(KSP,Vec,Vec,void*))KSPPreSolve_SNESEW,snes);CHKERRQ(ierr);
4894     ierr = KSPSetPostSolve(snes->ksp,(PetscErrorCode (*)(KSP,Vec,Vec,void*))KSPPostSolve_SNESEW,snes);CHKERRQ(ierr);
4895 
4896     ierr = PetscOptionsGetBool(((PetscObject)snes)->options,((PetscObject)snes)->prefix,"-ksp_monitor_snes",&monitor,NULL);CHKERRQ(ierr);
4897     if (monitor) {
4898       ierr = KSPMonitorSet(snes->ksp,KSPMonitorSNES,snes,NULL);CHKERRQ(ierr);
4899     }
4900     monitor = PETSC_FALSE;
4901     ierr = PetscOptionsGetBool(((PetscObject)snes)->options,((PetscObject)snes)->prefix,"-ksp_monitor_snes_lg",&monitor,NULL);CHKERRQ(ierr);
4902     if (monitor) {
4903       PetscObject *objs;
4904       ierr = KSPMonitorSNESLGResidualNormCreate(PetscObjectComm((PetscObject)snes),NULL,NULL,PETSC_DECIDE,PETSC_DECIDE,600,600,&objs);CHKERRQ(ierr);
4905       objs[0] = (PetscObject) snes;
4906       ierr = KSPMonitorSet(snes->ksp,(PetscErrorCode (*)(KSP,PetscInt,PetscReal,void*))KSPMonitorSNESLGResidualNorm,objs,(PetscErrorCode (*)(void**))KSPMonitorSNESLGResidualNormDestroy);CHKERRQ(ierr);
4907     }
4908   }
4909   *ksp = snes->ksp;
4910   PetscFunctionReturn(0);
4911 }
4912 
4913 
4914 #include <petsc/private/dmimpl.h>
4915 /*@
4916    SNESSetDM - Sets the DM that may be used by some nonlinear solvers or their underlying preconditioners
4917 
4918    Logically Collective on SNES
4919 
4920    Input Parameters:
4921 +  snes - the nonlinear solver context
4922 -  dm - the dm, cannot be NULL
4923 
4924    Level: intermediate
4925 
4926 .seealso: SNESGetDM(), SNESHasDM(), KSPSetDM(), KSPGetDM()
4927 @*/
4928 PetscErrorCode  SNESSetDM(SNES snes,DM dm)
4929 {
4930   PetscErrorCode ierr;
4931   KSP            ksp;
4932   DMSNES         sdm;
4933 
4934   PetscFunctionBegin;
4935   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4936   PetscValidHeaderSpecific(dm,DM_CLASSID,2);
4937   ierr = PetscObjectReference((PetscObject)dm);CHKERRQ(ierr);
4938   if (snes->dm) {               /* Move the DMSNES context over to the new DM unless the new DM already has one */
4939     if (snes->dm->dmsnes && !dm->dmsnes) {
4940       ierr = DMCopyDMSNES(snes->dm,dm);CHKERRQ(ierr);
4941       ierr = DMGetDMSNES(snes->dm,&sdm);CHKERRQ(ierr);
4942       if (sdm->originaldm == snes->dm) sdm->originaldm = dm; /* Grant write privileges to the replacement DM */
4943     }
4944     ierr = DMCoarsenHookRemove(snes->dm,DMCoarsenHook_SNESVecSol,DMRestrictHook_SNESVecSol,snes);CHKERRQ(ierr);
4945     ierr = DMDestroy(&snes->dm);CHKERRQ(ierr);
4946   }
4947   snes->dm     = dm;
4948   snes->dmAuto = PETSC_FALSE;
4949 
4950   ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr);
4951   ierr = KSPSetDM(ksp,dm);CHKERRQ(ierr);
4952   ierr = KSPSetDMActive(ksp,PETSC_FALSE);CHKERRQ(ierr);
4953   if (snes->npc) {
4954     ierr = SNESSetDM(snes->npc, snes->dm);CHKERRQ(ierr);
4955     ierr = SNESSetNPCSide(snes,snes->npcside);CHKERRQ(ierr);
4956   }
4957   PetscFunctionReturn(0);
4958 }
4959 
4960 /*@
4961    SNESGetDM - Gets the DM that may be used by some preconditioners
4962 
4963    Not Collective but DM obtained is parallel on SNES
4964 
4965    Input Parameter:
4966 . snes - the preconditioner context
4967 
4968    Output Parameter:
4969 .  dm - the dm
4970 
4971    Level: intermediate
4972 
4973 .seealso: SNESSetDM(), SNESHasDM(), KSPSetDM(), KSPGetDM()
4974 @*/
4975 PetscErrorCode  SNESGetDM(SNES snes,DM *dm)
4976 {
4977   PetscErrorCode ierr;
4978 
4979   PetscFunctionBegin;
4980   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4981   if (!snes->dm) {
4982     ierr         = DMShellCreate(PetscObjectComm((PetscObject)snes),&snes->dm);CHKERRQ(ierr);
4983     snes->dmAuto = PETSC_TRUE;
4984   }
4985   *dm = snes->dm;
4986   PetscFunctionReturn(0);
4987 }
4988 
4989 
4990 /*@
4991    SNESHasDM - Whether snes has dm
4992 
4993    Not collective but all processes must return the same value
4994 
4995    Input Parameter:
4996 . snes - the nonlinear solver object
4997 
4998    Output Parameter:
4999 .  hasdm - a flag indicates whether there is dm in snes
5000 
5001    Level: intermediate
5002 
5003 .seealso: SNESGetDM(), SNESSetDM(), KSPSetDM(), KSPGetDM()
5004 @*/
5005 PetscErrorCode  SNESHasDM(SNES snes,PetscBool *hasdm)
5006 {
5007   PetscFunctionBegin;
5008   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
5009   PetscValidPointer(hasdm,2);
5010   if (snes->dm) *hasdm = PETSC_TRUE;
5011   else *hasdm = PETSC_FALSE;
5012   PetscFunctionReturn(0);
5013 }
5014 
5015 /*@
5016   SNESSetNPC - Sets the nonlinear preconditioner to be used.
5017 
5018   Collective on SNES
5019 
5020   Input Parameters:
5021 + snes - iterative context obtained from SNESCreate()
5022 - pc   - the preconditioner object
5023 
5024   Notes:
5025   Use SNESGetNPC() to retrieve the preconditioner context (for example,
5026   to configure it using the API).
5027 
5028   Level: developer
5029 
5030 .keywords: SNES, set, precondition
5031 .seealso: SNESGetNPC(), SNESHasNPC()
5032 @*/
5033 PetscErrorCode SNESSetNPC(SNES snes, SNES pc)
5034 {
5035   PetscErrorCode ierr;
5036 
5037   PetscFunctionBegin;
5038   PetscValidHeaderSpecific(snes, SNES_CLASSID, 1);
5039   PetscValidHeaderSpecific(pc, SNES_CLASSID, 2);
5040   PetscCheckSameComm(snes, 1, pc, 2);
5041   ierr     = PetscObjectReference((PetscObject) pc);CHKERRQ(ierr);
5042   ierr     = SNESDestroy(&snes->npc);CHKERRQ(ierr);
5043   snes->npc = pc;
5044   ierr     = PetscLogObjectParent((PetscObject)snes, (PetscObject)snes->npc);CHKERRQ(ierr);
5045   PetscFunctionReturn(0);
5046 }
5047 
5048 /*@
5049   SNESGetNPC - Creates a nonlinear preconditioning solver (SNES) to be used to precondition the nonlinear solver.
5050 
5051   Not Collective
5052 
5053   Input Parameter:
5054 . snes - iterative context obtained from SNESCreate()
5055 
5056   Output Parameter:
5057 . pc - preconditioner context
5058 
5059   Notes: If a SNES was previously set with SNESSetNPC() then that SNES is returned.
5060 
5061   Level: developer
5062 
5063 .keywords: SNES, get, preconditioner
5064 .seealso: SNESSetNPC(), SNESHasNPC()
5065 @*/
5066 PetscErrorCode SNESGetNPC(SNES snes, SNES *pc)
5067 {
5068   PetscErrorCode ierr;
5069   const char     *optionsprefix;
5070 
5071   PetscFunctionBegin;
5072   PetscValidHeaderSpecific(snes, SNES_CLASSID, 1);
5073   PetscValidPointer(pc, 2);
5074   if (!snes->npc) {
5075     ierr = SNESCreate(PetscObjectComm((PetscObject)snes),&snes->npc);CHKERRQ(ierr);
5076     ierr = PetscObjectIncrementTabLevel((PetscObject)snes->npc,(PetscObject)snes,1);CHKERRQ(ierr);
5077     ierr = PetscLogObjectParent((PetscObject)snes,(PetscObject)snes->npc);CHKERRQ(ierr);
5078     ierr = SNESGetOptionsPrefix(snes,&optionsprefix);CHKERRQ(ierr);
5079     ierr = SNESSetOptionsPrefix(snes->npc,optionsprefix);CHKERRQ(ierr);
5080     ierr = SNESAppendOptionsPrefix(snes->npc,"npc_");CHKERRQ(ierr);
5081     ierr = SNESSetCountersReset(snes->npc,PETSC_FALSE);CHKERRQ(ierr);
5082   }
5083   *pc = snes->npc;
5084   PetscFunctionReturn(0);
5085 }
5086 
5087 /*@
5088   SNESHasNPC - Returns whether a nonlinear preconditioner exists
5089 
5090   Not Collective
5091 
5092   Input Parameter:
5093 . snes - iterative context obtained from SNESCreate()
5094 
5095   Output Parameter:
5096 . has_npc - whether the SNES has an NPC or not
5097 
5098   Level: developer
5099 
5100 .keywords: SNES, has, preconditioner
5101 .seealso: SNESSetNPC(), SNESGetNPC()
5102 @*/
5103 PetscErrorCode SNESHasNPC(SNES snes, PetscBool *has_npc)
5104 {
5105   PetscFunctionBegin;
5106   PetscValidHeaderSpecific(snes, SNES_CLASSID, 1);
5107   *has_npc = (PetscBool) (snes->npc ? PETSC_TRUE : PETSC_FALSE);
5108   PetscFunctionReturn(0);
5109 }
5110 
5111 /*@
5112     SNESSetNPCSide - Sets the preconditioning side.
5113 
5114     Logically Collective on SNES
5115 
5116     Input Parameter:
5117 .   snes - iterative context obtained from SNESCreate()
5118 
5119     Output Parameter:
5120 .   side - the preconditioning side, where side is one of
5121 .vb
5122       PC_LEFT - left preconditioning
5123       PC_RIGHT - right preconditioning (default for most nonlinear solvers)
5124 .ve
5125 
5126     Options Database Keys:
5127 .   -snes_pc_side <right,left>
5128 
5129     Notes: SNESNRICHARDSON and SNESNCG only support left preconditioning.
5130 
5131     Level: intermediate
5132 
5133 .keywords: SNES, set, right, left, side, preconditioner, flag
5134 
5135 .seealso: SNESGetNPCSide(), KSPSetPCSide()
5136 @*/
5137 PetscErrorCode  SNESSetNPCSide(SNES snes,PCSide side)
5138 {
5139   PetscFunctionBegin;
5140   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
5141   PetscValidLogicalCollectiveEnum(snes,side,2);
5142   snes->npcside= side;
5143   PetscFunctionReturn(0);
5144 }
5145 
5146 /*@
5147     SNESGetNPCSide - Gets the preconditioning side.
5148 
5149     Not Collective
5150 
5151     Input Parameter:
5152 .   snes - iterative context obtained from SNESCreate()
5153 
5154     Output Parameter:
5155 .   side - the preconditioning side, where side is one of
5156 .vb
5157       PC_LEFT - left preconditioning
5158       PC_RIGHT - right preconditioning (default for most nonlinear solvers)
5159 .ve
5160 
5161     Level: intermediate
5162 
5163 .keywords: SNES, get, right, left, side, preconditioner, flag
5164 
5165 .seealso: SNESSetNPCSide(), KSPGetPCSide()
5166 @*/
5167 PetscErrorCode  SNESGetNPCSide(SNES snes,PCSide *side)
5168 {
5169   PetscFunctionBegin;
5170   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
5171   PetscValidPointer(side,2);
5172   *side = snes->npcside;
5173   PetscFunctionReturn(0);
5174 }
5175 
5176 /*@
5177   SNESSetLineSearch - Sets the linesearch on the SNES instance.
5178 
5179   Collective on SNES
5180 
5181   Input Parameters:
5182 + snes - iterative context obtained from SNESCreate()
5183 - linesearch   - the linesearch object
5184 
5185   Notes:
5186   Use SNESGetLineSearch() to retrieve the preconditioner context (for example,
5187   to configure it using the API).
5188 
5189   Level: developer
5190 
5191 .keywords: SNES, set, linesearch
5192 .seealso: SNESGetLineSearch()
5193 @*/
5194 PetscErrorCode SNESSetLineSearch(SNES snes, SNESLineSearch linesearch)
5195 {
5196   PetscErrorCode ierr;
5197 
5198   PetscFunctionBegin;
5199   PetscValidHeaderSpecific(snes, SNES_CLASSID, 1);
5200   PetscValidHeaderSpecific(linesearch, SNESLINESEARCH_CLASSID, 2);
5201   PetscCheckSameComm(snes, 1, linesearch, 2);
5202   ierr = PetscObjectReference((PetscObject) linesearch);CHKERRQ(ierr);
5203   ierr = SNESLineSearchDestroy(&snes->linesearch);CHKERRQ(ierr);
5204 
5205   snes->linesearch = linesearch;
5206 
5207   ierr = PetscLogObjectParent((PetscObject)snes, (PetscObject)snes->linesearch);CHKERRQ(ierr);
5208   PetscFunctionReturn(0);
5209 }
5210 
5211 /*@
5212   SNESGetLineSearch - Returns a pointer to the line search context set with SNESSetLineSearch()
5213   or creates a default line search instance associated with the SNES and returns it.
5214 
5215   Not Collective
5216 
5217   Input Parameter:
5218 . snes - iterative context obtained from SNESCreate()
5219 
5220   Output Parameter:
5221 . linesearch - linesearch context
5222 
5223   Level: beginner
5224 
5225 .keywords: SNES, get, linesearch
5226 .seealso: SNESSetLineSearch(), SNESLineSearchCreate()
5227 @*/
5228 PetscErrorCode SNESGetLineSearch(SNES snes, SNESLineSearch *linesearch)
5229 {
5230   PetscErrorCode ierr;
5231   const char     *optionsprefix;
5232 
5233   PetscFunctionBegin;
5234   PetscValidHeaderSpecific(snes, SNES_CLASSID, 1);
5235   PetscValidPointer(linesearch, 2);
5236   if (!snes->linesearch) {
5237     ierr = SNESGetOptionsPrefix(snes, &optionsprefix);CHKERRQ(ierr);
5238     ierr = SNESLineSearchCreate(PetscObjectComm((PetscObject)snes), &snes->linesearch);CHKERRQ(ierr);
5239     ierr = SNESLineSearchSetSNES(snes->linesearch, snes);CHKERRQ(ierr);
5240     ierr = SNESLineSearchAppendOptionsPrefix(snes->linesearch, optionsprefix);CHKERRQ(ierr);
5241     ierr = PetscObjectIncrementTabLevel((PetscObject) snes->linesearch, (PetscObject) snes, 1);CHKERRQ(ierr);
5242     ierr = PetscLogObjectParent((PetscObject)snes, (PetscObject)snes->linesearch);CHKERRQ(ierr);
5243   }
5244   *linesearch = snes->linesearch;
5245   PetscFunctionReturn(0);
5246 }
5247 
5248 #if defined(PETSC_HAVE_MATLAB_ENGINE)
5249 #include <mex.h>
5250 
5251 typedef struct {char *funcname; mxArray *ctx;} SNESMatlabContext;
5252 
5253 /*
5254    SNESComputeFunction_Matlab - Calls the function that has been set with SNESSetFunctionMatlab().
5255 
5256    Collective on SNES
5257 
5258    Input Parameters:
5259 +  snes - the SNES context
5260 -  x - input vector
5261 
5262    Output Parameter:
5263 .  y - function vector, as set by SNESSetFunction()
5264 
5265    Notes:
5266    SNESComputeFunction() is typically used within nonlinear solvers
5267    implementations, so most users would not generally call this routine
5268    themselves.
5269 
5270    Level: developer
5271 
5272 .keywords: SNES, nonlinear, compute, function
5273 
5274 .seealso: SNESSetFunction(), SNESGetFunction()
5275 */
5276 PetscErrorCode  SNESComputeFunction_Matlab(SNES snes,Vec x,Vec y, void *ctx)
5277 {
5278   PetscErrorCode    ierr;
5279   SNESMatlabContext *sctx = (SNESMatlabContext*)ctx;
5280   int               nlhs  = 1,nrhs = 5;
5281   mxArray           *plhs[1],*prhs[5];
5282   long long int     lx = 0,ly = 0,ls = 0;
5283 
5284   PetscFunctionBegin;
5285   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
5286   PetscValidHeaderSpecific(x,VEC_CLASSID,2);
5287   PetscValidHeaderSpecific(y,VEC_CLASSID,3);
5288   PetscCheckSameComm(snes,1,x,2);
5289   PetscCheckSameComm(snes,1,y,3);
5290 
5291   /* call Matlab function in ctx with arguments x and y */
5292 
5293   ierr    = PetscMemcpy(&ls,&snes,sizeof(snes));CHKERRQ(ierr);
5294   ierr    = PetscMemcpy(&lx,&x,sizeof(x));CHKERRQ(ierr);
5295   ierr    = PetscMemcpy(&ly,&y,sizeof(x));CHKERRQ(ierr);
5296   prhs[0] = mxCreateDoubleScalar((double)ls);
5297   prhs[1] = mxCreateDoubleScalar((double)lx);
5298   prhs[2] = mxCreateDoubleScalar((double)ly);
5299   prhs[3] = mxCreateString(sctx->funcname);
5300   prhs[4] = sctx->ctx;
5301   ierr    = mexCallMATLAB(nlhs,plhs,nrhs,prhs,"PetscSNESComputeFunctionInternal");CHKERRQ(ierr);
5302   ierr    = mxGetScalar(plhs[0]);CHKERRQ(ierr);
5303   mxDestroyArray(prhs[0]);
5304   mxDestroyArray(prhs[1]);
5305   mxDestroyArray(prhs[2]);
5306   mxDestroyArray(prhs[3]);
5307   mxDestroyArray(plhs[0]);
5308   PetscFunctionReturn(0);
5309 }
5310 
5311 /*
5312    SNESSetFunctionMatlab - Sets the function evaluation routine and function
5313    vector for use by the SNES routines in solving systems of nonlinear
5314    equations from MATLAB. Here the function is a string containing the name of a MATLAB function
5315 
5316    Logically Collective on SNES
5317 
5318    Input Parameters:
5319 +  snes - the SNES context
5320 .  r - vector to store function value
5321 -  f - function evaluation routine
5322 
5323    Notes:
5324    The Newton-like methods typically solve linear systems of the form
5325 $      f'(x) x = -f(x),
5326    where f'(x) denotes the Jacobian matrix and f(x) is the function.
5327 
5328    Level: beginner
5329 
5330    Developer Note:  This bleeds the allocated memory SNESMatlabContext *sctx;
5331 
5332 .keywords: SNES, nonlinear, set, function
5333 
5334 .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian(), SNESSetFunction()
5335 */
5336 PetscErrorCode  SNESSetFunctionMatlab(SNES snes,Vec r,const char *f,mxArray *ctx)
5337 {
5338   PetscErrorCode    ierr;
5339   SNESMatlabContext *sctx;
5340 
5341   PetscFunctionBegin;
5342   /* currently sctx is memory bleed */
5343   ierr = PetscNew(&sctx);CHKERRQ(ierr);
5344   ierr = PetscStrallocpy(f,&sctx->funcname);CHKERRQ(ierr);
5345   /*
5346      This should work, but it doesn't
5347   sctx->ctx = ctx;
5348   mexMakeArrayPersistent(sctx->ctx);
5349   */
5350   sctx->ctx = mxDuplicateArray(ctx);
5351   ierr      = SNESSetFunction(snes,r,SNESComputeFunction_Matlab,sctx);CHKERRQ(ierr);
5352   PetscFunctionReturn(0);
5353 }
5354 
5355 /*
5356    SNESComputeJacobian_Matlab - Calls the function that has been set with SNESSetJacobianMatlab().
5357 
5358    Collective on SNES
5359 
5360    Input Parameters:
5361 +  snes - the SNES context
5362 .  x - input vector
5363 .  A, B - the matrices
5364 -  ctx - user context
5365 
5366    Level: developer
5367 
5368 .keywords: SNES, nonlinear, compute, function
5369 
5370 .seealso: SNESSetFunction(), SNESGetFunction()
5371 @*/
5372 PetscErrorCode  SNESComputeJacobian_Matlab(SNES snes,Vec x,Mat A,Mat B,void *ctx)
5373 {
5374   PetscErrorCode    ierr;
5375   SNESMatlabContext *sctx = (SNESMatlabContext*)ctx;
5376   int               nlhs  = 2,nrhs = 6;
5377   mxArray           *plhs[2],*prhs[6];
5378   long long int     lx = 0,lA = 0,ls = 0, lB = 0;
5379 
5380   PetscFunctionBegin;
5381   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
5382   PetscValidHeaderSpecific(x,VEC_CLASSID,2);
5383 
5384   /* call Matlab function in ctx with arguments x and y */
5385 
5386   ierr    = PetscMemcpy(&ls,&snes,sizeof(snes));CHKERRQ(ierr);
5387   ierr    = PetscMemcpy(&lx,&x,sizeof(x));CHKERRQ(ierr);
5388   ierr    = PetscMemcpy(&lA,A,sizeof(x));CHKERRQ(ierr);
5389   ierr    = PetscMemcpy(&lB,B,sizeof(x));CHKERRQ(ierr);
5390   prhs[0] = mxCreateDoubleScalar((double)ls);
5391   prhs[1] = mxCreateDoubleScalar((double)lx);
5392   prhs[2] = mxCreateDoubleScalar((double)lA);
5393   prhs[3] = mxCreateDoubleScalar((double)lB);
5394   prhs[4] = mxCreateString(sctx->funcname);
5395   prhs[5] = sctx->ctx;
5396   ierr    = mexCallMATLAB(nlhs,plhs,nrhs,prhs,"PetscSNESComputeJacobianInternal");CHKERRQ(ierr);
5397   ierr    = mxGetScalar(plhs[0]);CHKERRQ(ierr);
5398   mxDestroyArray(prhs[0]);
5399   mxDestroyArray(prhs[1]);
5400   mxDestroyArray(prhs[2]);
5401   mxDestroyArray(prhs[3]);
5402   mxDestroyArray(prhs[4]);
5403   mxDestroyArray(plhs[0]);
5404   mxDestroyArray(plhs[1]);
5405   PetscFunctionReturn(0);
5406 }
5407 
5408 /*
5409    SNESSetJacobianMatlab - Sets the Jacobian function evaluation routine and two empty Jacobian matrices
5410    vector for use by the SNES routines in solving systems of nonlinear
5411    equations from MATLAB. Here the function is a string containing the name of a MATLAB function
5412 
5413    Logically Collective on SNES
5414 
5415    Input Parameters:
5416 +  snes - the SNES context
5417 .  A,B - Jacobian matrices
5418 .  J - function evaluation routine
5419 -  ctx - user context
5420 
5421    Level: developer
5422 
5423    Developer Note:  This bleeds the allocated memory SNESMatlabContext *sctx;
5424 
5425 .keywords: SNES, nonlinear, set, function
5426 
5427 .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian(), SNESSetFunction(), J
5428 */
5429 PetscErrorCode  SNESSetJacobianMatlab(SNES snes,Mat A,Mat B,const char *J,mxArray *ctx)
5430 {
5431   PetscErrorCode    ierr;
5432   SNESMatlabContext *sctx;
5433 
5434   PetscFunctionBegin;
5435   /* currently sctx is memory bleed */
5436   ierr = PetscNew(&sctx);CHKERRQ(ierr);
5437   ierr = PetscStrallocpy(J,&sctx->funcname);CHKERRQ(ierr);
5438   /*
5439      This should work, but it doesn't
5440   sctx->ctx = ctx;
5441   mexMakeArrayPersistent(sctx->ctx);
5442   */
5443   sctx->ctx = mxDuplicateArray(ctx);
5444   ierr      = SNESSetJacobian(snes,A,B,SNESComputeJacobian_Matlab,sctx);CHKERRQ(ierr);
5445   PetscFunctionReturn(0);
5446 }
5447 
5448 /*
5449    SNESMonitor_Matlab - Calls the function that has been set with SNESMonitorSetMatlab().
5450 
5451    Collective on SNES
5452 
5453 .seealso: SNESSetFunction(), SNESGetFunction()
5454 @*/
5455 PetscErrorCode  SNESMonitor_Matlab(SNES snes,PetscInt it, PetscReal fnorm, void *ctx)
5456 {
5457   PetscErrorCode    ierr;
5458   SNESMatlabContext *sctx = (SNESMatlabContext*)ctx;
5459   int               nlhs  = 1,nrhs = 6;
5460   mxArray           *plhs[1],*prhs[6];
5461   long long int     lx = 0,ls = 0;
5462   Vec               x  = snes->vec_sol;
5463 
5464   PetscFunctionBegin;
5465   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
5466 
5467   ierr    = PetscMemcpy(&ls,&snes,sizeof(snes));CHKERRQ(ierr);
5468   ierr    = PetscMemcpy(&lx,&x,sizeof(x));CHKERRQ(ierr);
5469   prhs[0] = mxCreateDoubleScalar((double)ls);
5470   prhs[1] = mxCreateDoubleScalar((double)it);
5471   prhs[2] = mxCreateDoubleScalar((double)fnorm);
5472   prhs[3] = mxCreateDoubleScalar((double)lx);
5473   prhs[4] = mxCreateString(sctx->funcname);
5474   prhs[5] = sctx->ctx;
5475   ierr    = mexCallMATLAB(nlhs,plhs,nrhs,prhs,"PetscSNESMonitorInternal");CHKERRQ(ierr);
5476   ierr    = mxGetScalar(plhs[0]);CHKERRQ(ierr);
5477   mxDestroyArray(prhs[0]);
5478   mxDestroyArray(prhs[1]);
5479   mxDestroyArray(prhs[2]);
5480   mxDestroyArray(prhs[3]);
5481   mxDestroyArray(prhs[4]);
5482   mxDestroyArray(plhs[0]);
5483   PetscFunctionReturn(0);
5484 }
5485 
5486 /*
5487    SNESMonitorSetMatlab - Sets the monitor function from MATLAB
5488 
5489    Level: developer
5490 
5491    Developer Note:  This bleeds the allocated memory SNESMatlabContext *sctx;
5492 
5493 .keywords: SNES, nonlinear, set, function
5494 
5495 .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian(), SNESSetFunction()
5496 */
5497 PetscErrorCode  SNESMonitorSetMatlab(SNES snes,const char *f,mxArray *ctx)
5498 {
5499   PetscErrorCode    ierr;
5500   SNESMatlabContext *sctx;
5501 
5502   PetscFunctionBegin;
5503   /* currently sctx is memory bleed */
5504   ierr = PetscNew(&sctx);CHKERRQ(ierr);
5505   ierr = PetscStrallocpy(f,&sctx->funcname);CHKERRQ(ierr);
5506   /*
5507      This should work, but it doesn't
5508   sctx->ctx = ctx;
5509   mexMakeArrayPersistent(sctx->ctx);
5510   */
5511   sctx->ctx = mxDuplicateArray(ctx);
5512   ierr      = SNESMonitorSet(snes,SNESMonitor_Matlab,sctx,NULL);CHKERRQ(ierr);
5513   PetscFunctionReturn(0);
5514 }
5515 
5516 #endif
5517