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