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