xref: /petsc/src/snes/interface/snes.c (revision ed70e96a4de3cd8a7bd6336d7f25f499d1f74ed4)
1 
2 #include <private/snesimpl.h>      /*I "petscsnes.h"  I*/
3 
4 PetscBool  SNESRegisterAllCalled = PETSC_FALSE;
5 PetscFList SNESList              = PETSC_NULL;
6 
7 /* Logging support */
8 PetscClassId  SNES_CLASSID;
9 PetscLogEvent  SNES_Solve, SNES_LineSearch, SNES_FunctionEval, SNES_JacobianEval;
10 
11 #undef __FUNCT__
12 #define __FUNCT__ "SNESDMComputeJacobian"
13 /*
14     Translates from a SNES call to a DM call in computing a Jacobian
15 */
16 PetscErrorCode SNESDMComputeJacobian(SNES snes,Vec X,Mat *J,Mat *B,MatStructure *flag,void *ptr)
17 {
18   PetscErrorCode ierr;
19   DM             dm;
20 
21   PetscFunctionBegin;
22   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
23   ierr = DMComputeJacobian(dm,X,*J,*B,flag);CHKERRQ(ierr);
24   PetscFunctionReturn(0);
25 }
26 
27 #undef __FUNCT__
28 #define __FUNCT__ "SNESSetErrorIfNotConverged"
29 /*@
30    SNESSetErrorIfNotConverged - Causes SNESSolve() to generate an error if the solver has not converged.
31 
32    Logically Collective on SNES
33 
34    Input Parameters:
35 +  snes - iterative context obtained from SNESCreate()
36 -  flg - PETSC_TRUE indicates you want the error generated
37 
38    Options database keys:
39 .  -snes_error_if_not_converged : this takes an optional truth value (0/1/no/yes/true/false)
40 
41    Level: intermediate
42 
43    Notes:
44     Normally PETSc continues if a linear solver fails to converge, you can call SNESGetConvergedReason() after a SNESSolve()
45     to determine if it has converged.
46 
47 .keywords: SNES, set, initial guess, nonzero
48 
49 .seealso: SNESGetErrorIfNotConverged(), KSPGetErrorIfNotConverged(), KSPSetErrorIFNotConverged()
50 @*/
51 PetscErrorCode  SNESSetErrorIfNotConverged(SNES snes,PetscBool  flg)
52 {
53   PetscFunctionBegin;
54   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
55   PetscValidLogicalCollectiveBool(snes,flg,2);
56   snes->errorifnotconverged = flg;
57   PetscFunctionReturn(0);
58 }
59 
60 #undef __FUNCT__
61 #define __FUNCT__ "SNESGetErrorIfNotConverged"
62 /*@
63    SNESGetErrorIfNotConverged - Will SNESSolve() generate an error if the solver does not converge?
64 
65    Not Collective
66 
67    Input Parameter:
68 .  snes - iterative context obtained from SNESCreate()
69 
70    Output Parameter:
71 .  flag - PETSC_TRUE if it will generate an error, else PETSC_FALSE
72 
73    Level: intermediate
74 
75 .keywords: SNES, set, initial guess, nonzero
76 
77 .seealso:  SNESSetErrorIfNotConverged(), KSPGetErrorIfNotConverged(), KSPSetErrorIFNotConverged()
78 @*/
79 PetscErrorCode  SNESGetErrorIfNotConverged(SNES snes,PetscBool  *flag)
80 {
81   PetscFunctionBegin;
82   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
83   PetscValidPointer(flag,2);
84   *flag = snes->errorifnotconverged;
85   PetscFunctionReturn(0);
86 }
87 
88 #undef __FUNCT__
89 #define __FUNCT__ "SNESSetFunctionDomainError"
90 /*@
91    SNESSetFunctionDomainError - tells SNES that the input vector to your FormFunction is not
92      in the functions domain. For example, negative pressure.
93 
94    Logically Collective on SNES
95 
96    Input Parameters:
97 .  SNES - the SNES context
98 
99    Level: advanced
100 
101 .keywords: SNES, view
102 
103 .seealso: SNESCreate(), SNESSetFunction()
104 @*/
105 PetscErrorCode  SNESSetFunctionDomainError(SNES snes)
106 {
107   PetscFunctionBegin;
108   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
109   snes->domainerror = PETSC_TRUE;
110   PetscFunctionReturn(0);
111 }
112 
113 #undef __FUNCT__
114 #define __FUNCT__ "SNESView"
115 /*@C
116    SNESView - Prints the SNES data structure.
117 
118    Collective on SNES
119 
120    Input Parameters:
121 +  SNES - the SNES context
122 -  viewer - visualization context
123 
124    Options Database Key:
125 .  -snes_view - Calls SNESView() at end of SNESSolve()
126 
127    Notes:
128    The available visualization contexts include
129 +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
130 -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
131          output where only the first processor opens
132          the file.  All other processors send their
133          data to the first processor to print.
134 
135    The user can open an alternative visualization context with
136    PetscViewerASCIIOpen() - output to a specified file.
137 
138    Level: beginner
139 
140 .keywords: SNES, view
141 
142 .seealso: PetscViewerASCIIOpen()
143 @*/
144 PetscErrorCode  SNESView(SNES snes,PetscViewer viewer)
145 {
146   SNESKSPEW           *kctx;
147   PetscErrorCode      ierr;
148   KSP                 ksp;
149   PetscBool           iascii,isstring;
150 
151   PetscFunctionBegin;
152   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
153   if (!viewer) {
154     ierr = PetscViewerASCIIGetStdout(((PetscObject)snes)->comm,&viewer);CHKERRQ(ierr);
155   }
156   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
157   PetscCheckSameComm(snes,1,viewer,2);
158 
159   ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
160   ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERSTRING,&isstring);CHKERRQ(ierr);
161   if (iascii) {
162     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)snes,viewer,"SNES Object");CHKERRQ(ierr);
163     if (snes->ops->view) {
164       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
165       ierr = (*snes->ops->view)(snes,viewer);CHKERRQ(ierr);
166       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
167     }
168     ierr = PetscViewerASCIIPrintf(viewer,"  maximum iterations=%D, maximum function evaluations=%D\n",snes->max_its,snes->max_funcs);CHKERRQ(ierr);
169     ierr = PetscViewerASCIIPrintf(viewer,"  tolerances: relative=%G, absolute=%G, solution=%G\n",
170                  snes->rtol,snes->abstol,snes->xtol);CHKERRQ(ierr);
171     ierr = PetscViewerASCIIPrintf(viewer,"  total number of linear solver iterations=%D\n",snes->linear_its);CHKERRQ(ierr);
172     ierr = PetscViewerASCIIPrintf(viewer,"  total number of function evaluations=%D\n",snes->nfuncs);CHKERRQ(ierr);
173     if (snes->ksp_ewconv) {
174       kctx = (SNESKSPEW *)snes->kspconvctx;
175       if (kctx) {
176         ierr = PetscViewerASCIIPrintf(viewer,"  Eisenstat-Walker computation of KSP relative tolerance (version %D)\n",kctx->version);CHKERRQ(ierr);
177         ierr = PetscViewerASCIIPrintf(viewer,"    rtol_0=%G, rtol_max=%G, threshold=%G\n",kctx->rtol_0,kctx->rtol_max,kctx->threshold);CHKERRQ(ierr);
178         ierr = PetscViewerASCIIPrintf(viewer,"    gamma=%G, alpha=%G, alpha2=%G\n",kctx->gamma,kctx->alpha,kctx->alpha2);CHKERRQ(ierr);
179       }
180     }
181     if (snes->lagpreconditioner == -1) {
182       ierr = PetscViewerASCIIPrintf(viewer,"  Preconditioned is never rebuilt\n");CHKERRQ(ierr);
183     } else if (snes->lagpreconditioner > 1) {
184       ierr = PetscViewerASCIIPrintf(viewer,"  Preconditioned is rebuilt every %D new Jacobians\n",snes->lagpreconditioner);CHKERRQ(ierr);
185     }
186     if (snes->lagjacobian == -1) {
187       ierr = PetscViewerASCIIPrintf(viewer,"  Jacobian is never rebuilt\n");CHKERRQ(ierr);
188     } else if (snes->lagjacobian > 1) {
189       ierr = PetscViewerASCIIPrintf(viewer,"  Jacobian is rebuilt every %D Newton iterations\n",snes->lagjacobian);CHKERRQ(ierr);
190     }
191   } else if (isstring) {
192     const char *type;
193     ierr = SNESGetType(snes,&type);CHKERRQ(ierr);
194     ierr = PetscViewerStringSPrintf(viewer," %-3.3s",type);CHKERRQ(ierr);
195   }
196   ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr);
197   if (snes->pc) {
198     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
199     ierr = SNESView(snes->pc, viewer);CHKERRQ(ierr);
200     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
201   }
202   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
203   ierr = KSPView(ksp,viewer);CHKERRQ(ierr);
204   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
205   PetscFunctionReturn(0);
206 }
207 
208 /*
209   We retain a list of functions that also take SNES command
210   line options. These are called at the end SNESSetFromOptions()
211 */
212 #define MAXSETFROMOPTIONS 5
213 static PetscInt numberofsetfromoptions;
214 static PetscErrorCode (*othersetfromoptions[MAXSETFROMOPTIONS])(SNES);
215 
216 #undef __FUNCT__
217 #define __FUNCT__ "SNESAddOptionsChecker"
218 /*@C
219   SNESAddOptionsChecker - Adds an additional function to check for SNES options.
220 
221   Not Collective
222 
223   Input Parameter:
224 . snescheck - function that checks for options
225 
226   Level: developer
227 
228 .seealso: SNESSetFromOptions()
229 @*/
230 PetscErrorCode  SNESAddOptionsChecker(PetscErrorCode (*snescheck)(SNES))
231 {
232   PetscFunctionBegin;
233   if (numberofsetfromoptions >= MAXSETFROMOPTIONS) {
234     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE, "Too many options checkers, only %D allowed", MAXSETFROMOPTIONS);
235   }
236   othersetfromoptions[numberofsetfromoptions++] = snescheck;
237   PetscFunctionReturn(0);
238 }
239 
240 extern PetscErrorCode  SNESDefaultMatrixFreeCreate2(SNES,Vec,Mat*);
241 
242 #undef __FUNCT__
243 #define __FUNCT__ "SNESSetUpMatrixFree_Private"
244 static PetscErrorCode SNESSetUpMatrixFree_Private(SNES snes, PetscBool  hasOperator, PetscInt version)
245 {
246   Mat            J;
247   KSP            ksp;
248   PC             pc;
249   PetscBool      match;
250   PetscErrorCode ierr;
251 
252   PetscFunctionBegin;
253   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
254 
255   if(!snes->vec_func && (snes->jacobian || snes->jacobian_pre)) {
256     Mat A = snes->jacobian, B = snes->jacobian_pre;
257     ierr = MatGetVecs(A ? A : B, PETSC_NULL,&snes->vec_func);CHKERRQ(ierr);
258   }
259 
260   if (version == 1) {
261     ierr = MatCreateSNESMF(snes,&J);CHKERRQ(ierr);
262     ierr = MatMFFDSetOptionsPrefix(J,((PetscObject)snes)->prefix);CHKERRQ(ierr);
263     ierr = MatSetFromOptions(J);CHKERRQ(ierr);
264   } else if (version == 2) {
265     if (!snes->vec_func) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"SNESSetFunction() must be called first");
266 #if !defined(PETSC_USE_COMPLEX) && !defined(PETSC_USE_REAL_SINGLE) && !defined(PETSC_USE_REAL___FLOAT128) && !defined(PETSC_USE_REAL_LONG_DOUBLE)
267     ierr = SNESDefaultMatrixFreeCreate2(snes,snes->vec_func,&J);CHKERRQ(ierr);
268 #else
269     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP, "matrix-free operator rutines (version 2)");
270 #endif
271   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE, "matrix-free operator rutines, only version 1 and 2");
272 
273   ierr = PetscInfo1(snes,"Setting default matrix-free operator routines (version %D)\n", version);CHKERRQ(ierr);
274   if (hasOperator) {
275     /* This version replaces the user provided Jacobian matrix with a
276        matrix-free version but still employs the user-provided preconditioner matrix. */
277     ierr = SNESSetJacobian(snes,J,0,0,0);CHKERRQ(ierr);
278   } else {
279     /* This version replaces both the user-provided Jacobian and the user-
280        provided preconditioner matrix with the default matrix free version. */
281     ierr = SNESSetJacobian(snes,J,J,MatMFFDComputeJacobian,snes->funP);CHKERRQ(ierr);
282     /* Force no preconditioner */
283     ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr);
284     ierr = KSPGetPC(ksp,&pc);CHKERRQ(ierr);
285     ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&match);CHKERRQ(ierr);
286     if (!match) {
287       ierr = PetscInfo(snes,"Setting default matrix-free preconditioner routines\nThat is no preconditioner is being used\n");CHKERRQ(ierr);
288       ierr = PCSetType(pc,PCNONE);CHKERRQ(ierr);
289     }
290   }
291   ierr = MatDestroy(&J);CHKERRQ(ierr);
292   PetscFunctionReturn(0);
293 }
294 
295 #undef __FUNCT__
296 #define __FUNCT__ "SNESSetFromOptions"
297 /*@
298    SNESSetFromOptions - Sets various SNES and KSP parameters from user options.
299 
300    Collective on SNES
301 
302    Input Parameter:
303 .  snes - the SNES context
304 
305    Options Database Keys:
306 +  -snes_type <type> - ls, tr, umls, umtr, test
307 .  -snes_stol - convergence tolerance in terms of the norm
308                 of the change in the solution between steps
309 .  -snes_atol <abstol> - absolute tolerance of residual norm
310 .  -snes_rtol <rtol> - relative decrease in tolerance norm from initial
311 .  -snes_max_it <max_it> - maximum number of iterations
312 .  -snes_max_funcs <max_funcs> - maximum number of function evaluations
313 .  -snes_max_fail <max_fail> - maximum number of failures
314 .  -snes_max_linear_solve_fail - number of linear solver failures before SNESSolve() stops
315 .  -snes_lag_preconditioner <lag> - how often preconditioner is rebuilt (use -1 to never rebuild)
316 .  -snes_lag_jacobian <lag> - how often Jacobian is rebuilt (use -1 to never rebuild)
317 .  -snes_trtol <trtol> - trust region tolerance
318 .  -snes_no_convergence_test - skip convergence test in nonlinear
319                                solver; hence iterations will continue until max_it
320                                or some other criterion is reached. Saves expense
321                                of convergence test
322 .  -snes_monitor <optional filename> - prints residual norm at each iteration. if no
323                                        filename given prints to stdout
324 .  -snes_monitor_solution - plots solution at each iteration
325 .  -snes_monitor_residual - plots residual (not its norm) at each iteration
326 .  -snes_monitor_solution_update - plots update to solution at each iteration
327 .  -snes_monitor_draw - plots residual norm at each iteration
328 .  -snes_fd - use finite differences to compute Jacobian; very slow, only for testing
329 .  -snes_mf_ksp_monitor - if using matrix-free multiply then print h at each KSP iteration
330 -  -snes_converged_reason - print the reason for convergence/divergence after each solve
331 
332     Options Database for Eisenstat-Walker method:
333 +  -snes_ksp_ew - use Eisenstat-Walker method for determining linear system convergence
334 .  -snes_ksp_ew_version ver - version of  Eisenstat-Walker method
335 .  -snes_ksp_ew_rtol0 <rtol0> - Sets rtol0
336 .  -snes_ksp_ew_rtolmax <rtolmax> - Sets rtolmax
337 .  -snes_ksp_ew_gamma <gamma> - Sets gamma
338 .  -snes_ksp_ew_alpha <alpha> - Sets alpha
339 .  -snes_ksp_ew_alpha2 <alpha2> - Sets alpha2
340 -  -snes_ksp_ew_threshold <threshold> - Sets threshold
341 
342    Notes:
343    To see all options, run your program with the -help option or consult
344    the <A href="../../docs/manual.pdf#nameddest=ch_snes">SNES chapter of the users manual</A>.
345 
346    Level: beginner
347 
348 .keywords: SNES, nonlinear, set, options, database
349 
350 .seealso: SNESSetOptionsPrefix()
351 @*/
352 PetscErrorCode  SNESSetFromOptions(SNES snes)
353 {
354   PetscBool               flg,mf,mf_operator;
355   PetscInt                i,indx,lag,mf_version,grids;
356   MatStructure            matflag;
357   const char              *deft = SNESLS;
358   const char              *convtests[] = {"default","skip"};
359   SNESKSPEW               *kctx = NULL;
360   char                    type[256], monfilename[PETSC_MAX_PATH_LEN];
361   PetscViewer             monviewer;
362   PetscErrorCode          ierr;
363 
364   PetscFunctionBegin;
365   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
366 
367   if (!SNESRegisterAllCalled) {ierr = SNESRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
368   ierr = PetscOptionsBegin(((PetscObject)snes)->comm,((PetscObject)snes)->prefix,"Nonlinear solver (SNES) options","SNES");CHKERRQ(ierr);
369     if (((PetscObject)snes)->type_name) { deft = ((PetscObject)snes)->type_name; }
370     ierr = PetscOptionsList("-snes_type","Nonlinear solver method","SNESSetType",SNESList,deft,type,256,&flg);CHKERRQ(ierr);
371     if (flg) {
372       ierr = SNESSetType(snes,type);CHKERRQ(ierr);
373     } else if (!((PetscObject)snes)->type_name) {
374       ierr = SNESSetType(snes,deft);CHKERRQ(ierr);
375     }
376     /* not used here, but called so will go into help messaage */
377     ierr = PetscOptionsName("-snes_view","Print detailed information on solver used","SNESView",0);CHKERRQ(ierr);
378 
379     ierr = PetscOptionsReal("-snes_stol","Stop if step length less than","SNESSetTolerances",snes->xtol,&snes->xtol,0);CHKERRQ(ierr);
380     ierr = PetscOptionsReal("-snes_atol","Stop if function norm less than","SNESSetTolerances",snes->abstol,&snes->abstol,0);CHKERRQ(ierr);
381 
382     ierr = PetscOptionsReal("-snes_rtol","Stop if decrease in function norm less than","SNESSetTolerances",snes->rtol,&snes->rtol,0);CHKERRQ(ierr);
383     ierr = PetscOptionsInt("-snes_max_it","Maximum iterations","SNESSetTolerances",snes->max_its,&snes->max_its,PETSC_NULL);CHKERRQ(ierr);
384     ierr = PetscOptionsInt("-snes_max_funcs","Maximum function evaluations","SNESSetTolerances",snes->max_funcs,&snes->max_funcs,PETSC_NULL);CHKERRQ(ierr);
385     ierr = PetscOptionsInt("-snes_max_fail","Maximum failures","SNESSetTolerances",snes->maxFailures,&snes->maxFailures,PETSC_NULL);CHKERRQ(ierr);
386     ierr = PetscOptionsInt("-snes_max_linear_solve_fail","Maximum failures in linear solves allowed","SNESSetMaxLinearSolveFailures",snes->maxLinearSolveFailures,&snes->maxLinearSolveFailures,PETSC_NULL);CHKERRQ(ierr);
387     ierr = PetscOptionsBool("-snes_error_if_not_converged","Generate error if solver does not converge","SNESSetErrorIfNotConverged",snes->errorifnotconverged,&snes->errorifnotconverged,PETSC_NULL);CHKERRQ(ierr);
388 
389     ierr = PetscOptionsInt("-snes_lag_preconditioner","How often to rebuild preconditioner","SNESSetLagPreconditioner",snes->lagpreconditioner,&lag,&flg);CHKERRQ(ierr);
390     if (flg) {
391       ierr = SNESSetLagPreconditioner(snes,lag);CHKERRQ(ierr);
392     }
393     ierr = PetscOptionsInt("-snes_lag_jacobian","How often to rebuild Jacobian","SNESSetLagJacobian",snes->lagjacobian,&lag,&flg);CHKERRQ(ierr);
394     if (flg) {
395       ierr = SNESSetLagJacobian(snes,lag);CHKERRQ(ierr);
396     }
397     ierr = PetscOptionsInt("-snes_grid_sequence","Use grid sequencing to generate initial guess","SNESSetGridSequence",snes->gridsequence,&grids,&flg);CHKERRQ(ierr);
398     if (flg) {
399       ierr = SNESSetGridSequence(snes,grids);CHKERRQ(ierr);
400     }
401 
402     ierr = PetscOptionsEList("-snes_convergence_test","Convergence test","SNESSetConvergenceTest",convtests,2,"default",&indx,&flg);CHKERRQ(ierr);
403     if (flg) {
404       switch (indx) {
405       case 0: ierr = SNESSetConvergenceTest(snes,SNESDefaultConverged,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); break;
406       case 1: ierr = SNESSetConvergenceTest(snes,SNESSkipConverged,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);    break;
407       }
408     }
409 
410     ierr = PetscOptionsBool("-snes_converged_reason","Print reason for converged or diverged","SNESSolve",snes->printreason,&snes->printreason,PETSC_NULL);CHKERRQ(ierr);
411 
412     kctx = (SNESKSPEW *)snes->kspconvctx;
413 
414     ierr = PetscOptionsBool("-snes_ksp_ew","Use Eisentat-Walker linear system convergence test","SNESKSPSetUseEW",snes->ksp_ewconv,&snes->ksp_ewconv,PETSC_NULL);CHKERRQ(ierr);
415 
416     ierr = PetscOptionsInt("-snes_ksp_ew_version","Version 1, 2 or 3","SNESKSPSetParametersEW",kctx->version,&kctx->version,0);CHKERRQ(ierr);
417     ierr = PetscOptionsReal("-snes_ksp_ew_rtol0","0 <= rtol0 < 1","SNESKSPSetParametersEW",kctx->rtol_0,&kctx->rtol_0,0);CHKERRQ(ierr);
418     ierr = PetscOptionsReal("-snes_ksp_ew_rtolmax","0 <= rtolmax < 1","SNESKSPSetParametersEW",kctx->rtol_max,&kctx->rtol_max,0);CHKERRQ(ierr);
419     ierr = PetscOptionsReal("-snes_ksp_ew_gamma","0 <= gamma <= 1","SNESKSPSetParametersEW",kctx->gamma,&kctx->gamma,0);CHKERRQ(ierr);
420     ierr = PetscOptionsReal("-snes_ksp_ew_alpha","1 < alpha <= 2","SNESKSPSetParametersEW",kctx->alpha,&kctx->alpha,0);CHKERRQ(ierr);
421     ierr = PetscOptionsReal("-snes_ksp_ew_alpha2","alpha2","SNESKSPSetParametersEW",kctx->alpha2,&kctx->alpha2,0);CHKERRQ(ierr);
422     ierr = PetscOptionsReal("-snes_ksp_ew_threshold","0 < threshold < 1","SNESKSPSetParametersEW",kctx->threshold,&kctx->threshold,0);CHKERRQ(ierr);
423 
424     flg  = PETSC_FALSE;
425     ierr = PetscOptionsBool("-snes_monitor_cancel","Remove all monitors","SNESMonitorCancel",flg,&flg,PETSC_NULL);CHKERRQ(ierr);
426     if (flg) {ierr = SNESMonitorCancel(snes);CHKERRQ(ierr);}
427 
428     ierr = PetscOptionsString("-snes_monitor","Monitor norm of function","SNESMonitorSet","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
429     if (flg) {
430       ierr = PetscViewerASCIIOpen(((PetscObject)snes)->comm,monfilename,&monviewer);CHKERRQ(ierr);
431       ierr = SNESMonitorSet(snes,SNESMonitorDefault,monviewer,(PetscErrorCode (*)(void**))PetscViewerDestroy);CHKERRQ(ierr);
432     }
433 
434     ierr = PetscOptionsString("-snes_monitor_range","Monitor range of elements of function","SNESMonitorSet","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
435     if (flg) {
436       ierr = SNESMonitorSet(snes,SNESMonitorRange,0,0);CHKERRQ(ierr);
437     }
438 
439     ierr = PetscOptionsString("-snes_ratiomonitor","Monitor ratios of norms of function","SNESMonitorSetRatio","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
440     if (flg) {
441       ierr = PetscViewerASCIIOpen(((PetscObject)snes)->comm,monfilename,&monviewer);CHKERRQ(ierr);
442       ierr = SNESMonitorSetRatio(snes,monviewer);CHKERRQ(ierr);
443     }
444 
445     ierr = PetscOptionsString("-snes_monitor_short","Monitor norm of function (fewer digits)","SNESMonitorSet","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
446     if (flg) {
447       ierr = PetscViewerASCIIOpen(((PetscObject)snes)->comm,monfilename,&monviewer);CHKERRQ(ierr);
448       ierr = SNESMonitorSet(snes,SNESMonitorDefaultShort,monviewer,(PetscErrorCode (*)(void**))PetscViewerDestroy);CHKERRQ(ierr);
449     }
450 
451     ierr = PetscOptionsString("-snes_monitor_python","Use Python function","SNESMonitorSet",0,monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
452     if (flg) {ierr = PetscPythonMonitorSet((PetscObject)snes,monfilename);CHKERRQ(ierr);}
453 
454     flg  = PETSC_FALSE;
455     ierr = PetscOptionsBool("-snes_monitor_solution","Plot solution at each iteration","SNESMonitorSolution",flg,&flg,PETSC_NULL);CHKERRQ(ierr);
456     if (flg) {ierr = SNESMonitorSet(snes,SNESMonitorSolution,0,0);CHKERRQ(ierr);}
457     flg  = PETSC_FALSE;
458     ierr = PetscOptionsBool("-snes_monitor_solution_update","Plot correction at each iteration","SNESMonitorSolutionUpdate",flg,&flg,PETSC_NULL);CHKERRQ(ierr);
459     if (flg) {ierr = SNESMonitorSet(snes,SNESMonitorSolutionUpdate,0,0);CHKERRQ(ierr);}
460     flg  = PETSC_FALSE;
461     ierr = PetscOptionsBool("-snes_monitor_residual","Plot residual at each iteration","SNESMonitorResidual",flg,&flg,PETSC_NULL);CHKERRQ(ierr);
462     if (flg) {ierr = SNESMonitorSet(snes,SNESMonitorResidual,0,0);CHKERRQ(ierr);}
463     flg  = PETSC_FALSE;
464     ierr = PetscOptionsBool("-snes_monitor_draw","Plot function norm at each iteration","SNESMonitorLG",flg,&flg,PETSC_NULL);CHKERRQ(ierr);
465     if (flg) {ierr = SNESMonitorSet(snes,SNESMonitorLG,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);}
466     flg  = PETSC_FALSE;
467     ierr = PetscOptionsBool("-snes_monitor_range_draw","Plot function range at each iteration","SNESMonitorLG",flg,&flg,PETSC_NULL);CHKERRQ(ierr);
468     if (flg) {ierr = SNESMonitorSet(snes,SNESMonitorLGRange,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);}
469 
470     flg  = PETSC_FALSE;
471     ierr = PetscOptionsBool("-snes_fd","Use finite differences (slow) to compute Jacobian","SNESDefaultComputeJacobian",flg,&flg,PETSC_NULL);CHKERRQ(ierr);
472     if (flg) {
473       ierr = SNESSetJacobian(snes,snes->jacobian,snes->jacobian_pre,SNESDefaultComputeJacobian,snes->funP);CHKERRQ(ierr);
474       ierr = PetscInfo(snes,"Setting default finite difference Jacobian matrix\n");CHKERRQ(ierr);
475     }
476 
477     mf = mf_operator = PETSC_FALSE;
478     flg = PETSC_FALSE;
479     ierr = PetscOptionsBool("-snes_mf_operator","Use a Matrix-Free Jacobian with user-provided preconditioner matrix","MatCreateSNESMF",PETSC_FALSE,&mf_operator,&flg);CHKERRQ(ierr);
480     if (flg && mf_operator) {
481       snes->mf_operator = PETSC_TRUE;
482       mf = PETSC_TRUE;
483     }
484     flg = PETSC_FALSE;
485     ierr = PetscOptionsBool("-snes_mf","Use a Matrix-Free Jacobian with no preconditioner matrix","MatCreateSNESMF",PETSC_FALSE,&mf,&flg);CHKERRQ(ierr);
486     if (!flg && mf_operator) mf = PETSC_TRUE;
487     mf_version = 1;
488     ierr = PetscOptionsInt("-snes_mf_version","Matrix-Free routines version 1 or 2","None",mf_version,&mf_version,0);CHKERRQ(ierr);
489 
490     for(i = 0; i < numberofsetfromoptions; i++) {
491       ierr = (*othersetfromoptions[i])(snes);CHKERRQ(ierr);
492     }
493 
494     if (snes->ops->setfromoptions) {
495       ierr = (*snes->ops->setfromoptions)(snes);CHKERRQ(ierr);
496     }
497 
498     /* process any options handlers added with PetscObjectAddOptionsHandler() */
499     ierr = PetscObjectProcessOptionsHandlers((PetscObject)snes);CHKERRQ(ierr);
500   ierr = PetscOptionsEnd();CHKERRQ(ierr);
501 
502   if (mf) { ierr = SNESSetUpMatrixFree_Private(snes, mf_operator, mf_version);CHKERRQ(ierr); }
503 
504   if (!snes->ksp) {ierr = SNESGetKSP(snes,&snes->ksp);CHKERRQ(ierr);}
505   ierr = KSPGetOperators(snes->ksp,PETSC_NULL,PETSC_NULL,&matflag);
506   ierr = KSPSetOperators(snes->ksp,snes->jacobian,snes->jacobian_pre,matflag);CHKERRQ(ierr);
507   ierr = KSPSetFromOptions(snes->ksp);CHKERRQ(ierr);
508 
509   if (snes->pc) {
510     ierr = SNESSetOptionsPrefix(snes->pc, "npc_");CHKERRQ(ierr);
511     ierr = SNESSetDM(snes->pc, snes->dm);CHKERRQ(ierr);
512     /* Should we make a duplicate vector and matrix? Leave the DM to make it? */
513     ierr = SNESSetFunction(snes->pc, snes->vec_func, snes->ops->computefunction, snes->funP);CHKERRQ(ierr);
514     ierr = SNESSetJacobian(snes->pc, snes->jacobian, snes->jacobian_pre, snes->ops->computejacobian, snes->jacP);CHKERRQ(ierr);
515     ierr = SNESSetFromOptions(snes->pc);CHKERRQ(ierr);
516   }
517   PetscFunctionReturn(0);
518 }
519 
520 #undef __FUNCT__
521 #define __FUNCT__ "SNESSetComputeApplicationContext"
522 /*@
523    SNESSetComputeApplicationContext - Sets an optional function to compute a user-defined context for
524    the nonlinear solvers.
525 
526    Logically Collective on SNES
527 
528    Input Parameters:
529 +  snes - the SNES context
530 .  compute - function to compute the context
531 -  destroy - function to destroy the context
532 
533    Level: intermediate
534 
535 .keywords: SNES, nonlinear, set, application, context
536 
537 .seealso: SNESGetApplicationContext(), SNESSetComputeApplicationContext(), SNESGetApplicationContext()
538 @*/
539 PetscErrorCode  SNESSetComputeApplicationContext(SNES snes,PetscErrorCode (*compute)(SNES,void**),PetscErrorCode (*destroy)(void**))
540 {
541   PetscFunctionBegin;
542   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
543   snes->ops->usercompute = compute;
544   snes->ops->userdestroy = destroy;
545   PetscFunctionReturn(0);
546 }
547 
548 #undef __FUNCT__
549 #define __FUNCT__ "SNESSetApplicationContext"
550 /*@
551    SNESSetApplicationContext - Sets the optional user-defined context for
552    the nonlinear solvers.
553 
554    Logically Collective on SNES
555 
556    Input Parameters:
557 +  snes - the SNES context
558 -  usrP - optional user context
559 
560    Level: intermediate
561 
562 .keywords: SNES, nonlinear, set, application, context
563 
564 .seealso: SNESGetApplicationContext(), SNESSetApplicationContext()
565 @*/
566 PetscErrorCode  SNESSetApplicationContext(SNES snes,void *usrP)
567 {
568   PetscErrorCode ierr;
569   KSP            ksp;
570 
571   PetscFunctionBegin;
572   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
573   ierr       = SNESGetKSP(snes,&ksp);CHKERRQ(ierr);
574   ierr       = KSPSetApplicationContext(ksp,usrP);CHKERRQ(ierr);
575   snes->user = usrP;
576   PetscFunctionReturn(0);
577 }
578 
579 #undef __FUNCT__
580 #define __FUNCT__ "SNESGetApplicationContext"
581 /*@
582    SNESGetApplicationContext - Gets the user-defined context for the
583    nonlinear solvers.
584 
585    Not Collective
586 
587    Input Parameter:
588 .  snes - SNES context
589 
590    Output Parameter:
591 .  usrP - user context
592 
593    Level: intermediate
594 
595 .keywords: SNES, nonlinear, get, application, context
596 
597 .seealso: SNESSetApplicationContext()
598 @*/
599 PetscErrorCode  SNESGetApplicationContext(SNES snes,void *usrP)
600 {
601   PetscFunctionBegin;
602   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
603   *(void**)usrP = snes->user;
604   PetscFunctionReturn(0);
605 }
606 
607 #undef __FUNCT__
608 #define __FUNCT__ "SNESGetIterationNumber"
609 /*@
610    SNESGetIterationNumber - Gets the number of nonlinear iterations completed
611    at this time.
612 
613    Not Collective
614 
615    Input Parameter:
616 .  snes - SNES context
617 
618    Output Parameter:
619 .  iter - iteration number
620 
621    Notes:
622    For example, during the computation of iteration 2 this would return 1.
623 
624    This is useful for using lagged Jacobians (where one does not recompute the
625    Jacobian at each SNES iteration). For example, the code
626 .vb
627       ierr = SNESGetIterationNumber(snes,&it);
628       if (!(it % 2)) {
629         [compute Jacobian here]
630       }
631 .ve
632    can be used in your ComputeJacobian() function to cause the Jacobian to be
633    recomputed every second SNES iteration.
634 
635    Level: intermediate
636 
637 .keywords: SNES, nonlinear, get, iteration, number,
638 
639 .seealso:   SNESGetFunctionNorm(), SNESGetLinearSolveIterations()
640 @*/
641 PetscErrorCode  SNESGetIterationNumber(SNES snes,PetscInt* iter)
642 {
643   PetscFunctionBegin;
644   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
645   PetscValidIntPointer(iter,2);
646   *iter = snes->iter;
647   PetscFunctionReturn(0);
648 }
649 
650 #undef __FUNCT__
651 #define __FUNCT__ "SNESGetFunctionNorm"
652 /*@
653    SNESGetFunctionNorm - Gets the norm of the current function that was set
654    with SNESSSetFunction().
655 
656    Collective on SNES
657 
658    Input Parameter:
659 .  snes - SNES context
660 
661    Output Parameter:
662 .  fnorm - 2-norm of function
663 
664    Level: intermediate
665 
666 .keywords: SNES, nonlinear, get, function, norm
667 
668 .seealso: SNESGetFunction(), SNESGetIterationNumber(), SNESGetLinearSolveIterations()
669 @*/
670 PetscErrorCode  SNESGetFunctionNorm(SNES snes,PetscReal *fnorm)
671 {
672   PetscFunctionBegin;
673   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
674   PetscValidScalarPointer(fnorm,2);
675   *fnorm = snes->norm;
676   PetscFunctionReturn(0);
677 }
678 
679 #undef __FUNCT__
680 #define __FUNCT__ "SNESGetNonlinearStepFailures"
681 /*@
682    SNESGetNonlinearStepFailures - Gets the number of unsuccessful steps
683    attempted by the nonlinear solver.
684 
685    Not Collective
686 
687    Input Parameter:
688 .  snes - SNES context
689 
690    Output Parameter:
691 .  nfails - number of unsuccessful steps attempted
692 
693    Notes:
694    This counter is reset to zero for each successive call to SNESSolve().
695 
696    Level: intermediate
697 
698 .keywords: SNES, nonlinear, get, number, unsuccessful, steps
699 
700 .seealso: SNESGetMaxLinearSolveFailures(), SNESGetLinearSolveIterations(), SNESSetMaxLinearSolveFailures(), SNESGetLinearSolveFailures(),
701           SNESSetMaxNonlinearStepFailures(), SNESGetMaxNonlinearStepFailures()
702 @*/
703 PetscErrorCode  SNESGetNonlinearStepFailures(SNES snes,PetscInt* nfails)
704 {
705   PetscFunctionBegin;
706   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
707   PetscValidIntPointer(nfails,2);
708   *nfails = snes->numFailures;
709   PetscFunctionReturn(0);
710 }
711 
712 #undef __FUNCT__
713 #define __FUNCT__ "SNESSetMaxNonlinearStepFailures"
714 /*@
715    SNESSetMaxNonlinearStepFailures - Sets the maximum number of unsuccessful steps
716    attempted by the nonlinear solver before it gives up.
717 
718    Not Collective
719 
720    Input Parameters:
721 +  snes     - SNES context
722 -  maxFails - maximum of unsuccessful steps
723 
724    Level: intermediate
725 
726 .keywords: SNES, nonlinear, set, maximum, unsuccessful, steps
727 
728 .seealso: SNESGetMaxLinearSolveFailures(), SNESGetLinearSolveIterations(), SNESSetMaxLinearSolveFailures(), SNESGetLinearSolveFailures(),
729           SNESGetMaxNonlinearStepFailures(), SNESGetNonlinearStepFailures()
730 @*/
731 PetscErrorCode  SNESSetMaxNonlinearStepFailures(SNES snes, PetscInt maxFails)
732 {
733   PetscFunctionBegin;
734   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
735   snes->maxFailures = maxFails;
736   PetscFunctionReturn(0);
737 }
738 
739 #undef __FUNCT__
740 #define __FUNCT__ "SNESGetMaxNonlinearStepFailures"
741 /*@
742    SNESGetMaxNonlinearStepFailures - Gets the maximum number of unsuccessful steps
743    attempted by the nonlinear solver before it gives up.
744 
745    Not Collective
746 
747    Input Parameter:
748 .  snes     - SNES context
749 
750    Output Parameter:
751 .  maxFails - maximum of unsuccessful steps
752 
753    Level: intermediate
754 
755 .keywords: SNES, nonlinear, get, maximum, unsuccessful, steps
756 
757 .seealso: SNESGetMaxLinearSolveFailures(), SNESGetLinearSolveIterations(), SNESSetMaxLinearSolveFailures(), SNESGetLinearSolveFailures(),
758           SNESSetMaxNonlinearStepFailures(), SNESGetNonlinearStepFailures()
759 
760 @*/
761 PetscErrorCode  SNESGetMaxNonlinearStepFailures(SNES snes, PetscInt *maxFails)
762 {
763   PetscFunctionBegin;
764   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
765   PetscValidIntPointer(maxFails,2);
766   *maxFails = snes->maxFailures;
767   PetscFunctionReturn(0);
768 }
769 
770 #undef __FUNCT__
771 #define __FUNCT__ "SNESGetNumberFunctionEvals"
772 /*@
773    SNESGetNumberFunctionEvals - Gets the number of user provided function evaluations
774      done by SNES.
775 
776    Not Collective
777 
778    Input Parameter:
779 .  snes     - SNES context
780 
781    Output Parameter:
782 .  nfuncs - number of evaluations
783 
784    Level: intermediate
785 
786 .keywords: SNES, nonlinear, get, maximum, unsuccessful, steps
787 
788 .seealso: SNESGetMaxLinearSolveFailures(), SNESGetLinearSolveIterations(), SNESSetMaxLinearSolveFailures(), SNESGetLinearSolveFailures()
789 @*/
790 PetscErrorCode  SNESGetNumberFunctionEvals(SNES snes, PetscInt *nfuncs)
791 {
792   PetscFunctionBegin;
793   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
794   PetscValidIntPointer(nfuncs,2);
795   *nfuncs = snes->nfuncs;
796   PetscFunctionReturn(0);
797 }
798 
799 #undef __FUNCT__
800 #define __FUNCT__ "SNESGetLinearSolveFailures"
801 /*@
802    SNESGetLinearSolveFailures - Gets the number of failed (non-converged)
803    linear solvers.
804 
805    Not Collective
806 
807    Input Parameter:
808 .  snes - SNES context
809 
810    Output Parameter:
811 .  nfails - number of failed solves
812 
813    Notes:
814    This counter is reset to zero for each successive call to SNESSolve().
815 
816    Level: intermediate
817 
818 .keywords: SNES, nonlinear, get, number, unsuccessful, steps
819 
820 .seealso: SNESGetMaxLinearSolveFailures(), SNESGetLinearSolveIterations(), SNESSetMaxLinearSolveFailures()
821 @*/
822 PetscErrorCode  SNESGetLinearSolveFailures(SNES snes,PetscInt* nfails)
823 {
824   PetscFunctionBegin;
825   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
826   PetscValidIntPointer(nfails,2);
827   *nfails = snes->numLinearSolveFailures;
828   PetscFunctionReturn(0);
829 }
830 
831 #undef __FUNCT__
832 #define __FUNCT__ "SNESSetMaxLinearSolveFailures"
833 /*@
834    SNESSetMaxLinearSolveFailures - the number of failed linear solve attempts
835    allowed before SNES returns with a diverged reason of SNES_DIVERGED_LINEAR_SOLVE
836 
837    Logically Collective on SNES
838 
839    Input Parameters:
840 +  snes     - SNES context
841 -  maxFails - maximum allowed linear solve failures
842 
843    Level: intermediate
844 
845    Notes: By default this is 0; that is SNES returns on the first failed linear solve
846 
847 .keywords: SNES, nonlinear, set, maximum, unsuccessful, steps
848 
849 .seealso: SNESGetLinearSolveFailures(), SNESGetMaxLinearSolveFailures(), SNESGetLinearSolveIterations()
850 @*/
851 PetscErrorCode  SNESSetMaxLinearSolveFailures(SNES snes, PetscInt maxFails)
852 {
853   PetscFunctionBegin;
854   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
855   PetscValidLogicalCollectiveInt(snes,maxFails,2);
856   snes->maxLinearSolveFailures = maxFails;
857   PetscFunctionReturn(0);
858 }
859 
860 #undef __FUNCT__
861 #define __FUNCT__ "SNESGetMaxLinearSolveFailures"
862 /*@
863    SNESGetMaxLinearSolveFailures - gets the maximum number of linear solve failures that
864      are allowed before SNES terminates
865 
866    Not Collective
867 
868    Input Parameter:
869 .  snes     - SNES context
870 
871    Output Parameter:
872 .  maxFails - maximum of unsuccessful solves allowed
873 
874    Level: intermediate
875 
876    Notes: By default this is 1; that is SNES returns on the first failed linear solve
877 
878 .keywords: SNES, nonlinear, get, maximum, unsuccessful, steps
879 
880 .seealso: SNESGetLinearSolveFailures(), SNESGetLinearSolveIterations(), SNESSetMaxLinearSolveFailures(),
881 @*/
882 PetscErrorCode  SNESGetMaxLinearSolveFailures(SNES snes, PetscInt *maxFails)
883 {
884   PetscFunctionBegin;
885   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
886   PetscValidIntPointer(maxFails,2);
887   *maxFails = snes->maxLinearSolveFailures;
888   PetscFunctionReturn(0);
889 }
890 
891 #undef __FUNCT__
892 #define __FUNCT__ "SNESGetLinearSolveIterations"
893 /*@
894    SNESGetLinearSolveIterations - Gets the total number of linear iterations
895    used by the nonlinear solver.
896 
897    Not Collective
898 
899    Input Parameter:
900 .  snes - SNES context
901 
902    Output Parameter:
903 .  lits - number of linear iterations
904 
905    Notes:
906    This counter is reset to zero for each successive call to SNESSolve().
907 
908    Level: intermediate
909 
910 .keywords: SNES, nonlinear, get, number, linear, iterations
911 
912 .seealso:  SNESGetIterationNumber(), SNESGetFunctionNorm(), SNESGetLinearSolveFailures(), SNESGetMaxLinearSolveFailures()
913 @*/
914 PetscErrorCode  SNESGetLinearSolveIterations(SNES snes,PetscInt* lits)
915 {
916   PetscFunctionBegin;
917   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
918   PetscValidIntPointer(lits,2);
919   *lits = snes->linear_its;
920   PetscFunctionReturn(0);
921 }
922 
923 #undef __FUNCT__
924 #define __FUNCT__ "SNESGetKSP"
925 /*@
926    SNESGetKSP - Returns the KSP context for a SNES solver.
927 
928    Not Collective, but if SNES object is parallel, then KSP object is parallel
929 
930    Input Parameter:
931 .  snes - the SNES context
932 
933    Output Parameter:
934 .  ksp - the KSP context
935 
936    Notes:
937    The user can then directly manipulate the KSP context to set various
938    options, etc.  Likewise, the user can then extract and manipulate the
939    PC contexts as well.
940 
941    Level: beginner
942 
943 .keywords: SNES, nonlinear, get, KSP, context
944 
945 .seealso: KSPGetPC(), SNESCreate(), KSPCreate(), SNESSetKSP()
946 @*/
947 PetscErrorCode  SNESGetKSP(SNES snes,KSP *ksp)
948 {
949   PetscErrorCode ierr;
950 
951   PetscFunctionBegin;
952   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
953   PetscValidPointer(ksp,2);
954 
955   if (!snes->ksp) {
956     ierr = KSPCreate(((PetscObject)snes)->comm,&snes->ksp);CHKERRQ(ierr);
957     ierr = PetscObjectIncrementTabLevel((PetscObject)snes->ksp,(PetscObject)snes,1);CHKERRQ(ierr);
958     ierr = PetscLogObjectParent(snes,snes->ksp);CHKERRQ(ierr);
959   }
960   *ksp = snes->ksp;
961   PetscFunctionReturn(0);
962 }
963 
964 #undef __FUNCT__
965 #define __FUNCT__ "SNESSetKSP"
966 /*@
967    SNESSetKSP - Sets a KSP context for the SNES object to use
968 
969    Not Collective, but the SNES and KSP objects must live on the same MPI_Comm
970 
971    Input Parameters:
972 +  snes - the SNES context
973 -  ksp - the KSP context
974 
975    Notes:
976    The SNES object already has its KSP object, you can obtain with SNESGetKSP()
977    so this routine is rarely needed.
978 
979    The KSP object that is already in the SNES object has its reference count
980    decreased by one.
981 
982    Level: developer
983 
984 .keywords: SNES, nonlinear, get, KSP, context
985 
986 .seealso: KSPGetPC(), SNESCreate(), KSPCreate(), SNESSetKSP()
987 @*/
988 PetscErrorCode  SNESSetKSP(SNES snes,KSP ksp)
989 {
990   PetscErrorCode ierr;
991 
992   PetscFunctionBegin;
993   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
994   PetscValidHeaderSpecific(ksp,KSP_CLASSID,2);
995   PetscCheckSameComm(snes,1,ksp,2);
996   ierr = PetscObjectReference((PetscObject)ksp);CHKERRQ(ierr);
997   if (snes->ksp) {ierr = PetscObjectDereference((PetscObject)snes->ksp);CHKERRQ(ierr);}
998   snes->ksp = ksp;
999   PetscFunctionReturn(0);
1000 }
1001 
1002 #if 0
1003 #undef __FUNCT__
1004 #define __FUNCT__ "SNESPublish_Petsc"
1005 static PetscErrorCode SNESPublish_Petsc(PetscObject obj)
1006 {
1007   PetscFunctionBegin;
1008   PetscFunctionReturn(0);
1009 }
1010 #endif
1011 
1012 /* -----------------------------------------------------------*/
1013 #undef __FUNCT__
1014 #define __FUNCT__ "SNESCreate"
1015 /*@
1016    SNESCreate - Creates a nonlinear solver context.
1017 
1018    Collective on MPI_Comm
1019 
1020    Input Parameters:
1021 .  comm - MPI communicator
1022 
1023    Output Parameter:
1024 .  outsnes - the new SNES context
1025 
1026    Options Database Keys:
1027 +   -snes_mf - Activates default matrix-free Jacobian-vector products,
1028                and no preconditioning matrix
1029 .   -snes_mf_operator - Activates default matrix-free Jacobian-vector
1030                products, and a user-provided preconditioning matrix
1031                as set by SNESSetJacobian()
1032 -   -snes_fd - Uses (slow!) finite differences to compute Jacobian
1033 
1034    Level: beginner
1035 
1036 .keywords: SNES, nonlinear, create, context
1037 
1038 .seealso: SNESSolve(), SNESDestroy(), SNES, SNESSetLagPreconditioner()
1039 
1040 @*/
1041 PetscErrorCode  SNESCreate(MPI_Comm comm,SNES *outsnes)
1042 {
1043   PetscErrorCode      ierr;
1044   SNES                snes;
1045   SNESKSPEW           *kctx;
1046 
1047   PetscFunctionBegin;
1048   PetscValidPointer(outsnes,2);
1049   *outsnes = PETSC_NULL;
1050 #ifndef PETSC_USE_DYNAMIC_LIBRARIES
1051   ierr = SNESInitializePackage(PETSC_NULL);CHKERRQ(ierr);
1052 #endif
1053 
1054   ierr = PetscHeaderCreate(snes,_p_SNES,struct _SNESOps,SNES_CLASSID,0,"SNES",comm,SNESDestroy,SNESView);CHKERRQ(ierr);
1055 
1056   snes->ops->converged    = SNESDefaultConverged;
1057   snes->max_its           = 50;
1058   snes->max_funcs	  = 10000;
1059   snes->norm		  = 0.0;
1060   snes->rtol		  = 1.e-8;
1061   snes->ttol              = 0.0;
1062   snes->abstol		  = 1.e-50;
1063   snes->xtol		  = 1.e-8;
1064   snes->deltatol	  = 1.e-12;
1065   snes->nfuncs            = 0;
1066   snes->numFailures       = 0;
1067   snes->maxFailures       = 1;
1068   snes->linear_its        = 0;
1069   snes->lagjacobian       = 1;
1070   snes->lagpreconditioner = 1;
1071   snes->numbermonitors    = 0;
1072   snes->data              = 0;
1073   snes->setupcalled       = PETSC_FALSE;
1074   snes->ksp_ewconv        = PETSC_FALSE;
1075   snes->nwork             = 0;
1076   snes->work              = 0;
1077   snes->nvwork            = 0;
1078   snes->vwork             = 0;
1079   snes->conv_hist_len     = 0;
1080   snes->conv_hist_max     = 0;
1081   snes->conv_hist         = PETSC_NULL;
1082   snes->conv_hist_its     = PETSC_NULL;
1083   snes->conv_hist_reset   = PETSC_TRUE;
1084   snes->reason            = SNES_CONVERGED_ITERATING;
1085 
1086   snes->numLinearSolveFailures = 0;
1087   snes->maxLinearSolveFailures = 1;
1088 
1089   /* Create context to compute Eisenstat-Walker relative tolerance for KSP */
1090   ierr = PetscNewLog(snes,SNESKSPEW,&kctx);CHKERRQ(ierr);
1091   snes->kspconvctx  = (void*)kctx;
1092   kctx->version     = 2;
1093   kctx->rtol_0      = .3; /* Eisenstat and Walker suggest rtol_0=.5, but
1094                              this was too large for some test cases */
1095   kctx->rtol_last   = 0.0;
1096   kctx->rtol_max    = .9;
1097   kctx->gamma       = 1.0;
1098   kctx->alpha       = .5*(1.0 + sqrt(5.0));
1099   kctx->alpha2      = kctx->alpha;
1100   kctx->threshold   = .1;
1101   kctx->lresid_last = 0.0;
1102   kctx->norm_last   = 0.0;
1103 
1104   *outsnes = snes;
1105   PetscFunctionReturn(0);
1106 }
1107 
1108 #undef __FUNCT__
1109 #define __FUNCT__ "SNESSetFunction"
1110 /*@C
1111    SNESSetFunction - Sets the function evaluation routine and function
1112    vector for use by the SNES routines in solving systems of nonlinear
1113    equations.
1114 
1115    Logically Collective on SNES
1116 
1117    Input Parameters:
1118 +  snes - the SNES context
1119 .  r - vector to store function value
1120 .  func - function evaluation routine
1121 -  ctx - [optional] user-defined context for private data for the
1122          function evaluation routine (may be PETSC_NULL)
1123 
1124    Calling sequence of func:
1125 $    func (SNES snes,Vec x,Vec f,void *ctx);
1126 
1127 .  f - function vector
1128 -  ctx - optional user-defined function context
1129 
1130    Notes:
1131    The Newton-like methods typically solve linear systems of the form
1132 $      f'(x) x = -f(x),
1133    where f'(x) denotes the Jacobian matrix and f(x) is the function.
1134 
1135    Level: beginner
1136 
1137 .keywords: SNES, nonlinear, set, function
1138 
1139 .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian()
1140 @*/
1141 PetscErrorCode  SNESSetFunction(SNES snes,Vec r,PetscErrorCode (*func)(SNES,Vec,Vec,void*),void *ctx)
1142 {
1143   PetscErrorCode ierr;
1144   PetscFunctionBegin;
1145   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1146   if (r) {
1147     PetscValidHeaderSpecific(r,VEC_CLASSID,2);
1148     PetscCheckSameComm(snes,1,r,2);
1149     ierr = PetscObjectReference((PetscObject)r);CHKERRQ(ierr);
1150     ierr = VecDestroy(&snes->vec_func);CHKERRQ(ierr);
1151     snes->vec_func = r;
1152   } else if (!snes->vec_func && snes->dm) {
1153     ierr = DMCreateGlobalVector(snes->dm,&snes->vec_func);CHKERRQ(ierr);
1154   }
1155   if (func) snes->ops->computefunction = func;
1156   if (ctx)  snes->funP                 = ctx;
1157   PetscFunctionReturn(0);
1158 }
1159 
1160 #undef __FUNCT__
1161 #define __FUNCT__ "SNESSetComputeInitialGuess"
1162 /*@C
1163    SNESSetComputeInitialGuess - Sets a routine used to compute an initial guess for the problem
1164 
1165    Logically Collective on SNES
1166 
1167    Input Parameters:
1168 +  snes - the SNES context
1169 .  func - function evaluation routine
1170 -  ctx - [optional] user-defined context for private data for the
1171          function evaluation routine (may be PETSC_NULL)
1172 
1173    Calling sequence of func:
1174 $    func (SNES snes,Vec x,void *ctx);
1175 
1176 .  f - function vector
1177 -  ctx - optional user-defined function context
1178 
1179    Level: intermediate
1180 
1181 .keywords: SNES, nonlinear, set, function
1182 
1183 .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian()
1184 @*/
1185 PetscErrorCode  SNESSetComputeInitialGuess(SNES snes,PetscErrorCode (*func)(SNES,Vec,void*),void *ctx)
1186 {
1187   PetscFunctionBegin;
1188   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1189   if (func) snes->ops->computeinitialguess = func;
1190   if (ctx)  snes->initialguessP            = ctx;
1191   PetscFunctionReturn(0);
1192 }
1193 
1194 /* --------------------------------------------------------------- */
1195 #undef __FUNCT__
1196 #define __FUNCT__ "SNESGetRhs"
1197 /*@C
1198    SNESGetRhs - Gets the vector for solving F(x) = rhs. If rhs is not set
1199    it assumes a zero right hand side.
1200 
1201    Logically Collective on SNES
1202 
1203    Input Parameter:
1204 .  snes - the SNES context
1205 
1206    Output Parameter:
1207 .  rhs - the right hand side vector or PETSC_NULL if the right hand side vector is null
1208 
1209    Level: intermediate
1210 
1211 .keywords: SNES, nonlinear, get, function, right hand side
1212 
1213 .seealso: SNESGetSolution(), SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian(), SNESSetFunction()
1214 @*/
1215 PetscErrorCode  SNESGetRhs(SNES snes,Vec *rhs)
1216 {
1217   PetscFunctionBegin;
1218   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1219   PetscValidPointer(rhs,2);
1220   *rhs = snes->vec_rhs;
1221   PetscFunctionReturn(0);
1222 }
1223 
1224 #undef __FUNCT__
1225 #define __FUNCT__ "SNESComputeFunction"
1226 /*@
1227    SNESComputeFunction - Calls the function that has been set with
1228                          SNESSetFunction().
1229 
1230    Collective on SNES
1231 
1232    Input Parameters:
1233 +  snes - the SNES context
1234 -  x - input vector
1235 
1236    Output Parameter:
1237 .  y - function vector, as set by SNESSetFunction()
1238 
1239    Notes:
1240    SNESComputeFunction() is typically used within nonlinear solvers
1241    implementations, so most users would not generally call this routine
1242    themselves.
1243 
1244    Level: developer
1245 
1246 .keywords: SNES, nonlinear, compute, function
1247 
1248 .seealso: SNESSetFunction(), SNESGetFunction()
1249 @*/
1250 PetscErrorCode  SNESComputeFunction(SNES snes,Vec x,Vec y)
1251 {
1252   PetscErrorCode ierr;
1253 
1254   PetscFunctionBegin;
1255   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1256   PetscValidHeaderSpecific(x,VEC_CLASSID,2);
1257   PetscValidHeaderSpecific(y,VEC_CLASSID,3);
1258   PetscCheckSameComm(snes,1,x,2);
1259   PetscCheckSameComm(snes,1,y,3);
1260 
1261   ierr = PetscLogEventBegin(SNES_FunctionEval,snes,x,y,0);CHKERRQ(ierr);
1262   if (snes->ops->computefunction) {
1263     PetscStackPush("SNES user function");
1264     ierr = (*snes->ops->computefunction)(snes,x,y,snes->funP);CHKERRQ(ierr);
1265     PetscStackPop;
1266   } else if (snes->vec_rhs) {
1267     ierr = MatMult(snes->jacobian, x, y);CHKERRQ(ierr);
1268   } else if (snes->dm) {
1269     ierr = DMComputeFunction(snes->dm,x,y);CHKERRQ(ierr);
1270   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE, "Must call SNESSetFunction() or SNESSetDM() before SNESComputeFunction(), likely called from SNESSolve().");
1271   if (snes->vec_rhs) {
1272     ierr = VecAXPY(y,-1.0,snes->vec_rhs);CHKERRQ(ierr);
1273   }
1274   snes->nfuncs++;
1275   ierr = PetscLogEventEnd(SNES_FunctionEval,snes,x,y,0);CHKERRQ(ierr);
1276   PetscFunctionReturn(0);
1277 }
1278 
1279 #undef __FUNCT__
1280 #define __FUNCT__ "SNESComputeJacobian"
1281 /*@
1282    SNESComputeJacobian - Computes the Jacobian matrix that has been
1283    set with SNESSetJacobian().
1284 
1285    Collective on SNES and Mat
1286 
1287    Input Parameters:
1288 +  snes - the SNES context
1289 -  x - input vector
1290 
1291    Output Parameters:
1292 +  A - Jacobian matrix
1293 .  B - optional preconditioning matrix
1294 -  flag - flag indicating matrix structure (one of, SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER)
1295 
1296   Options Database Keys:
1297 +    -snes_lag_preconditioner <lag>
1298 .    -snes_lag_jacobian <lag>
1299 .    -snes_compare_explicit - Compare the computed Jacobian to the finite difference Jacobian and output the differences
1300 .    -snes_compare_explicit_draw  - Compare the computed Jacobian to the finite difference Jacobian and draw the result
1301 .    -snes_compare_explicit_contour  - Compare the computed Jacobian to the finite difference Jacobian and draw a contour plot with the result
1302 -    -snes_compare_operator  - Make the comparison options above use the operator instead of the preconditioning matrix
1303 
1304    Notes:
1305    Most users should not need to explicitly call this routine, as it
1306    is used internally within the nonlinear solvers.
1307 
1308    See KSPSetOperators() for important information about setting the
1309    flag parameter.
1310 
1311    Level: developer
1312 
1313 .keywords: SNES, compute, Jacobian, matrix
1314 
1315 .seealso:  SNESSetJacobian(), KSPSetOperators(), MatStructure, SNESSetLagPreconditioner(), SNESSetLagJacobian()
1316 @*/
1317 PetscErrorCode  SNESComputeJacobian(SNES snes,Vec X,Mat *A,Mat *B,MatStructure *flg)
1318 {
1319   PetscErrorCode ierr;
1320   PetscBool      flag;
1321 
1322   PetscFunctionBegin;
1323   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1324   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
1325   PetscValidPointer(flg,5);
1326   PetscCheckSameComm(snes,1,X,2);
1327   if (!snes->ops->computejacobian) PetscFunctionReturn(0);
1328 
1329   /* make sure that MatAssemblyBegin/End() is called on A matrix if it is matrix free */
1330 
1331   if (snes->lagjacobian == -2) {
1332     snes->lagjacobian = -1;
1333     ierr = PetscInfo(snes,"Recomputing Jacobian/preconditioner because lag is -2 (means compute Jacobian, but then never again) \n");CHKERRQ(ierr);
1334   } else if (snes->lagjacobian == -1) {
1335     *flg = SAME_PRECONDITIONER;
1336     ierr = PetscInfo(snes,"Reusing Jacobian/preconditioner because lag is -1\n");CHKERRQ(ierr);
1337     ierr = PetscTypeCompare((PetscObject)*A,MATMFFD,&flag);CHKERRQ(ierr);
1338     if (flag) {
1339       ierr = MatAssemblyBegin(*A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1340       ierr = MatAssemblyEnd(*A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1341     }
1342     PetscFunctionReturn(0);
1343   } else if (snes->lagjacobian > 1 && snes->iter % snes->lagjacobian) {
1344     *flg = SAME_PRECONDITIONER;
1345     ierr = PetscInfo2(snes,"Reusing Jacobian/preconditioner because lag is %D and SNES iteration is %D\n",snes->lagjacobian,snes->iter);CHKERRQ(ierr);
1346     ierr = PetscTypeCompare((PetscObject)*A,MATMFFD,&flag);CHKERRQ(ierr);
1347     if (flag) {
1348       ierr = MatAssemblyBegin(*A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1349       ierr = MatAssemblyEnd(*A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1350     }
1351     PetscFunctionReturn(0);
1352   }
1353 
1354   *flg = DIFFERENT_NONZERO_PATTERN;
1355   ierr = PetscLogEventBegin(SNES_JacobianEval,snes,X,*A,*B);CHKERRQ(ierr);
1356   PetscStackPush("SNES user Jacobian function");
1357   ierr = (*snes->ops->computejacobian)(snes,X,A,B,flg,snes->jacP);CHKERRQ(ierr);
1358   PetscStackPop;
1359   ierr = PetscLogEventEnd(SNES_JacobianEval,snes,X,*A,*B);CHKERRQ(ierr);
1360 
1361   if (snes->lagpreconditioner == -2) {
1362     ierr = PetscInfo(snes,"Rebuilding preconditioner exactly once since lag is -2\n");CHKERRQ(ierr);
1363     snes->lagpreconditioner = -1;
1364   } else if (snes->lagpreconditioner == -1) {
1365     *flg = SAME_PRECONDITIONER;
1366     ierr = PetscInfo(snes,"Reusing preconditioner because lag is -1\n");CHKERRQ(ierr);
1367   } else if (snes->lagpreconditioner > 1 && snes->iter % snes->lagpreconditioner) {
1368     *flg = SAME_PRECONDITIONER;
1369     ierr = PetscInfo2(snes,"Reusing preconditioner because lag is %D and SNES iteration is %D\n",snes->lagpreconditioner,snes->iter);CHKERRQ(ierr);
1370   }
1371 
1372   /* make sure user returned a correct Jacobian and preconditioner */
1373   /* PetscValidHeaderSpecific(*A,MAT_CLASSID,3);
1374     PetscValidHeaderSpecific(*B,MAT_CLASSID,4);   */
1375   {
1376     PetscBool flag = PETSC_FALSE,flag_draw = PETSC_FALSE,flag_contour = PETSC_FALSE,flag_operator = PETSC_FALSE;
1377     ierr  = PetscOptionsGetBool(((PetscObject)snes)->prefix,"-snes_compare_explicit",&flag,PETSC_NULL);CHKERRQ(ierr);
1378     ierr  = PetscOptionsGetBool(((PetscObject)snes)->prefix,"-snes_compare_explicit_draw",&flag_draw,PETSC_NULL);CHKERRQ(ierr);
1379     ierr  = PetscOptionsGetBool(((PetscObject)snes)->prefix,"-snes_compare_explicit_draw_contour",&flag_contour,PETSC_NULL);CHKERRQ(ierr);
1380     ierr  = PetscOptionsGetBool(((PetscObject)snes)->prefix,"-snes_compare_operator",&flag_operator,PETSC_NULL);CHKERRQ(ierr);
1381     if (flag || flag_draw || flag_contour) {
1382       Mat Bexp_mine = PETSC_NULL,Bexp,FDexp;
1383       MatStructure mstruct;
1384       PetscViewer vdraw,vstdout;
1385       PetscBool flg;
1386       if (flag_operator) {
1387         ierr = MatComputeExplicitOperator(*A,&Bexp_mine);CHKERRQ(ierr);
1388         Bexp = Bexp_mine;
1389       } else {
1390         /* See if the preconditioning matrix can be viewed and added directly */
1391         ierr = PetscTypeCompareAny((PetscObject)*B,&flg,MATSEQAIJ,MATMPIAIJ,MATSEQDENSE,MATMPIDENSE,MATSEQBAIJ,MATMPIBAIJ,MATSEQSBAIJ,MATMPIBAIJ,"");CHKERRQ(ierr);
1392         if (flg) Bexp = *B;
1393         else {
1394           /* If the "preconditioning" matrix is itself MATSHELL or some other type without direct support */
1395           ierr = MatComputeExplicitOperator(*B,&Bexp_mine);CHKERRQ(ierr);
1396           Bexp = Bexp_mine;
1397         }
1398       }
1399       ierr = MatConvert(Bexp,MATSAME,MAT_INITIAL_MATRIX,&FDexp);CHKERRQ(ierr);
1400       ierr = SNESDefaultComputeJacobian(snes,X,&FDexp,&FDexp,&mstruct,NULL);CHKERRQ(ierr);
1401       ierr = PetscViewerASCIIGetStdout(((PetscObject)snes)->comm,&vstdout);CHKERRQ(ierr);
1402       if (flag_draw || flag_contour) {
1403         ierr = PetscViewerDrawOpen(((PetscObject)snes)->comm,0,"Explicit Jacobians",PETSC_DECIDE,PETSC_DECIDE,300,300,&vdraw);CHKERRQ(ierr);
1404         if (flag_contour) {ierr = PetscViewerPushFormat(vdraw,PETSC_VIEWER_DRAW_CONTOUR);CHKERRQ(ierr);}
1405       } else vdraw = PETSC_NULL;
1406       ierr = PetscViewerASCIIPrintf(vstdout,"Explicit %s\n",flag_operator?"Jacobian":"preconditioning Jacobian");CHKERRQ(ierr);
1407       if (flag) {ierr = MatView(Bexp,vstdout);CHKERRQ(ierr);}
1408       if (vdraw) {ierr = MatView(Bexp,vdraw);CHKERRQ(ierr);}
1409       ierr = PetscViewerASCIIPrintf(vstdout,"Finite difference Jacobian\n");CHKERRQ(ierr);
1410       if (flag) {ierr = MatView(FDexp,vstdout);CHKERRQ(ierr);}
1411       if (vdraw) {ierr = MatView(FDexp,vdraw);CHKERRQ(ierr);}
1412       ierr = MatAYPX(FDexp,-1.0,Bexp,SAME_NONZERO_PATTERN);CHKERRQ(ierr);
1413       ierr = PetscViewerASCIIPrintf(vstdout,"User-provided matrix minus finite difference Jacobian\n");CHKERRQ(ierr);
1414       if (flag) {ierr = MatView(FDexp,vstdout);CHKERRQ(ierr);}
1415       if (vdraw) {              /* Always use contour for the difference */
1416         ierr = PetscViewerPushFormat(vdraw,PETSC_VIEWER_DRAW_CONTOUR);CHKERRQ(ierr);
1417         ierr = MatView(FDexp,vdraw);CHKERRQ(ierr);
1418         ierr = PetscViewerPopFormat(vdraw);CHKERRQ(ierr);
1419       }
1420       if (flag_contour) {ierr = PetscViewerPopFormat(vdraw);CHKERRQ(ierr);}
1421       ierr = PetscViewerDestroy(&vdraw);CHKERRQ(ierr);
1422       ierr = MatDestroy(&Bexp_mine);CHKERRQ(ierr);
1423       ierr = MatDestroy(&FDexp);CHKERRQ(ierr);
1424     }
1425   }
1426   PetscFunctionReturn(0);
1427 }
1428 
1429 #undef __FUNCT__
1430 #define __FUNCT__ "SNESSetJacobian"
1431 /*@C
1432    SNESSetJacobian - Sets the function to compute Jacobian as well as the
1433    location to store the matrix.
1434 
1435    Logically Collective on SNES and Mat
1436 
1437    Input Parameters:
1438 +  snes - the SNES context
1439 .  A - Jacobian matrix
1440 .  B - preconditioner matrix (usually same as the Jacobian)
1441 .  func - Jacobian evaluation routine (if PETSC_NULL then SNES retains any previously set value)
1442 -  ctx - [optional] user-defined context for private data for the
1443          Jacobian evaluation routine (may be PETSC_NULL) (if PETSC_NULL then SNES retains any previously set value)
1444 
1445    Calling sequence of func:
1446 $     func (SNES snes,Vec x,Mat *A,Mat *B,int *flag,void *ctx);
1447 
1448 +  x - input vector
1449 .  A - Jacobian matrix
1450 .  B - preconditioner matrix, usually the same as A
1451 .  flag - flag indicating information about the preconditioner matrix
1452    structure (same as flag in KSPSetOperators()), one of SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER
1453 -  ctx - [optional] user-defined Jacobian context
1454 
1455    Notes:
1456    See KSPSetOperators() for important information about setting the flag
1457    output parameter in the routine func().  Be sure to read this information!
1458 
1459    The routine func() takes Mat * as the matrix arguments rather than Mat.
1460    This allows the Jacobian evaluation routine to replace A and/or B with a
1461    completely new new matrix structure (not just different matrix elements)
1462    when appropriate, for instance, if the nonzero structure is changing
1463    throughout the global iterations.
1464 
1465    If the A matrix and B matrix are different you must call MatAssemblyBegin/End() on
1466    each matrix.
1467 
1468    If using SNESDefaultComputeJacobianColor() to assemble a Jacobian, the ctx argument
1469    must be a MatFDColoring.
1470 
1471    Level: beginner
1472 
1473 .keywords: SNES, nonlinear, set, Jacobian, matrix
1474 
1475 .seealso: KSPSetOperators(), SNESSetFunction(), MatMFFDComputeJacobian(), SNESDefaultComputeJacobianColor(), MatStructure
1476 @*/
1477 PetscErrorCode  SNESSetJacobian(SNES snes,Mat A,Mat B,PetscErrorCode (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx)
1478 {
1479   PetscErrorCode ierr;
1480 
1481   PetscFunctionBegin;
1482   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1483   if (A) PetscValidHeaderSpecific(A,MAT_CLASSID,2);
1484   if (B) PetscValidHeaderSpecific(B,MAT_CLASSID,3);
1485   if (A) PetscCheckSameComm(snes,1,A,2);
1486   if (B) PetscCheckSameComm(snes,1,B,3);
1487   if (func) snes->ops->computejacobian = func;
1488   if (ctx)  snes->jacP                 = ctx;
1489   if (A) {
1490     ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr);
1491     ierr = MatDestroy(&snes->jacobian);CHKERRQ(ierr);
1492     snes->jacobian = A;
1493   }
1494   if (B) {
1495     ierr = PetscObjectReference((PetscObject)B);CHKERRQ(ierr);
1496     ierr = MatDestroy(&snes->jacobian_pre);CHKERRQ(ierr);
1497     snes->jacobian_pre = B;
1498   }
1499   PetscFunctionReturn(0);
1500 }
1501 
1502 #undef __FUNCT__
1503 #define __FUNCT__ "SNESGetJacobian"
1504 /*@C
1505    SNESGetJacobian - Returns the Jacobian matrix and optionally the user
1506    provided context for evaluating the Jacobian.
1507 
1508    Not Collective, but Mat object will be parallel if SNES object is
1509 
1510    Input Parameter:
1511 .  snes - the nonlinear solver context
1512 
1513    Output Parameters:
1514 +  A - location to stash Jacobian matrix (or PETSC_NULL)
1515 .  B - location to stash preconditioner matrix (or PETSC_NULL)
1516 .  func - location to put Jacobian function (or PETSC_NULL)
1517 -  ctx - location to stash Jacobian ctx (or PETSC_NULL)
1518 
1519    Level: advanced
1520 
1521 .seealso: SNESSetJacobian(), SNESComputeJacobian()
1522 @*/
1523 PetscErrorCode  SNESGetJacobian(SNES snes,Mat *A,Mat *B,PetscErrorCode (**func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx)
1524 {
1525   PetscFunctionBegin;
1526   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1527   if (A)    *A    = snes->jacobian;
1528   if (B)    *B    = snes->jacobian_pre;
1529   if (func) *func = snes->ops->computejacobian;
1530   if (ctx)  *ctx  = snes->jacP;
1531   PetscFunctionReturn(0);
1532 }
1533 
1534 /* ----- Routines to initialize and destroy a nonlinear solver ---- */
1535 
1536 #undef __FUNCT__
1537 #define __FUNCT__ "SNESSetUp"
1538 /*@
1539    SNESSetUp - Sets up the internal data structures for the later use
1540    of a nonlinear solver.
1541 
1542    Collective on SNES
1543 
1544    Input Parameters:
1545 .  snes - the SNES context
1546 
1547    Notes:
1548    For basic use of the SNES solvers the user need not explicitly call
1549    SNESSetUp(), since these actions will automatically occur during
1550    the call to SNESSolve().  However, if one wishes to control this
1551    phase separately, SNESSetUp() should be called after SNESCreate()
1552    and optional routines of the form SNESSetXXX(), but before SNESSolve().
1553 
1554    Level: advanced
1555 
1556 .keywords: SNES, nonlinear, setup
1557 
1558 .seealso: SNESCreate(), SNESSolve(), SNESDestroy()
1559 @*/
1560 PetscErrorCode  SNESSetUp(SNES snes)
1561 {
1562   PetscErrorCode ierr;
1563 
1564   PetscFunctionBegin;
1565   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1566   if (snes->setupcalled) PetscFunctionReturn(0);
1567 
1568   if (!((PetscObject)snes)->type_name) {
1569     ierr = SNESSetType(snes,SNESLS);CHKERRQ(ierr);
1570   }
1571 
1572   if (!snes->vec_func && snes->dm && !snes->vec_rhs) {
1573     ierr = DMCreateGlobalVector(snes->dm,&snes->vec_func);CHKERRQ(ierr);
1574   }
1575   if (!snes->vec_func && !snes->vec_rhs) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetFunction() first");
1576   if (!snes->ops->computefunction && !snes->vec_rhs && !snes->dm) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetFunction() or SNESSetDM() first");
1577   if (snes->vec_func == snes->vec_sol) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_IDN,"Solution vector cannot be function vector");
1578   if (snes->vec_rhs  == snes->vec_sol) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_IDN,"Solution vector cannot be right hand side vector");
1579 
1580   if (!snes->vec_func && snes->vec_rhs) {
1581     ierr = VecDuplicate(snes->vec_rhs, &snes->vec_func);CHKERRQ(ierr);
1582   }
1583   if (!snes->vec_sol_update /* && snes->vec_sol */) {
1584     ierr = VecDuplicate(snes->vec_sol,&snes->vec_sol_update);CHKERRQ(ierr);
1585     ierr = PetscLogObjectParent(snes,snes->vec_sol_update);CHKERRQ(ierr);
1586   }
1587 
1588   if (!snes->ops->computejacobian && snes->dm) {
1589     Mat J;
1590     ierr = DMGetMatrix(snes->dm,MATAIJ,&J);CHKERRQ(ierr);
1591     ierr = SNESSetJacobian(snes,J,J,SNESDMComputeJacobian,PETSC_NULL);CHKERRQ(ierr);
1592     ierr = MatDestroy(&J);CHKERRQ(ierr);
1593   } else if (!snes->jacobian && snes->ops->computejacobian == MatMFFDComputeJacobian) {
1594     Mat J;
1595     ierr = MatCreateSNESMF(snes,&J);CHKERRQ(ierr);
1596     ierr = MatMFFDSetOptionsPrefix(J,((PetscObject)snes)->prefix);CHKERRQ(ierr);
1597     ierr = MatSetFromOptions(J);CHKERRQ(ierr);
1598     ierr = SNESSetJacobian(snes,J,J,MatMFFDComputeJacobian,snes->funP);CHKERRQ(ierr);
1599     ierr = MatDestroy(&J);CHKERRQ(ierr);
1600   } else if (snes->dm && snes->mf_operator && !snes->jacobian_pre && !snes->jacobian) {
1601     Mat J,B;
1602     ierr = MatCreateSNESMF(snes,&J);CHKERRQ(ierr);
1603     ierr = MatMFFDSetOptionsPrefix(J,((PetscObject)snes)->prefix);CHKERRQ(ierr);
1604     ierr = MatSetFromOptions(J);CHKERRQ(ierr);
1605     ierr = DMGetMatrix(snes->dm,MATAIJ,&B);CHKERRQ(ierr);
1606     ierr = SNESSetJacobian(snes,J,B,SNESDMComputeJacobian,snes->funP);CHKERRQ(ierr);
1607     ierr = MatDestroy(&J);CHKERRQ(ierr);
1608     ierr = MatDestroy(&B);CHKERRQ(ierr);
1609   } else if (snes->dm && !snes->jacobian_pre){
1610     Mat J;
1611     ierr = DMGetMatrix(snes->dm,MATAIJ,&J);CHKERRQ(ierr);
1612     ierr = SNESSetJacobian(snes,J,J,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
1613     ierr = MatDestroy(&J);CHKERRQ(ierr);
1614   }
1615 
1616   if (!snes->ksp) {ierr = SNESGetKSP(snes, &snes->ksp);CHKERRQ(ierr);}
1617 
1618   if (snes->ops->usercompute && !snes->user) {
1619     ierr = (*snes->ops->usercompute)(snes,(void**)&snes->user);CHKERRQ(ierr);
1620   }
1621 
1622   if (snes->ops->setup) {
1623     ierr = (*snes->ops->setup)(snes);CHKERRQ(ierr);
1624   }
1625 
1626   snes->setupcalled = PETSC_TRUE;
1627   PetscFunctionReturn(0);
1628 }
1629 
1630 #undef __FUNCT__
1631 #define __FUNCT__ "SNESReset"
1632 /*@
1633    SNESReset - Resets a SNES context to the snessetupcalled = 0 state and removes any allocated Vecs and Mats
1634 
1635    Collective on SNES
1636 
1637    Input Parameter:
1638 .  snes - iterative context obtained from SNESCreate()
1639 
1640    Level: intermediate
1641 
1642    Notes: Also calls the application context destroy routine set with SNESSetComputeApplicationContext()
1643 
1644 .keywords: SNES, destroy
1645 
1646 .seealso: SNESCreate(), SNESSetUp(), SNESSolve()
1647 @*/
1648 PetscErrorCode  SNESReset(SNES snes)
1649 {
1650   PetscErrorCode ierr;
1651 
1652   PetscFunctionBegin;
1653   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1654   if (snes->ops->userdestroy && snes->user) {
1655     ierr       = (*snes->ops->userdestroy)((void**)&snes->user);CHKERRQ(ierr);
1656     snes->user = PETSC_NULL;
1657   }
1658   if (snes->ops->computejacobian == SNESDefaultComputeJacobianColor && snes->dm) {
1659     ierr = MatFDColoringDestroy((MatFDColoring*)&snes->jacP);CHKERRQ(ierr);
1660     snes->ops->computejacobian = PETSC_NULL;
1661   }
1662 
1663   if (snes->ops->reset) {
1664     ierr = (*snes->ops->reset)(snes);CHKERRQ(ierr);
1665   }
1666   if (snes->ksp) {ierr = KSPReset(snes->ksp);CHKERRQ(ierr);}
1667   ierr = VecDestroy(&snes->vec_rhs);CHKERRQ(ierr);
1668   ierr = VecDestroy(&snes->vec_sol);CHKERRQ(ierr);
1669   ierr = VecDestroy(&snes->vec_sol_update);CHKERRQ(ierr);
1670   ierr = VecDestroy(&snes->vec_func);CHKERRQ(ierr);
1671   ierr = MatDestroy(&snes->jacobian);CHKERRQ(ierr);
1672   ierr = MatDestroy(&snes->jacobian_pre);CHKERRQ(ierr);
1673   if (snes->work) {ierr = VecDestroyVecs(snes->nwork,&snes->work);CHKERRQ(ierr);}
1674   if (snes->vwork) {ierr = VecDestroyVecs(snes->nvwork,&snes->vwork);CHKERRQ(ierr);}
1675   snes->nwork = snes->nvwork = 0;
1676   snes->setupcalled = PETSC_FALSE;
1677   PetscFunctionReturn(0);
1678 }
1679 
1680 #undef __FUNCT__
1681 #define __FUNCT__ "SNESDestroy"
1682 /*@
1683    SNESDestroy - Destroys the nonlinear solver context that was created
1684    with SNESCreate().
1685 
1686    Collective on SNES
1687 
1688    Input Parameter:
1689 .  snes - the SNES context
1690 
1691    Level: beginner
1692 
1693 .keywords: SNES, nonlinear, destroy
1694 
1695 .seealso: SNESCreate(), SNESSolve()
1696 @*/
1697 PetscErrorCode  SNESDestroy(SNES *snes)
1698 {
1699   PetscErrorCode ierr;
1700 
1701   PetscFunctionBegin;
1702   if (!*snes) PetscFunctionReturn(0);
1703   PetscValidHeaderSpecific((*snes),SNES_CLASSID,1);
1704   if (--((PetscObject)(*snes))->refct > 0) {*snes = 0; PetscFunctionReturn(0);}
1705 
1706   ierr = SNESReset((*snes));CHKERRQ(ierr);
1707 
1708   /* if memory was published with AMS then destroy it */
1709   ierr = PetscObjectDepublish((*snes));CHKERRQ(ierr);
1710   if ((*snes)->ops->destroy) {ierr = (*((*snes))->ops->destroy)((*snes));CHKERRQ(ierr);}
1711 
1712   ierr = DMDestroy(&(*snes)->dm);CHKERRQ(ierr);
1713   ierr = KSPDestroy(&(*snes)->ksp);CHKERRQ(ierr);
1714 
1715   ierr = PetscFree((*snes)->kspconvctx);CHKERRQ(ierr);
1716   if ((*snes)->ops->convergeddestroy) {
1717     ierr = (*(*snes)->ops->convergeddestroy)((*snes)->cnvP);CHKERRQ(ierr);
1718   }
1719   if ((*snes)->conv_malloc) {
1720     ierr = PetscFree((*snes)->conv_hist);CHKERRQ(ierr);
1721     ierr = PetscFree((*snes)->conv_hist_its);CHKERRQ(ierr);
1722   }
1723   ierr = SNESMonitorCancel((*snes));CHKERRQ(ierr);
1724   ierr = PetscHeaderDestroy(snes);CHKERRQ(ierr);
1725   PetscFunctionReturn(0);
1726 }
1727 
1728 /* ----------- Routines to set solver parameters ---------- */
1729 
1730 #undef __FUNCT__
1731 #define __FUNCT__ "SNESSetLagPreconditioner"
1732 /*@
1733    SNESSetLagPreconditioner - Determines when the preconditioner is rebuilt in the nonlinear solve.
1734 
1735    Logically Collective on SNES
1736 
1737    Input Parameters:
1738 +  snes - the SNES context
1739 -  lag - -1 indicates NEVER rebuild, 1 means rebuild every time the Jacobian is computed within a single nonlinear solve, 2 means every second time
1740          the Jacobian is built etc. -2 indicates rebuild preconditioner at next chance but then never rebuild after that
1741 
1742    Options Database Keys:
1743 .    -snes_lag_preconditioner <lag>
1744 
1745    Notes:
1746    The default is 1
1747    The preconditioner is ALWAYS built in the first iteration of a nonlinear solve unless lag is -1
1748    If  -1 is used before the very first nonlinear solve the preconditioner is still built because there is no previous preconditioner to use
1749 
1750    Level: intermediate
1751 
1752 .keywords: SNES, nonlinear, set, convergence, tolerances
1753 
1754 .seealso: SNESSetTrustRegionTolerance(), SNESGetLagPreconditioner(), SNESSetLagJacobian(), SNESGetLagJacobian()
1755 
1756 @*/
1757 PetscErrorCode  SNESSetLagPreconditioner(SNES snes,PetscInt lag)
1758 {
1759   PetscFunctionBegin;
1760   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1761   if (lag < -2) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Lag must be -2, -1, 1 or greater");
1762   if (!lag) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Lag cannot be 0");
1763   PetscValidLogicalCollectiveInt(snes,lag,2);
1764   snes->lagpreconditioner = lag;
1765   PetscFunctionReturn(0);
1766 }
1767 
1768 #undef __FUNCT__
1769 #define __FUNCT__ "SNESSetGridSequence"
1770 /*@
1771    SNESSetGridSequence - sets the number of steps of grid sequencing that SNES does
1772 
1773    Logically Collective on SNES
1774 
1775    Input Parameters:
1776 +  snes - the SNES context
1777 -  steps - the number of refinements to do, defaults to 0
1778 
1779    Options Database Keys:
1780 .    -snes_grid_sequence <steps>
1781 
1782    Level: intermediate
1783 
1784 .keywords: SNES, nonlinear, set, convergence, tolerances
1785 
1786 .seealso: SNESSetTrustRegionTolerance(), SNESGetLagPreconditioner(), SNESSetLagJacobian(), SNESGetLagJacobian()
1787 
1788 @*/
1789 PetscErrorCode  SNESSetGridSequence(SNES snes,PetscInt steps)
1790 {
1791   PetscFunctionBegin;
1792   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1793   PetscValidLogicalCollectiveInt(snes,steps,2);
1794   snes->gridsequence = steps;
1795   PetscFunctionReturn(0);
1796 }
1797 
1798 #undef __FUNCT__
1799 #define __FUNCT__ "SNESGetLagPreconditioner"
1800 /*@
1801    SNESGetLagPreconditioner - Indicates how often the preconditioner is rebuilt
1802 
1803    Not Collective
1804 
1805    Input Parameter:
1806 .  snes - the SNES context
1807 
1808    Output Parameter:
1809 .   lag - -1 indicates NEVER rebuild, 1 means rebuild every time the Jacobian is computed within a single nonlinear solve, 2 means every second time
1810          the Jacobian is built etc. -2 indicates rebuild preconditioner at next chance but then never rebuild after that
1811 
1812    Options Database Keys:
1813 .    -snes_lag_preconditioner <lag>
1814 
1815    Notes:
1816    The default is 1
1817    The preconditioner is ALWAYS built in the first iteration of a nonlinear solve unless lag is -1
1818 
1819    Level: intermediate
1820 
1821 .keywords: SNES, nonlinear, set, convergence, tolerances
1822 
1823 .seealso: SNESSetTrustRegionTolerance(), SNESSetLagPreconditioner()
1824 
1825 @*/
1826 PetscErrorCode  SNESGetLagPreconditioner(SNES snes,PetscInt *lag)
1827 {
1828   PetscFunctionBegin;
1829   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1830   *lag = snes->lagpreconditioner;
1831   PetscFunctionReturn(0);
1832 }
1833 
1834 #undef __FUNCT__
1835 #define __FUNCT__ "SNESSetLagJacobian"
1836 /*@
1837    SNESSetLagJacobian - Determines when the Jacobian is rebuilt in the nonlinear solve. See SNESSetLagPreconditioner() for determining how
1838      often the preconditioner is rebuilt.
1839 
1840    Logically Collective on SNES
1841 
1842    Input Parameters:
1843 +  snes - the SNES context
1844 -  lag - -1 indicates NEVER rebuild, 1 means rebuild every time the Jacobian is computed within a single nonlinear solve, 2 means every second time
1845          the Jacobian is built etc. -2 means rebuild at next chance but then never again
1846 
1847    Options Database Keys:
1848 .    -snes_lag_jacobian <lag>
1849 
1850    Notes:
1851    The default is 1
1852    The Jacobian is ALWAYS built in the first iteration of a nonlinear solve unless lag is -1
1853    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
1854    at the next Newton step but never again (unless it is reset to another value)
1855 
1856    Level: intermediate
1857 
1858 .keywords: SNES, nonlinear, set, convergence, tolerances
1859 
1860 .seealso: SNESSetTrustRegionTolerance(), SNESGetLagPreconditioner(), SNESSetLagPreconditioner(), SNESGetLagJacobian()
1861 
1862 @*/
1863 PetscErrorCode  SNESSetLagJacobian(SNES snes,PetscInt lag)
1864 {
1865   PetscFunctionBegin;
1866   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1867   if (lag < -2) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Lag must be -2, -1, 1 or greater");
1868   if (!lag) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Lag cannot be 0");
1869   PetscValidLogicalCollectiveInt(snes,lag,2);
1870   snes->lagjacobian = lag;
1871   PetscFunctionReturn(0);
1872 }
1873 
1874 #undef __FUNCT__
1875 #define __FUNCT__ "SNESGetLagJacobian"
1876 /*@
1877    SNESGetLagJacobian - Indicates how often the Jacobian is rebuilt. See SNESGetLagPreconditioner() to determine when the preconditioner is rebuilt
1878 
1879    Not Collective
1880 
1881    Input Parameter:
1882 .  snes - the SNES context
1883 
1884    Output Parameter:
1885 .   lag - -1 indicates NEVER rebuild, 1 means rebuild every time the Jacobian is computed within a single nonlinear solve, 2 means every second time
1886          the Jacobian is built etc.
1887 
1888    Options Database Keys:
1889 .    -snes_lag_jacobian <lag>
1890 
1891    Notes:
1892    The default is 1
1893    The jacobian is ALWAYS built in the first iteration of a nonlinear solve unless lag is -1
1894 
1895    Level: intermediate
1896 
1897 .keywords: SNES, nonlinear, set, convergence, tolerances
1898 
1899 .seealso: SNESSetTrustRegionTolerance(), SNESSetLagJacobian(), SNESSetLagPreconditioner(), SNESGetLagPreconditioner()
1900 
1901 @*/
1902 PetscErrorCode  SNESGetLagJacobian(SNES snes,PetscInt *lag)
1903 {
1904   PetscFunctionBegin;
1905   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1906   *lag = snes->lagjacobian;
1907   PetscFunctionReturn(0);
1908 }
1909 
1910 #undef __FUNCT__
1911 #define __FUNCT__ "SNESSetTolerances"
1912 /*@
1913    SNESSetTolerances - Sets various parameters used in convergence tests.
1914 
1915    Logically Collective on SNES
1916 
1917    Input Parameters:
1918 +  snes - the SNES context
1919 .  abstol - absolute convergence tolerance
1920 .  rtol - relative convergence tolerance
1921 .  stol -  convergence tolerance in terms of the norm
1922            of the change in the solution between steps
1923 .  maxit - maximum number of iterations
1924 -  maxf - maximum number of function evaluations
1925 
1926    Options Database Keys:
1927 +    -snes_atol <abstol> - Sets abstol
1928 .    -snes_rtol <rtol> - Sets rtol
1929 .    -snes_stol <stol> - Sets stol
1930 .    -snes_max_it <maxit> - Sets maxit
1931 -    -snes_max_funcs <maxf> - Sets maxf
1932 
1933    Notes:
1934    The default maximum number of iterations is 50.
1935    The default maximum number of function evaluations is 1000.
1936 
1937    Level: intermediate
1938 
1939 .keywords: SNES, nonlinear, set, convergence, tolerances
1940 
1941 .seealso: SNESSetTrustRegionTolerance()
1942 @*/
1943 PetscErrorCode  SNESSetTolerances(SNES snes,PetscReal abstol,PetscReal rtol,PetscReal stol,PetscInt maxit,PetscInt maxf)
1944 {
1945   PetscFunctionBegin;
1946   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1947   PetscValidLogicalCollectiveReal(snes,abstol,2);
1948   PetscValidLogicalCollectiveReal(snes,rtol,3);
1949   PetscValidLogicalCollectiveReal(snes,stol,4);
1950   PetscValidLogicalCollectiveInt(snes,maxit,5);
1951   PetscValidLogicalCollectiveInt(snes,maxf,6);
1952 
1953   if (abstol != PETSC_DEFAULT)  snes->abstol      = abstol;
1954   if (rtol != PETSC_DEFAULT)  snes->rtol      = rtol;
1955   if (stol != PETSC_DEFAULT)  snes->xtol      = stol;
1956   if (maxit != PETSC_DEFAULT) snes->max_its   = maxit;
1957   if (maxf != PETSC_DEFAULT)  snes->max_funcs = maxf;
1958   PetscFunctionReturn(0);
1959 }
1960 
1961 #undef __FUNCT__
1962 #define __FUNCT__ "SNESGetTolerances"
1963 /*@
1964    SNESGetTolerances - Gets various parameters used in convergence tests.
1965 
1966    Not Collective
1967 
1968    Input Parameters:
1969 +  snes - the SNES context
1970 .  atol - absolute convergence tolerance
1971 .  rtol - relative convergence tolerance
1972 .  stol -  convergence tolerance in terms of the norm
1973            of the change in the solution between steps
1974 .  maxit - maximum number of iterations
1975 -  maxf - maximum number of function evaluations
1976 
1977    Notes:
1978    The user can specify PETSC_NULL for any parameter that is not needed.
1979 
1980    Level: intermediate
1981 
1982 .keywords: SNES, nonlinear, get, convergence, tolerances
1983 
1984 .seealso: SNESSetTolerances()
1985 @*/
1986 PetscErrorCode  SNESGetTolerances(SNES snes,PetscReal *atol,PetscReal *rtol,PetscReal *stol,PetscInt *maxit,PetscInt *maxf)
1987 {
1988   PetscFunctionBegin;
1989   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
1990   if (atol)  *atol  = snes->abstol;
1991   if (rtol)  *rtol  = snes->rtol;
1992   if (stol)  *stol  = snes->xtol;
1993   if (maxit) *maxit = snes->max_its;
1994   if (maxf)  *maxf  = snes->max_funcs;
1995   PetscFunctionReturn(0);
1996 }
1997 
1998 #undef __FUNCT__
1999 #define __FUNCT__ "SNESSetTrustRegionTolerance"
2000 /*@
2001    SNESSetTrustRegionTolerance - Sets the trust region parameter tolerance.
2002 
2003    Logically Collective on SNES
2004 
2005    Input Parameters:
2006 +  snes - the SNES context
2007 -  tol - tolerance
2008 
2009    Options Database Key:
2010 .  -snes_trtol <tol> - Sets tol
2011 
2012    Level: intermediate
2013 
2014 .keywords: SNES, nonlinear, set, trust region, tolerance
2015 
2016 .seealso: SNESSetTolerances()
2017 @*/
2018 PetscErrorCode  SNESSetTrustRegionTolerance(SNES snes,PetscReal tol)
2019 {
2020   PetscFunctionBegin;
2021   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2022   PetscValidLogicalCollectiveReal(snes,tol,2);
2023   snes->deltatol = tol;
2024   PetscFunctionReturn(0);
2025 }
2026 
2027 /*
2028    Duplicate the lg monitors for SNES from KSP; for some reason with
2029    dynamic libraries things don't work under Sun4 if we just use
2030    macros instead of functions
2031 */
2032 #undef __FUNCT__
2033 #define __FUNCT__ "SNESMonitorLG"
2034 PetscErrorCode  SNESMonitorLG(SNES snes,PetscInt it,PetscReal norm,void *ctx)
2035 {
2036   PetscErrorCode ierr;
2037 
2038   PetscFunctionBegin;
2039   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2040   ierr = KSPMonitorLG((KSP)snes,it,norm,ctx);CHKERRQ(ierr);
2041   PetscFunctionReturn(0);
2042 }
2043 
2044 #undef __FUNCT__
2045 #define __FUNCT__ "SNESMonitorLGCreate"
2046 PetscErrorCode  SNESMonitorLGCreate(const char host[],const char label[],int x,int y,int m,int n,PetscDrawLG *draw)
2047 {
2048   PetscErrorCode ierr;
2049 
2050   PetscFunctionBegin;
2051   ierr = KSPMonitorLGCreate(host,label,x,y,m,n,draw);CHKERRQ(ierr);
2052   PetscFunctionReturn(0);
2053 }
2054 
2055 #undef __FUNCT__
2056 #define __FUNCT__ "SNESMonitorLGDestroy"
2057 PetscErrorCode  SNESMonitorLGDestroy(PetscDrawLG *draw)
2058 {
2059   PetscErrorCode ierr;
2060 
2061   PetscFunctionBegin;
2062   ierr = KSPMonitorLGDestroy(draw);CHKERRQ(ierr);
2063   PetscFunctionReturn(0);
2064 }
2065 
2066 extern PetscErrorCode  SNESMonitorRange_Private(SNES,PetscInt,PetscReal*);
2067 #undef __FUNCT__
2068 #define __FUNCT__ "SNESMonitorLGRange"
2069 PetscErrorCode  SNESMonitorLGRange(SNES snes,PetscInt n,PetscReal rnorm,void *monctx)
2070 {
2071   PetscDrawLG      lg;
2072   PetscErrorCode   ierr;
2073   PetscReal        x,y,per;
2074   PetscViewer      v = (PetscViewer)monctx;
2075   static PetscReal prev; /* should be in the context */
2076   PetscDraw        draw;
2077   PetscFunctionBegin;
2078   if (!monctx) {
2079     MPI_Comm    comm;
2080 
2081     ierr   = PetscObjectGetComm((PetscObject)snes,&comm);CHKERRQ(ierr);
2082     v      = PETSC_VIEWER_DRAW_(comm);
2083   }
2084   ierr   = PetscViewerDrawGetDrawLG(v,0,&lg);CHKERRQ(ierr);
2085   if (!n) {ierr = PetscDrawLGReset(lg);CHKERRQ(ierr);}
2086   ierr   = PetscDrawLGGetDraw(lg,&draw);CHKERRQ(ierr);
2087   ierr   = PetscDrawSetTitle(draw,"Residual norm");CHKERRQ(ierr);
2088   x = (PetscReal) n;
2089   if (rnorm > 0.0) y = log10(rnorm); else y = -15.0;
2090   ierr = PetscDrawLGAddPoint(lg,&x,&y);CHKERRQ(ierr);
2091   if (n < 20 || !(n % 5)) {
2092     ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr);
2093   }
2094 
2095   ierr = PetscViewerDrawGetDrawLG(v,1,&lg);CHKERRQ(ierr);
2096   if (!n) {ierr = PetscDrawLGReset(lg);CHKERRQ(ierr);}
2097   ierr = PetscDrawLGGetDraw(lg,&draw);CHKERRQ(ierr);
2098   ierr = PetscDrawSetTitle(draw,"% elemts > .2*max elemt");CHKERRQ(ierr);
2099   ierr =  SNESMonitorRange_Private(snes,n,&per);CHKERRQ(ierr);
2100   x = (PetscReal) n;
2101   y = 100.0*per;
2102   ierr = PetscDrawLGAddPoint(lg,&x,&y);CHKERRQ(ierr);
2103   if (n < 20 || !(n % 5)) {
2104     ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr);
2105   }
2106 
2107   ierr = PetscViewerDrawGetDrawLG(v,2,&lg);CHKERRQ(ierr);
2108   if (!n) {prev = rnorm;ierr = PetscDrawLGReset(lg);CHKERRQ(ierr);}
2109   ierr = PetscDrawLGGetDraw(lg,&draw);CHKERRQ(ierr);
2110   ierr = PetscDrawSetTitle(draw,"(norm -oldnorm)/oldnorm");CHKERRQ(ierr);
2111   x = (PetscReal) n;
2112   y = (prev - rnorm)/prev;
2113   ierr = PetscDrawLGAddPoint(lg,&x,&y);CHKERRQ(ierr);
2114   if (n < 20 || !(n % 5)) {
2115     ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr);
2116   }
2117 
2118   ierr = PetscViewerDrawGetDrawLG(v,3,&lg);CHKERRQ(ierr);
2119   if (!n) {ierr = PetscDrawLGReset(lg);CHKERRQ(ierr);}
2120   ierr = PetscDrawLGGetDraw(lg,&draw);CHKERRQ(ierr);
2121   ierr = PetscDrawSetTitle(draw,"(norm -oldnorm)/oldnorm*(% > .2 max)");CHKERRQ(ierr);
2122   x = (PetscReal) n;
2123   y = (prev - rnorm)/(prev*per);
2124   if (n > 2) { /*skip initial crazy value */
2125     ierr = PetscDrawLGAddPoint(lg,&x,&y);CHKERRQ(ierr);
2126   }
2127   if (n < 20 || !(n % 5)) {
2128     ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr);
2129   }
2130   prev = rnorm;
2131   PetscFunctionReturn(0);
2132 }
2133 
2134 #undef __FUNCT__
2135 #define __FUNCT__ "SNESMonitorLGRangeCreate"
2136 PetscErrorCode  SNESMonitorLGRangeCreate(const char host[],const char label[],int x,int y,int m,int n,PetscDrawLG *draw)
2137 {
2138   PetscErrorCode ierr;
2139 
2140   PetscFunctionBegin;
2141   ierr = KSPMonitorLGCreate(host,label,x,y,m,n,draw);CHKERRQ(ierr);
2142   PetscFunctionReturn(0);
2143 }
2144 
2145 #undef __FUNCT__
2146 #define __FUNCT__ "SNESMonitorLGRangeDestroy"
2147 PetscErrorCode  SNESMonitorLGRangeDestroy(PetscDrawLG *draw)
2148 {
2149   PetscErrorCode ierr;
2150 
2151   PetscFunctionBegin;
2152   ierr = KSPMonitorLGDestroy(draw);CHKERRQ(ierr);
2153   PetscFunctionReturn(0);
2154 }
2155 
2156 #undef __FUNCT__
2157 #define __FUNCT__ "SNESMonitor"
2158 /*
2159      Runs the user provided monitor routines, if they exists.
2160 */
2161 PetscErrorCode  SNESMonitor(SNES snes,PetscInt iter,PetscReal rnorm)
2162 {
2163   PetscErrorCode ierr;
2164   PetscInt       i,n = snes->numbermonitors;
2165 
2166   PetscFunctionBegin;
2167   for (i=0; i<n; i++) {
2168     ierr = (*snes->monitor[i])(snes,iter,rnorm,snes->monitorcontext[i]);CHKERRQ(ierr);
2169   }
2170   PetscFunctionReturn(0);
2171 }
2172 
2173 /* ------------ Routines to set performance monitoring options ----------- */
2174 
2175 #undef __FUNCT__
2176 #define __FUNCT__ "SNESMonitorSet"
2177 /*@C
2178    SNESMonitorSet - Sets an ADDITIONAL function that is to be used at every
2179    iteration of the nonlinear solver to display the iteration's
2180    progress.
2181 
2182    Logically Collective on SNES
2183 
2184    Input Parameters:
2185 +  snes - the SNES context
2186 .  func - monitoring routine
2187 .  mctx - [optional] user-defined context for private data for the
2188           monitor routine (use PETSC_NULL if no context is desired)
2189 -  monitordestroy - [optional] routine that frees monitor context
2190           (may be PETSC_NULL)
2191 
2192    Calling sequence of func:
2193 $     int func(SNES snes,PetscInt its, PetscReal norm,void *mctx)
2194 
2195 +    snes - the SNES context
2196 .    its - iteration number
2197 .    norm - 2-norm function value (may be estimated)
2198 -    mctx - [optional] monitoring context
2199 
2200    Options Database Keys:
2201 +    -snes_monitor        - sets SNESMonitorDefault()
2202 .    -snes_monitor_draw    - sets line graph monitor,
2203                             uses SNESMonitorLGCreate()
2204 -    -snes_monitor_cancel - cancels all monitors that have
2205                             been hardwired into a code by
2206                             calls to SNESMonitorSet(), but
2207                             does not cancel those set via
2208                             the options database.
2209 
2210    Notes:
2211    Several different monitoring routines may be set by calling
2212    SNESMonitorSet() multiple times; all will be called in the
2213    order in which they were set.
2214 
2215    Fortran notes: Only a single monitor function can be set for each SNES object
2216 
2217    Level: intermediate
2218 
2219 .keywords: SNES, nonlinear, set, monitor
2220 
2221 .seealso: SNESMonitorDefault(), SNESMonitorCancel()
2222 @*/
2223 PetscErrorCode  SNESMonitorSet(SNES snes,PetscErrorCode (*monitor)(SNES,PetscInt,PetscReal,void*),void *mctx,PetscErrorCode (*monitordestroy)(void**))
2224 {
2225   PetscInt       i;
2226   PetscErrorCode ierr;
2227 
2228   PetscFunctionBegin;
2229   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2230   if (snes->numbermonitors >= MAXSNESMONITORS) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Too many monitors set");
2231   for (i=0; i<snes->numbermonitors;i++) {
2232     if (monitor == snes->monitor[i] && monitordestroy == snes->monitordestroy[i] && mctx == snes->monitorcontext[i]) {
2233       if (monitordestroy) {
2234         ierr = (*monitordestroy)(&mctx);CHKERRQ(ierr);
2235       }
2236       PetscFunctionReturn(0);
2237     }
2238   }
2239   snes->monitor[snes->numbermonitors]           = monitor;
2240   snes->monitordestroy[snes->numbermonitors]    = monitordestroy;
2241   snes->monitorcontext[snes->numbermonitors++]  = (void*)mctx;
2242   PetscFunctionReturn(0);
2243 }
2244 
2245 #undef __FUNCT__
2246 #define __FUNCT__ "SNESMonitorCancel"
2247 /*@C
2248    SNESMonitorCancel - Clears all the monitor functions for a SNES object.
2249 
2250    Logically Collective on SNES
2251 
2252    Input Parameters:
2253 .  snes - the SNES context
2254 
2255    Options Database Key:
2256 .  -snes_monitor_cancel - cancels all monitors that have been hardwired
2257     into a code by calls to SNESMonitorSet(), but does not cancel those
2258     set via the options database
2259 
2260    Notes:
2261    There is no way to clear one specific monitor from a SNES object.
2262 
2263    Level: intermediate
2264 
2265 .keywords: SNES, nonlinear, set, monitor
2266 
2267 .seealso: SNESMonitorDefault(), SNESMonitorSet()
2268 @*/
2269 PetscErrorCode  SNESMonitorCancel(SNES snes)
2270 {
2271   PetscErrorCode ierr;
2272   PetscInt       i;
2273 
2274   PetscFunctionBegin;
2275   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2276   for (i=0; i<snes->numbermonitors; i++) {
2277     if (snes->monitordestroy[i]) {
2278       ierr = (*snes->monitordestroy[i])(&snes->monitorcontext[i]);CHKERRQ(ierr);
2279     }
2280   }
2281   snes->numbermonitors = 0;
2282   PetscFunctionReturn(0);
2283 }
2284 
2285 #undef __FUNCT__
2286 #define __FUNCT__ "SNESSetConvergenceTest"
2287 /*@C
2288    SNESSetConvergenceTest - Sets the function that is to be used
2289    to test for convergence of the nonlinear iterative solution.
2290 
2291    Logically Collective on SNES
2292 
2293    Input Parameters:
2294 +  snes - the SNES context
2295 .  func - routine to test for convergence
2296 .  cctx - [optional] context for private data for the convergence routine  (may be PETSC_NULL)
2297 -  destroy - [optional] destructor for the context (may be PETSC_NULL; PETSC_NULL_FUNCTION in Fortran)
2298 
2299    Calling sequence of func:
2300 $     PetscErrorCode func (SNES snes,PetscInt it,PetscReal xnorm,PetscReal gnorm,PetscReal f,SNESConvergedReason *reason,void *cctx)
2301 
2302 +    snes - the SNES context
2303 .    it - current iteration (0 is the first and is before any Newton step)
2304 .    cctx - [optional] convergence context
2305 .    reason - reason for convergence/divergence
2306 .    xnorm - 2-norm of current iterate
2307 .    gnorm - 2-norm of current step
2308 -    f - 2-norm of function
2309 
2310    Level: advanced
2311 
2312 .keywords: SNES, nonlinear, set, convergence, test
2313 
2314 .seealso: SNESDefaultConverged(), SNESSkipConverged()
2315 @*/
2316 PetscErrorCode  SNESSetConvergenceTest(SNES snes,PetscErrorCode (*func)(SNES,PetscInt,PetscReal,PetscReal,PetscReal,SNESConvergedReason*,void*),void *cctx,PetscErrorCode (*destroy)(void*))
2317 {
2318   PetscErrorCode ierr;
2319 
2320   PetscFunctionBegin;
2321   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2322   if (!func) func = SNESSkipConverged;
2323   if (snes->ops->convergeddestroy) {
2324     ierr = (*snes->ops->convergeddestroy)(snes->cnvP);CHKERRQ(ierr);
2325   }
2326   snes->ops->converged        = func;
2327   snes->ops->convergeddestroy = destroy;
2328   snes->cnvP                  = cctx;
2329   PetscFunctionReturn(0);
2330 }
2331 
2332 #undef __FUNCT__
2333 #define __FUNCT__ "SNESGetConvergedReason"
2334 /*@
2335    SNESGetConvergedReason - Gets the reason the SNES iteration was stopped.
2336 
2337    Not Collective
2338 
2339    Input Parameter:
2340 .  snes - the SNES context
2341 
2342    Output Parameter:
2343 .  reason - negative value indicates diverged, positive value converged, see SNESConvergedReason or the
2344             manual pages for the individual convergence tests for complete lists
2345 
2346    Level: intermediate
2347 
2348    Notes: Can only be called after the call the SNESSolve() is complete.
2349 
2350 .keywords: SNES, nonlinear, set, convergence, test
2351 
2352 .seealso: SNESSetConvergenceTest(), SNESConvergedReason
2353 @*/
2354 PetscErrorCode  SNESGetConvergedReason(SNES snes,SNESConvergedReason *reason)
2355 {
2356   PetscFunctionBegin;
2357   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2358   PetscValidPointer(reason,2);
2359   *reason = snes->reason;
2360   PetscFunctionReturn(0);
2361 }
2362 
2363 #undef __FUNCT__
2364 #define __FUNCT__ "SNESSetConvergenceHistory"
2365 /*@
2366    SNESSetConvergenceHistory - Sets the array used to hold the convergence history.
2367 
2368    Logically Collective on SNES
2369 
2370    Input Parameters:
2371 +  snes - iterative context obtained from SNESCreate()
2372 .  a   - array to hold history, this array will contain the function norms computed at each step
2373 .  its - integer array holds the number of linear iterations for each solve.
2374 .  na  - size of a and its
2375 -  reset - PETSC_TRUE indicates each new nonlinear solve resets the history counter to zero,
2376            else it continues storing new values for new nonlinear solves after the old ones
2377 
2378    Notes:
2379    If 'a' and 'its' are PETSC_NULL then space is allocated for the history. If 'na' PETSC_DECIDE or PETSC_DEFAULT then a
2380    default array of length 10000 is allocated.
2381 
2382    This routine is useful, e.g., when running a code for purposes
2383    of accurate performance monitoring, when no I/O should be done
2384    during the section of code that is being timed.
2385 
2386    Level: intermediate
2387 
2388 .keywords: SNES, set, convergence, history
2389 
2390 .seealso: SNESGetConvergenceHistory()
2391 
2392 @*/
2393 PetscErrorCode  SNESSetConvergenceHistory(SNES snes,PetscReal a[],PetscInt its[],PetscInt na,PetscBool  reset)
2394 {
2395   PetscErrorCode ierr;
2396 
2397   PetscFunctionBegin;
2398   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2399   if (na)  PetscValidScalarPointer(a,2);
2400   if (its) PetscValidIntPointer(its,3);
2401   if (na == PETSC_DECIDE || na == PETSC_DEFAULT || !a) {
2402     if (na == PETSC_DECIDE || na == PETSC_DEFAULT) na = 1000;
2403     ierr = PetscMalloc(na*sizeof(PetscReal),&a);CHKERRQ(ierr);
2404     ierr = PetscMalloc(na*sizeof(PetscInt),&its);CHKERRQ(ierr);
2405     snes->conv_malloc   = PETSC_TRUE;
2406   }
2407   snes->conv_hist       = a;
2408   snes->conv_hist_its   = its;
2409   snes->conv_hist_max   = na;
2410   snes->conv_hist_len   = 0;
2411   snes->conv_hist_reset = reset;
2412   PetscFunctionReturn(0);
2413 }
2414 
2415 #if defined(PETSC_HAVE_MATLAB_ENGINE)
2416 #include <engine.h>   /* MATLAB include file */
2417 #include <mex.h>      /* MATLAB include file */
2418 EXTERN_C_BEGIN
2419 #undef __FUNCT__
2420 #define __FUNCT__ "SNESGetConvergenceHistoryMatlab"
2421 mxArray *SNESGetConvergenceHistoryMatlab(SNES snes)
2422 {
2423   mxArray        *mat;
2424   PetscInt       i;
2425   PetscReal      *ar;
2426 
2427   PetscFunctionBegin;
2428   mat  = mxCreateDoubleMatrix(snes->conv_hist_len,1,mxREAL);
2429   ar   = (PetscReal*) mxGetData(mat);
2430   for (i=0; i<snes->conv_hist_len; i++) {
2431     ar[i] = snes->conv_hist[i];
2432   }
2433   PetscFunctionReturn(mat);
2434 }
2435 EXTERN_C_END
2436 #endif
2437 
2438 
2439 #undef __FUNCT__
2440 #define __FUNCT__ "SNESGetConvergenceHistory"
2441 /*@C
2442    SNESGetConvergenceHistory - Gets the array used to hold the convergence history.
2443 
2444    Not Collective
2445 
2446    Input Parameter:
2447 .  snes - iterative context obtained from SNESCreate()
2448 
2449    Output Parameters:
2450 .  a   - array to hold history
2451 .  its - integer array holds the number of linear iterations (or
2452          negative if not converged) for each solve.
2453 -  na  - size of a and its
2454 
2455    Notes:
2456     The calling sequence for this routine in Fortran is
2457 $   call SNESGetConvergenceHistory(SNES snes, integer na, integer ierr)
2458 
2459    This routine is useful, e.g., when running a code for purposes
2460    of accurate performance monitoring, when no I/O should be done
2461    during the section of code that is being timed.
2462 
2463    Level: intermediate
2464 
2465 .keywords: SNES, get, convergence, history
2466 
2467 .seealso: SNESSetConvergencHistory()
2468 
2469 @*/
2470 PetscErrorCode  SNESGetConvergenceHistory(SNES snes,PetscReal *a[],PetscInt *its[],PetscInt *na)
2471 {
2472   PetscFunctionBegin;
2473   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2474   if (a)   *a   = snes->conv_hist;
2475   if (its) *its = snes->conv_hist_its;
2476   if (na)  *na  = snes->conv_hist_len;
2477   PetscFunctionReturn(0);
2478 }
2479 
2480 #undef __FUNCT__
2481 #define __FUNCT__ "SNESSetUpdate"
2482 /*@C
2483   SNESSetUpdate - Sets the general-purpose update function called
2484   at the beginning of every iteration of the nonlinear solve. Specifically
2485   it is called just before the Jacobian is "evaluated".
2486 
2487   Logically Collective on SNES
2488 
2489   Input Parameters:
2490 . snes - The nonlinear solver context
2491 . func - The function
2492 
2493   Calling sequence of func:
2494 . func (SNES snes, PetscInt step);
2495 
2496 . step - The current step of the iteration
2497 
2498   Level: advanced
2499 
2500   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()
2501         This is not used by most users.
2502 
2503 .keywords: SNES, update
2504 
2505 .seealso SNESDefaultUpdate(), SNESSetJacobian(), SNESSolve()
2506 @*/
2507 PetscErrorCode  SNESSetUpdate(SNES snes, PetscErrorCode (*func)(SNES, PetscInt))
2508 {
2509   PetscFunctionBegin;
2510   PetscValidHeaderSpecific(snes, SNES_CLASSID,1);
2511   snes->ops->update = func;
2512   PetscFunctionReturn(0);
2513 }
2514 
2515 #undef __FUNCT__
2516 #define __FUNCT__ "SNESDefaultUpdate"
2517 /*@
2518   SNESDefaultUpdate - The default update function which does nothing.
2519 
2520   Not collective
2521 
2522   Input Parameters:
2523 . snes - The nonlinear solver context
2524 . step - The current step of the iteration
2525 
2526   Level: intermediate
2527 
2528 .keywords: SNES, update
2529 .seealso SNESSetUpdate(), SNESDefaultRhsBC(), SNESDefaultShortolutionBC()
2530 @*/
2531 PetscErrorCode  SNESDefaultUpdate(SNES snes, PetscInt step)
2532 {
2533   PetscFunctionBegin;
2534   PetscFunctionReturn(0);
2535 }
2536 
2537 #undef __FUNCT__
2538 #define __FUNCT__ "SNESScaleStep_Private"
2539 /*
2540    SNESScaleStep_Private - Scales a step so that its length is less than the
2541    positive parameter delta.
2542 
2543     Input Parameters:
2544 +   snes - the SNES context
2545 .   y - approximate solution of linear system
2546 .   fnorm - 2-norm of current function
2547 -   delta - trust region size
2548 
2549     Output Parameters:
2550 +   gpnorm - predicted function norm at the new point, assuming local
2551     linearization.  The value is zero if the step lies within the trust
2552     region, and exceeds zero otherwise.
2553 -   ynorm - 2-norm of the step
2554 
2555     Note:
2556     For non-trust region methods such as SNESLS, the parameter delta
2557     is set to be the maximum allowable step size.
2558 
2559 .keywords: SNES, nonlinear, scale, step
2560 */
2561 PetscErrorCode SNESScaleStep_Private(SNES snes,Vec y,PetscReal *fnorm,PetscReal *delta,PetscReal *gpnorm,PetscReal *ynorm)
2562 {
2563   PetscReal      nrm;
2564   PetscScalar    cnorm;
2565   PetscErrorCode ierr;
2566 
2567   PetscFunctionBegin;
2568   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2569   PetscValidHeaderSpecific(y,VEC_CLASSID,2);
2570   PetscCheckSameComm(snes,1,y,2);
2571 
2572   ierr = VecNorm(y,NORM_2,&nrm);CHKERRQ(ierr);
2573   if (nrm > *delta) {
2574      nrm = *delta/nrm;
2575      *gpnorm = (1.0 - nrm)*(*fnorm);
2576      cnorm = nrm;
2577      ierr = VecScale(y,cnorm);CHKERRQ(ierr);
2578      *ynorm = *delta;
2579   } else {
2580      *gpnorm = 0.0;
2581      *ynorm = nrm;
2582   }
2583   PetscFunctionReturn(0);
2584 }
2585 
2586 #undef __FUNCT__
2587 #define __FUNCT__ "SNESSolve"
2588 /*@C
2589    SNESSolve - Solves a nonlinear system F(x) = b.
2590    Call SNESSolve() after calling SNESCreate() and optional routines of the form SNESSetXXX().
2591 
2592    Collective on SNES
2593 
2594    Input Parameters:
2595 +  snes - the SNES context
2596 .  b - the constant part of the equation, or PETSC_NULL to use zero.
2597 -  x - the solution vector.
2598 
2599    Notes:
2600    The user should initialize the vector,x, with the initial guess
2601    for the nonlinear solve prior to calling SNESSolve.  In particular,
2602    to employ an initial guess of zero, the user should explicitly set
2603    this vector to zero by calling VecSet().
2604 
2605    Level: beginner
2606 
2607 .keywords: SNES, nonlinear, solve
2608 
2609 .seealso: SNESCreate(), SNESDestroy(), SNESSetFunction(), SNESSetJacobian()
2610 @*/
2611 PetscErrorCode  SNESSolve(SNES snes,Vec b,Vec x)
2612 {
2613   PetscErrorCode ierr;
2614   PetscBool      flg;
2615   char           filename[PETSC_MAX_PATH_LEN];
2616   PetscViewer    viewer;
2617   PetscInt       grid;
2618 
2619   PetscFunctionBegin;
2620   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2621   PetscValidHeaderSpecific(x,VEC_CLASSID,3);
2622   PetscCheckSameComm(snes,1,x,3);
2623   if (b) PetscValidHeaderSpecific(b,VEC_CLASSID,2);
2624   if (b) PetscCheckSameComm(snes,1,b,2);
2625 
2626   for (grid=0; grid<snes->gridsequence; grid++) {ierr = PetscViewerASCIIPushTab(PETSC_VIEWER_STDOUT_(((PetscObject)snes)->comm));CHKERRQ(ierr);}
2627   for (grid=0; grid<snes->gridsequence+1; grid++) {
2628 
2629     /* set solution vector */
2630     if (!grid) {ierr = PetscObjectReference((PetscObject)x);CHKERRQ(ierr);}
2631     ierr = VecDestroy(&snes->vec_sol);CHKERRQ(ierr);
2632     snes->vec_sol = x;
2633     /* set afine vector if provided */
2634     if (b) { ierr = PetscObjectReference((PetscObject)b);CHKERRQ(ierr); }
2635     ierr = VecDestroy(&snes->vec_rhs);CHKERRQ(ierr);
2636     snes->vec_rhs = b;
2637 
2638     ierr = SNESSetUp(snes);CHKERRQ(ierr);
2639 
2640     if (!grid && snes->ops->computeinitialguess) {
2641       ierr = (*snes->ops->computeinitialguess)(snes,snes->vec_sol,snes->initialguessP);CHKERRQ(ierr);
2642     }
2643 
2644     if (snes->conv_hist_reset) snes->conv_hist_len = 0;
2645     snes->nfuncs = 0; snes->linear_its = 0; snes->numFailures = 0;
2646 
2647     ierr = PetscLogEventBegin(SNES_Solve,snes,0,0,0);CHKERRQ(ierr);
2648     ierr = (*snes->ops->solve)(snes);CHKERRQ(ierr);
2649     ierr = PetscLogEventEnd(SNES_Solve,snes,0,0,0);CHKERRQ(ierr);
2650     if (snes->domainerror){
2651       snes->reason      = SNES_DIVERGED_FUNCTION_DOMAIN;
2652       snes->domainerror = PETSC_FALSE;
2653     }
2654     if (!snes->reason) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Internal error, solver returned without setting converged reason");
2655 
2656     ierr = PetscOptionsGetString(((PetscObject)snes)->prefix,"-snes_view",filename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
2657     if (flg && !PetscPreLoadingOn) {
2658       ierr = PetscViewerASCIIOpen(((PetscObject)snes)->comm,filename,&viewer);CHKERRQ(ierr);
2659       ierr = SNESView(snes,viewer);CHKERRQ(ierr);
2660       ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
2661     }
2662 
2663     flg  = PETSC_FALSE;
2664     ierr = PetscOptionsGetBool(((PetscObject)snes)->prefix,"-snes_test_local_min",&flg,PETSC_NULL);CHKERRQ(ierr);
2665     if (flg && !PetscPreLoadingOn) { ierr = SNESTestLocalMin(snes);CHKERRQ(ierr); }
2666     if (snes->printreason) {
2667       ierr = PetscViewerASCIIAddTab(PETSC_VIEWER_STDOUT_(((PetscObject)snes)->comm),((PetscObject)snes)->tablevel);CHKERRQ(ierr);
2668       if (snes->reason > 0) {
2669         ierr = PetscViewerASCIIPrintf(PETSC_VIEWER_STDOUT_(((PetscObject)snes)->comm),"Nonlinear solve converged due to %s\n",SNESConvergedReasons[snes->reason]);CHKERRQ(ierr);
2670       } else {
2671         ierr = PetscViewerASCIIPrintf(PETSC_VIEWER_STDOUT_(((PetscObject)snes)->comm),"Nonlinear solve did not converge due to %s\n",SNESConvergedReasons[snes->reason]);CHKERRQ(ierr);
2672       }
2673       ierr = PetscViewerASCIISubtractTab(PETSC_VIEWER_STDOUT_(((PetscObject)snes)->comm),((PetscObject)snes)->tablevel);CHKERRQ(ierr);
2674     }
2675 
2676     if (snes->errorifnotconverged && snes->reason < 0) SETERRQ(((PetscObject)snes)->comm,PETSC_ERR_NOT_CONVERGED,"SNESSolve has not converged");
2677     if (grid <  snes->gridsequence) {
2678       DM  fine;
2679       Vec xnew;
2680       Mat interp;
2681 
2682       ierr = DMRefine(snes->dm,((PetscObject)snes)->comm,&fine);CHKERRQ(ierr);
2683       ierr = DMGetInterpolation(snes->dm,fine,&interp,PETSC_NULL);CHKERRQ(ierr);
2684       ierr = DMCreateGlobalVector(fine,&xnew);CHKERRQ(ierr);
2685       ierr = MatInterpolate(interp,x,xnew);CHKERRQ(ierr);
2686       ierr = MatDestroy(&interp);CHKERRQ(ierr);
2687       x    = xnew;
2688 
2689       ierr = SNESReset(snes);CHKERRQ(ierr);
2690       ierr = SNESSetDM(snes,fine);CHKERRQ(ierr);
2691       ierr = DMDestroy(&fine);CHKERRQ(ierr);
2692       ierr = PetscViewerASCIIPopTab(PETSC_VIEWER_STDOUT_(((PetscObject)snes)->comm));CHKERRQ(ierr);
2693     }
2694   }
2695   PetscFunctionReturn(0);
2696 }
2697 
2698 /* --------- Internal routines for SNES Package --------- */
2699 
2700 #undef __FUNCT__
2701 #define __FUNCT__ "SNESSetType"
2702 /*@C
2703    SNESSetType - Sets the method for the nonlinear solver.
2704 
2705    Collective on SNES
2706 
2707    Input Parameters:
2708 +  snes - the SNES context
2709 -  type - a known method
2710 
2711    Options Database Key:
2712 .  -snes_type <type> - Sets the method; use -help for a list
2713    of available methods (for instance, ls or tr)
2714 
2715    Notes:
2716    See "petsc/include/petscsnes.h" for available methods (for instance)
2717 +    SNESLS - Newton's method with line search
2718      (systems of nonlinear equations)
2719 .    SNESTR - Newton's method with trust region
2720      (systems of nonlinear equations)
2721 
2722   Normally, it is best to use the SNESSetFromOptions() command and then
2723   set the SNES solver type from the options database rather than by using
2724   this routine.  Using the options database provides the user with
2725   maximum flexibility in evaluating the many nonlinear solvers.
2726   The SNESSetType() routine is provided for those situations where it
2727   is necessary to set the nonlinear solver independently of the command
2728   line or options database.  This might be the case, for example, when
2729   the choice of solver changes during the execution of the program,
2730   and the user's application is taking responsibility for choosing the
2731   appropriate method.
2732 
2733   Level: intermediate
2734 
2735 .keywords: SNES, set, type
2736 
2737 .seealso: SNESType, SNESCreate()
2738 
2739 @*/
2740 PetscErrorCode  SNESSetType(SNES snes,const SNESType type)
2741 {
2742   PetscErrorCode ierr,(*r)(SNES);
2743   PetscBool      match;
2744 
2745   PetscFunctionBegin;
2746   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2747   PetscValidCharPointer(type,2);
2748 
2749   ierr = PetscTypeCompare((PetscObject)snes,type,&match);CHKERRQ(ierr);
2750   if (match) PetscFunctionReturn(0);
2751 
2752   ierr =  PetscFListFind(SNESList,((PetscObject)snes)->comm,type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr);
2753   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested SNES type %s",type);
2754   /* Destroy the previous private SNES context */
2755   if (snes->ops->destroy) { ierr = (*(snes)->ops->destroy)(snes);CHKERRQ(ierr); }
2756   /* Reinitialize function pointers in SNESOps structure */
2757   snes->ops->setup          = 0;
2758   snes->ops->solve          = 0;
2759   snes->ops->view           = 0;
2760   snes->ops->setfromoptions = 0;
2761   snes->ops->destroy        = 0;
2762   /* Call the SNESCreate_XXX routine for this particular Nonlinear solver */
2763   snes->setupcalled = PETSC_FALSE;
2764   ierr = PetscObjectChangeTypeName((PetscObject)snes,type);CHKERRQ(ierr);
2765   ierr = (*r)(snes);CHKERRQ(ierr);
2766 #if defined(PETSC_HAVE_AMS)
2767   if (PetscAMSPublishAll) {
2768     ierr = PetscObjectAMSPublish((PetscObject)snes);CHKERRQ(ierr);
2769   }
2770 #endif
2771   PetscFunctionReturn(0);
2772 }
2773 
2774 
2775 /* --------------------------------------------------------------------- */
2776 #undef __FUNCT__
2777 #define __FUNCT__ "SNESRegisterDestroy"
2778 /*@
2779    SNESRegisterDestroy - Frees the list of nonlinear solvers that were
2780    registered by SNESRegisterDynamic().
2781 
2782    Not Collective
2783 
2784    Level: advanced
2785 
2786 .keywords: SNES, nonlinear, register, destroy
2787 
2788 .seealso: SNESRegisterAll(), SNESRegisterAll()
2789 @*/
2790 PetscErrorCode  SNESRegisterDestroy(void)
2791 {
2792   PetscErrorCode ierr;
2793 
2794   PetscFunctionBegin;
2795   ierr = PetscFListDestroy(&SNESList);CHKERRQ(ierr);
2796   SNESRegisterAllCalled = PETSC_FALSE;
2797   PetscFunctionReturn(0);
2798 }
2799 
2800 #undef __FUNCT__
2801 #define __FUNCT__ "SNESGetType"
2802 /*@C
2803    SNESGetType - Gets the SNES method type and name (as a string).
2804 
2805    Not Collective
2806 
2807    Input Parameter:
2808 .  snes - nonlinear solver context
2809 
2810    Output Parameter:
2811 .  type - SNES method (a character string)
2812 
2813    Level: intermediate
2814 
2815 .keywords: SNES, nonlinear, get, type, name
2816 @*/
2817 PetscErrorCode  SNESGetType(SNES snes,const SNESType *type)
2818 {
2819   PetscFunctionBegin;
2820   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2821   PetscValidPointer(type,2);
2822   *type = ((PetscObject)snes)->type_name;
2823   PetscFunctionReturn(0);
2824 }
2825 
2826 #undef __FUNCT__
2827 #define __FUNCT__ "SNESGetSolution"
2828 /*@
2829    SNESGetSolution - Returns the vector where the approximate solution is
2830    stored.
2831 
2832    Not Collective, but Vec is parallel if SNES is parallel
2833 
2834    Input Parameter:
2835 .  snes - the SNES context
2836 
2837    Output Parameter:
2838 .  x - the solution
2839 
2840    Level: intermediate
2841 
2842 .keywords: SNES, nonlinear, get, solution
2843 
2844 .seealso:  SNESGetSolutionUpdate(), SNESGetFunction()
2845 @*/
2846 PetscErrorCode  SNESGetSolution(SNES snes,Vec *x)
2847 {
2848   PetscFunctionBegin;
2849   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2850   PetscValidPointer(x,2);
2851   *x = snes->vec_sol;
2852   PetscFunctionReturn(0);
2853 }
2854 
2855 #undef __FUNCT__
2856 #define __FUNCT__ "SNESGetSolutionUpdate"
2857 /*@
2858    SNESGetSolutionUpdate - Returns the vector where the solution update is
2859    stored.
2860 
2861    Not Collective, but Vec is parallel if SNES is parallel
2862 
2863    Input Parameter:
2864 .  snes - the SNES context
2865 
2866    Output Parameter:
2867 .  x - the solution update
2868 
2869    Level: advanced
2870 
2871 .keywords: SNES, nonlinear, get, solution, update
2872 
2873 .seealso: SNESGetSolution(), SNESGetFunction()
2874 @*/
2875 PetscErrorCode  SNESGetSolutionUpdate(SNES snes,Vec *x)
2876 {
2877   PetscFunctionBegin;
2878   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2879   PetscValidPointer(x,2);
2880   *x = snes->vec_sol_update;
2881   PetscFunctionReturn(0);
2882 }
2883 
2884 #undef __FUNCT__
2885 #define __FUNCT__ "SNESGetFunction"
2886 /*@C
2887    SNESGetFunction - Returns the vector where the function is stored.
2888 
2889    Not Collective, but Vec is parallel if SNES is parallel
2890 
2891    Input Parameter:
2892 .  snes - the SNES context
2893 
2894    Output Parameter:
2895 +  r - the function (or PETSC_NULL)
2896 .  func - the function (or PETSC_NULL)
2897 -  ctx - the function context (or PETSC_NULL)
2898 
2899    Level: advanced
2900 
2901 .keywords: SNES, nonlinear, get, function
2902 
2903 .seealso: SNESSetFunction(), SNESGetSolution()
2904 @*/
2905 PetscErrorCode  SNESGetFunction(SNES snes,Vec *r,PetscErrorCode (**func)(SNES,Vec,Vec,void*),void **ctx)
2906 {
2907   PetscFunctionBegin;
2908   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2909   if (r)    *r    = snes->vec_func;
2910   if (func) *func = snes->ops->computefunction;
2911   if (ctx)  *ctx  = snes->funP;
2912   PetscFunctionReturn(0);
2913 }
2914 
2915 #undef __FUNCT__
2916 #define __FUNCT__ "SNESSetOptionsPrefix"
2917 /*@C
2918    SNESSetOptionsPrefix - Sets the prefix used for searching for all
2919    SNES options in the database.
2920 
2921    Logically Collective on SNES
2922 
2923    Input Parameter:
2924 +  snes - the SNES context
2925 -  prefix - the prefix to prepend to all option names
2926 
2927    Notes:
2928    A hyphen (-) must NOT be given at the beginning of the prefix name.
2929    The first character of all runtime options is AUTOMATICALLY the hyphen.
2930 
2931    Level: advanced
2932 
2933 .keywords: SNES, set, options, prefix, database
2934 
2935 .seealso: SNESSetFromOptions()
2936 @*/
2937 PetscErrorCode  SNESSetOptionsPrefix(SNES snes,const char prefix[])
2938 {
2939   PetscErrorCode ierr;
2940 
2941   PetscFunctionBegin;
2942   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2943   ierr = PetscObjectSetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr);
2944   if (!snes->ksp) {ierr = SNESGetKSP(snes,&snes->ksp);CHKERRQ(ierr);}
2945   ierr = KSPSetOptionsPrefix(snes->ksp,prefix);CHKERRQ(ierr);
2946   PetscFunctionReturn(0);
2947 }
2948 
2949 #undef __FUNCT__
2950 #define __FUNCT__ "SNESAppendOptionsPrefix"
2951 /*@C
2952    SNESAppendOptionsPrefix - Appends to the prefix used for searching for all
2953    SNES options in the database.
2954 
2955    Logically Collective on SNES
2956 
2957    Input Parameters:
2958 +  snes - the SNES context
2959 -  prefix - the prefix to prepend to all option names
2960 
2961    Notes:
2962    A hyphen (-) must NOT be given at the beginning of the prefix name.
2963    The first character of all runtime options is AUTOMATICALLY the hyphen.
2964 
2965    Level: advanced
2966 
2967 .keywords: SNES, append, options, prefix, database
2968 
2969 .seealso: SNESGetOptionsPrefix()
2970 @*/
2971 PetscErrorCode  SNESAppendOptionsPrefix(SNES snes,const char prefix[])
2972 {
2973   PetscErrorCode ierr;
2974 
2975   PetscFunctionBegin;
2976   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
2977   ierr = PetscObjectAppendOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr);
2978   if (!snes->ksp) {ierr = SNESGetKSP(snes,&snes->ksp);CHKERRQ(ierr);}
2979   ierr = KSPAppendOptionsPrefix(snes->ksp,prefix);CHKERRQ(ierr);
2980   PetscFunctionReturn(0);
2981 }
2982 
2983 #undef __FUNCT__
2984 #define __FUNCT__ "SNESGetOptionsPrefix"
2985 /*@C
2986    SNESGetOptionsPrefix - Sets the prefix used for searching for all
2987    SNES options in the database.
2988 
2989    Not Collective
2990 
2991    Input Parameter:
2992 .  snes - the SNES context
2993 
2994    Output Parameter:
2995 .  prefix - pointer to the prefix string used
2996 
2997    Notes: On the fortran side, the user should pass in a string 'prefix' of
2998    sufficient length to hold the prefix.
2999 
3000    Level: advanced
3001 
3002 .keywords: SNES, get, options, prefix, database
3003 
3004 .seealso: SNESAppendOptionsPrefix()
3005 @*/
3006 PetscErrorCode  SNESGetOptionsPrefix(SNES snes,const char *prefix[])
3007 {
3008   PetscErrorCode ierr;
3009 
3010   PetscFunctionBegin;
3011   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3012   ierr = PetscObjectGetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr);
3013   PetscFunctionReturn(0);
3014 }
3015 
3016 
3017 #undef __FUNCT__
3018 #define __FUNCT__ "SNESRegister"
3019 /*@C
3020   SNESRegister - See SNESRegisterDynamic()
3021 
3022   Level: advanced
3023 @*/
3024 PetscErrorCode  SNESRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(SNES))
3025 {
3026   char           fullname[PETSC_MAX_PATH_LEN];
3027   PetscErrorCode ierr;
3028 
3029   PetscFunctionBegin;
3030   ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr);
3031   ierr = PetscFListAdd(&SNESList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
3032   PetscFunctionReturn(0);
3033 }
3034 
3035 #undef __FUNCT__
3036 #define __FUNCT__ "SNESTestLocalMin"
3037 PetscErrorCode  SNESTestLocalMin(SNES snes)
3038 {
3039   PetscErrorCode ierr;
3040   PetscInt       N,i,j;
3041   Vec            u,uh,fh;
3042   PetscScalar    value;
3043   PetscReal      norm;
3044 
3045   PetscFunctionBegin;
3046   ierr = SNESGetSolution(snes,&u);CHKERRQ(ierr);
3047   ierr = VecDuplicate(u,&uh);CHKERRQ(ierr);
3048   ierr = VecDuplicate(u,&fh);CHKERRQ(ierr);
3049 
3050   /* currently only works for sequential */
3051   ierr = PetscPrintf(PETSC_COMM_WORLD,"Testing FormFunction() for local min\n");
3052   ierr = VecGetSize(u,&N);CHKERRQ(ierr);
3053   for (i=0; i<N; i++) {
3054     ierr = VecCopy(u,uh);CHKERRQ(ierr);
3055     ierr  = PetscPrintf(PETSC_COMM_WORLD,"i = %D\n",i);CHKERRQ(ierr);
3056     for (j=-10; j<11; j++) {
3057       value = PetscSign(j)*exp(PetscAbs(j)-10.0);
3058       ierr  = VecSetValue(uh,i,value,ADD_VALUES);CHKERRQ(ierr);
3059       ierr  = SNESComputeFunction(snes,uh,fh);CHKERRQ(ierr);
3060       ierr  = VecNorm(fh,NORM_2,&norm);CHKERRQ(ierr);
3061       ierr  = PetscPrintf(PETSC_COMM_WORLD,"       j norm %D %18.16e\n",j,norm);CHKERRQ(ierr);
3062       value = -value;
3063       ierr  = VecSetValue(uh,i,value,ADD_VALUES);CHKERRQ(ierr);
3064     }
3065   }
3066   ierr = VecDestroy(&uh);CHKERRQ(ierr);
3067   ierr = VecDestroy(&fh);CHKERRQ(ierr);
3068   PetscFunctionReturn(0);
3069 }
3070 
3071 #undef __FUNCT__
3072 #define __FUNCT__ "SNESKSPSetUseEW"
3073 /*@
3074    SNESKSPSetUseEW - Sets SNES use Eisenstat-Walker method for
3075    computing relative tolerance for linear solvers within an inexact
3076    Newton method.
3077 
3078    Logically Collective on SNES
3079 
3080    Input Parameters:
3081 +  snes - SNES context
3082 -  flag - PETSC_TRUE or PETSC_FALSE
3083 
3084     Options Database:
3085 +  -snes_ksp_ew - use Eisenstat-Walker method for determining linear system convergence
3086 .  -snes_ksp_ew_version ver - version of  Eisenstat-Walker method
3087 .  -snes_ksp_ew_rtol0 <rtol0> - Sets rtol0
3088 .  -snes_ksp_ew_rtolmax <rtolmax> - Sets rtolmax
3089 .  -snes_ksp_ew_gamma <gamma> - Sets gamma
3090 .  -snes_ksp_ew_alpha <alpha> - Sets alpha
3091 .  -snes_ksp_ew_alpha2 <alpha2> - Sets alpha2
3092 -  -snes_ksp_ew_threshold <threshold> - Sets threshold
3093 
3094    Notes:
3095    Currently, the default is to use a constant relative tolerance for
3096    the inner linear solvers.  Alternatively, one can use the
3097    Eisenstat-Walker method, where the relative convergence tolerance
3098    is reset at each Newton iteration according progress of the nonlinear
3099    solver.
3100 
3101    Level: advanced
3102 
3103    Reference:
3104    S. C. Eisenstat and H. F. Walker, "Choosing the forcing terms in an
3105    inexact Newton method", SISC 17 (1), pp.16-32, 1996.
3106 
3107 .keywords: SNES, KSP, Eisenstat, Walker, convergence, test, inexact, Newton
3108 
3109 .seealso: SNESKSPGetUseEW(), SNESKSPGetParametersEW(), SNESKSPSetParametersEW()
3110 @*/
3111 PetscErrorCode  SNESKSPSetUseEW(SNES snes,PetscBool  flag)
3112 {
3113   PetscFunctionBegin;
3114   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3115   PetscValidLogicalCollectiveBool(snes,flag,2);
3116   snes->ksp_ewconv = flag;
3117   PetscFunctionReturn(0);
3118 }
3119 
3120 #undef __FUNCT__
3121 #define __FUNCT__ "SNESKSPGetUseEW"
3122 /*@
3123    SNESKSPGetUseEW - Gets if SNES is using Eisenstat-Walker method
3124    for computing relative tolerance for linear solvers within an
3125    inexact Newton method.
3126 
3127    Not Collective
3128 
3129    Input Parameter:
3130 .  snes - SNES context
3131 
3132    Output Parameter:
3133 .  flag - PETSC_TRUE or PETSC_FALSE
3134 
3135    Notes:
3136    Currently, the default is to use a constant relative tolerance for
3137    the inner linear solvers.  Alternatively, one can use the
3138    Eisenstat-Walker method, where the relative convergence tolerance
3139    is reset at each Newton iteration according progress of the nonlinear
3140    solver.
3141 
3142    Level: advanced
3143 
3144    Reference:
3145    S. C. Eisenstat and H. F. Walker, "Choosing the forcing terms in an
3146    inexact Newton method", SISC 17 (1), pp.16-32, 1996.
3147 
3148 .keywords: SNES, KSP, Eisenstat, Walker, convergence, test, inexact, Newton
3149 
3150 .seealso: SNESKSPSetUseEW(), SNESKSPGetParametersEW(), SNESKSPSetParametersEW()
3151 @*/
3152 PetscErrorCode  SNESKSPGetUseEW(SNES snes, PetscBool  *flag)
3153 {
3154   PetscFunctionBegin;
3155   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3156   PetscValidPointer(flag,2);
3157   *flag = snes->ksp_ewconv;
3158   PetscFunctionReturn(0);
3159 }
3160 
3161 #undef __FUNCT__
3162 #define __FUNCT__ "SNESKSPSetParametersEW"
3163 /*@
3164    SNESKSPSetParametersEW - Sets parameters for Eisenstat-Walker
3165    convergence criteria for the linear solvers within an inexact
3166    Newton method.
3167 
3168    Logically Collective on SNES
3169 
3170    Input Parameters:
3171 +    snes - SNES context
3172 .    version - version 1, 2 (default is 2) or 3
3173 .    rtol_0 - initial relative tolerance (0 <= rtol_0 < 1)
3174 .    rtol_max - maximum relative tolerance (0 <= rtol_max < 1)
3175 .    gamma - multiplicative factor for version 2 rtol computation
3176              (0 <= gamma2 <= 1)
3177 .    alpha - power for version 2 rtol computation (1 < alpha <= 2)
3178 .    alpha2 - power for safeguard
3179 -    threshold - threshold for imposing safeguard (0 < threshold < 1)
3180 
3181    Note:
3182    Version 3 was contributed by Luis Chacon, June 2006.
3183 
3184    Use PETSC_DEFAULT to retain the default for any of the parameters.
3185 
3186    Level: advanced
3187 
3188    Reference:
3189    S. C. Eisenstat and H. F. Walker, "Choosing the forcing terms in an
3190    inexact Newton method", Utah State University Math. Stat. Dept. Res.
3191    Report 6/94/75, June, 1994, to appear in SIAM J. Sci. Comput.
3192 
3193 .keywords: SNES, KSP, Eisenstat, Walker, set, parameters
3194 
3195 .seealso: SNESKSPSetUseEW(), SNESKSPGetUseEW(), SNESKSPGetParametersEW()
3196 @*/
3197 PetscErrorCode  SNESKSPSetParametersEW(SNES snes,PetscInt version,PetscReal rtol_0,PetscReal rtol_max,
3198 							    PetscReal gamma,PetscReal alpha,PetscReal alpha2,PetscReal threshold)
3199 {
3200   SNESKSPEW *kctx;
3201   PetscFunctionBegin;
3202   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3203   kctx = (SNESKSPEW*)snes->kspconvctx;
3204   if (!kctx) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"No Eisenstat-Walker context existing");
3205   PetscValidLogicalCollectiveInt(snes,version,2);
3206   PetscValidLogicalCollectiveReal(snes,rtol_0,3);
3207   PetscValidLogicalCollectiveReal(snes,rtol_max,4);
3208   PetscValidLogicalCollectiveReal(snes,gamma,5);
3209   PetscValidLogicalCollectiveReal(snes,alpha,6);
3210   PetscValidLogicalCollectiveReal(snes,alpha2,7);
3211   PetscValidLogicalCollectiveReal(snes,threshold,8);
3212 
3213   if (version != PETSC_DEFAULT)   kctx->version   = version;
3214   if (rtol_0 != PETSC_DEFAULT)    kctx->rtol_0    = rtol_0;
3215   if (rtol_max != PETSC_DEFAULT)  kctx->rtol_max  = rtol_max;
3216   if (gamma != PETSC_DEFAULT)     kctx->gamma     = gamma;
3217   if (alpha != PETSC_DEFAULT)     kctx->alpha     = alpha;
3218   if (alpha2 != PETSC_DEFAULT)    kctx->alpha2    = alpha2;
3219   if (threshold != PETSC_DEFAULT) kctx->threshold = threshold;
3220 
3221   if (kctx->version < 1 || kctx->version > 3) {
3222     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Only versions 1, 2 and 3 are supported: %D",kctx->version);
3223   }
3224   if (kctx->rtol_0 < 0.0 || kctx->rtol_0 >= 1.0) {
3225     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"0.0 <= rtol_0 < 1.0: %G",kctx->rtol_0);
3226   }
3227   if (kctx->rtol_max < 0.0 || kctx->rtol_max >= 1.0) {
3228     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"0.0 <= rtol_max (%G) < 1.0\n",kctx->rtol_max);
3229   }
3230   if (kctx->gamma < 0.0 || kctx->gamma > 1.0) {
3231     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"0.0 <= gamma (%G) <= 1.0\n",kctx->gamma);
3232   }
3233   if (kctx->alpha <= 1.0 || kctx->alpha > 2.0) {
3234     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"1.0 < alpha (%G) <= 2.0\n",kctx->alpha);
3235   }
3236   if (kctx->threshold <= 0.0 || kctx->threshold >= 1.0) {
3237     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"0.0 < threshold (%G) < 1.0\n",kctx->threshold);
3238   }
3239   PetscFunctionReturn(0);
3240 }
3241 
3242 #undef __FUNCT__
3243 #define __FUNCT__ "SNESKSPGetParametersEW"
3244 /*@
3245    SNESKSPGetParametersEW - Gets parameters for Eisenstat-Walker
3246    convergence criteria for the linear solvers within an inexact
3247    Newton method.
3248 
3249    Not Collective
3250 
3251    Input Parameters:
3252      snes - SNES context
3253 
3254    Output Parameters:
3255 +    version - version 1, 2 (default is 2) or 3
3256 .    rtol_0 - initial relative tolerance (0 <= rtol_0 < 1)
3257 .    rtol_max - maximum relative tolerance (0 <= rtol_max < 1)
3258 .    gamma - multiplicative factor for version 2 rtol computation
3259              (0 <= gamma2 <= 1)
3260 .    alpha - power for version 2 rtol computation (1 < alpha <= 2)
3261 .    alpha2 - power for safeguard
3262 -    threshold - threshold for imposing safeguard (0 < threshold < 1)
3263 
3264    Level: advanced
3265 
3266 .keywords: SNES, KSP, Eisenstat, Walker, get, parameters
3267 
3268 .seealso: SNESKSPSetUseEW(), SNESKSPGetUseEW(), SNESKSPSetParametersEW()
3269 @*/
3270 PetscErrorCode  SNESKSPGetParametersEW(SNES snes,PetscInt *version,PetscReal *rtol_0,PetscReal *rtol_max,
3271 							    PetscReal *gamma,PetscReal *alpha,PetscReal *alpha2,PetscReal *threshold)
3272 {
3273   SNESKSPEW *kctx;
3274   PetscFunctionBegin;
3275   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3276   kctx = (SNESKSPEW*)snes->kspconvctx;
3277   if (!kctx) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"No Eisenstat-Walker context existing");
3278   if(version)   *version   = kctx->version;
3279   if(rtol_0)    *rtol_0    = kctx->rtol_0;
3280   if(rtol_max)  *rtol_max  = kctx->rtol_max;
3281   if(gamma)     *gamma     = kctx->gamma;
3282   if(alpha)     *alpha     = kctx->alpha;
3283   if(alpha2)    *alpha2    = kctx->alpha2;
3284   if(threshold) *threshold = kctx->threshold;
3285   PetscFunctionReturn(0);
3286 }
3287 
3288 #undef __FUNCT__
3289 #define __FUNCT__ "SNESKSPEW_PreSolve"
3290 static PetscErrorCode SNESKSPEW_PreSolve(SNES snes, KSP ksp, Vec b, Vec x)
3291 {
3292   PetscErrorCode ierr;
3293   SNESKSPEW      *kctx = (SNESKSPEW*)snes->kspconvctx;
3294   PetscReal      rtol=PETSC_DEFAULT,stol;
3295 
3296   PetscFunctionBegin;
3297   if (!kctx) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"No Eisenstat-Walker context exists");
3298   if (!snes->iter) { /* first time in, so use the original user rtol */
3299     rtol = kctx->rtol_0;
3300   } else {
3301     if (kctx->version == 1) {
3302       rtol = (snes->norm - kctx->lresid_last)/kctx->norm_last;
3303       if (rtol < 0.0) rtol = -rtol;
3304       stol = pow(kctx->rtol_last,kctx->alpha2);
3305       if (stol > kctx->threshold) rtol = PetscMax(rtol,stol);
3306     } else if (kctx->version == 2) {
3307       rtol = kctx->gamma * pow(snes->norm/kctx->norm_last,kctx->alpha);
3308       stol = kctx->gamma * pow(kctx->rtol_last,kctx->alpha);
3309       if (stol > kctx->threshold) rtol = PetscMax(rtol,stol);
3310     } else if (kctx->version == 3) {/* contributed by Luis Chacon, June 2006. */
3311       rtol = kctx->gamma * pow(snes->norm/kctx->norm_last,kctx->alpha);
3312       /* safeguard: avoid sharp decrease of rtol */
3313       stol = kctx->gamma*pow(kctx->rtol_last,kctx->alpha);
3314       stol = PetscMax(rtol,stol);
3315       rtol = PetscMin(kctx->rtol_0,stol);
3316       /* safeguard: avoid oversolving */
3317       stol = kctx->gamma*(snes->ttol)/snes->norm;
3318       stol = PetscMax(rtol,stol);
3319       rtol = PetscMin(kctx->rtol_0,stol);
3320     } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Only versions 1, 2 or 3 are supported: %D",kctx->version);
3321   }
3322   /* safeguard: avoid rtol greater than one */
3323   rtol = PetscMin(rtol,kctx->rtol_max);
3324   ierr = KSPSetTolerances(ksp,rtol,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_DEFAULT);CHKERRQ(ierr);
3325   ierr = PetscInfo3(snes,"iter %D, Eisenstat-Walker (version %D) KSP rtol=%G\n",snes->iter,kctx->version,rtol);CHKERRQ(ierr);
3326   PetscFunctionReturn(0);
3327 }
3328 
3329 #undef __FUNCT__
3330 #define __FUNCT__ "SNESKSPEW_PostSolve"
3331 static PetscErrorCode SNESKSPEW_PostSolve(SNES snes, KSP ksp, Vec b, Vec x)
3332 {
3333   PetscErrorCode ierr;
3334   SNESKSPEW      *kctx = (SNESKSPEW*)snes->kspconvctx;
3335   PCSide         pcside;
3336   Vec            lres;
3337 
3338   PetscFunctionBegin;
3339   if (!kctx) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"No Eisenstat-Walker context exists");
3340   ierr = KSPGetTolerances(ksp,&kctx->rtol_last,0,0,0);CHKERRQ(ierr);
3341   ierr = SNESGetFunctionNorm(snes,&kctx->norm_last);CHKERRQ(ierr);
3342   if (kctx->version == 1) {
3343     ierr = KSPGetPCSide(ksp,&pcside);CHKERRQ(ierr);
3344     if (pcside == PC_RIGHT) { /* XXX Should we also test KSP_UNPRECONDITIONED_NORM ? */
3345       /* KSP residual is true linear residual */
3346       ierr = KSPGetResidualNorm(ksp,&kctx->lresid_last);CHKERRQ(ierr);
3347     } else {
3348       /* KSP residual is preconditioned residual */
3349       /* compute true linear residual norm */
3350       ierr = VecDuplicate(b,&lres);CHKERRQ(ierr);
3351       ierr = MatMult(snes->jacobian,x,lres);CHKERRQ(ierr);
3352       ierr = VecAYPX(lres,-1.0,b);CHKERRQ(ierr);
3353       ierr = VecNorm(lres,NORM_2,&kctx->lresid_last);CHKERRQ(ierr);
3354       ierr = VecDestroy(&lres);CHKERRQ(ierr);
3355     }
3356   }
3357   PetscFunctionReturn(0);
3358 }
3359 
3360 #undef __FUNCT__
3361 #define __FUNCT__ "SNES_KSPSolve"
3362 PetscErrorCode SNES_KSPSolve(SNES snes, KSP ksp, Vec b, Vec x)
3363 {
3364   PetscErrorCode ierr;
3365 
3366   PetscFunctionBegin;
3367   if (snes->ksp_ewconv) { ierr = SNESKSPEW_PreSolve(snes,ksp,b,x);CHKERRQ(ierr);  }
3368   ierr = KSPSolve(ksp,b,x);CHKERRQ(ierr);
3369   if (snes->ksp_ewconv) { ierr = SNESKSPEW_PostSolve(snes,ksp,b,x);CHKERRQ(ierr); }
3370   PetscFunctionReturn(0);
3371 }
3372 
3373 #undef __FUNCT__
3374 #define __FUNCT__ "SNESSetDM"
3375 /*@
3376    SNESSetDM - Sets the DM that may be used by some preconditioners
3377 
3378    Logically Collective on SNES
3379 
3380    Input Parameters:
3381 +  snes - the preconditioner context
3382 -  dm - the dm
3383 
3384    Level: intermediate
3385 
3386 
3387 .seealso: SNESGetDM(), KSPSetDM(), KSPGetDM()
3388 @*/
3389 PetscErrorCode  SNESSetDM(SNES snes,DM dm)
3390 {
3391   PetscErrorCode ierr;
3392   KSP            ksp;
3393 
3394   PetscFunctionBegin;
3395   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3396   if (dm) {ierr = PetscObjectReference((PetscObject)dm);CHKERRQ(ierr);}
3397   ierr = DMDestroy(&snes->dm);CHKERRQ(ierr);
3398   snes->dm = dm;
3399   ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr);
3400   ierr = KSPSetDM(ksp,dm);CHKERRQ(ierr);
3401   ierr = KSPSetDMActive(ksp,PETSC_FALSE);CHKERRQ(ierr);
3402   PetscFunctionReturn(0);
3403 }
3404 
3405 #undef __FUNCT__
3406 #define __FUNCT__ "SNESGetDM"
3407 /*@
3408    SNESGetDM - Gets the DM that may be used by some preconditioners
3409 
3410    Not Collective but DM obtained is parallel on SNES
3411 
3412    Input Parameter:
3413 . snes - the preconditioner context
3414 
3415    Output Parameter:
3416 .  dm - the dm
3417 
3418    Level: intermediate
3419 
3420 
3421 .seealso: SNESSetDM(), KSPSetDM(), KSPGetDM()
3422 @*/
3423 PetscErrorCode  SNESGetDM(SNES snes,DM *dm)
3424 {
3425   PetscFunctionBegin;
3426   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3427   *dm = snes->dm;
3428   PetscFunctionReturn(0);
3429 }
3430 
3431 #undef __FUNCT__
3432 #define __FUNCT__ "SNESSetPC"
3433 /*@
3434   SNESSetPC - Sets the preconditioner to be used.
3435 
3436   Collective on SNES
3437 
3438   Input Parameters:
3439 + snes - iterative context obtained from SNESCreate()
3440 - pc   - the preconditioner object
3441 
3442   Notes:
3443   Use SNESGetPC() to retrieve the preconditioner context (for example,
3444   to configure it using the API).
3445 
3446   Level: developer
3447 
3448 .keywords: SNES, set, precondition
3449 .seealso: SNESGetPC()
3450 @*/
3451 PetscErrorCode SNESSetPC(SNES snes, SNES pc)
3452 {
3453   PetscErrorCode ierr;
3454 
3455   PetscFunctionBegin;
3456   PetscValidHeaderSpecific(snes, SNES_CLASSID, 1);
3457   PetscValidHeaderSpecific(pc, SNES_CLASSID, 2);
3458   PetscCheckSameComm(snes, 1, pc, 2);
3459   ierr = PetscObjectReference((PetscObject) pc);CHKERRQ(ierr);
3460   ierr = SNESDestroy(&snes->pc);CHKERRQ(ierr);
3461   snes->pc = pc;
3462   ierr = PetscLogObjectParent(snes, snes->pc);CHKERRQ(ierr);
3463   PetscFunctionReturn(0);
3464 }
3465 
3466 #undef __FUNCT__
3467 #define __FUNCT__ "SNESGetPC"
3468 /*@
3469   SNESGetPC - Returns a pointer to the preconditioner context set with SNESSetPC().
3470 
3471   Not Collective
3472 
3473   Input Parameter:
3474 . snes - iterative context obtained from SNESCreate()
3475 
3476   Output Parameter:
3477 . pc - preconditioner context
3478 
3479   Level: developer
3480 
3481 .keywords: SNES, get, preconditioner
3482 .seealso: SNESSetPC()
3483 @*/
3484 PetscErrorCode SNESGetPC(SNES snes, SNES *pc)
3485 {
3486   PetscErrorCode ierr;
3487 
3488   PetscFunctionBegin;
3489   PetscValidHeaderSpecific(snes, SNES_CLASSID, 1);
3490   PetscValidPointer(pc, 2);
3491   if (!snes->pc) {
3492     ierr = SNESCreate(((PetscObject) snes)->comm, &snes->pc);CHKERRQ(ierr);
3493     ierr = PetscObjectIncrementTabLevel((PetscObject) snes->pc, (PetscObject) snes, 1);CHKERRQ(ierr);
3494     ierr = PetscLogObjectParent(snes, snes->pc);CHKERRQ(ierr);
3495   }
3496   *pc = snes->pc;
3497   PetscFunctionReturn(0);
3498 }
3499 
3500 #if defined(PETSC_HAVE_MATLAB_ENGINE)
3501 #include <mex.h>
3502 
3503 typedef struct {char *funcname; mxArray *ctx;} SNESMatlabContext;
3504 
3505 #undef __FUNCT__
3506 #define __FUNCT__ "SNESComputeFunction_Matlab"
3507 /*
3508    SNESComputeFunction_Matlab - Calls the function that has been set with
3509                          SNESSetFunctionMatlab().
3510 
3511    Collective on SNES
3512 
3513    Input Parameters:
3514 +  snes - the SNES context
3515 -  x - input vector
3516 
3517    Output Parameter:
3518 .  y - function vector, as set by SNESSetFunction()
3519 
3520    Notes:
3521    SNESComputeFunction() is typically used within nonlinear solvers
3522    implementations, so most users would not generally call this routine
3523    themselves.
3524 
3525    Level: developer
3526 
3527 .keywords: SNES, nonlinear, compute, function
3528 
3529 .seealso: SNESSetFunction(), SNESGetFunction()
3530 */
3531 PetscErrorCode  SNESComputeFunction_Matlab(SNES snes,Vec x,Vec y, void *ctx)
3532 {
3533   PetscErrorCode    ierr;
3534   SNESMatlabContext *sctx = (SNESMatlabContext *)ctx;
3535   int               nlhs = 1,nrhs = 5;
3536   mxArray	    *plhs[1],*prhs[5];
3537   long long int     lx = 0,ly = 0,ls = 0;
3538 
3539   PetscFunctionBegin;
3540   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3541   PetscValidHeaderSpecific(x,VEC_CLASSID,2);
3542   PetscValidHeaderSpecific(y,VEC_CLASSID,3);
3543   PetscCheckSameComm(snes,1,x,2);
3544   PetscCheckSameComm(snes,1,y,3);
3545 
3546   /* call Matlab function in ctx with arguments x and y */
3547 
3548   ierr = PetscMemcpy(&ls,&snes,sizeof(snes));CHKERRQ(ierr);
3549   ierr = PetscMemcpy(&lx,&x,sizeof(x));CHKERRQ(ierr);
3550   ierr = PetscMemcpy(&ly,&y,sizeof(x));CHKERRQ(ierr);
3551   prhs[0] =  mxCreateDoubleScalar((double)ls);
3552   prhs[1] =  mxCreateDoubleScalar((double)lx);
3553   prhs[2] =  mxCreateDoubleScalar((double)ly);
3554   prhs[3] =  mxCreateString(sctx->funcname);
3555   prhs[4] =  sctx->ctx;
3556   ierr    =  mexCallMATLAB(nlhs,plhs,nrhs,prhs,"PetscSNESComputeFunctionInternal");CHKERRQ(ierr);
3557   ierr    =  mxGetScalar(plhs[0]);CHKERRQ(ierr);
3558   mxDestroyArray(prhs[0]);
3559   mxDestroyArray(prhs[1]);
3560   mxDestroyArray(prhs[2]);
3561   mxDestroyArray(prhs[3]);
3562   mxDestroyArray(plhs[0]);
3563   PetscFunctionReturn(0);
3564 }
3565 
3566 
3567 #undef __FUNCT__
3568 #define __FUNCT__ "SNESSetFunctionMatlab"
3569 /*
3570    SNESSetFunctionMatlab - Sets the function evaluation routine and function
3571    vector for use by the SNES routines in solving systems of nonlinear
3572    equations from MATLAB. Here the function is a string containing the name of a MATLAB function
3573 
3574    Logically Collective on SNES
3575 
3576    Input Parameters:
3577 +  snes - the SNES context
3578 .  r - vector to store function value
3579 -  func - function evaluation routine
3580 
3581    Calling sequence of func:
3582 $    func (SNES snes,Vec x,Vec f,void *ctx);
3583 
3584 
3585    Notes:
3586    The Newton-like methods typically solve linear systems of the form
3587 $      f'(x) x = -f(x),
3588    where f'(x) denotes the Jacobian matrix and f(x) is the function.
3589 
3590    Level: beginner
3591 
3592 .keywords: SNES, nonlinear, set, function
3593 
3594 .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian(), SNESSetFunction()
3595 */
3596 PetscErrorCode  SNESSetFunctionMatlab(SNES snes,Vec r,const char *func,mxArray *ctx)
3597 {
3598   PetscErrorCode    ierr;
3599   SNESMatlabContext *sctx;
3600 
3601   PetscFunctionBegin;
3602   /* currently sctx is memory bleed */
3603   ierr = PetscMalloc(sizeof(SNESMatlabContext),&sctx);CHKERRQ(ierr);
3604   ierr = PetscStrallocpy(func,&sctx->funcname);CHKERRQ(ierr);
3605   /*
3606      This should work, but it doesn't
3607   sctx->ctx = ctx;
3608   mexMakeArrayPersistent(sctx->ctx);
3609   */
3610   sctx->ctx = mxDuplicateArray(ctx);
3611   ierr = SNESSetFunction(snes,r,SNESComputeFunction_Matlab,sctx);CHKERRQ(ierr);
3612   PetscFunctionReturn(0);
3613 }
3614 
3615 #undef __FUNCT__
3616 #define __FUNCT__ "SNESComputeJacobian_Matlab"
3617 /*
3618    SNESComputeJacobian_Matlab - Calls the function that has been set with
3619                          SNESSetJacobianMatlab().
3620 
3621    Collective on SNES
3622 
3623    Input Parameters:
3624 +  snes - the SNES context
3625 .  x - input vector
3626 .  A, B - the matrices
3627 -  ctx - user context
3628 
3629    Output Parameter:
3630 .  flag - structure of the matrix
3631 
3632    Level: developer
3633 
3634 .keywords: SNES, nonlinear, compute, function
3635 
3636 .seealso: SNESSetFunction(), SNESGetFunction()
3637 @*/
3638 PetscErrorCode  SNESComputeJacobian_Matlab(SNES snes,Vec x,Mat *A,Mat *B,MatStructure *flag, void *ctx)
3639 {
3640   PetscErrorCode    ierr;
3641   SNESMatlabContext *sctx = (SNESMatlabContext *)ctx;
3642   int               nlhs = 2,nrhs = 6;
3643   mxArray	    *plhs[2],*prhs[6];
3644   long long int     lx = 0,lA = 0,ls = 0, lB = 0;
3645 
3646   PetscFunctionBegin;
3647   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3648   PetscValidHeaderSpecific(x,VEC_CLASSID,2);
3649 
3650   /* call Matlab function in ctx with arguments x and y */
3651 
3652   ierr = PetscMemcpy(&ls,&snes,sizeof(snes));CHKERRQ(ierr);
3653   ierr = PetscMemcpy(&lx,&x,sizeof(x));CHKERRQ(ierr);
3654   ierr = PetscMemcpy(&lA,A,sizeof(x));CHKERRQ(ierr);
3655   ierr = PetscMemcpy(&lB,B,sizeof(x));CHKERRQ(ierr);
3656   prhs[0] =  mxCreateDoubleScalar((double)ls);
3657   prhs[1] =  mxCreateDoubleScalar((double)lx);
3658   prhs[2] =  mxCreateDoubleScalar((double)lA);
3659   prhs[3] =  mxCreateDoubleScalar((double)lB);
3660   prhs[4] =  mxCreateString(sctx->funcname);
3661   prhs[5] =  sctx->ctx;
3662   ierr    =  mexCallMATLAB(nlhs,plhs,nrhs,prhs,"PetscSNESComputeJacobianInternal");CHKERRQ(ierr);
3663   ierr    =  mxGetScalar(plhs[0]);CHKERRQ(ierr);
3664   *flag   =  (MatStructure) mxGetScalar(plhs[1]);CHKERRQ(ierr);
3665   mxDestroyArray(prhs[0]);
3666   mxDestroyArray(prhs[1]);
3667   mxDestroyArray(prhs[2]);
3668   mxDestroyArray(prhs[3]);
3669   mxDestroyArray(prhs[4]);
3670   mxDestroyArray(plhs[0]);
3671   mxDestroyArray(plhs[1]);
3672   PetscFunctionReturn(0);
3673 }
3674 
3675 
3676 #undef __FUNCT__
3677 #define __FUNCT__ "SNESSetJacobianMatlab"
3678 /*
3679    SNESSetJacobianMatlab - Sets the Jacobian function evaluation routine and two empty Jacobian matrices
3680    vector for use by the SNES routines in solving systems of nonlinear
3681    equations from MATLAB. Here the function is a string containing the name of a MATLAB function
3682 
3683    Logically Collective on SNES
3684 
3685    Input Parameters:
3686 +  snes - the SNES context
3687 .  A,B - Jacobian matrices
3688 .  func - function evaluation routine
3689 -  ctx - user context
3690 
3691    Calling sequence of func:
3692 $    flag = func (SNES snes,Vec x,Mat A,Mat B,void *ctx);
3693 
3694 
3695    Level: developer
3696 
3697 .keywords: SNES, nonlinear, set, function
3698 
3699 .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian(), SNESSetFunction()
3700 */
3701 PetscErrorCode  SNESSetJacobianMatlab(SNES snes,Mat A,Mat B,const char *func,mxArray *ctx)
3702 {
3703   PetscErrorCode    ierr;
3704   SNESMatlabContext *sctx;
3705 
3706   PetscFunctionBegin;
3707   /* currently sctx is memory bleed */
3708   ierr = PetscMalloc(sizeof(SNESMatlabContext),&sctx);CHKERRQ(ierr);
3709   ierr = PetscStrallocpy(func,&sctx->funcname);CHKERRQ(ierr);
3710   /*
3711      This should work, but it doesn't
3712   sctx->ctx = ctx;
3713   mexMakeArrayPersistent(sctx->ctx);
3714   */
3715   sctx->ctx = mxDuplicateArray(ctx);
3716   ierr = SNESSetJacobian(snes,A,B,SNESComputeJacobian_Matlab,sctx);CHKERRQ(ierr);
3717   PetscFunctionReturn(0);
3718 }
3719 
3720 #undef __FUNCT__
3721 #define __FUNCT__ "SNESMonitor_Matlab"
3722 /*
3723    SNESMonitor_Matlab - Calls the function that has been set with SNESMonitorSetMatlab().
3724 
3725    Collective on SNES
3726 
3727 .seealso: SNESSetFunction(), SNESGetFunction()
3728 @*/
3729 PetscErrorCode  SNESMonitor_Matlab(SNES snes,PetscInt it, PetscReal fnorm, void *ctx)
3730 {
3731   PetscErrorCode  ierr;
3732   SNESMatlabContext *sctx = (SNESMatlabContext *)ctx;
3733   int             nlhs = 1,nrhs = 6;
3734   mxArray	  *plhs[1],*prhs[6];
3735   long long int   lx = 0,ls = 0;
3736   Vec             x=snes->vec_sol;
3737 
3738   PetscFunctionBegin;
3739   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
3740 
3741   ierr = PetscMemcpy(&ls,&snes,sizeof(snes));CHKERRQ(ierr);
3742   ierr = PetscMemcpy(&lx,&x,sizeof(x));CHKERRQ(ierr);
3743   prhs[0] =  mxCreateDoubleScalar((double)ls);
3744   prhs[1] =  mxCreateDoubleScalar((double)it);
3745   prhs[2] =  mxCreateDoubleScalar((double)fnorm);
3746   prhs[3] =  mxCreateDoubleScalar((double)lx);
3747   prhs[4] =  mxCreateString(sctx->funcname);
3748   prhs[5] =  sctx->ctx;
3749   ierr    =  mexCallMATLAB(nlhs,plhs,nrhs,prhs,"PetscSNESMonitorInternal");CHKERRQ(ierr);
3750   ierr    =  mxGetScalar(plhs[0]);CHKERRQ(ierr);
3751   mxDestroyArray(prhs[0]);
3752   mxDestroyArray(prhs[1]);
3753   mxDestroyArray(prhs[2]);
3754   mxDestroyArray(prhs[3]);
3755   mxDestroyArray(prhs[4]);
3756   mxDestroyArray(plhs[0]);
3757   PetscFunctionReturn(0);
3758 }
3759 
3760 
3761 #undef __FUNCT__
3762 #define __FUNCT__ "SNESMonitorSetMatlab"
3763 /*
3764    SNESMonitorSetMatlab - Sets the monitor function from MATLAB
3765 
3766    Level: developer
3767 
3768 .keywords: SNES, nonlinear, set, function
3769 
3770 .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian(), SNESSetFunction()
3771 */
3772 PetscErrorCode  SNESMonitorSetMatlab(SNES snes,const char *func,mxArray *ctx)
3773 {
3774   PetscErrorCode    ierr;
3775   SNESMatlabContext *sctx;
3776 
3777   PetscFunctionBegin;
3778   /* currently sctx is memory bleed */
3779   ierr = PetscMalloc(sizeof(SNESMatlabContext),&sctx);CHKERRQ(ierr);
3780   ierr = PetscStrallocpy(func,&sctx->funcname);CHKERRQ(ierr);
3781   /*
3782      This should work, but it doesn't
3783   sctx->ctx = ctx;
3784   mexMakeArrayPersistent(sctx->ctx);
3785   */
3786   sctx->ctx = mxDuplicateArray(ctx);
3787   ierr = SNESMonitorSet(snes,SNESMonitor_Matlab,sctx,PETSC_NULL);CHKERRQ(ierr);
3788   PetscFunctionReturn(0);
3789 }
3790 
3791 #endif
3792