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