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