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