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