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