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