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