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