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