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