xref: /petsc/src/snes/interface/snes.c (revision 966be33a19c9230d4aa438248a644248d45cc287)
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 
3477   PetscFunctionBegin;
3478   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3479   if (snes->numbermonitors >= MAXSNESMONITORS) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Too many monitors set");
3480   for (i=0; i<snes->numbermonitors;i++) {
3481     if (f == snes->monitor[i] && monitordestroy == snes->monitordestroy[i] && mctx == snes->monitorcontext[i]) {
3482       if (monitordestroy) {
3483         ierr = (*monitordestroy)(&mctx);CHKERRQ(ierr);
3484       }
3485       PetscFunctionReturn(0);
3486     }
3487   }
3488   snes->monitor[snes->numbermonitors]          = f;
3489   snes->monitordestroy[snes->numbermonitors]   = monitordestroy;
3490   snes->monitorcontext[snes->numbermonitors++] = (void*)mctx;
3491   PetscFunctionReturn(0);
3492 }
3493 
3494 #undef __FUNCT__
3495 #define __FUNCT__ "SNESMonitorCancel"
3496 /*@
3497    SNESMonitorCancel - Clears all the monitor functions for a SNES object.
3498 
3499    Logically Collective on SNES
3500 
3501    Input Parameters:
3502 .  snes - the SNES context
3503 
3504    Options Database Key:
3505 .  -snes_monitor_cancel - cancels all monitors that have been hardwired
3506     into a code by calls to SNESMonitorSet(), but does not cancel those
3507     set via the options database
3508 
3509    Notes:
3510    There is no way to clear one specific monitor from a SNES object.
3511 
3512    Level: intermediate
3513 
3514 .keywords: SNES, nonlinear, set, monitor
3515 
3516 .seealso: SNESMonitorDefault(), SNESMonitorSet()
3517 @*/
3518 PetscErrorCode  SNESMonitorCancel(SNES snes)
3519 {
3520   PetscErrorCode ierr;
3521   PetscInt       i;
3522 
3523   PetscFunctionBegin;
3524   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3525   for (i=0; i<snes->numbermonitors; i++) {
3526     if (snes->monitordestroy[i]) {
3527       ierr = (*snes->monitordestroy[i])(&snes->monitorcontext[i]);CHKERRQ(ierr);
3528     }
3529   }
3530   snes->numbermonitors = 0;
3531   PetscFunctionReturn(0);
3532 }
3533 
3534 /*MC
3535     SNESConvergenceTestFunction - functional form used for testing of convergence of nonlinear solver
3536 
3537      Synopsis:
3538      #include <petscsnes.h>
3539 $     PetscErrorCode SNESConvergenceTest(SNES snes,PetscInt it,PetscReal xnorm,PetscReal gnorm,PetscReal f,SNESConvergedReason *reason,void *cctx)
3540 
3541 +    snes - the SNES context
3542 .    it - current iteration (0 is the first and is before any Newton step)
3543 .    cctx - [optional] convergence context
3544 .    reason - reason for convergence/divergence
3545 .    xnorm - 2-norm of current iterate
3546 .    gnorm - 2-norm of current step
3547 -    f - 2-norm of function
3548 
3549    Level: intermediate
3550 
3551 .seealso:   SNESSetConvergenceTest(), SNESGetConvergenceTest()
3552 M*/
3553 
3554 #undef __FUNCT__
3555 #define __FUNCT__ "SNESSetConvergenceTest"
3556 /*@C
3557    SNESSetConvergenceTest - Sets the function that is to be used
3558    to test for convergence of the nonlinear iterative solution.
3559 
3560    Logically Collective on SNES
3561 
3562    Input Parameters:
3563 +  snes - the SNES context
3564 .  SNESConvergenceTestFunction - routine to test for convergence
3565 .  cctx - [optional] context for private data for the convergence routine  (may be NULL)
3566 -  destroy - [optional] destructor for the context (may be NULL; NULL_FUNCTION in Fortran)
3567 
3568    Level: advanced
3569 
3570 .keywords: SNES, nonlinear, set, convergence, test
3571 
3572 .seealso: SNESConvergedDefault(), SNESConvergedSkip(), SNESConvergenceTestFunction
3573 @*/
3574 PetscErrorCode  SNESSetConvergenceTest(SNES snes,PetscErrorCode (*SNESConvergenceTestFunction)(SNES,PetscInt,PetscReal,PetscReal,PetscReal,SNESConvergedReason*,void*),void *cctx,PetscErrorCode (*destroy)(void*))
3575 {
3576   PetscErrorCode ierr;
3577 
3578   PetscFunctionBegin;
3579   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3580   if (!SNESConvergenceTestFunction) SNESConvergenceTestFunction = SNESConvergedSkip;
3581   if (snes->ops->convergeddestroy) {
3582     ierr = (*snes->ops->convergeddestroy)(snes->cnvP);CHKERRQ(ierr);
3583   }
3584   snes->ops->converged        = SNESConvergenceTestFunction;
3585   snes->ops->convergeddestroy = destroy;
3586   snes->cnvP                  = cctx;
3587   PetscFunctionReturn(0);
3588 }
3589 
3590 #undef __FUNCT__
3591 #define __FUNCT__ "SNESGetConvergedReason"
3592 /*@
3593    SNESGetConvergedReason - Gets the reason the SNES iteration was stopped.
3594 
3595    Not Collective
3596 
3597    Input Parameter:
3598 .  snes - the SNES context
3599 
3600    Output Parameter:
3601 .  reason - negative value indicates diverged, positive value converged, see SNESConvergedReason or the
3602             manual pages for the individual convergence tests for complete lists
3603 
3604    Level: intermediate
3605 
3606    Notes: Can only be called after the call the SNESSolve() is complete.
3607 
3608 .keywords: SNES, nonlinear, set, convergence, test
3609 
3610 .seealso: SNESSetConvergenceTest(), SNESSetConvergedReason(), SNESConvergedReason
3611 @*/
3612 PetscErrorCode SNESGetConvergedReason(SNES snes,SNESConvergedReason *reason)
3613 {
3614   PetscFunctionBegin;
3615   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3616   PetscValidPointer(reason,2);
3617   *reason = snes->reason;
3618   PetscFunctionReturn(0);
3619 }
3620 
3621 #undef __FUNCT__
3622 #define __FUNCT__ "SNESSetConvergedReason"
3623 /*@
3624    SNESSetConvergedReason - Sets the reason the SNES iteration was stopped.
3625 
3626    Not Collective
3627 
3628    Input Parameters:
3629 +  snes - the SNES context
3630 -  reason - negative value indicates diverged, positive value converged, see SNESConvergedReason or the
3631             manual pages for the individual convergence tests for complete lists
3632 
3633    Level: intermediate
3634 
3635 .keywords: SNES, nonlinear, set, convergence, test
3636 .seealso: SNESGetConvergedReason(), SNESSetConvergenceTest(), SNESConvergedReason
3637 @*/
3638 PetscErrorCode SNESSetConvergedReason(SNES snes,SNESConvergedReason reason)
3639 {
3640   PetscFunctionBegin;
3641   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3642   snes->reason = reason;
3643   PetscFunctionReturn(0);
3644 }
3645 
3646 #undef __FUNCT__
3647 #define __FUNCT__ "SNESSetConvergenceHistory"
3648 /*@
3649    SNESSetConvergenceHistory - Sets the array used to hold the convergence history.
3650 
3651    Logically Collective on SNES
3652 
3653    Input Parameters:
3654 +  snes - iterative context obtained from SNESCreate()
3655 .  a   - array to hold history, this array will contain the function norms computed at each step
3656 .  its - integer array holds the number of linear iterations for each solve.
3657 .  na  - size of a and its
3658 -  reset - PETSC_TRUE indicates each new nonlinear solve resets the history counter to zero,
3659            else it continues storing new values for new nonlinear solves after the old ones
3660 
3661    Notes:
3662    If 'a' and 'its' are NULL then space is allocated for the history. If 'na' PETSC_DECIDE or PETSC_DEFAULT then a
3663    default array of length 10000 is allocated.
3664 
3665    This routine is useful, e.g., when running a code for purposes
3666    of accurate performance monitoring, when no I/O should be done
3667    during the section of code that is being timed.
3668 
3669    Level: intermediate
3670 
3671 .keywords: SNES, set, convergence, history
3672 
3673 .seealso: SNESGetConvergenceHistory()
3674 
3675 @*/
3676 PetscErrorCode  SNESSetConvergenceHistory(SNES snes,PetscReal a[],PetscInt its[],PetscInt na,PetscBool reset)
3677 {
3678   PetscErrorCode ierr;
3679 
3680   PetscFunctionBegin;
3681   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3682   if (a) PetscValidScalarPointer(a,2);
3683   if (its) PetscValidIntPointer(its,3);
3684   if (!a) {
3685     if (na == PETSC_DECIDE || na == PETSC_DEFAULT) na = 1000;
3686     ierr = PetscCalloc1(na,&a);CHKERRQ(ierr);
3687     ierr = PetscCalloc1(na,&its);CHKERRQ(ierr);
3688 
3689     snes->conv_malloc = PETSC_TRUE;
3690   }
3691   snes->conv_hist       = a;
3692   snes->conv_hist_its   = its;
3693   snes->conv_hist_max   = na;
3694   snes->conv_hist_len   = 0;
3695   snes->conv_hist_reset = reset;
3696   PetscFunctionReturn(0);
3697 }
3698 
3699 #if defined(PETSC_HAVE_MATLAB_ENGINE)
3700 #include <engine.h>   /* MATLAB include file */
3701 #include <mex.h>      /* MATLAB include file */
3702 
3703 #undef __FUNCT__
3704 #define __FUNCT__ "SNESGetConvergenceHistoryMatlab"
3705 PETSC_EXTERN mxArray *SNESGetConvergenceHistoryMatlab(SNES snes)
3706 {
3707   mxArray   *mat;
3708   PetscInt  i;
3709   PetscReal *ar;
3710 
3711   PetscFunctionBegin;
3712   mat = mxCreateDoubleMatrix(snes->conv_hist_len,1,mxREAL);
3713   ar  = (PetscReal*) mxGetData(mat);
3714   for (i=0; i<snes->conv_hist_len; i++) ar[i] = snes->conv_hist[i];
3715   PetscFunctionReturn(mat);
3716 }
3717 #endif
3718 
3719 #undef __FUNCT__
3720 #define __FUNCT__ "SNESGetConvergenceHistory"
3721 /*@C
3722    SNESGetConvergenceHistory - Gets the array used to hold the convergence history.
3723 
3724    Not Collective
3725 
3726    Input Parameter:
3727 .  snes - iterative context obtained from SNESCreate()
3728 
3729    Output Parameters:
3730 .  a   - array to hold history
3731 .  its - integer array holds the number of linear iterations (or
3732          negative if not converged) for each solve.
3733 -  na  - size of a and its
3734 
3735    Notes:
3736     The calling sequence for this routine in Fortran is
3737 $   call SNESGetConvergenceHistory(SNES snes, integer na, integer ierr)
3738 
3739    This routine is useful, e.g., when running a code for purposes
3740    of accurate performance monitoring, when no I/O should be done
3741    during the section of code that is being timed.
3742 
3743    Level: intermediate
3744 
3745 .keywords: SNES, get, convergence, history
3746 
3747 .seealso: SNESSetConvergencHistory()
3748 
3749 @*/
3750 PetscErrorCode  SNESGetConvergenceHistory(SNES snes,PetscReal *a[],PetscInt *its[],PetscInt *na)
3751 {
3752   PetscFunctionBegin;
3753   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3754   if (a)   *a   = snes->conv_hist;
3755   if (its) *its = snes->conv_hist_its;
3756   if (na)  *na  = snes->conv_hist_len;
3757   PetscFunctionReturn(0);
3758 }
3759 
3760 #undef __FUNCT__
3761 #define __FUNCT__ "SNESSetUpdate"
3762 /*@C
3763   SNESSetUpdate - Sets the general-purpose update function called
3764   at the beginning of every iteration of the nonlinear solve. Specifically
3765   it is called just before the Jacobian is "evaluated".
3766 
3767   Logically Collective on SNES
3768 
3769   Input Parameters:
3770 . snes - The nonlinear solver context
3771 . func - The function
3772 
3773   Calling sequence of func:
3774 . func (SNES snes, PetscInt step);
3775 
3776 . step - The current step of the iteration
3777 
3778   Level: advanced
3779 
3780   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()
3781         This is not used by most users.
3782 
3783 .keywords: SNES, update
3784 
3785 .seealso SNESSetJacobian(), SNESSolve()
3786 @*/
3787 PetscErrorCode  SNESSetUpdate(SNES snes, PetscErrorCode (*func)(SNES, PetscInt))
3788 {
3789   PetscFunctionBegin;
3790   PetscValidHeaderSpecific(snes, SNES_CLASSID,1);
3791   snes->ops->update = func;
3792   PetscFunctionReturn(0);
3793 }
3794 
3795 #undef __FUNCT__
3796 #define __FUNCT__ "SNESScaleStep_Private"
3797 /*
3798    SNESScaleStep_Private - Scales a step so that its length is less than the
3799    positive parameter delta.
3800 
3801     Input Parameters:
3802 +   snes - the SNES context
3803 .   y - approximate solution of linear system
3804 .   fnorm - 2-norm of current function
3805 -   delta - trust region size
3806 
3807     Output Parameters:
3808 +   gpnorm - predicted function norm at the new point, assuming local
3809     linearization.  The value is zero if the step lies within the trust
3810     region, and exceeds zero otherwise.
3811 -   ynorm - 2-norm of the step
3812 
3813     Note:
3814     For non-trust region methods such as SNESNEWTONLS, the parameter delta
3815     is set to be the maximum allowable step size.
3816 
3817 .keywords: SNES, nonlinear, scale, step
3818 */
3819 PetscErrorCode SNESScaleStep_Private(SNES snes,Vec y,PetscReal *fnorm,PetscReal *delta,PetscReal *gpnorm,PetscReal *ynorm)
3820 {
3821   PetscReal      nrm;
3822   PetscScalar    cnorm;
3823   PetscErrorCode ierr;
3824 
3825   PetscFunctionBegin;
3826   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3827   PetscValidHeaderSpecific(y,VEC_CLASSID,2);
3828   PetscCheckSameComm(snes,1,y,2);
3829 
3830   ierr = VecNorm(y,NORM_2,&nrm);CHKERRQ(ierr);
3831   if (nrm > *delta) {
3832     nrm     = *delta/nrm;
3833     *gpnorm = (1.0 - nrm)*(*fnorm);
3834     cnorm   = nrm;
3835     ierr    = VecScale(y,cnorm);CHKERRQ(ierr);
3836     *ynorm  = *delta;
3837   } else {
3838     *gpnorm = 0.0;
3839     *ynorm  = nrm;
3840   }
3841   PetscFunctionReturn(0);
3842 }
3843 
3844 #undef __FUNCT__
3845 #define __FUNCT__ "SNESReasonView"
3846 /*@
3847    SNESReasonView - Displays the reason a SNES solve converged or diverged to a viewer
3848 
3849    Collective on SNES
3850 
3851    Parameter:
3852 +  snes - iterative context obtained from SNESCreate()
3853 -  viewer - the viewer to display the reason
3854 
3855 
3856    Options Database Keys:
3857 .  -snes_converged_reason - print reason for converged or diverged, also prints number of iterations
3858 
3859    Level: beginner
3860 
3861 .keywords: SNES, solve, linear system
3862 
3863 .seealso: SNESCreate(), SNESSetUp(), SNESDestroy(), SNESSetTolerances(), SNESConvergedDefault()
3864 
3865 @*/
3866 PetscErrorCode  SNESReasonView(SNES snes,PetscViewer viewer)
3867 {
3868   PetscErrorCode ierr;
3869   PetscBool      isAscii;
3870 
3871   PetscFunctionBegin;
3872   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isAscii);CHKERRQ(ierr);
3873   if (isAscii) {
3874     ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
3875     if (snes->reason > 0) {
3876       if (((PetscObject) snes)->prefix) {
3877         ierr = PetscViewerASCIIPrintf(viewer,"Nonlinear %s solve converged due to %s iterations %D\n",((PetscObject) snes)->prefix,SNESConvergedReasons[snes->reason],snes->iter);CHKERRQ(ierr);
3878       } else {
3879         ierr = PetscViewerASCIIPrintf(viewer,"Nonlinear solve converged due to %s iterations %D\n",SNESConvergedReasons[snes->reason],snes->iter);CHKERRQ(ierr);
3880       }
3881     } else {
3882       if (((PetscObject) snes)->prefix) {
3883         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);
3884       } else {
3885         ierr = PetscViewerASCIIPrintf(viewer,"Nonlinear solve did not converge due to %s iterations %D\n",SNESConvergedReasons[snes->reason],snes->iter);CHKERRQ(ierr);
3886       }
3887     }
3888     ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
3889   }
3890   PetscFunctionReturn(0);
3891 }
3892 
3893 #undef __FUNCT__
3894 #define __FUNCT__ "SNESReasonViewFromOptions"
3895 /*@C
3896   SNESReasonViewFromOptions - Processes command line options to determine if/how a SNESReason is to be viewed.
3897 
3898   Collective on SNES
3899 
3900   Input Parameters:
3901 . snes   - the SNES object
3902 
3903   Level: intermediate
3904 
3905 @*/
3906 PetscErrorCode SNESReasonViewFromOptions(SNES snes)
3907 {
3908   PetscErrorCode    ierr;
3909   PetscViewer       viewer;
3910   PetscBool         flg;
3911   static PetscBool  incall = PETSC_FALSE;
3912   PetscViewerFormat format;
3913 
3914   PetscFunctionBegin;
3915   if (incall) PetscFunctionReturn(0);
3916   incall = PETSC_TRUE;
3917   ierr   = PetscOptionsGetViewer(PetscObjectComm((PetscObject)snes),((PetscObject)snes)->prefix,"-snes_converged_reason",&viewer,&format,&flg);CHKERRQ(ierr);
3918   if (flg) {
3919     ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr);
3920     ierr = SNESReasonView(snes,viewer);CHKERRQ(ierr);
3921     ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
3922     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
3923   }
3924   incall = PETSC_FALSE;
3925   PetscFunctionReturn(0);
3926 }
3927 
3928 #undef __FUNCT__
3929 #define __FUNCT__ "SNESSolve"
3930 /*@C
3931    SNESSolve - Solves a nonlinear system F(x) = b.
3932    Call SNESSolve() after calling SNESCreate() and optional routines of the form SNESSetXXX().
3933 
3934    Collective on SNES
3935 
3936    Input Parameters:
3937 +  snes - the SNES context
3938 .  b - the constant part of the equation F(x) = b, or NULL to use zero.
3939 -  x - the solution vector.
3940 
3941    Notes:
3942    The user should initialize the vector,x, with the initial guess
3943    for the nonlinear solve prior to calling SNESSolve.  In particular,
3944    to employ an initial guess of zero, the user should explicitly set
3945    this vector to zero by calling VecSet().
3946 
3947    Level: beginner
3948 
3949 .keywords: SNES, nonlinear, solve
3950 
3951 .seealso: SNESCreate(), SNESDestroy(), SNESSetFunction(), SNESSetJacobian(), SNESSetGridSequence(), SNESGetSolution()
3952 @*/
3953 PetscErrorCode  SNESSolve(SNES snes,Vec b,Vec x)
3954 {
3955   PetscErrorCode    ierr;
3956   PetscBool         flg;
3957   PetscInt          grid;
3958   Vec               xcreated = NULL;
3959   DM                dm;
3960 
3961   PetscFunctionBegin;
3962   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3963   if (x) PetscValidHeaderSpecific(x,VEC_CLASSID,3);
3964   if (x) PetscCheckSameComm(snes,1,x,3);
3965   if (b) PetscValidHeaderSpecific(b,VEC_CLASSID,2);
3966   if (b) PetscCheckSameComm(snes,1,b,2);
3967 
3968   if (!x) {
3969     ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
3970     ierr = DMCreateGlobalVector(dm,&xcreated);CHKERRQ(ierr);
3971     x    = xcreated;
3972   }
3973   ierr = SNESViewFromOptions(snes,NULL,"-snes_view_pre");CHKERRQ(ierr);
3974 
3975   for (grid=0; grid<snes->gridsequence; grid++) {ierr = PetscViewerASCIIPushTab(PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)snes)));CHKERRQ(ierr);}
3976   for (grid=0; grid<snes->gridsequence+1; grid++) {
3977 
3978     /* set solution vector */
3979     if (!grid) {ierr = PetscObjectReference((PetscObject)x);CHKERRQ(ierr);}
3980     ierr          = VecDestroy(&snes->vec_sol);CHKERRQ(ierr);
3981     snes->vec_sol = x;
3982     ierr          = SNESGetDM(snes,&dm);CHKERRQ(ierr);
3983 
3984     /* set affine vector if provided */
3985     if (b) { ierr = PetscObjectReference((PetscObject)b);CHKERRQ(ierr); }
3986     ierr          = VecDestroy(&snes->vec_rhs);CHKERRQ(ierr);
3987     snes->vec_rhs = b;
3988 
3989     if (snes->vec_func == snes->vec_sol) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_IDN,"Solution vector cannot be function vector");
3990     if (snes->vec_rhs  == snes->vec_sol) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_IDN,"Solution vector cannot be right hand side vector");
3991     if (!snes->vec_sol_update /* && snes->vec_sol */) {
3992       ierr = VecDuplicate(snes->vec_sol,&snes->vec_sol_update);CHKERRQ(ierr);
3993       ierr = PetscLogObjectParent((PetscObject)snes,(PetscObject)snes->vec_sol_update);CHKERRQ(ierr);
3994     }
3995     ierr = DMShellSetGlobalVector(dm,snes->vec_sol);CHKERRQ(ierr);
3996     ierr = SNESSetUp(snes);CHKERRQ(ierr);
3997 
3998     if (!grid) {
3999       if (snes->ops->computeinitialguess) {
4000         ierr = (*snes->ops->computeinitialguess)(snes,snes->vec_sol,snes->initialguessP);CHKERRQ(ierr);
4001       }
4002     }
4003 
4004     if (snes->conv_hist_reset) snes->conv_hist_len = 0;
4005     if (snes->counters_reset) {snes->nfuncs = 0; snes->linear_its = 0; snes->numFailures = 0;}
4006 
4007     ierr = PetscLogEventBegin(SNES_Solve,snes,0,0,0);CHKERRQ(ierr);
4008     ierr = (*snes->ops->solve)(snes);CHKERRQ(ierr);
4009     ierr = PetscLogEventEnd(SNES_Solve,snes,0,0,0);CHKERRQ(ierr);
4010     if (!snes->reason) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Internal error, solver returned without setting converged reason");
4011     snes->domainerror = PETSC_FALSE; /* clear the flag if it has been set */
4012 
4013     if (snes->lagjac_persist) snes->jac_iter += snes->iter;
4014     if (snes->lagpre_persist) snes->pre_iter += snes->iter;
4015 
4016     ierr   = PetscOptionsGetViewer(PetscObjectComm((PetscObject)snes),((PetscObject)snes)->prefix,"-snes_test_local_min",NULL,NULL,&flg);CHKERRQ(ierr);
4017     if (flg && !PetscPreLoadingOn) { ierr = SNESTestLocalMin(snes);CHKERRQ(ierr); }
4018     ierr = SNESReasonViewFromOptions(snes);CHKERRQ(ierr);
4019 
4020     if (snes->errorifnotconverged && snes->reason < 0) SETERRQ(PetscObjectComm((PetscObject)snes),PETSC_ERR_NOT_CONVERGED,"SNESSolve has not converged");
4021     if (snes->reason < 0) break;
4022     if (grid <  snes->gridsequence) {
4023       DM  fine;
4024       Vec xnew;
4025       Mat interp;
4026 
4027       ierr = DMRefine(snes->dm,PetscObjectComm((PetscObject)snes),&fine);CHKERRQ(ierr);
4028       if (!fine) SETERRQ(PetscObjectComm((PetscObject)snes),PETSC_ERR_ARG_INCOMP,"DMRefine() did not perform any refinement, cannot continue grid sequencing");
4029       ierr = DMCreateInterpolation(snes->dm,fine,&interp,NULL);CHKERRQ(ierr);
4030       ierr = DMCreateGlobalVector(fine,&xnew);CHKERRQ(ierr);
4031       ierr = MatInterpolate(interp,x,xnew);CHKERRQ(ierr);
4032       ierr = DMInterpolate(snes->dm,interp,fine);CHKERRQ(ierr);
4033       ierr = MatDestroy(&interp);CHKERRQ(ierr);
4034       x    = xnew;
4035 
4036       ierr = SNESReset(snes);CHKERRQ(ierr);
4037       ierr = SNESSetDM(snes,fine);CHKERRQ(ierr);
4038       ierr = DMDestroy(&fine);CHKERRQ(ierr);
4039       ierr = PetscViewerASCIIPopTab(PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)snes)));CHKERRQ(ierr);
4040     }
4041   }
4042   ierr = SNESViewFromOptions(snes,NULL,"-snes_view");CHKERRQ(ierr);
4043   ierr = VecViewFromOptions(snes->vec_sol,(PetscObject)snes,"-snes_view_solution");CHKERRQ(ierr);
4044 
4045   ierr = VecDestroy(&xcreated);CHKERRQ(ierr);
4046   ierr = PetscObjectSAWsBlock((PetscObject)snes);CHKERRQ(ierr);
4047   PetscFunctionReturn(0);
4048 }
4049 
4050 /* --------- Internal routines for SNES Package --------- */
4051 
4052 #undef __FUNCT__
4053 #define __FUNCT__ "SNESSetType"
4054 /*@C
4055    SNESSetType - Sets the method for the nonlinear solver.
4056 
4057    Collective on SNES
4058 
4059    Input Parameters:
4060 +  snes - the SNES context
4061 -  type - a known method
4062 
4063    Options Database Key:
4064 .  -snes_type <type> - Sets the method; use -help for a list
4065    of available methods (for instance, newtonls or newtontr)
4066 
4067    Notes:
4068    See "petsc/include/petscsnes.h" for available methods (for instance)
4069 +    SNESNEWTONLS - Newton's method with line search
4070      (systems of nonlinear equations)
4071 .    SNESNEWTONTR - Newton's method with trust region
4072      (systems of nonlinear equations)
4073 
4074   Normally, it is best to use the SNESSetFromOptions() command and then
4075   set the SNES solver type from the options database rather than by using
4076   this routine.  Using the options database provides the user with
4077   maximum flexibility in evaluating the many nonlinear solvers.
4078   The SNESSetType() routine is provided for those situations where it
4079   is necessary to set the nonlinear solver independently of the command
4080   line or options database.  This might be the case, for example, when
4081   the choice of solver changes during the execution of the program,
4082   and the user's application is taking responsibility for choosing the
4083   appropriate method.
4084 
4085     Developer Notes: SNESRegister() adds a constructor for a new SNESType to SNESList, SNESSetType() locates
4086     the constructor in that list and calls it to create the spexific object.
4087 
4088   Level: intermediate
4089 
4090 .keywords: SNES, set, type
4091 
4092 .seealso: SNESType, SNESCreate(), SNESDestroy(), SNESGetType(), SNESSetFromOptions()
4093 
4094 @*/
4095 PetscErrorCode  SNESSetType(SNES snes,SNESType type)
4096 {
4097   PetscErrorCode ierr,(*r)(SNES);
4098   PetscBool      match;
4099 
4100   PetscFunctionBegin;
4101   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4102   PetscValidCharPointer(type,2);
4103 
4104   ierr = PetscObjectTypeCompare((PetscObject)snes,type,&match);CHKERRQ(ierr);
4105   if (match) PetscFunctionReturn(0);
4106 
4107   ierr =  PetscFunctionListFind(SNESList,type,&r);CHKERRQ(ierr);
4108   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested SNES type %s",type);
4109   /* Destroy the previous private SNES context */
4110   if (snes->ops->destroy) {
4111     ierr               = (*(snes)->ops->destroy)(snes);CHKERRQ(ierr);
4112     snes->ops->destroy = NULL;
4113   }
4114   /* Reinitialize function pointers in SNESOps structure */
4115   snes->ops->setup          = 0;
4116   snes->ops->solve          = 0;
4117   snes->ops->view           = 0;
4118   snes->ops->setfromoptions = 0;
4119   snes->ops->destroy        = 0;
4120   /* Call the SNESCreate_XXX routine for this particular Nonlinear solver */
4121   snes->setupcalled = PETSC_FALSE;
4122 
4123   ierr = PetscObjectChangeTypeName((PetscObject)snes,type);CHKERRQ(ierr);
4124   ierr = (*r)(snes);CHKERRQ(ierr);
4125   PetscFunctionReturn(0);
4126 }
4127 
4128 #undef __FUNCT__
4129 #define __FUNCT__ "SNESGetType"
4130 /*@C
4131    SNESGetType - Gets the SNES method type and name (as a string).
4132 
4133    Not Collective
4134 
4135    Input Parameter:
4136 .  snes - nonlinear solver context
4137 
4138    Output Parameter:
4139 .  type - SNES method (a character string)
4140 
4141    Level: intermediate
4142 
4143 .keywords: SNES, nonlinear, get, type, name
4144 @*/
4145 PetscErrorCode  SNESGetType(SNES snes,SNESType *type)
4146 {
4147   PetscFunctionBegin;
4148   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4149   PetscValidPointer(type,2);
4150   *type = ((PetscObject)snes)->type_name;
4151   PetscFunctionReturn(0);
4152 }
4153 
4154 #undef __FUNCT__
4155 #define __FUNCT__ "SNESSetSolution"
4156 /*@
4157   SNESSetSolution - Sets the solution vector for use by the SNES routines.
4158 
4159   Logically Collective on SNES and Vec
4160 
4161   Input Parameters:
4162 + snes - the SNES context obtained from SNESCreate()
4163 - u    - the solution vector
4164 
4165   Level: beginner
4166 
4167 .keywords: SNES, set, solution
4168 @*/
4169 PetscErrorCode SNESSetSolution(SNES snes, Vec u)
4170 {
4171   DM             dm;
4172   PetscErrorCode ierr;
4173 
4174   PetscFunctionBegin;
4175   PetscValidHeaderSpecific(snes, SNES_CLASSID, 1);
4176   PetscValidHeaderSpecific(u, VEC_CLASSID, 2);
4177   ierr = PetscObjectReference((PetscObject) u);CHKERRQ(ierr);
4178   ierr = VecDestroy(&snes->vec_sol);CHKERRQ(ierr);
4179 
4180   snes->vec_sol = u;
4181 
4182   ierr = SNESGetDM(snes, &dm);CHKERRQ(ierr);
4183   ierr = DMShellSetGlobalVector(dm, u);CHKERRQ(ierr);
4184   PetscFunctionReturn(0);
4185 }
4186 
4187 #undef __FUNCT__
4188 #define __FUNCT__ "SNESGetSolution"
4189 /*@
4190    SNESGetSolution - Returns the vector where the approximate solution is
4191    stored. This is the fine grid solution when using SNESSetGridSequence().
4192 
4193    Not Collective, but Vec is parallel if SNES is parallel
4194 
4195    Input Parameter:
4196 .  snes - the SNES context
4197 
4198    Output Parameter:
4199 .  x - the solution
4200 
4201    Level: intermediate
4202 
4203 .keywords: SNES, nonlinear, get, solution
4204 
4205 .seealso:  SNESGetSolutionUpdate(), SNESGetFunction()
4206 @*/
4207 PetscErrorCode  SNESGetSolution(SNES snes,Vec *x)
4208 {
4209   PetscFunctionBegin;
4210   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4211   PetscValidPointer(x,2);
4212   *x = snes->vec_sol;
4213   PetscFunctionReturn(0);
4214 }
4215 
4216 #undef __FUNCT__
4217 #define __FUNCT__ "SNESGetSolutionUpdate"
4218 /*@
4219    SNESGetSolutionUpdate - Returns the vector where the solution update is
4220    stored.
4221 
4222    Not Collective, but Vec is parallel if SNES is parallel
4223 
4224    Input Parameter:
4225 .  snes - the SNES context
4226 
4227    Output Parameter:
4228 .  x - the solution update
4229 
4230    Level: advanced
4231 
4232 .keywords: SNES, nonlinear, get, solution, update
4233 
4234 .seealso: SNESGetSolution(), SNESGetFunction()
4235 @*/
4236 PetscErrorCode  SNESGetSolutionUpdate(SNES snes,Vec *x)
4237 {
4238   PetscFunctionBegin;
4239   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4240   PetscValidPointer(x,2);
4241   *x = snes->vec_sol_update;
4242   PetscFunctionReturn(0);
4243 }
4244 
4245 #undef __FUNCT__
4246 #define __FUNCT__ "SNESGetFunction"
4247 /*@C
4248    SNESGetFunction - Returns the vector where the function is stored.
4249 
4250    Not Collective, but Vec is parallel if SNES is parallel. Collective if Vec is requested, but has not been created yet.
4251 
4252    Input Parameter:
4253 .  snes - the SNES context
4254 
4255    Output Parameter:
4256 +  r - the vector that is used to store residuals (or NULL if you don't want it)
4257 .  f - the function (or NULL if you don't want it); see SNESFunction for calling sequence details
4258 -  ctx - the function context (or NULL if you don't want it)
4259 
4260    Level: advanced
4261 
4262 .keywords: SNES, nonlinear, get, function
4263 
4264 .seealso: SNESSetFunction(), SNESGetSolution(), SNESFunction
4265 @*/
4266 PetscErrorCode  SNESGetFunction(SNES snes,Vec *r,PetscErrorCode (**f)(SNES,Vec,Vec,void*),void **ctx)
4267 {
4268   PetscErrorCode ierr;
4269   DM             dm;
4270 
4271   PetscFunctionBegin;
4272   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4273   if (r) {
4274     if (!snes->vec_func) {
4275       if (snes->vec_rhs) {
4276         ierr = VecDuplicate(snes->vec_rhs,&snes->vec_func);CHKERRQ(ierr);
4277       } else if (snes->vec_sol) {
4278         ierr = VecDuplicate(snes->vec_sol,&snes->vec_func);CHKERRQ(ierr);
4279       } else if (snes->dm) {
4280         ierr = DMCreateGlobalVector(snes->dm,&snes->vec_func);CHKERRQ(ierr);
4281       }
4282     }
4283     *r = snes->vec_func;
4284   }
4285   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
4286   ierr = DMSNESGetFunction(dm,f,ctx);CHKERRQ(ierr);
4287   PetscFunctionReturn(0);
4288 }
4289 
4290 /*@C
4291    SNESGetNGS - Returns the NGS function and context.
4292 
4293    Input Parameter:
4294 .  snes - the SNES context
4295 
4296    Output Parameter:
4297 +  f - the function (or NULL) see SNESNGSFunction for details
4298 -  ctx    - the function context (or NULL)
4299 
4300    Level: advanced
4301 
4302 .keywords: SNES, nonlinear, get, function
4303 
4304 .seealso: SNESSetNGS(), SNESGetFunction()
4305 @*/
4306 
4307 #undef __FUNCT__
4308 #define __FUNCT__ "SNESGetNGS"
4309 PetscErrorCode SNESGetNGS (SNES snes, PetscErrorCode (**f)(SNES, Vec, Vec, void*), void ** ctx)
4310 {
4311   PetscErrorCode ierr;
4312   DM             dm;
4313 
4314   PetscFunctionBegin;
4315   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4316   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
4317   ierr = DMSNESGetNGS(dm,f,ctx);CHKERRQ(ierr);
4318   PetscFunctionReturn(0);
4319 }
4320 
4321 #undef __FUNCT__
4322 #define __FUNCT__ "SNESSetOptionsPrefix"
4323 /*@C
4324    SNESSetOptionsPrefix - Sets the prefix used for searching for all
4325    SNES options in the database.
4326 
4327    Logically Collective on SNES
4328 
4329    Input Parameter:
4330 +  snes - the SNES context
4331 -  prefix - the prefix to prepend to all option names
4332 
4333    Notes:
4334    A hyphen (-) must NOT be given at the beginning of the prefix name.
4335    The first character of all runtime options is AUTOMATICALLY the hyphen.
4336 
4337    Level: advanced
4338 
4339 .keywords: SNES, set, options, prefix, database
4340 
4341 .seealso: SNESSetFromOptions()
4342 @*/
4343 PetscErrorCode  SNESSetOptionsPrefix(SNES snes,const char prefix[])
4344 {
4345   PetscErrorCode ierr;
4346 
4347   PetscFunctionBegin;
4348   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4349   ierr = PetscObjectSetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr);
4350   if (!snes->ksp) {ierr = SNESGetKSP(snes,&snes->ksp);CHKERRQ(ierr);}
4351   if (snes->linesearch) {
4352     ierr = SNESGetLineSearch(snes,&snes->linesearch);CHKERRQ(ierr);
4353     ierr = PetscObjectSetOptionsPrefix((PetscObject)snes->linesearch,prefix);CHKERRQ(ierr);
4354   }
4355   ierr = KSPSetOptionsPrefix(snes->ksp,prefix);CHKERRQ(ierr);
4356   PetscFunctionReturn(0);
4357 }
4358 
4359 #undef __FUNCT__
4360 #define __FUNCT__ "SNESAppendOptionsPrefix"
4361 /*@C
4362    SNESAppendOptionsPrefix - Appends to the prefix used for searching for all
4363    SNES options in the database.
4364 
4365    Logically Collective on SNES
4366 
4367    Input Parameters:
4368 +  snes - the SNES context
4369 -  prefix - the prefix to prepend to all option names
4370 
4371    Notes:
4372    A hyphen (-) must NOT be given at the beginning of the prefix name.
4373    The first character of all runtime options is AUTOMATICALLY the hyphen.
4374 
4375    Level: advanced
4376 
4377 .keywords: SNES, append, options, prefix, database
4378 
4379 .seealso: SNESGetOptionsPrefix()
4380 @*/
4381 PetscErrorCode  SNESAppendOptionsPrefix(SNES snes,const char prefix[])
4382 {
4383   PetscErrorCode ierr;
4384 
4385   PetscFunctionBegin;
4386   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4387   ierr = PetscObjectAppendOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr);
4388   if (!snes->ksp) {ierr = SNESGetKSP(snes,&snes->ksp);CHKERRQ(ierr);}
4389   if (snes->linesearch) {
4390     ierr = SNESGetLineSearch(snes,&snes->linesearch);CHKERRQ(ierr);
4391     ierr = PetscObjectAppendOptionsPrefix((PetscObject)snes->linesearch,prefix);CHKERRQ(ierr);
4392   }
4393   ierr = KSPAppendOptionsPrefix(snes->ksp,prefix);CHKERRQ(ierr);
4394   PetscFunctionReturn(0);
4395 }
4396 
4397 #undef __FUNCT__
4398 #define __FUNCT__ "SNESGetOptionsPrefix"
4399 /*@C
4400    SNESGetOptionsPrefix - Sets the prefix used for searching for all
4401    SNES options in the database.
4402 
4403    Not Collective
4404 
4405    Input Parameter:
4406 .  snes - the SNES context
4407 
4408    Output Parameter:
4409 .  prefix - pointer to the prefix string used
4410 
4411    Notes: On the fortran side, the user should pass in a string 'prefix' of
4412    sufficient length to hold the prefix.
4413 
4414    Level: advanced
4415 
4416 .keywords: SNES, get, options, prefix, database
4417 
4418 .seealso: SNESAppendOptionsPrefix()
4419 @*/
4420 PetscErrorCode  SNESGetOptionsPrefix(SNES snes,const char *prefix[])
4421 {
4422   PetscErrorCode ierr;
4423 
4424   PetscFunctionBegin;
4425   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4426   ierr = PetscObjectGetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr);
4427   PetscFunctionReturn(0);
4428 }
4429 
4430 
4431 #undef __FUNCT__
4432 #define __FUNCT__ "SNESRegister"
4433 /*@C
4434   SNESRegister - Adds a method to the nonlinear solver package.
4435 
4436    Not collective
4437 
4438    Input Parameters:
4439 +  name_solver - name of a new user-defined solver
4440 -  routine_create - routine to create method context
4441 
4442    Notes:
4443    SNESRegister() may be called multiple times to add several user-defined solvers.
4444 
4445    Sample usage:
4446 .vb
4447    SNESRegister("my_solver",MySolverCreate);
4448 .ve
4449 
4450    Then, your solver can be chosen with the procedural interface via
4451 $     SNESSetType(snes,"my_solver")
4452    or at runtime via the option
4453 $     -snes_type my_solver
4454 
4455    Level: advanced
4456 
4457     Note: If your function is not being put into a shared library then use SNESRegister() instead
4458 
4459 .keywords: SNES, nonlinear, register
4460 
4461 .seealso: SNESRegisterAll(), SNESRegisterDestroy()
4462 
4463   Level: advanced
4464 @*/
4465 PetscErrorCode  SNESRegister(const char sname[],PetscErrorCode (*function)(SNES))
4466 {
4467   PetscErrorCode ierr;
4468 
4469   PetscFunctionBegin;
4470   ierr = PetscFunctionListAdd(&SNESList,sname,function);CHKERRQ(ierr);
4471   PetscFunctionReturn(0);
4472 }
4473 
4474 #undef __FUNCT__
4475 #define __FUNCT__ "SNESTestLocalMin"
4476 PetscErrorCode  SNESTestLocalMin(SNES snes)
4477 {
4478   PetscErrorCode ierr;
4479   PetscInt       N,i,j;
4480   Vec            u,uh,fh;
4481   PetscScalar    value;
4482   PetscReal      norm;
4483 
4484   PetscFunctionBegin;
4485   ierr = SNESGetSolution(snes,&u);CHKERRQ(ierr);
4486   ierr = VecDuplicate(u,&uh);CHKERRQ(ierr);
4487   ierr = VecDuplicate(u,&fh);CHKERRQ(ierr);
4488 
4489   /* currently only works for sequential */
4490   ierr = PetscPrintf(PETSC_COMM_WORLD,"Testing FormFunction() for local min\n");CHKERRQ(ierr);
4491   ierr = VecGetSize(u,&N);CHKERRQ(ierr);
4492   for (i=0; i<N; i++) {
4493     ierr = VecCopy(u,uh);CHKERRQ(ierr);
4494     ierr = PetscPrintf(PETSC_COMM_WORLD,"i = %D\n",i);CHKERRQ(ierr);
4495     for (j=-10; j<11; j++) {
4496       value = PetscSign(j)*PetscExpReal(PetscAbs(j)-10.0);
4497       ierr  = VecSetValue(uh,i,value,ADD_VALUES);CHKERRQ(ierr);
4498       ierr  = SNESComputeFunction(snes,uh,fh);CHKERRQ(ierr);
4499       ierr  = VecNorm(fh,NORM_2,&norm);CHKERRQ(ierr);
4500       ierr  = PetscPrintf(PETSC_COMM_WORLD,"       j norm %D %18.16e\n",j,norm);CHKERRQ(ierr);
4501       value = -value;
4502       ierr  = VecSetValue(uh,i,value,ADD_VALUES);CHKERRQ(ierr);
4503     }
4504   }
4505   ierr = VecDestroy(&uh);CHKERRQ(ierr);
4506   ierr = VecDestroy(&fh);CHKERRQ(ierr);
4507   PetscFunctionReturn(0);
4508 }
4509 
4510 #undef __FUNCT__
4511 #define __FUNCT__ "SNESKSPSetUseEW"
4512 /*@
4513    SNESKSPSetUseEW - Sets SNES use Eisenstat-Walker method for
4514    computing relative tolerance for linear solvers within an inexact
4515    Newton method.
4516 
4517    Logically Collective on SNES
4518 
4519    Input Parameters:
4520 +  snes - SNES context
4521 -  flag - PETSC_TRUE or PETSC_FALSE
4522 
4523     Options Database:
4524 +  -snes_ksp_ew - use Eisenstat-Walker method for determining linear system convergence
4525 .  -snes_ksp_ew_version ver - version of  Eisenstat-Walker method
4526 .  -snes_ksp_ew_rtol0 <rtol0> - Sets rtol0
4527 .  -snes_ksp_ew_rtolmax <rtolmax> - Sets rtolmax
4528 .  -snes_ksp_ew_gamma <gamma> - Sets gamma
4529 .  -snes_ksp_ew_alpha <alpha> - Sets alpha
4530 .  -snes_ksp_ew_alpha2 <alpha2> - Sets alpha2
4531 -  -snes_ksp_ew_threshold <threshold> - Sets threshold
4532 
4533    Notes:
4534    Currently, the default is to use a constant relative tolerance for
4535    the inner linear solvers.  Alternatively, one can use the
4536    Eisenstat-Walker method, where the relative convergence tolerance
4537    is reset at each Newton iteration according progress of the nonlinear
4538    solver.
4539 
4540    Level: advanced
4541 
4542    Reference:
4543    S. C. Eisenstat and H. F. Walker, "Choosing the forcing terms in an
4544    inexact Newton method", SISC 17 (1), pp.16-32, 1996.
4545 
4546 .keywords: SNES, KSP, Eisenstat, Walker, convergence, test, inexact, Newton
4547 
4548 .seealso: SNESKSPGetUseEW(), SNESKSPGetParametersEW(), SNESKSPSetParametersEW()
4549 @*/
4550 PetscErrorCode  SNESKSPSetUseEW(SNES snes,PetscBool flag)
4551 {
4552   PetscFunctionBegin;
4553   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4554   PetscValidLogicalCollectiveBool(snes,flag,2);
4555   snes->ksp_ewconv = flag;
4556   PetscFunctionReturn(0);
4557 }
4558 
4559 #undef __FUNCT__
4560 #define __FUNCT__ "SNESKSPGetUseEW"
4561 /*@
4562    SNESKSPGetUseEW - Gets if SNES is using Eisenstat-Walker method
4563    for computing relative tolerance for linear solvers within an
4564    inexact Newton method.
4565 
4566    Not Collective
4567 
4568    Input Parameter:
4569 .  snes - SNES context
4570 
4571    Output Parameter:
4572 .  flag - PETSC_TRUE or PETSC_FALSE
4573 
4574    Notes:
4575    Currently, the default is to use a constant relative tolerance for
4576    the inner linear solvers.  Alternatively, one can use the
4577    Eisenstat-Walker method, where the relative convergence tolerance
4578    is reset at each Newton iteration according progress of the nonlinear
4579    solver.
4580 
4581    Level: advanced
4582 
4583    Reference:
4584    S. C. Eisenstat and H. F. Walker, "Choosing the forcing terms in an
4585    inexact Newton method", SISC 17 (1), pp.16-32, 1996.
4586 
4587 .keywords: SNES, KSP, Eisenstat, Walker, convergence, test, inexact, Newton
4588 
4589 .seealso: SNESKSPSetUseEW(), SNESKSPGetParametersEW(), SNESKSPSetParametersEW()
4590 @*/
4591 PetscErrorCode  SNESKSPGetUseEW(SNES snes, PetscBool  *flag)
4592 {
4593   PetscFunctionBegin;
4594   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4595   PetscValidPointer(flag,2);
4596   *flag = snes->ksp_ewconv;
4597   PetscFunctionReturn(0);
4598 }
4599 
4600 #undef __FUNCT__
4601 #define __FUNCT__ "SNESKSPSetParametersEW"
4602 /*@
4603    SNESKSPSetParametersEW - Sets parameters for Eisenstat-Walker
4604    convergence criteria for the linear solvers within an inexact
4605    Newton method.
4606 
4607    Logically Collective on SNES
4608 
4609    Input Parameters:
4610 +    snes - SNES context
4611 .    version - version 1, 2 (default is 2) or 3
4612 .    rtol_0 - initial relative tolerance (0 <= rtol_0 < 1)
4613 .    rtol_max - maximum relative tolerance (0 <= rtol_max < 1)
4614 .    gamma - multiplicative factor for version 2 rtol computation
4615              (0 <= gamma2 <= 1)
4616 .    alpha - power for version 2 rtol computation (1 < alpha <= 2)
4617 .    alpha2 - power for safeguard
4618 -    threshold - threshold for imposing safeguard (0 < threshold < 1)
4619 
4620    Note:
4621    Version 3 was contributed by Luis Chacon, June 2006.
4622 
4623    Use PETSC_DEFAULT to retain the default for any of the parameters.
4624 
4625    Level: advanced
4626 
4627    Reference:
4628    S. C. Eisenstat and H. F. Walker, "Choosing the forcing terms in an
4629    inexact Newton method", Utah State University Math. Stat. Dept. Res.
4630    Report 6/94/75, June, 1994, to appear in SIAM J. Sci. Comput.
4631 
4632 .keywords: SNES, KSP, Eisenstat, Walker, set, parameters
4633 
4634 .seealso: SNESKSPSetUseEW(), SNESKSPGetUseEW(), SNESKSPGetParametersEW()
4635 @*/
4636 PetscErrorCode  SNESKSPSetParametersEW(SNES snes,PetscInt version,PetscReal rtol_0,PetscReal rtol_max,PetscReal gamma,PetscReal alpha,PetscReal alpha2,PetscReal threshold)
4637 {
4638   SNESKSPEW *kctx;
4639 
4640   PetscFunctionBegin;
4641   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4642   kctx = (SNESKSPEW*)snes->kspconvctx;
4643   if (!kctx) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"No Eisenstat-Walker context existing");
4644   PetscValidLogicalCollectiveInt(snes,version,2);
4645   PetscValidLogicalCollectiveReal(snes,rtol_0,3);
4646   PetscValidLogicalCollectiveReal(snes,rtol_max,4);
4647   PetscValidLogicalCollectiveReal(snes,gamma,5);
4648   PetscValidLogicalCollectiveReal(snes,alpha,6);
4649   PetscValidLogicalCollectiveReal(snes,alpha2,7);
4650   PetscValidLogicalCollectiveReal(snes,threshold,8);
4651 
4652   if (version != PETSC_DEFAULT)   kctx->version   = version;
4653   if (rtol_0 != PETSC_DEFAULT)    kctx->rtol_0    = rtol_0;
4654   if (rtol_max != PETSC_DEFAULT)  kctx->rtol_max  = rtol_max;
4655   if (gamma != PETSC_DEFAULT)     kctx->gamma     = gamma;
4656   if (alpha != PETSC_DEFAULT)     kctx->alpha     = alpha;
4657   if (alpha2 != PETSC_DEFAULT)    kctx->alpha2    = alpha2;
4658   if (threshold != PETSC_DEFAULT) kctx->threshold = threshold;
4659 
4660   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);
4661   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);
4662   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);
4663   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);
4664   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);
4665   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);
4666   PetscFunctionReturn(0);
4667 }
4668 
4669 #undef __FUNCT__
4670 #define __FUNCT__ "SNESKSPGetParametersEW"
4671 /*@
4672    SNESKSPGetParametersEW - Gets parameters for Eisenstat-Walker
4673    convergence criteria for the linear solvers within an inexact
4674    Newton method.
4675 
4676    Not Collective
4677 
4678    Input Parameters:
4679      snes - SNES context
4680 
4681    Output Parameters:
4682 +    version - version 1, 2 (default is 2) or 3
4683 .    rtol_0 - initial relative tolerance (0 <= rtol_0 < 1)
4684 .    rtol_max - maximum relative tolerance (0 <= rtol_max < 1)
4685 .    gamma - multiplicative factor for version 2 rtol computation (0 <= gamma2 <= 1)
4686 .    alpha - power for version 2 rtol computation (1 < alpha <= 2)
4687 .    alpha2 - power for safeguard
4688 -    threshold - threshold for imposing safeguard (0 < threshold < 1)
4689 
4690    Level: advanced
4691 
4692 .keywords: SNES, KSP, Eisenstat, Walker, get, parameters
4693 
4694 .seealso: SNESKSPSetUseEW(), SNESKSPGetUseEW(), SNESKSPSetParametersEW()
4695 @*/
4696 PetscErrorCode  SNESKSPGetParametersEW(SNES snes,PetscInt *version,PetscReal *rtol_0,PetscReal *rtol_max,PetscReal *gamma,PetscReal *alpha,PetscReal *alpha2,PetscReal *threshold)
4697 {
4698   SNESKSPEW *kctx;
4699 
4700   PetscFunctionBegin;
4701   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4702   kctx = (SNESKSPEW*)snes->kspconvctx;
4703   if (!kctx) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"No Eisenstat-Walker context existing");
4704   if (version)   *version   = kctx->version;
4705   if (rtol_0)    *rtol_0    = kctx->rtol_0;
4706   if (rtol_max)  *rtol_max  = kctx->rtol_max;
4707   if (gamma)     *gamma     = kctx->gamma;
4708   if (alpha)     *alpha     = kctx->alpha;
4709   if (alpha2)    *alpha2    = kctx->alpha2;
4710   if (threshold) *threshold = kctx->threshold;
4711   PetscFunctionReturn(0);
4712 }
4713 
4714 #undef __FUNCT__
4715 #define __FUNCT__ "KSPPreSolve_SNESEW"
4716  PetscErrorCode KSPPreSolve_SNESEW(KSP ksp, Vec b, Vec x, SNES snes)
4717 {
4718   PetscErrorCode ierr;
4719   SNESKSPEW      *kctx = (SNESKSPEW*)snes->kspconvctx;
4720   PetscReal      rtol  = PETSC_DEFAULT,stol;
4721 
4722   PetscFunctionBegin;
4723   if (!snes->ksp_ewconv) PetscFunctionReturn(0);
4724   if (!snes->iter) {
4725     rtol = kctx->rtol_0; /* first time in, so use the original user rtol */
4726     ierr = VecNorm(snes->vec_func,NORM_2,&kctx->norm_first);CHKERRQ(ierr);
4727   }
4728   else {
4729     if (kctx->version == 1) {
4730       rtol = (snes->norm - kctx->lresid_last)/kctx->norm_last;
4731       if (rtol < 0.0) rtol = -rtol;
4732       stol = PetscPowReal(kctx->rtol_last,kctx->alpha2);
4733       if (stol > kctx->threshold) rtol = PetscMax(rtol,stol);
4734     } else if (kctx->version == 2) {
4735       rtol = kctx->gamma * PetscPowReal(snes->norm/kctx->norm_last,kctx->alpha);
4736       stol = kctx->gamma * PetscPowReal(kctx->rtol_last,kctx->alpha);
4737       if (stol > kctx->threshold) rtol = PetscMax(rtol,stol);
4738     } else if (kctx->version == 3) { /* contributed by Luis Chacon, June 2006. */
4739       rtol = kctx->gamma * PetscPowReal(snes->norm/kctx->norm_last,kctx->alpha);
4740       /* safeguard: avoid sharp decrease of rtol */
4741       stol = kctx->gamma*PetscPowReal(kctx->rtol_last,kctx->alpha);
4742       stol = PetscMax(rtol,stol);
4743       rtol = PetscMin(kctx->rtol_0,stol);
4744       /* safeguard: avoid oversolving */
4745       stol = kctx->gamma*(kctx->norm_first*snes->rtol)/snes->norm;
4746       stol = PetscMax(rtol,stol);
4747       rtol = PetscMin(kctx->rtol_0,stol);
4748     } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Only versions 1, 2 or 3 are supported: %D",kctx->version);
4749   }
4750   /* safeguard: avoid rtol greater than one */
4751   rtol = PetscMin(rtol,kctx->rtol_max);
4752   ierr = KSPSetTolerances(ksp,rtol,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_DEFAULT);CHKERRQ(ierr);
4753   ierr = PetscInfo3(snes,"iter %D, Eisenstat-Walker (version %D) KSP rtol=%g\n",snes->iter,kctx->version,(double)rtol);CHKERRQ(ierr);
4754   PetscFunctionReturn(0);
4755 }
4756 
4757 #undef __FUNCT__
4758 #define __FUNCT__ "KSPPostSolve_SNESEW"
4759 PetscErrorCode KSPPostSolve_SNESEW(KSP ksp, Vec b, Vec x, SNES snes)
4760 {
4761   PetscErrorCode ierr;
4762   SNESKSPEW      *kctx = (SNESKSPEW*)snes->kspconvctx;
4763   PCSide         pcside;
4764   Vec            lres;
4765 
4766   PetscFunctionBegin;
4767   if (!snes->ksp_ewconv) PetscFunctionReturn(0);
4768   ierr = KSPGetTolerances(ksp,&kctx->rtol_last,0,0,0);CHKERRQ(ierr);
4769   kctx->norm_last = snes->norm;
4770   if (kctx->version == 1) {
4771     PC        pc;
4772     PetscBool isNone;
4773 
4774     ierr = KSPGetPC(ksp, &pc);CHKERRQ(ierr);
4775     ierr = PetscObjectTypeCompare((PetscObject) pc, PCNONE, &isNone);CHKERRQ(ierr);
4776     ierr = KSPGetPCSide(ksp,&pcside);CHKERRQ(ierr);
4777      if (pcside == PC_RIGHT || isNone) { /* XXX Should we also test KSP_UNPRECONDITIONED_NORM ? */
4778       /* KSP residual is true linear residual */
4779       ierr = KSPGetResidualNorm(ksp,&kctx->lresid_last);CHKERRQ(ierr);
4780     } else {
4781       /* KSP residual is preconditioned residual */
4782       /* compute true linear residual norm */
4783       ierr = VecDuplicate(b,&lres);CHKERRQ(ierr);
4784       ierr = MatMult(snes->jacobian,x,lres);CHKERRQ(ierr);
4785       ierr = VecAYPX(lres,-1.0,b);CHKERRQ(ierr);
4786       ierr = VecNorm(lres,NORM_2,&kctx->lresid_last);CHKERRQ(ierr);
4787       ierr = VecDestroy(&lres);CHKERRQ(ierr);
4788     }
4789   }
4790   PetscFunctionReturn(0);
4791 }
4792 
4793 #undef __FUNCT__
4794 #define __FUNCT__ "SNESGetKSP"
4795 /*@
4796    SNESGetKSP - Returns the KSP context for a SNES solver.
4797 
4798    Not Collective, but if SNES object is parallel, then KSP object is parallel
4799 
4800    Input Parameter:
4801 .  snes - the SNES context
4802 
4803    Output Parameter:
4804 .  ksp - the KSP context
4805 
4806    Notes:
4807    The user can then directly manipulate the KSP context to set various
4808    options, etc.  Likewise, the user can then extract and manipulate the
4809    PC contexts as well.
4810 
4811    Level: beginner
4812 
4813 .keywords: SNES, nonlinear, get, KSP, context
4814 
4815 .seealso: KSPGetPC(), SNESCreate(), KSPCreate(), SNESSetKSP()
4816 @*/
4817 PetscErrorCode  SNESGetKSP(SNES snes,KSP *ksp)
4818 {
4819   PetscErrorCode ierr;
4820 
4821   PetscFunctionBegin;
4822   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4823   PetscValidPointer(ksp,2);
4824 
4825   if (!snes->ksp) {
4826     PetscBool monitor = PETSC_FALSE;
4827 
4828     ierr = KSPCreate(PetscObjectComm((PetscObject)snes),&snes->ksp);CHKERRQ(ierr);
4829     ierr = PetscObjectIncrementTabLevel((PetscObject)snes->ksp,(PetscObject)snes,1);CHKERRQ(ierr);
4830     ierr = PetscLogObjectParent((PetscObject)snes,(PetscObject)snes->ksp);CHKERRQ(ierr);
4831 
4832     ierr = KSPSetPreSolve(snes->ksp,(PetscErrorCode (*)(KSP,Vec,Vec,void*))KSPPreSolve_SNESEW,snes);CHKERRQ(ierr);
4833     ierr = KSPSetPostSolve(snes->ksp,(PetscErrorCode (*)(KSP,Vec,Vec,void*))KSPPostSolve_SNESEW,snes);CHKERRQ(ierr);
4834 
4835     ierr = PetscOptionsGetBool(((PetscObject)snes)->options,((PetscObject)snes)->prefix,"-ksp_monitor_snes",&monitor,NULL);CHKERRQ(ierr);
4836     if (monitor) {
4837       ierr = KSPMonitorSet(snes->ksp,KSPMonitorSNES,snes,NULL);CHKERRQ(ierr);
4838     }
4839     monitor = PETSC_FALSE;
4840     ierr = PetscOptionsGetBool(((PetscObject)snes)->options,((PetscObject)snes)->prefix,"-ksp_monitor_snes_lg",&monitor,NULL);CHKERRQ(ierr);
4841     if (monitor) {
4842       PetscObject *objs;
4843       ierr = KSPMonitorSNESLGResidualNormCreate(PetscObjectComm((PetscObject)snes),NULL,NULL,PETSC_DECIDE,PETSC_DECIDE,600,600,&objs);CHKERRQ(ierr);
4844       objs[0] = (PetscObject) snes;
4845       ierr = KSPMonitorSet(snes->ksp,(PetscErrorCode (*)(KSP,PetscInt,PetscReal,void*))KSPMonitorSNESLGResidualNorm,objs,(PetscErrorCode (*)(void**))KSPMonitorSNESLGResidualNormDestroy);CHKERRQ(ierr);
4846     }
4847   }
4848   *ksp = snes->ksp;
4849   PetscFunctionReturn(0);
4850 }
4851 
4852 
4853 #include <petsc/private/dmimpl.h>
4854 #undef __FUNCT__
4855 #define __FUNCT__ "SNESSetDM"
4856 /*@
4857    SNESSetDM - Sets the DM that may be used by some preconditioners
4858 
4859    Logically Collective on SNES
4860 
4861    Input Parameters:
4862 +  snes - the preconditioner context
4863 -  dm - the dm
4864 
4865    Level: intermediate
4866 
4867 .seealso: SNESGetDM(), KSPSetDM(), KSPGetDM()
4868 @*/
4869 PetscErrorCode  SNESSetDM(SNES snes,DM dm)
4870 {
4871   PetscErrorCode ierr;
4872   KSP            ksp;
4873   DMSNES         sdm;
4874 
4875   PetscFunctionBegin;
4876   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4877   if (dm) {ierr = PetscObjectReference((PetscObject)dm);CHKERRQ(ierr);}
4878   if (snes->dm) {               /* Move the DMSNES context over to the new DM unless the new DM already has one */
4879     if (snes->dm->dmsnes && snes->dmAuto && !dm->dmsnes) {
4880       ierr = DMCopyDMSNES(snes->dm,dm);CHKERRQ(ierr);
4881       ierr = DMGetDMSNES(snes->dm,&sdm);CHKERRQ(ierr);
4882       if (sdm->originaldm == snes->dm) sdm->originaldm = dm; /* Grant write privileges to the replacement DM */
4883     }
4884     ierr = DMDestroy(&snes->dm);CHKERRQ(ierr);
4885   }
4886   snes->dm     = dm;
4887   snes->dmAuto = PETSC_FALSE;
4888 
4889   ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr);
4890   ierr = KSPSetDM(ksp,dm);CHKERRQ(ierr);
4891   ierr = KSPSetDMActive(ksp,PETSC_FALSE);CHKERRQ(ierr);
4892   if (snes->pc) {
4893     ierr = SNESSetDM(snes->pc, snes->dm);CHKERRQ(ierr);
4894     ierr = SNESSetNPCSide(snes,snes->pcside);CHKERRQ(ierr);
4895   }
4896   PetscFunctionReturn(0);
4897 }
4898 
4899 #undef __FUNCT__
4900 #define __FUNCT__ "SNESGetDM"
4901 /*@
4902    SNESGetDM - Gets the DM that may be used by some preconditioners
4903 
4904    Not Collective but DM obtained is parallel on SNES
4905 
4906    Input Parameter:
4907 . snes - the preconditioner context
4908 
4909    Output Parameter:
4910 .  dm - the dm
4911 
4912    Level: intermediate
4913 
4914 .seealso: SNESSetDM(), KSPSetDM(), KSPGetDM()
4915 @*/
4916 PetscErrorCode  SNESGetDM(SNES snes,DM *dm)
4917 {
4918   PetscErrorCode ierr;
4919 
4920   PetscFunctionBegin;
4921   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
4922   if (!snes->dm) {
4923     ierr         = DMShellCreate(PetscObjectComm((PetscObject)snes),&snes->dm);CHKERRQ(ierr);
4924     snes->dmAuto = PETSC_TRUE;
4925   }
4926   *dm = snes->dm;
4927   PetscFunctionReturn(0);
4928 }
4929 
4930 #undef __FUNCT__
4931 #define __FUNCT__ "SNESSetNPC"
4932 /*@
4933   SNESSetNPC - Sets the nonlinear preconditioner to be used.
4934 
4935   Collective on SNES
4936 
4937   Input Parameters:
4938 + snes - iterative context obtained from SNESCreate()
4939 - pc   - the preconditioner object
4940 
4941   Notes:
4942   Use SNESGetNPC() to retrieve the preconditioner context (for example,
4943   to configure it using the API).
4944 
4945   Level: developer
4946 
4947 .keywords: SNES, set, precondition
4948 .seealso: SNESGetNPC(), SNESHasNPC()
4949 @*/
4950 PetscErrorCode SNESSetNPC(SNES snes, SNES pc)
4951 {
4952   PetscErrorCode ierr;
4953 
4954   PetscFunctionBegin;
4955   PetscValidHeaderSpecific(snes, SNES_CLASSID, 1);
4956   PetscValidHeaderSpecific(pc, SNES_CLASSID, 2);
4957   PetscCheckSameComm(snes, 1, pc, 2);
4958   ierr     = PetscObjectReference((PetscObject) pc);CHKERRQ(ierr);
4959   ierr     = SNESDestroy(&snes->pc);CHKERRQ(ierr);
4960   snes->pc = pc;
4961   ierr     = PetscLogObjectParent((PetscObject)snes, (PetscObject)snes->pc);CHKERRQ(ierr);
4962   PetscFunctionReturn(0);
4963 }
4964 
4965 #undef __FUNCT__
4966 #define __FUNCT__ "SNESGetNPC"
4967 /*@
4968   SNESGetNPC - Creates a nonlinear preconditioning solver (SNES) to be used to precondition the nonlinear solver.
4969 
4970   Not Collective
4971 
4972   Input Parameter:
4973 . snes - iterative context obtained from SNESCreate()
4974 
4975   Output Parameter:
4976 . pc - preconditioner context
4977 
4978   Notes: If a SNES was previously set with SNESSetNPC() then that SNES is returned.
4979 
4980   Level: developer
4981 
4982 .keywords: SNES, get, preconditioner
4983 .seealso: SNESSetNPC(), SNESHasNPC()
4984 @*/
4985 PetscErrorCode SNESGetNPC(SNES snes, SNES *pc)
4986 {
4987   PetscErrorCode ierr;
4988   const char     *optionsprefix;
4989 
4990   PetscFunctionBegin;
4991   PetscValidHeaderSpecific(snes, SNES_CLASSID, 1);
4992   PetscValidPointer(pc, 2);
4993   if (!snes->pc) {
4994     ierr = SNESCreate(PetscObjectComm((PetscObject)snes),&snes->pc);CHKERRQ(ierr);
4995     ierr = PetscObjectIncrementTabLevel((PetscObject)snes->pc,(PetscObject)snes,1);CHKERRQ(ierr);
4996     ierr = PetscLogObjectParent((PetscObject)snes,(PetscObject)snes->pc);CHKERRQ(ierr);
4997     ierr = SNESGetOptionsPrefix(snes,&optionsprefix);CHKERRQ(ierr);
4998     ierr = SNESSetOptionsPrefix(snes->pc,optionsprefix);CHKERRQ(ierr);
4999     ierr = SNESAppendOptionsPrefix(snes->pc,"npc_");CHKERRQ(ierr);
5000     ierr = SNESSetCountersReset(snes->pc,PETSC_FALSE);CHKERRQ(ierr);
5001   }
5002   *pc = snes->pc;
5003   PetscFunctionReturn(0);
5004 }
5005 
5006 #undef __FUNCT__
5007 #define __FUNCT__ "SNESHasNPC"
5008 /*@
5009   SNESHasNPC - Returns whether a nonlinear preconditioner exists
5010 
5011   Not Collective
5012 
5013   Input Parameter:
5014 . snes - iterative context obtained from SNESCreate()
5015 
5016   Output Parameter:
5017 . has_npc - whether the SNES has an NPC or not
5018 
5019   Level: developer
5020 
5021 .keywords: SNES, has, preconditioner
5022 .seealso: SNESSetNPC(), SNESGetNPC()
5023 @*/
5024 PetscErrorCode SNESHasNPC(SNES snes, PetscBool *has_npc)
5025 {
5026   PetscFunctionBegin;
5027   PetscValidHeaderSpecific(snes, SNES_CLASSID, 1);
5028   *has_npc = (PetscBool) (snes->pc ? PETSC_TRUE : PETSC_FALSE);
5029   PetscFunctionReturn(0);
5030 }
5031 
5032 #undef __FUNCT__
5033 #define __FUNCT__ "SNESSetNPCSide"
5034 /*@
5035     SNESSetNPCSide - Sets the preconditioning side.
5036 
5037     Logically Collective on SNES
5038 
5039     Input Parameter:
5040 .   snes - iterative context obtained from SNESCreate()
5041 
5042     Output Parameter:
5043 .   side - the preconditioning side, where side is one of
5044 .vb
5045       PC_LEFT - left preconditioning (default)
5046       PC_RIGHT - right preconditioning
5047 .ve
5048 
5049     Options Database Keys:
5050 .   -snes_pc_side <right,left>
5051 
5052     Level: intermediate
5053 
5054 .keywords: SNES, set, right, left, side, preconditioner, flag
5055 
5056 .seealso: SNESGetNPCSide(), KSPSetPCSide()
5057 @*/
5058 PetscErrorCode  SNESSetNPCSide(SNES snes,PCSide side)
5059 {
5060   PetscFunctionBegin;
5061   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
5062   PetscValidLogicalCollectiveEnum(snes,side,2);
5063   snes->pcside = side;
5064   PetscFunctionReturn(0);
5065 }
5066 
5067 #undef __FUNCT__
5068 #define __FUNCT__ "SNESGetNPCSide"
5069 /*@
5070     SNESGetNPCSide - Gets the preconditioning side.
5071 
5072     Not Collective
5073 
5074     Input Parameter:
5075 .   snes - iterative context obtained from SNESCreate()
5076 
5077     Output Parameter:
5078 .   side - the preconditioning side, where side is one of
5079 .vb
5080       PC_LEFT - left preconditioning (default)
5081       PC_RIGHT - right preconditioning
5082 .ve
5083 
5084     Level: intermediate
5085 
5086 .keywords: SNES, get, right, left, side, preconditioner, flag
5087 
5088 .seealso: SNESSetNPCSide(), KSPGetPCSide()
5089 @*/
5090 PetscErrorCode  SNESGetNPCSide(SNES snes,PCSide *side)
5091 {
5092   PetscFunctionBegin;
5093   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
5094   PetscValidPointer(side,2);
5095   *side = snes->pcside;
5096   PetscFunctionReturn(0);
5097 }
5098 
5099 #undef __FUNCT__
5100 #define __FUNCT__ "SNESSetLineSearch"
5101 /*@
5102   SNESSetLineSearch - Sets the linesearch on the SNES instance.
5103 
5104   Collective on SNES
5105 
5106   Input Parameters:
5107 + snes - iterative context obtained from SNESCreate()
5108 - linesearch   - the linesearch object
5109 
5110   Notes:
5111   Use SNESGetLineSearch() to retrieve the preconditioner context (for example,
5112   to configure it using the API).
5113 
5114   Level: developer
5115 
5116 .keywords: SNES, set, linesearch
5117 .seealso: SNESGetLineSearch()
5118 @*/
5119 PetscErrorCode SNESSetLineSearch(SNES snes, SNESLineSearch linesearch)
5120 {
5121   PetscErrorCode ierr;
5122 
5123   PetscFunctionBegin;
5124   PetscValidHeaderSpecific(snes, SNES_CLASSID, 1);
5125   PetscValidHeaderSpecific(linesearch, SNESLINESEARCH_CLASSID, 2);
5126   PetscCheckSameComm(snes, 1, linesearch, 2);
5127   ierr = PetscObjectReference((PetscObject) linesearch);CHKERRQ(ierr);
5128   ierr = SNESLineSearchDestroy(&snes->linesearch);CHKERRQ(ierr);
5129 
5130   snes->linesearch = linesearch;
5131 
5132   ierr = PetscLogObjectParent((PetscObject)snes, (PetscObject)snes->linesearch);CHKERRQ(ierr);
5133   PetscFunctionReturn(0);
5134 }
5135 
5136 #undef __FUNCT__
5137 #define __FUNCT__ "SNESGetLineSearch"
5138 /*@
5139   SNESGetLineSearch - Returns a pointer to the line search context set with SNESSetLineSearch()
5140   or creates a default line search instance associated with the SNES and returns it.
5141 
5142   Not Collective
5143 
5144   Input Parameter:
5145 . snes - iterative context obtained from SNESCreate()
5146 
5147   Output Parameter:
5148 . linesearch - linesearch context
5149 
5150   Level: beginner
5151 
5152 .keywords: SNES, get, linesearch
5153 .seealso: SNESSetLineSearch(), SNESLineSearchCreate()
5154 @*/
5155 PetscErrorCode SNESGetLineSearch(SNES snes, SNESLineSearch *linesearch)
5156 {
5157   PetscErrorCode ierr;
5158   const char     *optionsprefix;
5159 
5160   PetscFunctionBegin;
5161   PetscValidHeaderSpecific(snes, SNES_CLASSID, 1);
5162   PetscValidPointer(linesearch, 2);
5163   if (!snes->linesearch) {
5164     ierr = SNESGetOptionsPrefix(snes, &optionsprefix);CHKERRQ(ierr);
5165     ierr = SNESLineSearchCreate(PetscObjectComm((PetscObject)snes), &snes->linesearch);CHKERRQ(ierr);
5166     ierr = SNESLineSearchSetSNES(snes->linesearch, snes);CHKERRQ(ierr);
5167     ierr = SNESLineSearchAppendOptionsPrefix(snes->linesearch, optionsprefix);CHKERRQ(ierr);
5168     ierr = PetscObjectIncrementTabLevel((PetscObject) snes->linesearch, (PetscObject) snes, 1);CHKERRQ(ierr);
5169     ierr = PetscLogObjectParent((PetscObject)snes, (PetscObject)snes->linesearch);CHKERRQ(ierr);
5170   }
5171   *linesearch = snes->linesearch;
5172   PetscFunctionReturn(0);
5173 }
5174 
5175 #if defined(PETSC_HAVE_MATLAB_ENGINE)
5176 #include <mex.h>
5177 
5178 typedef struct {char *funcname; mxArray *ctx;} SNESMatlabContext;
5179 
5180 #undef __FUNCT__
5181 #define __FUNCT__ "SNESComputeFunction_Matlab"
5182 /*
5183    SNESComputeFunction_Matlab - Calls the function that has been set with SNESSetFunctionMatlab().
5184 
5185    Collective on SNES
5186 
5187    Input Parameters:
5188 +  snes - the SNES context
5189 -  x - input vector
5190 
5191    Output Parameter:
5192 .  y - function vector, as set by SNESSetFunction()
5193 
5194    Notes:
5195    SNESComputeFunction() is typically used within nonlinear solvers
5196    implementations, so most users would not generally call this routine
5197    themselves.
5198 
5199    Level: developer
5200 
5201 .keywords: SNES, nonlinear, compute, function
5202 
5203 .seealso: SNESSetFunction(), SNESGetFunction()
5204 */
5205 PetscErrorCode  SNESComputeFunction_Matlab(SNES snes,Vec x,Vec y, void *ctx)
5206 {
5207   PetscErrorCode    ierr;
5208   SNESMatlabContext *sctx = (SNESMatlabContext*)ctx;
5209   int               nlhs  = 1,nrhs = 5;
5210   mxArray           *plhs[1],*prhs[5];
5211   long long int     lx = 0,ly = 0,ls = 0;
5212 
5213   PetscFunctionBegin;
5214   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
5215   PetscValidHeaderSpecific(x,VEC_CLASSID,2);
5216   PetscValidHeaderSpecific(y,VEC_CLASSID,3);
5217   PetscCheckSameComm(snes,1,x,2);
5218   PetscCheckSameComm(snes,1,y,3);
5219 
5220   /* call Matlab function in ctx with arguments x and y */
5221 
5222   ierr    = PetscMemcpy(&ls,&snes,sizeof(snes));CHKERRQ(ierr);
5223   ierr    = PetscMemcpy(&lx,&x,sizeof(x));CHKERRQ(ierr);
5224   ierr    = PetscMemcpy(&ly,&y,sizeof(x));CHKERRQ(ierr);
5225   prhs[0] = mxCreateDoubleScalar((double)ls);
5226   prhs[1] = mxCreateDoubleScalar((double)lx);
5227   prhs[2] = mxCreateDoubleScalar((double)ly);
5228   prhs[3] = mxCreateString(sctx->funcname);
5229   prhs[4] = sctx->ctx;
5230   ierr    = mexCallMATLAB(nlhs,plhs,nrhs,prhs,"PetscSNESComputeFunctionInternal");CHKERRQ(ierr);
5231   ierr    = mxGetScalar(plhs[0]);CHKERRQ(ierr);
5232   mxDestroyArray(prhs[0]);
5233   mxDestroyArray(prhs[1]);
5234   mxDestroyArray(prhs[2]);
5235   mxDestroyArray(prhs[3]);
5236   mxDestroyArray(plhs[0]);
5237   PetscFunctionReturn(0);
5238 }
5239 
5240 #undef __FUNCT__
5241 #define __FUNCT__ "SNESSetFunctionMatlab"
5242 /*
5243    SNESSetFunctionMatlab - Sets the function evaluation routine and function
5244    vector for use by the SNES routines in solving systems of nonlinear
5245    equations from MATLAB. Here the function is a string containing the name of a MATLAB function
5246 
5247    Logically Collective on SNES
5248 
5249    Input Parameters:
5250 +  snes - the SNES context
5251 .  r - vector to store function value
5252 -  f - function evaluation routine
5253 
5254    Notes:
5255    The Newton-like methods typically solve linear systems of the form
5256 $      f'(x) x = -f(x),
5257    where f'(x) denotes the Jacobian matrix and f(x) is the function.
5258 
5259    Level: beginner
5260 
5261    Developer Note:  This bleeds the allocated memory SNESMatlabContext *sctx;
5262 
5263 .keywords: SNES, nonlinear, set, function
5264 
5265 .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian(), SNESSetFunction()
5266 */
5267 PetscErrorCode  SNESSetFunctionMatlab(SNES snes,Vec r,const char *f,mxArray *ctx)
5268 {
5269   PetscErrorCode    ierr;
5270   SNESMatlabContext *sctx;
5271 
5272   PetscFunctionBegin;
5273   /* currently sctx is memory bleed */
5274   ierr = PetscNew(&sctx);CHKERRQ(ierr);
5275   ierr = PetscStrallocpy(f,&sctx->funcname);CHKERRQ(ierr);
5276   /*
5277      This should work, but it doesn't
5278   sctx->ctx = ctx;
5279   mexMakeArrayPersistent(sctx->ctx);
5280   */
5281   sctx->ctx = mxDuplicateArray(ctx);
5282   ierr      = SNESSetFunction(snes,r,SNESComputeFunction_Matlab,sctx);CHKERRQ(ierr);
5283   PetscFunctionReturn(0);
5284 }
5285 
5286 #undef __FUNCT__
5287 #define __FUNCT__ "SNESComputeJacobian_Matlab"
5288 /*
5289    SNESComputeJacobian_Matlab - Calls the function that has been set with SNESSetJacobianMatlab().
5290 
5291    Collective on SNES
5292 
5293    Input Parameters:
5294 +  snes - the SNES context
5295 .  x - input vector
5296 .  A, B - the matrices
5297 -  ctx - user context
5298 
5299    Level: developer
5300 
5301 .keywords: SNES, nonlinear, compute, function
5302 
5303 .seealso: SNESSetFunction(), SNESGetFunction()
5304 @*/
5305 PetscErrorCode  SNESComputeJacobian_Matlab(SNES snes,Vec x,Mat A,Mat B,void *ctx)
5306 {
5307   PetscErrorCode    ierr;
5308   SNESMatlabContext *sctx = (SNESMatlabContext*)ctx;
5309   int               nlhs  = 2,nrhs = 6;
5310   mxArray           *plhs[2],*prhs[6];
5311   long long int     lx = 0,lA = 0,ls = 0, lB = 0;
5312 
5313   PetscFunctionBegin;
5314   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
5315   PetscValidHeaderSpecific(x,VEC_CLASSID,2);
5316 
5317   /* call Matlab function in ctx with arguments x and y */
5318 
5319   ierr    = PetscMemcpy(&ls,&snes,sizeof(snes));CHKERRQ(ierr);
5320   ierr    = PetscMemcpy(&lx,&x,sizeof(x));CHKERRQ(ierr);
5321   ierr    = PetscMemcpy(&lA,A,sizeof(x));CHKERRQ(ierr);
5322   ierr    = PetscMemcpy(&lB,B,sizeof(x));CHKERRQ(ierr);
5323   prhs[0] = mxCreateDoubleScalar((double)ls);
5324   prhs[1] = mxCreateDoubleScalar((double)lx);
5325   prhs[2] = mxCreateDoubleScalar((double)lA);
5326   prhs[3] = mxCreateDoubleScalar((double)lB);
5327   prhs[4] = mxCreateString(sctx->funcname);
5328   prhs[5] = sctx->ctx;
5329   ierr    = mexCallMATLAB(nlhs,plhs,nrhs,prhs,"PetscSNESComputeJacobianInternal");CHKERRQ(ierr);
5330   ierr    = mxGetScalar(plhs[0]);CHKERRQ(ierr);
5331   mxDestroyArray(prhs[0]);
5332   mxDestroyArray(prhs[1]);
5333   mxDestroyArray(prhs[2]);
5334   mxDestroyArray(prhs[3]);
5335   mxDestroyArray(prhs[4]);
5336   mxDestroyArray(plhs[0]);
5337   mxDestroyArray(plhs[1]);
5338   PetscFunctionReturn(0);
5339 }
5340 
5341 #undef __FUNCT__
5342 #define __FUNCT__ "SNESSetJacobianMatlab"
5343 /*
5344    SNESSetJacobianMatlab - Sets the Jacobian function evaluation routine and two empty Jacobian matrices
5345    vector for use by the SNES routines in solving systems of nonlinear
5346    equations from MATLAB. Here the function is a string containing the name of a MATLAB function
5347 
5348    Logically Collective on SNES
5349 
5350    Input Parameters:
5351 +  snes - the SNES context
5352 .  A,B - Jacobian matrices
5353 .  J - function evaluation routine
5354 -  ctx - user context
5355 
5356    Level: developer
5357 
5358    Developer Note:  This bleeds the allocated memory SNESMatlabContext *sctx;
5359 
5360 .keywords: SNES, nonlinear, set, function
5361 
5362 .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian(), SNESSetFunction(), J
5363 */
5364 PetscErrorCode  SNESSetJacobianMatlab(SNES snes,Mat A,Mat B,const char *J,mxArray *ctx)
5365 {
5366   PetscErrorCode    ierr;
5367   SNESMatlabContext *sctx;
5368 
5369   PetscFunctionBegin;
5370   /* currently sctx is memory bleed */
5371   ierr = PetscNew(&sctx);CHKERRQ(ierr);
5372   ierr = PetscStrallocpy(J,&sctx->funcname);CHKERRQ(ierr);
5373   /*
5374      This should work, but it doesn't
5375   sctx->ctx = ctx;
5376   mexMakeArrayPersistent(sctx->ctx);
5377   */
5378   sctx->ctx = mxDuplicateArray(ctx);
5379   ierr      = SNESSetJacobian(snes,A,B,SNESComputeJacobian_Matlab,sctx);CHKERRQ(ierr);
5380   PetscFunctionReturn(0);
5381 }
5382 
5383 #undef __FUNCT__
5384 #define __FUNCT__ "SNESMonitor_Matlab"
5385 /*
5386    SNESMonitor_Matlab - Calls the function that has been set with SNESMonitorSetMatlab().
5387 
5388    Collective on SNES
5389 
5390 .seealso: SNESSetFunction(), SNESGetFunction()
5391 @*/
5392 PetscErrorCode  SNESMonitor_Matlab(SNES snes,PetscInt it, PetscReal fnorm, void *ctx)
5393 {
5394   PetscErrorCode    ierr;
5395   SNESMatlabContext *sctx = (SNESMatlabContext*)ctx;
5396   int               nlhs  = 1,nrhs = 6;
5397   mxArray           *plhs[1],*prhs[6];
5398   long long int     lx = 0,ls = 0;
5399   Vec               x  = snes->vec_sol;
5400 
5401   PetscFunctionBegin;
5402   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
5403 
5404   ierr    = PetscMemcpy(&ls,&snes,sizeof(snes));CHKERRQ(ierr);
5405   ierr    = PetscMemcpy(&lx,&x,sizeof(x));CHKERRQ(ierr);
5406   prhs[0] = mxCreateDoubleScalar((double)ls);
5407   prhs[1] = mxCreateDoubleScalar((double)it);
5408   prhs[2] = mxCreateDoubleScalar((double)fnorm);
5409   prhs[3] = mxCreateDoubleScalar((double)lx);
5410   prhs[4] = mxCreateString(sctx->funcname);
5411   prhs[5] = sctx->ctx;
5412   ierr    = mexCallMATLAB(nlhs,plhs,nrhs,prhs,"PetscSNESMonitorInternal");CHKERRQ(ierr);
5413   ierr    = mxGetScalar(plhs[0]);CHKERRQ(ierr);
5414   mxDestroyArray(prhs[0]);
5415   mxDestroyArray(prhs[1]);
5416   mxDestroyArray(prhs[2]);
5417   mxDestroyArray(prhs[3]);
5418   mxDestroyArray(prhs[4]);
5419   mxDestroyArray(plhs[0]);
5420   PetscFunctionReturn(0);
5421 }
5422 
5423 #undef __FUNCT__
5424 #define __FUNCT__ "SNESMonitorSetMatlab"
5425 /*
5426    SNESMonitorSetMatlab - Sets the monitor function from MATLAB
5427 
5428    Level: developer
5429 
5430    Developer Note:  This bleeds the allocated memory SNESMatlabContext *sctx;
5431 
5432 .keywords: SNES, nonlinear, set, function
5433 
5434 .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian(), SNESSetFunction()
5435 */
5436 PetscErrorCode  SNESMonitorSetMatlab(SNES snes,const char *f,mxArray *ctx)
5437 {
5438   PetscErrorCode    ierr;
5439   SNESMatlabContext *sctx;
5440 
5441   PetscFunctionBegin;
5442   /* currently sctx is memory bleed */
5443   ierr = PetscNew(&sctx);CHKERRQ(ierr);
5444   ierr = PetscStrallocpy(f,&sctx->funcname);CHKERRQ(ierr);
5445   /*
5446      This should work, but it doesn't
5447   sctx->ctx = ctx;
5448   mexMakeArrayPersistent(sctx->ctx);
5449   */
5450   sctx->ctx = mxDuplicateArray(ctx);
5451   ierr      = SNESMonitorSet(snes,SNESMonitor_Matlab,sctx,NULL);CHKERRQ(ierr);
5452   PetscFunctionReturn(0);
5453 }
5454 
5455 #endif
5456