xref: /petsc/src/snes/interface/snes.c (revision 8c7482ecd57f867b3b03f179d2ba453992e59563)
1 #define PETSCSNES_DLL
2 
3 #include "private/snesimpl.h"      /*I "petscsnes.h"  I*/
4 
5 PetscTruth SNESRegisterAllCalled = PETSC_FALSE;
6 PetscFList SNESList              = PETSC_NULL;
7 
8 /* Logging support */
9 PetscCookie PETSCSNES_DLLEXPORT SNES_COOKIE;
10 PetscLogEvent  SNES_Solve, SNES_LineSearch, SNES_FunctionEval, SNES_JacobianEval;
11 
12 #undef __FUNCT__
13 #define __FUNCT__ "SNESSetFunctionDomainError"
14 /*@
15    SNESSetFunctionDomainError - tells SNES that the input vector to your FormFunction is not
16      in the functions domain. For example, negative pressure.
17 
18    Collective on SNES
19 
20    Input Parameters:
21 .  SNES - the SNES context
22 
23    Level: advanced
24 
25 .keywords: SNES, view
26 
27 .seealso: SNESCreate(), SNESSetFunction()
28 @*/
29 PetscErrorCode PETSCSNES_DLLEXPORT SNESSetFunctionDomainError(SNES snes)
30 {
31   PetscFunctionBegin;
32   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
33   snes->domainerror = PETSC_TRUE;
34   PetscFunctionReturn(0);
35 }
36 
37 #undef __FUNCT__
38 #define __FUNCT__ "SNESView"
39 /*@C
40    SNESView - Prints the SNES data structure.
41 
42    Collective on SNES
43 
44    Input Parameters:
45 +  SNES - the SNES context
46 -  viewer - visualization context
47 
48    Options Database Key:
49 .  -snes_view - Calls SNESView() at end of SNESSolve()
50 
51    Notes:
52    The available visualization contexts include
53 +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
54 -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
55          output where only the first processor opens
56          the file.  All other processors send their
57          data to the first processor to print.
58 
59    The user can open an alternative visualization context with
60    PetscViewerASCIIOpen() - output to a specified file.
61 
62    Level: beginner
63 
64 .keywords: SNES, view
65 
66 .seealso: PetscViewerASCIIOpen()
67 @*/
68 PetscErrorCode PETSCSNES_DLLEXPORT SNESView(SNES snes,PetscViewer viewer)
69 {
70   SNESKSPEW           *kctx;
71   PetscErrorCode      ierr;
72   KSP                 ksp;
73   const SNESType      type;
74   PetscTruth          iascii,isstring;
75 
76   PetscFunctionBegin;
77   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
78   if (!viewer) {
79     ierr = PetscViewerASCIIGetStdout(((PetscObject)snes)->comm,&viewer);CHKERRQ(ierr);
80   }
81   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_COOKIE,2);
82   PetscCheckSameComm(snes,1,viewer,2);
83 
84   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
85   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_STRING,&isstring);CHKERRQ(ierr);
86   if (iascii) {
87     if (((PetscObject)snes)->prefix) {
88       ierr = PetscViewerASCIIPrintf(viewer,"SNES Object:(%s)\n",((PetscObject)snes)->prefix);CHKERRQ(ierr);
89     } else {
90       ierr = PetscViewerASCIIPrintf(viewer,"SNES Object:\n");CHKERRQ(ierr);
91     }
92     ierr = SNESGetType(snes,&type);CHKERRQ(ierr);
93     if (type) {
94       ierr = PetscViewerASCIIPrintf(viewer,"  type: %s\n",type);CHKERRQ(ierr);
95     } else {
96       ierr = PetscViewerASCIIPrintf(viewer,"  type: not set yet\n");CHKERRQ(ierr);
97     }
98     if (snes->ops->view) {
99       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
100       ierr = (*snes->ops->view)(snes,viewer);CHKERRQ(ierr);
101       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
102     }
103     ierr = PetscViewerASCIIPrintf(viewer,"  maximum iterations=%D, maximum function evaluations=%D\n",snes->max_its,snes->max_funcs);CHKERRQ(ierr);
104     ierr = PetscViewerASCIIPrintf(viewer,"  tolerances: relative=%G, absolute=%G, solution=%G\n",
105                  snes->rtol,snes->abstol,snes->xtol);CHKERRQ(ierr);
106     ierr = PetscViewerASCIIPrintf(viewer,"  total number of linear solver iterations=%D\n",snes->linear_its);CHKERRQ(ierr);
107     ierr = PetscViewerASCIIPrintf(viewer,"  total number of function evaluations=%D\n",snes->nfuncs);CHKERRQ(ierr);
108     if (snes->ksp_ewconv) {
109       kctx = (SNESKSPEW *)snes->kspconvctx;
110       if (kctx) {
111         ierr = PetscViewerASCIIPrintf(viewer,"  Eisenstat-Walker computation of KSP relative tolerance (version %D)\n",kctx->version);CHKERRQ(ierr);
112         ierr = PetscViewerASCIIPrintf(viewer,"    rtol_0=%G, rtol_max=%G, threshold=%G\n",kctx->rtol_0,kctx->rtol_max,kctx->threshold);CHKERRQ(ierr);
113         ierr = PetscViewerASCIIPrintf(viewer,"    gamma=%G, alpha=%G, alpha2=%G\n",kctx->gamma,kctx->alpha,kctx->alpha2);CHKERRQ(ierr);
114       }
115     }
116   } else if (isstring) {
117     ierr = SNESGetType(snes,&type);CHKERRQ(ierr);
118     ierr = PetscViewerStringSPrintf(viewer," %-3.3s",type);CHKERRQ(ierr);
119   }
120   ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr);
121   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
122   ierr = KSPView(ksp,viewer);CHKERRQ(ierr);
123   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
124   PetscFunctionReturn(0);
125 }
126 
127 /*
128   We retain a list of functions that also take SNES command
129   line options. These are called at the end SNESSetFromOptions()
130 */
131 #define MAXSETFROMOPTIONS 5
132 static PetscInt numberofsetfromoptions;
133 static PetscErrorCode (*othersetfromoptions[MAXSETFROMOPTIONS])(SNES);
134 
135 #undef __FUNCT__
136 #define __FUNCT__ "SNESAddOptionsChecker"
137 /*@C
138   SNESAddOptionsChecker - Adds an additional function to check for SNES options.
139 
140   Not Collective
141 
142   Input Parameter:
143 . snescheck - function that checks for options
144 
145   Level: developer
146 
147 .seealso: SNESSetFromOptions()
148 @*/
149 PetscErrorCode PETSCSNES_DLLEXPORT SNESAddOptionsChecker(PetscErrorCode (*snescheck)(SNES))
150 {
151   PetscFunctionBegin;
152   if (numberofsetfromoptions >= MAXSETFROMOPTIONS) {
153     SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE, "Too many options checkers, only %D allowed", MAXSETFROMOPTIONS);
154   }
155   othersetfromoptions[numberofsetfromoptions++] = snescheck;
156   PetscFunctionReturn(0);
157 }
158 
159 #undef __FUNCT__
160 #define __FUNCT__ "SNESSetFromOptions"
161 /*@
162    SNESSetFromOptions - Sets various SNES and KSP parameters from user options.
163 
164    Collective on SNES
165 
166    Input Parameter:
167 .  snes - the SNES context
168 
169    Options Database Keys:
170 +  -snes_type <type> - ls, tr, umls, umtr, test
171 .  -snes_stol - convergence tolerance in terms of the norm
172                 of the change in the solution between steps
173 .  -snes_atol <abstol> - absolute tolerance of residual norm
174 .  -snes_rtol <rtol> - relative decrease in tolerance norm from initial
175 .  -snes_max_it <max_it> - maximum number of iterations
176 .  -snes_max_funcs <max_funcs> - maximum number of function evaluations
177 .  -snes_max_fail <max_fail> - maximum number of failures
178 .  -snes_max_linear_solve_fail - number of linear solver failures before SNESSolve() stops
179 .  -snes_lag_preconditioner <lag> - how often preconditioner is rebuilt (use -1 to never rebuild)
180 .  -snes_lag_jacobian <lag> - how often Jacobian is rebuilt (use -1 to never rebuild)
181 .  -snes_trtol <trtol> - trust region tolerance
182 .  -snes_no_convergence_test - skip convergence test in nonlinear
183                                solver; hence iterations will continue until max_it
184                                or some other criterion is reached. Saves expense
185                                of convergence test
186 .  -snes_monitor <optional filename> - prints residual norm at each iteration. if no
187                                        filename given prints to stdout
188 .  -snes_monitor_solution - plots solution at each iteration
189 .  -snes_monitor_residual - plots residual (not its norm) at each iteration
190 .  -snes_monitor_solution_update - plots update to solution at each iteration
191 .  -snes_monitor_draw - plots residual norm at each iteration
192 .  -snes_fd - use finite differences to compute Jacobian; very slow, only for testing
193 .  -snes_mf_ksp_monitor - if using matrix-free multiply then print h at each KSP iteration
194 -  -snes_converged_reason - print the reason for convergence/divergence after each solve
195 
196     Options Database for Eisenstat-Walker method:
197 +  -snes_ksp_ew - use Eisenstat-Walker method for determining linear system convergence
198 .  -snes_ksp_ew_version ver - version of  Eisenstat-Walker method
199 .  -snes_ksp_ew_rtol0 <rtol0> - Sets rtol0
200 .  -snes_ksp_ew_rtolmax <rtolmax> - Sets rtolmax
201 .  -snes_ksp_ew_gamma <gamma> - Sets gamma
202 .  -snes_ksp_ew_alpha <alpha> - Sets alpha
203 .  -snes_ksp_ew_alpha2 <alpha2> - Sets alpha2
204 -  -snes_ksp_ew_threshold <threshold> - Sets threshold
205 
206    Notes:
207    To see all options, run your program with the -help option or consult
208    the users manual.
209 
210    Level: beginner
211 
212 .keywords: SNES, nonlinear, set, options, database
213 
214 .seealso: SNESSetOptionsPrefix()
215 @*/
216 PetscErrorCode PETSCSNES_DLLEXPORT SNESSetFromOptions(SNES snes)
217 {
218   PetscTruth              flg;
219   PetscInt                i,indx,lag;
220   const char              *deft = SNESLS;
221   const char              *convtests[] = {"default","skip"};
222   SNESKSPEW               *kctx = NULL;
223   char                    type[256], monfilename[PETSC_MAX_PATH_LEN];
224   PetscViewerASCIIMonitor monviewer;
225   PetscErrorCode          ierr;
226 
227   PetscFunctionBegin;
228   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
229 
230   if (!SNESRegisterAllCalled) {ierr = SNESRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
231   ierr = PetscOptionsBegin(((PetscObject)snes)->comm,((PetscObject)snes)->prefix,"Nonlinear solver (SNES) options","SNES");CHKERRQ(ierr);
232     if (((PetscObject)snes)->type_name) { deft = ((PetscObject)snes)->type_name; }
233     ierr = PetscOptionsList("-snes_type","Nonlinear solver method","SNESSetType",SNESList,deft,type,256,&flg);CHKERRQ(ierr);
234     if (flg) {
235       ierr = SNESSetType(snes,type);CHKERRQ(ierr);
236     } else if (!((PetscObject)snes)->type_name) {
237       ierr = SNESSetType(snes,deft);CHKERRQ(ierr);
238     }
239     ierr = PetscOptionsName("-snes_view","Print detailed information on solver used","SNESView",0);CHKERRQ(ierr);
240 
241     ierr = PetscOptionsReal("-snes_stol","Stop if step length less then","SNESSetTolerances",snes->xtol,&snes->xtol,0);CHKERRQ(ierr);
242     ierr = PetscOptionsReal("-snes_atol","Stop if function norm less then","SNESSetTolerances",snes->abstol,&snes->abstol,0);CHKERRQ(ierr);
243 
244     ierr = PetscOptionsReal("-snes_rtol","Stop if decrease in function norm less then","SNESSetTolerances",snes->rtol,&snes->rtol,0);CHKERRQ(ierr);
245     ierr = PetscOptionsInt("-snes_max_it","Maximum iterations","SNESSetTolerances",snes->max_its,&snes->max_its,PETSC_NULL);CHKERRQ(ierr);
246     ierr = PetscOptionsInt("-snes_max_funcs","Maximum function evaluations","SNESSetTolerances",snes->max_funcs,&snes->max_funcs,PETSC_NULL);CHKERRQ(ierr);
247     ierr = PetscOptionsInt("-snes_max_fail","Maximum failures","SNESSetTolerances",snes->maxFailures,&snes->maxFailures,PETSC_NULL);CHKERRQ(ierr);
248     ierr = PetscOptionsInt("-snes_max_linear_solve_fail","Maximum failures in linear solves allowed","SNESSetMaxLinearSolveFailures",snes->maxLinearSolveFailures,&snes->maxLinearSolveFailures,PETSC_NULL);CHKERRQ(ierr);
249 
250     ierr = PetscOptionsInt("-snes_lag_preconditioner","How often to rebuild preconditioner","SNESSetLagPreconditioner",snes->lagpreconditioner,&lag,&flg);CHKERRQ(ierr);
251     if (flg) {
252       ierr = SNESSetLagPreconditioner(snes,lag);CHKERRQ(ierr);
253     }
254     ierr = PetscOptionsInt("-snes_lag_jacobian","How often to rebuild Jacobian","SNESSetLagJacobian",snes->lagjacobian,&lag,&flg);CHKERRQ(ierr);
255     if (flg) {
256       ierr = SNESSetLagJacobian(snes,lag);CHKERRQ(ierr);
257     }
258 
259     ierr = PetscOptionsEList("-snes_convergence_test","Convergence test","SNESSetConvergenceTest",convtests,2,"default",&indx,&flg);CHKERRQ(ierr);
260     if (flg) {
261       switch (indx) {
262       case 0: ierr = SNESSetConvergenceTest(snes,SNESDefaultConverged,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); break;
263       case 1: ierr = SNESSetConvergenceTest(snes,SNESSkipConverged,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);    break;
264       }
265     }
266 
267     ierr = PetscOptionsName("-snes_converged_reason","Print reason for converged or diverged","SNESSolve",&flg);CHKERRQ(ierr);
268     if (flg) {
269       snes->printreason = PETSC_TRUE;
270     }
271 
272     kctx = (SNESKSPEW *)snes->kspconvctx;
273 
274     ierr = PetscOptionsTruth("-snes_ksp_ew","Use Eisentat-Walker linear system convergence test","SNESKSPSetUseEW",snes->ksp_ewconv,&snes->ksp_ewconv,PETSC_NULL);CHKERRQ(ierr);
275 
276     ierr = PetscOptionsInt("-snes_ksp_ew_version","Version 1, 2 or 3","SNESKSPSetParametersEW",kctx->version,&kctx->version,0);CHKERRQ(ierr);
277     ierr = PetscOptionsReal("-snes_ksp_ew_rtol0","0 <= rtol0 < 1","SNESKSPSetParametersEW",kctx->rtol_0,&kctx->rtol_0,0);CHKERRQ(ierr);
278     ierr = PetscOptionsReal("-snes_ksp_ew_rtolmax","0 <= rtolmax < 1","SNESKSPSetParametersEW",kctx->rtol_max,&kctx->rtol_max,0);CHKERRQ(ierr);
279     ierr = PetscOptionsReal("-snes_ksp_ew_gamma","0 <= gamma <= 1","SNESKSPSetParametersEW",kctx->gamma,&kctx->gamma,0);CHKERRQ(ierr);
280     ierr = PetscOptionsReal("-snes_ksp_ew_alpha","1 < alpha <= 2","SNESKSPSetParametersEW",kctx->alpha,&kctx->alpha,0);CHKERRQ(ierr);
281     ierr = PetscOptionsReal("-snes_ksp_ew_alpha2","alpha2","SNESKSPSetParametersEW",kctx->alpha2,&kctx->alpha2,0);CHKERRQ(ierr);
282     ierr = PetscOptionsReal("-snes_ksp_ew_threshold","0 < threshold < 1","SNESKSPSetParametersEW",kctx->threshold,&kctx->threshold,0);CHKERRQ(ierr);
283 
284     ierr = PetscOptionsName("-snes_monitor_cancel","Remove all monitors","SNESMonitorCancel",&flg);CHKERRQ(ierr);
285     if (flg) {ierr = SNESMonitorCancel(snes);CHKERRQ(ierr);}
286 
287     ierr = PetscOptionsString("-snes_monitor","Monitor norm of function","SNESMonitorSet","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
288     if (flg) {
289       ierr = PetscViewerASCIIMonitorCreate(((PetscObject)snes)->comm,monfilename,((PetscObject)snes)->tablevel,&monviewer);CHKERRQ(ierr);
290       ierr = SNESMonitorSet(snes,SNESMonitorDefault,monviewer,(PetscErrorCode (*)(void*))PetscViewerASCIIMonitorDestroy);CHKERRQ(ierr);
291     }
292 
293     ierr = PetscOptionsString("-snes_monitor_range","Monitor range of elements of function","SNESMonitorSet","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
294     if (flg) {
295       ierr = SNESMonitorSet(snes,SNESMonitorRange,0,0);CHKERRQ(ierr);
296     }
297 
298     ierr = PetscOptionsString("-snes_ratiomonitor","Monitor ratios of norms of function","SNESMonitorSetRatio","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
299     if (flg) {
300       ierr = PetscViewerASCIIMonitorCreate(((PetscObject)snes)->comm,monfilename,((PetscObject)snes)->tablevel,&monviewer);CHKERRQ(ierr);
301       ierr = SNESMonitorSetRatio(snes,monviewer);CHKERRQ(ierr);
302     }
303 
304     ierr = PetscOptionsString("-snes_monitor_short","Monitor norm of function (fewer digits)","SNESMonitorSet","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
305     if (flg) {
306       ierr = PetscViewerASCIIMonitorCreate(((PetscObject)snes)->comm,monfilename,((PetscObject)snes)->tablevel,&monviewer);CHKERRQ(ierr);
307       ierr = SNESMonitorSet(snes,SNESMonitorDefaultShort,monviewer,(PetscErrorCode (*)(void*))PetscViewerASCIIMonitorDestroy);CHKERRQ(ierr);
308     }
309 
310     ierr = PetscOptionsName("-snes_monitor_solution","Plot solution at each iteration","SNESMonitorSolution",&flg);CHKERRQ(ierr);
311     if (flg) {ierr = SNESMonitorSet(snes,SNESMonitorSolution,0,0);CHKERRQ(ierr);}
312     ierr = PetscOptionsName("-snes_monitor_solution_update","Plot correction at each iteration","SNESMonitorSolutionUpdate",&flg);CHKERRQ(ierr);
313     if (flg) {ierr = SNESMonitorSet(snes,SNESMonitorSolutionUpdate,0,0);CHKERRQ(ierr);}
314     ierr = PetscOptionsName("-snes_monitor_residual","Plot residual at each iteration","SNESMonitorResidual",&flg);CHKERRQ(ierr);
315     if (flg) {ierr = SNESMonitorSet(snes,SNESMonitorResidual,0,0);CHKERRQ(ierr);}
316     ierr = PetscOptionsName("-snes_monitor_draw","Plot function norm at each iteration","SNESMonitorLG",&flg);CHKERRQ(ierr);
317     if (flg) {ierr = SNESMonitorSet(snes,SNESMonitorLG,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);}
318     ierr = PetscOptionsName("-snes_monitor_range_draw","Plot function range at each iteration","SNESMonitorLG",&flg);CHKERRQ(ierr);
319     if (flg) {ierr = SNESMonitorSet(snes,SNESMonitorLGRange,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);}
320 
321     ierr = PetscOptionsName("-snes_fd","Use finite differences (slow) to compute Jacobian","SNESDefaultComputeJacobian",&flg);CHKERRQ(ierr);
322     if (flg) {
323       ierr = SNESSetJacobian(snes,snes->jacobian,snes->jacobian_pre,SNESDefaultComputeJacobian,snes->funP);CHKERRQ(ierr);
324       ierr = PetscInfo(snes,"Setting default finite difference Jacobian matrix\n");CHKERRQ(ierr);
325     }
326 
327     for(i = 0; i < numberofsetfromoptions; i++) {
328       ierr = (*othersetfromoptions[i])(snes);CHKERRQ(ierr);
329     }
330 
331     if (snes->ops->setfromoptions) {
332       ierr = (*snes->ops->setfromoptions)(snes);CHKERRQ(ierr);
333     }
334   ierr = PetscOptionsEnd();CHKERRQ(ierr);
335 
336 
337   if (!snes->ksp) {ierr = SNESGetKSP(snes,&snes->ksp);CHKERRQ(ierr);}
338   ierr = KSPSetFromOptions(snes->ksp);CHKERRQ(ierr);
339 
340   PetscFunctionReturn(0);
341 }
342 
343 
344 #undef __FUNCT__
345 #define __FUNCT__ "SNESSetApplicationContext"
346 /*@
347    SNESSetApplicationContext - Sets the optional user-defined context for
348    the nonlinear solvers.
349 
350    Collective on SNES
351 
352    Input Parameters:
353 +  snes - the SNES context
354 -  usrP - optional user context
355 
356    Level: intermediate
357 
358 .keywords: SNES, nonlinear, set, application, context
359 
360 .seealso: SNESGetApplicationContext()
361 @*/
362 PetscErrorCode PETSCSNES_DLLEXPORT SNESSetApplicationContext(SNES snes,void *usrP)
363 {
364   PetscFunctionBegin;
365   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
366   snes->user		= usrP;
367   PetscFunctionReturn(0);
368 }
369 
370 #undef __FUNCT__
371 #define __FUNCT__ "SNESGetApplicationContext"
372 /*@C
373    SNESGetApplicationContext - Gets the user-defined context for the
374    nonlinear solvers.
375 
376    Not Collective
377 
378    Input Parameter:
379 .  snes - SNES context
380 
381    Output Parameter:
382 .  usrP - user context
383 
384    Level: intermediate
385 
386 .keywords: SNES, nonlinear, get, application, context
387 
388 .seealso: SNESSetApplicationContext()
389 @*/
390 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetApplicationContext(SNES snes,void **usrP)
391 {
392   PetscFunctionBegin;
393   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
394   *usrP = snes->user;
395   PetscFunctionReturn(0);
396 }
397 
398 #undef __FUNCT__
399 #define __FUNCT__ "SNESGetIterationNumber"
400 /*@
401    SNESGetIterationNumber - Gets the number of nonlinear iterations completed
402    at this time.
403 
404    Not Collective
405 
406    Input Parameter:
407 .  snes - SNES context
408 
409    Output Parameter:
410 .  iter - iteration number
411 
412    Notes:
413    For example, during the computation of iteration 2 this would return 1.
414 
415    This is useful for using lagged Jacobians (where one does not recompute the
416    Jacobian at each SNES iteration). For example, the code
417 .vb
418       ierr = SNESGetIterationNumber(snes,&it);
419       if (!(it % 2)) {
420         [compute Jacobian here]
421       }
422 .ve
423    can be used in your ComputeJacobian() function to cause the Jacobian to be
424    recomputed every second SNES iteration.
425 
426    Level: intermediate
427 
428 .keywords: SNES, nonlinear, get, iteration, number,
429 
430 .seealso:   SNESGetFunctionNorm(), SNESGetLinearSolveIterations()
431 @*/
432 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetIterationNumber(SNES snes,PetscInt* iter)
433 {
434   PetscFunctionBegin;
435   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
436   PetscValidIntPointer(iter,2);
437   *iter = snes->iter;
438   PetscFunctionReturn(0);
439 }
440 
441 #undef __FUNCT__
442 #define __FUNCT__ "SNESGetFunctionNorm"
443 /*@
444    SNESGetFunctionNorm - Gets the norm of the current function that was set
445    with SNESSSetFunction().
446 
447    Collective on SNES
448 
449    Input Parameter:
450 .  snes - SNES context
451 
452    Output Parameter:
453 .  fnorm - 2-norm of function
454 
455    Level: intermediate
456 
457 .keywords: SNES, nonlinear, get, function, norm
458 
459 .seealso: SNESGetFunction(), SNESGetIterationNumber(), SNESGetLinearSolveIterations()
460 @*/
461 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetFunctionNorm(SNES snes,PetscReal *fnorm)
462 {
463   PetscFunctionBegin;
464   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
465   PetscValidScalarPointer(fnorm,2);
466   *fnorm = snes->norm;
467   PetscFunctionReturn(0);
468 }
469 
470 #undef __FUNCT__
471 #define __FUNCT__ "SNESGetNonlinearStepFailures"
472 /*@
473    SNESGetNonlinearStepFailures - Gets the number of unsuccessful steps
474    attempted by the nonlinear solver.
475 
476    Not Collective
477 
478    Input Parameter:
479 .  snes - SNES context
480 
481    Output Parameter:
482 .  nfails - number of unsuccessful steps attempted
483 
484    Notes:
485    This counter is reset to zero for each successive call to SNESSolve().
486 
487    Level: intermediate
488 
489 .keywords: SNES, nonlinear, get, number, unsuccessful, steps
490 
491 .seealso: SNESGetMaxLinearSolveFailures(), SNESGetLinearSolveIterations(), SNESSetMaxLinearSolveFailures(), SNESGetLinearSolveFailures(),
492           SNESSetMaxNonlinearStepFailures(), SNESGetMaxNonlinearStepFailures()
493 @*/
494 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetNonlinearStepFailures(SNES snes,PetscInt* nfails)
495 {
496   PetscFunctionBegin;
497   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
498   PetscValidIntPointer(nfails,2);
499   *nfails = snes->numFailures;
500   PetscFunctionReturn(0);
501 }
502 
503 #undef __FUNCT__
504 #define __FUNCT__ "SNESSetMaxNonlinearStepFailures"
505 /*@
506    SNESSetMaxNonlinearStepFailures - Sets the maximum number of unsuccessful steps
507    attempted by the nonlinear solver before it gives up.
508 
509    Not Collective
510 
511    Input Parameters:
512 +  snes     - SNES context
513 -  maxFails - maximum of unsuccessful steps
514 
515    Level: intermediate
516 
517 .keywords: SNES, nonlinear, set, maximum, unsuccessful, steps
518 
519 .seealso: SNESGetMaxLinearSolveFailures(), SNESGetLinearSolveIterations(), SNESSetMaxLinearSolveFailures(), SNESGetLinearSolveFailures(),
520           SNESGetMaxNonlinearStepFailures(), SNESGetNonlinearStepFailures()
521 @*/
522 PetscErrorCode PETSCSNES_DLLEXPORT SNESSetMaxNonlinearStepFailures(SNES snes, PetscInt maxFails)
523 {
524   PetscFunctionBegin;
525   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
526   snes->maxFailures = maxFails;
527   PetscFunctionReturn(0);
528 }
529 
530 #undef __FUNCT__
531 #define __FUNCT__ "SNESGetMaxNonlinearStepFailures"
532 /*@
533    SNESGetMaxNonlinearStepFailures - Gets the maximum number of unsuccessful steps
534    attempted by the nonlinear solver before it gives up.
535 
536    Not Collective
537 
538    Input Parameter:
539 .  snes     - SNES context
540 
541    Output Parameter:
542 .  maxFails - maximum of unsuccessful steps
543 
544    Level: intermediate
545 
546 .keywords: SNES, nonlinear, get, maximum, unsuccessful, steps
547 
548 .seealso: SNESGetMaxLinearSolveFailures(), SNESGetLinearSolveIterations(), SNESSetMaxLinearSolveFailures(), SNESGetLinearSolveFailures(),
549           SNESSetMaxNonlinearStepFailures(), SNESGetNonlinearStepFailures()
550 
551 @*/
552 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetMaxNonlinearStepFailures(SNES snes, PetscInt *maxFails)
553 {
554   PetscFunctionBegin;
555   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
556   PetscValidIntPointer(maxFails,2);
557   *maxFails = snes->maxFailures;
558   PetscFunctionReturn(0);
559 }
560 
561 #undef __FUNCT__
562 #define __FUNCT__ "SNESGetNumberFunctionEvals"
563 /*@
564    SNESGetNumberFunctionEvals - Gets the number of user provided function evaluations
565      done by SNES.
566 
567    Not Collective
568 
569    Input Parameter:
570 .  snes     - SNES context
571 
572    Output Parameter:
573 .  nfuncs - number of evaluations
574 
575    Level: intermediate
576 
577 .keywords: SNES, nonlinear, get, maximum, unsuccessful, steps
578 
579 .seealso: SNESGetMaxLinearSolveFailures(), SNESGetLinearSolveIterations(), SNESSetMaxLinearSolveFailures(), SNESGetLinearSolveFailures()
580 @*/
581 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetNumberFunctionEvals(SNES snes, PetscInt *nfuncs)
582 {
583   PetscFunctionBegin;
584   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
585   PetscValidIntPointer(nfuncs,2);
586   *nfuncs = snes->nfuncs;
587   PetscFunctionReturn(0);
588 }
589 
590 #undef __FUNCT__
591 #define __FUNCT__ "SNESGetLinearSolveFailures"
592 /*@
593    SNESGetLinearSolveFailures - Gets the number of failed (non-converged)
594    linear solvers.
595 
596    Not Collective
597 
598    Input Parameter:
599 .  snes - SNES context
600 
601    Output Parameter:
602 .  nfails - number of failed solves
603 
604    Notes:
605    This counter is reset to zero for each successive call to SNESSolve().
606 
607    Level: intermediate
608 
609 .keywords: SNES, nonlinear, get, number, unsuccessful, steps
610 
611 .seealso: SNESGetMaxLinearSolveFailures(), SNESGetLinearSolveIterations(), SNESSetMaxLinearSolveFailures()
612 @*/
613 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetLinearSolveFailures(SNES snes,PetscInt* nfails)
614 {
615   PetscFunctionBegin;
616   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
617   PetscValidIntPointer(nfails,2);
618   *nfails = snes->numLinearSolveFailures;
619   PetscFunctionReturn(0);
620 }
621 
622 #undef __FUNCT__
623 #define __FUNCT__ "SNESSetMaxLinearSolveFailures"
624 /*@
625    SNESSetMaxLinearSolveFailures - the number of failed linear solve attempts
626    allowed before SNES returns with a diverged reason of SNES_DIVERGED_LINEAR_SOLVE
627 
628    Collective on SNES
629 
630    Input Parameters:
631 +  snes     - SNES context
632 -  maxFails - maximum allowed linear solve failures
633 
634    Level: intermediate
635 
636    Notes: By default this is 0; that is SNES returns on the first failed linear solve
637 
638 .keywords: SNES, nonlinear, set, maximum, unsuccessful, steps
639 
640 .seealso: SNESGetLinearSolveFailures(), SNESGetMaxLinearSolveFailures(), SNESGetLinearSolveIterations()
641 @*/
642 PetscErrorCode PETSCSNES_DLLEXPORT SNESSetMaxLinearSolveFailures(SNES snes, PetscInt maxFails)
643 {
644   PetscFunctionBegin;
645   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
646   snes->maxLinearSolveFailures = maxFails;
647   PetscFunctionReturn(0);
648 }
649 
650 #undef __FUNCT__
651 #define __FUNCT__ "SNESGetMaxLinearSolveFailures"
652 /*@
653    SNESGetMaxLinearSolveFailures - gets the maximum number of linear solve failures that
654      are allowed before SNES terminates
655 
656    Not Collective
657 
658    Input Parameter:
659 .  snes     - SNES context
660 
661    Output Parameter:
662 .  maxFails - maximum of unsuccessful solves allowed
663 
664    Level: intermediate
665 
666    Notes: By default this is 1; that is SNES returns on the first failed linear solve
667 
668 .keywords: SNES, nonlinear, get, maximum, unsuccessful, steps
669 
670 .seealso: SNESGetLinearSolveFailures(), SNESGetLinearSolveIterations(), SNESSetMaxLinearSolveFailures(),
671 @*/
672 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetMaxLinearSolveFailures(SNES snes, PetscInt *maxFails)
673 {
674   PetscFunctionBegin;
675   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
676   PetscValidIntPointer(maxFails,2);
677   *maxFails = snes->maxLinearSolveFailures;
678   PetscFunctionReturn(0);
679 }
680 
681 #undef __FUNCT__
682 #define __FUNCT__ "SNESGetLinearSolveIterations"
683 /*@
684    SNESGetLinearSolveIterations - Gets the total number of linear iterations
685    used by the nonlinear solver.
686 
687    Not Collective
688 
689    Input Parameter:
690 .  snes - SNES context
691 
692    Output Parameter:
693 .  lits - number of linear iterations
694 
695    Notes:
696    This counter is reset to zero for each successive call to SNESSolve().
697 
698    Level: intermediate
699 
700 .keywords: SNES, nonlinear, get, number, linear, iterations
701 
702 .seealso:  SNESGetIterationNumber(), SNESGetFunctionNorm(), SNESGetLinearSolveFailures(), SNESGetMaxLinearSolveFailures()
703 @*/
704 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetLinearSolveIterations(SNES snes,PetscInt* lits)
705 {
706   PetscFunctionBegin;
707   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
708   PetscValidIntPointer(lits,2);
709   *lits = snes->linear_its;
710   PetscFunctionReturn(0);
711 }
712 
713 #undef __FUNCT__
714 #define __FUNCT__ "SNESGetKSP"
715 /*@
716    SNESGetKSP - Returns the KSP context for a SNES solver.
717 
718    Not Collective, but if SNES object is parallel, then KSP object is parallel
719 
720    Input Parameter:
721 .  snes - the SNES context
722 
723    Output Parameter:
724 .  ksp - the KSP context
725 
726    Notes:
727    The user can then directly manipulate the KSP context to set various
728    options, etc.  Likewise, the user can then extract and manipulate the
729    PC contexts as well.
730 
731    Level: beginner
732 
733 .keywords: SNES, nonlinear, get, KSP, context
734 
735 .seealso: KSPGetPC(), SNESCreate(), KSPCreate(), SNESSetKSP()
736 @*/
737 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetKSP(SNES snes,KSP *ksp)
738 {
739   PetscErrorCode ierr;
740 
741   PetscFunctionBegin;
742   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
743   PetscValidPointer(ksp,2);
744 
745   if (!snes->ksp) {
746     ierr = KSPCreate(((PetscObject)snes)->comm,&snes->ksp);CHKERRQ(ierr);
747     ierr = PetscObjectIncrementTabLevel((PetscObject)snes->ksp,(PetscObject)snes,1);CHKERRQ(ierr);
748     ierr = PetscLogObjectParent(snes,snes->ksp);CHKERRQ(ierr);
749   }
750   *ksp = snes->ksp;
751   PetscFunctionReturn(0);
752 }
753 
754 #undef __FUNCT__
755 #define __FUNCT__ "SNESSetKSP"
756 /*@
757    SNESSetKSP - Sets a KSP context for the SNES object to use
758 
759    Not Collective, but the SNES and KSP objects must live on the same MPI_Comm
760 
761    Input Parameters:
762 +  snes - the SNES context
763 -  ksp - the KSP context
764 
765    Notes:
766    The SNES object already has its KSP object, you can obtain with SNESGetKSP()
767    so this routine is rarely needed.
768 
769    The KSP object that is already in the SNES object has its reference count
770    decreased by one.
771 
772    Level: developer
773 
774 .keywords: SNES, nonlinear, get, KSP, context
775 
776 .seealso: KSPGetPC(), SNESCreate(), KSPCreate(), SNESSetKSP()
777 @*/
778 PetscErrorCode PETSCSNES_DLLEXPORT SNESSetKSP(SNES snes,KSP ksp)
779 {
780   PetscErrorCode ierr;
781 
782   PetscFunctionBegin;
783   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
784   PetscValidHeaderSpecific(ksp,KSP_COOKIE,2);
785   PetscCheckSameComm(snes,1,ksp,2);
786   ierr = PetscObjectReference((PetscObject)ksp);CHKERRQ(ierr);
787   if (snes->ksp) {ierr = PetscObjectDereference((PetscObject)snes->ksp);CHKERRQ(ierr);}
788   snes->ksp = ksp;
789   PetscFunctionReturn(0);
790 }
791 
792 #if 0
793 #undef __FUNCT__
794 #define __FUNCT__ "SNESPublish_Petsc"
795 static PetscErrorCode SNESPublish_Petsc(PetscObject obj)
796 {
797   PetscFunctionBegin;
798   PetscFunctionReturn(0);
799 }
800 #endif
801 
802 /* -----------------------------------------------------------*/
803 #undef __FUNCT__
804 #define __FUNCT__ "SNESCreate"
805 /*@
806    SNESCreate - Creates a nonlinear solver context.
807 
808    Collective on MPI_Comm
809 
810    Input Parameters:
811 .  comm - MPI communicator
812 
813    Output Parameter:
814 .  outsnes - the new SNES context
815 
816    Options Database Keys:
817 +   -snes_mf - Activates default matrix-free Jacobian-vector products,
818                and no preconditioning matrix
819 .   -snes_mf_operator - Activates default matrix-free Jacobian-vector
820                products, and a user-provided preconditioning matrix
821                as set by SNESSetJacobian()
822 -   -snes_fd - Uses (slow!) finite differences to compute Jacobian
823 
824    Level: beginner
825 
826 .keywords: SNES, nonlinear, create, context
827 
828 .seealso: SNESSolve(), SNESDestroy(), SNES, SNESSetLagPreconditioner()
829 
830 @*/
831 PetscErrorCode PETSCSNES_DLLEXPORT SNESCreate(MPI_Comm comm,SNES *outsnes)
832 {
833   PetscErrorCode      ierr;
834   SNES                snes;
835   SNESKSPEW           *kctx;
836 
837   PetscFunctionBegin;
838   PetscValidPointer(outsnes,2);
839   *outsnes = PETSC_NULL;
840 #ifndef PETSC_USE_DYNAMIC_LIBRARIES
841   ierr = SNESInitializePackage(PETSC_NULL);CHKERRQ(ierr);
842 #endif
843 
844   ierr = PetscHeaderCreate(snes,_p_SNES,struct _SNESOps,SNES_COOKIE,0,"SNES",comm,SNESDestroy,SNESView);CHKERRQ(ierr);
845 
846   snes->ops->converged    = SNESDefaultConverged;
847   snes->max_its           = 50;
848   snes->max_funcs	  = 10000;
849   snes->norm		  = 0.0;
850   snes->rtol		  = 1.e-8;
851   snes->ttol              = 0.0;
852   snes->abstol		  = 1.e-50;
853   snes->xtol		  = 1.e-8;
854   snes->deltatol	  = 1.e-12;
855   snes->nfuncs            = 0;
856   snes->numFailures       = 0;
857   snes->maxFailures       = 1;
858   snes->linear_its        = 0;
859   snes->lagjacobian       = 1;
860   snes->lagpreconditioner = 1;
861   snes->numbermonitors    = 0;
862   snes->data              = 0;
863   snes->setupcalled       = PETSC_FALSE;
864   snes->ksp_ewconv        = PETSC_FALSE;
865   snes->vwork             = 0;
866   snes->nwork             = 0;
867   snes->conv_hist_len     = 0;
868   snes->conv_hist_max     = 0;
869   snes->conv_hist         = PETSC_NULL;
870   snes->conv_hist_its     = PETSC_NULL;
871   snes->conv_hist_reset   = PETSC_TRUE;
872   snes->reason            = SNES_CONVERGED_ITERATING;
873 
874   snes->numLinearSolveFailures = 0;
875   snes->maxLinearSolveFailures = 1;
876 
877   /* Create context to compute Eisenstat-Walker relative tolerance for KSP */
878   ierr = PetscNewLog(snes,SNESKSPEW,&kctx);CHKERRQ(ierr);
879   snes->kspconvctx  = (void*)kctx;
880   kctx->version     = 2;
881   kctx->rtol_0      = .3; /* Eisenstat and Walker suggest rtol_0=.5, but
882                              this was too large for some test cases */
883   kctx->rtol_last   = 0;
884   kctx->rtol_max    = .9;
885   kctx->gamma       = 1.0;
886   kctx->alpha       = .5*(1.0 + sqrt(5.0));
887   kctx->alpha2      = kctx->alpha;
888   kctx->threshold   = .1;
889   kctx->lresid_last = 0;
890   kctx->norm_last   = 0;
891 
892   *outsnes = snes;
893   ierr = PetscPublishAll(snes);CHKERRQ(ierr);
894   PetscFunctionReturn(0);
895 }
896 
897 #undef __FUNCT__
898 #define __FUNCT__ "SNESSetFunction"
899 /*@C
900    SNESSetFunction - Sets the function evaluation routine and function
901    vector for use by the SNES routines in solving systems of nonlinear
902    equations.
903 
904    Collective on SNES
905 
906    Input Parameters:
907 +  snes - the SNES context
908 .  r - vector to store function value
909 .  func - function evaluation routine
910 -  ctx - [optional] user-defined context for private data for the
911          function evaluation routine (may be PETSC_NULL)
912 
913    Calling sequence of func:
914 $    func (SNES snes,Vec x,Vec f,void *ctx);
915 
916 .  f - function vector
917 -  ctx - optional user-defined function context
918 
919    Notes:
920    The Newton-like methods typically solve linear systems of the form
921 $      f'(x) x = -f(x),
922    where f'(x) denotes the Jacobian matrix and f(x) is the function.
923 
924    Level: beginner
925 
926 .keywords: SNES, nonlinear, set, function
927 
928 .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian()
929 @*/
930 PetscErrorCode PETSCSNES_DLLEXPORT SNESSetFunction(SNES snes,Vec r,PetscErrorCode (*func)(SNES,Vec,Vec,void*),void *ctx)
931 {
932   PetscErrorCode ierr;
933   PetscFunctionBegin;
934   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
935   PetscValidHeaderSpecific(r,VEC_COOKIE,2);
936   PetscCheckSameComm(snes,1,r,2);
937   ierr = PetscObjectReference((PetscObject)r);CHKERRQ(ierr);
938   if (snes->vec_func) { ierr = VecDestroy(snes->vec_func);CHKERRQ(ierr); }
939   snes->ops->computefunction = func;
940   snes->vec_func             = r;
941   snes->funP                 = ctx;
942   PetscFunctionReturn(0);
943 }
944 
945 /* --------------------------------------------------------------- */
946 #undef __FUNCT__
947 #define __FUNCT__ "SNESGetRhs"
948 /*@C
949    SNESGetRhs - Gets the vector for solving F(x) = rhs. If rhs is not set
950    it assumes a zero right hand side.
951 
952    Collective on SNES
953 
954    Input Parameter:
955 .  snes - the SNES context
956 
957    Output Parameter:
958 .  rhs - the right hand side vector or PETSC_NULL if the right hand side vector is null
959 
960    Level: intermediate
961 
962 .keywords: SNES, nonlinear, get, function, right hand side
963 
964 .seealso: SNESGetSolution(), SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian(), SNESSetFunction()
965 @*/
966 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetRhs(SNES snes,Vec *rhs)
967 {
968   PetscFunctionBegin;
969   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
970   PetscValidPointer(rhs,2);
971   *rhs = snes->vec_rhs;
972   PetscFunctionReturn(0);
973 }
974 
975 #undef __FUNCT__
976 #define __FUNCT__ "SNESComputeFunction"
977 /*@
978    SNESComputeFunction - Calls the function that has been set with
979                          SNESSetFunction().
980 
981    Collective on SNES
982 
983    Input Parameters:
984 +  snes - the SNES context
985 -  x - input vector
986 
987    Output Parameter:
988 .  y - function vector, as set by SNESSetFunction()
989 
990    Notes:
991    SNESComputeFunction() is typically used within nonlinear solvers
992    implementations, so most users would not generally call this routine
993    themselves.
994 
995    Level: developer
996 
997 .keywords: SNES, nonlinear, compute, function
998 
999 .seealso: SNESSetFunction(), SNESGetFunction()
1000 @*/
1001 PetscErrorCode PETSCSNES_DLLEXPORT SNESComputeFunction(SNES snes,Vec x,Vec y)
1002 {
1003   PetscErrorCode ierr;
1004 
1005   PetscFunctionBegin;
1006   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1007   PetscValidHeaderSpecific(x,VEC_COOKIE,2);
1008   PetscValidHeaderSpecific(y,VEC_COOKIE,3);
1009   PetscCheckSameComm(snes,1,x,2);
1010   PetscCheckSameComm(snes,1,y,3);
1011 
1012   ierr = PetscLogEventBegin(SNES_FunctionEval,snes,x,y,0);CHKERRQ(ierr);
1013   if (snes->ops->computefunction) {
1014     PetscStackPush("SNES user function");
1015     CHKMEMQ;
1016     ierr = (*snes->ops->computefunction)(snes,x,y,snes->funP);
1017     CHKMEMQ;
1018     PetscStackPop;
1019     if (PetscExceptionValue(ierr)) {
1020       PetscErrorCode pierr = PetscLogEventEnd(SNES_FunctionEval,snes,x,y,0);CHKERRQ(pierr);
1021     }
1022     CHKERRQ(ierr);
1023   } else if (snes->vec_rhs) {
1024     ierr = MatMult(snes->jacobian, x, y);CHKERRQ(ierr);
1025   } else {
1026     SETERRQ(PETSC_ERR_ARG_WRONGSTATE, "Must call SNESSetFunction() before SNESComputeFunction(), likely called from SNESSolve().");
1027   }
1028   if (snes->vec_rhs) {
1029     ierr = VecAXPY(y,-1.0,snes->vec_rhs);CHKERRQ(ierr);
1030   }
1031   snes->nfuncs++;
1032   ierr = PetscLogEventEnd(SNES_FunctionEval,snes,x,y,0);CHKERRQ(ierr);
1033   PetscFunctionReturn(0);
1034 }
1035 
1036 #undef __FUNCT__
1037 #define __FUNCT__ "SNESComputeJacobian"
1038 /*@
1039    SNESComputeJacobian - Computes the Jacobian matrix that has been
1040    set with SNESSetJacobian().
1041 
1042    Collective on SNES and Mat
1043 
1044    Input Parameters:
1045 +  snes - the SNES context
1046 -  x - input vector
1047 
1048    Output Parameters:
1049 +  A - Jacobian matrix
1050 .  B - optional preconditioning matrix
1051 -  flag - flag indicating matrix structure (one of, SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER)
1052 
1053   Options Database Keys:
1054 +    -snes_lag_preconditioner <lag>
1055 -    -snes_lag_jacobian <lag>
1056 
1057    Notes:
1058    Most users should not need to explicitly call this routine, as it
1059    is used internally within the nonlinear solvers.
1060 
1061    See KSPSetOperators() for important information about setting the
1062    flag parameter.
1063 
1064    Level: developer
1065 
1066 .keywords: SNES, compute, Jacobian, matrix
1067 
1068 .seealso:  SNESSetJacobian(), KSPSetOperators(), MatStructure, SNESSetLagPreconditioner(), SNESSetLagJacobian()
1069 @*/
1070 PetscErrorCode PETSCSNES_DLLEXPORT SNESComputeJacobian(SNES snes,Vec X,Mat *A,Mat *B,MatStructure *flg)
1071 {
1072   PetscErrorCode ierr;
1073   PetscTruth     flag;
1074 
1075   PetscFunctionBegin;
1076   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1077   PetscValidHeaderSpecific(X,VEC_COOKIE,2);
1078   PetscValidPointer(flg,5);
1079   PetscCheckSameComm(snes,1,X,2);
1080   if (!snes->ops->computejacobian) PetscFunctionReturn(0);
1081 
1082   /* make sure that MatAssemblyBegin/End() is called on A matrix if it is matrix free */
1083 
1084   if (snes->lagjacobian == -2) {
1085     snes->lagjacobian = -1;
1086     ierr = PetscInfo(snes,"Recomputing Jacobian/preconditioner because lag is -2 (means compute Jacobian, but then never again) \n");CHKERRQ(ierr);
1087   } else if (snes->lagjacobian == -1) {
1088     *flg = SAME_PRECONDITIONER;
1089     ierr = PetscInfo(snes,"Reusing Jacobian/preconditioner because lag is -1\n");CHKERRQ(ierr);
1090     ierr = PetscTypeCompare((PetscObject)*A,MATMFFD,&flag);CHKERRQ(ierr);
1091     if (flag) {
1092       ierr = MatAssemblyBegin(*A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1093       ierr = MatAssemblyEnd(*A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1094     }
1095     PetscFunctionReturn(0);
1096   } else if (snes->lagjacobian > 1 && snes->iter % snes->lagjacobian) {
1097     *flg = SAME_PRECONDITIONER;
1098     ierr = PetscInfo2(snes,"Reusing Jacobian/preconditioner because lag is %D and SNES iteration is %D\n",snes->lagjacobian,snes->iter);CHKERRQ(ierr);
1099     ierr = PetscTypeCompare((PetscObject)*A,MATMFFD,&flag);CHKERRQ(ierr);
1100     if (flag) {
1101       ierr = MatAssemblyBegin(*A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1102       ierr = MatAssemblyEnd(*A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1103     }
1104     PetscFunctionReturn(0);
1105   }
1106 
1107   *flg = DIFFERENT_NONZERO_PATTERN;
1108   ierr = PetscLogEventBegin(SNES_JacobianEval,snes,X,*A,*B);CHKERRQ(ierr);
1109   PetscStackPush("SNES user Jacobian function");
1110   CHKMEMQ;
1111   ierr = (*snes->ops->computejacobian)(snes,X,A,B,flg,snes->jacP);CHKERRQ(ierr);
1112   CHKMEMQ;
1113   PetscStackPop;
1114   ierr = PetscLogEventEnd(SNES_JacobianEval,snes,X,*A,*B);CHKERRQ(ierr);
1115 
1116   if (snes->lagpreconditioner == -2) {
1117     ierr = PetscInfo(snes,"Rebuilding preconditioner exactly once since lag is -2\n");CHKERRQ(ierr);
1118     snes->lagpreconditioner = -1;
1119   } else if (snes->lagpreconditioner == -1) {
1120     *flg = SAME_PRECONDITIONER;
1121     ierr = PetscInfo(snes,"Reusing preconditioner because lag is -1\n");CHKERRQ(ierr);
1122   } else if (snes->lagpreconditioner > 1 && snes->iter % snes->lagpreconditioner) {
1123     *flg = SAME_PRECONDITIONER;
1124     ierr = PetscInfo2(snes,"Reusing preconditioner because lag is %D and SNES iteration is %D\n",snes->lagpreconditioner,snes->iter);CHKERRQ(ierr);
1125   }
1126 
1127   /* make sure user returned a correct Jacobian and preconditioner */
1128   /* PetscValidHeaderSpecific(*A,MAT_COOKIE,3);
1129     PetscValidHeaderSpecific(*B,MAT_COOKIE,4);   */
1130   PetscFunctionReturn(0);
1131 }
1132 
1133 #undef __FUNCT__
1134 #define __FUNCT__ "SNESSetJacobian"
1135 /*@C
1136    SNESSetJacobian - Sets the function to compute Jacobian as well as the
1137    location to store the matrix.
1138 
1139    Collective on SNES and Mat
1140 
1141    Input Parameters:
1142 +  snes - the SNES context
1143 .  A - Jacobian matrix
1144 .  B - preconditioner matrix (usually same as the Jacobian)
1145 .  func - Jacobian evaluation routine
1146 -  ctx - [optional] user-defined context for private data for the
1147          Jacobian evaluation routine (may be PETSC_NULL)
1148 
1149    Calling sequence of func:
1150 $     func (SNES snes,Vec x,Mat *A,Mat *B,int *flag,void *ctx);
1151 
1152 +  x - input vector
1153 .  A - Jacobian matrix
1154 .  B - preconditioner matrix, usually the same as A
1155 .  flag - flag indicating information about the preconditioner matrix
1156    structure (same as flag in KSPSetOperators()), one of SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER
1157 -  ctx - [optional] user-defined Jacobian context
1158 
1159    Notes:
1160    See KSPSetOperators() for important information about setting the flag
1161    output parameter in the routine func().  Be sure to read this information!
1162 
1163    The routine func() takes Mat * as the matrix arguments rather than Mat.
1164    This allows the Jacobian evaluation routine to replace A and/or B with a
1165    completely new new matrix structure (not just different matrix elements)
1166    when appropriate, for instance, if the nonzero structure is changing
1167    throughout the global iterations.
1168 
1169    If the A matrix and B matrix are different you must call MatAssemblyBegin/End() on
1170    each matrix.
1171 
1172    Level: beginner
1173 
1174 .keywords: SNES, nonlinear, set, Jacobian, matrix
1175 
1176 .seealso: KSPSetOperators(), SNESSetFunction(), MatMFFDComputeJacobian(), SNESDefaultComputeJacobianColor(), MatStructure
1177 @*/
1178 PetscErrorCode PETSCSNES_DLLEXPORT SNESSetJacobian(SNES snes,Mat A,Mat B,PetscErrorCode (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx)
1179 {
1180   PetscErrorCode ierr;
1181 
1182   PetscFunctionBegin;
1183   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1184   if (A) PetscValidHeaderSpecific(A,MAT_COOKIE,2);
1185   if (B) PetscValidHeaderSpecific(B,MAT_COOKIE,3);
1186   if (A) PetscCheckSameComm(snes,1,A,2);
1187   if (B) PetscCheckSameComm(snes,1,B,2);
1188   if (func) snes->ops->computejacobian = func;
1189   if (ctx)  snes->jacP                 = ctx;
1190   if (A) {
1191     ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr);
1192     if (snes->jacobian) {ierr = MatDestroy(snes->jacobian);CHKERRQ(ierr);}
1193     snes->jacobian = A;
1194   }
1195   if (B) {
1196     ierr = PetscObjectReference((PetscObject)B);CHKERRQ(ierr);
1197     if (snes->jacobian_pre) {ierr = MatDestroy(snes->jacobian_pre);CHKERRQ(ierr);}
1198     snes->jacobian_pre = B;
1199   }
1200   PetscFunctionReturn(0);
1201 }
1202 
1203 #undef __FUNCT__
1204 #define __FUNCT__ "SNESGetJacobian"
1205 /*@C
1206    SNESGetJacobian - Returns the Jacobian matrix and optionally the user
1207    provided context for evaluating the Jacobian.
1208 
1209    Not Collective, but Mat object will be parallel if SNES object is
1210 
1211    Input Parameter:
1212 .  snes - the nonlinear solver context
1213 
1214    Output Parameters:
1215 +  A - location to stash Jacobian matrix (or PETSC_NULL)
1216 .  B - location to stash preconditioner matrix (or PETSC_NULL)
1217 .  func - location to put Jacobian function (or PETSC_NULL)
1218 -  ctx - location to stash Jacobian ctx (or PETSC_NULL)
1219 
1220    Level: advanced
1221 
1222 .seealso: SNESSetJacobian(), SNESComputeJacobian()
1223 @*/
1224 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetJacobian(SNES snes,Mat *A,Mat *B,PetscErrorCode (**func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx)
1225 {
1226   PetscFunctionBegin;
1227   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1228   if (A)    *A    = snes->jacobian;
1229   if (B)    *B    = snes->jacobian_pre;
1230   if (func) *func = snes->ops->computejacobian;
1231   if (ctx)  *ctx  = snes->jacP;
1232   PetscFunctionReturn(0);
1233 }
1234 
1235 /* ----- Routines to initialize and destroy a nonlinear solver ---- */
1236 EXTERN PetscErrorCode PETSCSNES_DLLEXPORT SNESDefaultMatrixFreeCreate2(SNES,Vec,Mat*);
1237 
1238 #undef __FUNCT__
1239 #define __FUNCT__ "SNESSetUp"
1240 /*@
1241    SNESSetUp - Sets up the internal data structures for the later use
1242    of a nonlinear solver.
1243 
1244    Collective on SNES
1245 
1246    Input Parameters:
1247 .  snes - the SNES context
1248 
1249    Notes:
1250    For basic use of the SNES solvers the user need not explicitly call
1251    SNESSetUp(), since these actions will automatically occur during
1252    the call to SNESSolve().  However, if one wishes to control this
1253    phase separately, SNESSetUp() should be called after SNESCreate()
1254    and optional routines of the form SNESSetXXX(), but before SNESSolve().
1255 
1256    Level: advanced
1257 
1258 .keywords: SNES, nonlinear, setup
1259 
1260 .seealso: SNESCreate(), SNESSolve(), SNESDestroy()
1261 @*/
1262 PetscErrorCode PETSCSNES_DLLEXPORT SNESSetUp(SNES snes)
1263 {
1264   PetscErrorCode ierr;
1265   PetscTruth     flg;
1266 
1267   PetscFunctionBegin;
1268   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1269   if (snes->setupcalled) PetscFunctionReturn(0);
1270 
1271   if (!((PetscObject)snes)->type_name) {
1272     ierr = SNESSetType(snes,SNESLS);CHKERRQ(ierr);
1273   }
1274 
1275   ierr = PetscOptionsHasName(((PetscObject)snes)->prefix,"-snes_mf_operator",&flg);CHKERRQ(ierr);
1276   /*
1277       This version replaces the user provided Jacobian matrix with a
1278       matrix-free version but still employs the user-provided preconditioner matrix
1279   */
1280   if (flg) {
1281     Mat J;
1282     ierr = MatCreateSNESMF(snes,&J);CHKERRQ(ierr);
1283     ierr = MatMFFDSetFromOptions(J);CHKERRQ(ierr);
1284     ierr = PetscInfo(snes,"Setting default matrix-free operator routines\n");CHKERRQ(ierr);
1285     ierr = SNESSetJacobian(snes,J,0,0,0);CHKERRQ(ierr);
1286     ierr = MatDestroy(J);CHKERRQ(ierr);
1287   }
1288 
1289 #if !defined(PETSC_USE_COMPLEX) && !defined(PETSC_USE_SINGLE) && !defined(PETSC_USE_MAT_SINGLE) && !defined(PETSC_USE_LONG_DOUBLE) && !defined(PETSC_USE_INT)
1290   ierr = PetscOptionsHasName(((PetscObject)snes)->prefix,"-snes_mf_operator2",&flg);CHKERRQ(ierr);
1291   if (flg) {
1292     Mat J;
1293     ierr = SNESDefaultMatrixFreeCreate2(snes,snes->vec_sol,&J);CHKERRQ(ierr);
1294     ierr = PetscInfo(snes,"Setting default matrix-free operator routines (version 2)\n");CHKERRQ(ierr);
1295     ierr = SNESSetJacobian(snes,J,0,0,0);CHKERRQ(ierr);
1296     ierr = MatDestroy(J);CHKERRQ(ierr);
1297   }
1298 #endif
1299 
1300   ierr = PetscOptionsHasName(((PetscObject)snes)->prefix,"-snes_mf",&flg);CHKERRQ(ierr);
1301   /*
1302       This version replaces both the user-provided Jacobian and the user-
1303       provided preconditioner matrix with the default matrix free version.
1304    */
1305   if (flg) {
1306     Mat  J;
1307     KSP ksp;
1308     PC   pc;
1309     /* create and set matrix-free operator */
1310     ierr = MatCreateSNESMF(snes,&J);CHKERRQ(ierr);
1311     ierr = MatMFFDSetFromOptions(J);CHKERRQ(ierr);
1312     ierr = PetscInfo(snes,"Setting default matrix-free operator routines\n");CHKERRQ(ierr);
1313     ierr = SNESSetJacobian(snes,J,J,MatMFFDComputeJacobian,snes->funP);CHKERRQ(ierr);
1314     ierr = MatDestroy(J);CHKERRQ(ierr);
1315     /* force no preconditioner */
1316     ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr);
1317     ierr = KSPGetPC(ksp,&pc);CHKERRQ(ierr);
1318     ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr);
1319     if (!flg) {
1320       ierr = PetscInfo(snes,"Setting default matrix-free preconditioner routines;\nThat is no preconditioner is being used\n");CHKERRQ(ierr);
1321       ierr = PCSetType(pc,PCNONE);CHKERRQ(ierr);
1322     }
1323   }
1324 
1325   if (!snes->vec_func && !snes->vec_rhs) {
1326     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetFunction() first");
1327   }
1328   if (!snes->ops->computefunction && !snes->vec_rhs) {
1329     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetFunction() first");
1330   }
1331   if (snes->vec_func == snes->vec_sol) {
1332     SETERRQ(PETSC_ERR_ARG_IDN,"Solution vector cannot be function vector");
1333   }
1334 
1335   if (!snes->ksp) {ierr = SNESGetKSP(snes, &snes->ksp);CHKERRQ(ierr);}
1336 
1337   if (snes->ops->setup) {
1338     ierr = (*snes->ops->setup)(snes);CHKERRQ(ierr);
1339   }
1340   snes->setupcalled = PETSC_TRUE;
1341   PetscFunctionReturn(0);
1342 }
1343 
1344 #undef __FUNCT__
1345 #define __FUNCT__ "SNESDestroy"
1346 /*@
1347    SNESDestroy - Destroys the nonlinear solver context that was created
1348    with SNESCreate().
1349 
1350    Collective on SNES
1351 
1352    Input Parameter:
1353 .  snes - the SNES context
1354 
1355    Level: beginner
1356 
1357 .keywords: SNES, nonlinear, destroy
1358 
1359 .seealso: SNESCreate(), SNESSolve()
1360 @*/
1361 PetscErrorCode PETSCSNES_DLLEXPORT SNESDestroy(SNES snes)
1362 {
1363   PetscErrorCode ierr;
1364 
1365   PetscFunctionBegin;
1366   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1367   if (--((PetscObject)snes)->refct > 0) PetscFunctionReturn(0);
1368 
1369   /* if memory was published with AMS then destroy it */
1370   ierr = PetscObjectDepublish(snes);CHKERRQ(ierr);
1371   if (snes->ops->destroy) {ierr = (*(snes)->ops->destroy)(snes);CHKERRQ(ierr);}
1372 
1373   if (snes->vec_rhs) {ierr = VecDestroy(snes->vec_rhs);CHKERRQ(ierr);}
1374   if (snes->vec_sol) {ierr = VecDestroy(snes->vec_sol);CHKERRQ(ierr);}
1375   if (snes->vec_func) {ierr = VecDestroy(snes->vec_func);CHKERRQ(ierr);}
1376   if (snes->jacobian) {ierr = MatDestroy(snes->jacobian);CHKERRQ(ierr);}
1377   if (snes->jacobian_pre) {ierr = MatDestroy(snes->jacobian_pre);CHKERRQ(ierr);}
1378   if (snes->ksp) {ierr = KSPDestroy(snes->ksp);CHKERRQ(ierr);}
1379   ierr = PetscFree(snes->kspconvctx);CHKERRQ(ierr);
1380   if (snes->vwork) {ierr = VecDestroyVecs(snes->vwork,snes->nvwork);CHKERRQ(ierr);}
1381   ierr = SNESMonitorCancel(snes);CHKERRQ(ierr);
1382   if (snes->ops->convergeddestroy) {ierr = (*snes->ops->convergeddestroy)(snes->cnvP);CHKERRQ(ierr);}
1383   ierr = PetscHeaderDestroy(snes);CHKERRQ(ierr);
1384   PetscFunctionReturn(0);
1385 }
1386 
1387 /* ----------- Routines to set solver parameters ---------- */
1388 
1389 #undef __FUNCT__
1390 #define __FUNCT__ "SNESSetLagPreconditioner"
1391 /*@
1392    SNESSetLagPreconditioner - Determines when the preconditioner is rebuilt in the nonlinear solve.
1393 
1394    Collective on SNES
1395 
1396    Input Parameters:
1397 +  snes - the SNES context
1398 -  lag - -1 indicates NEVER rebuild, 1 means rebuild every time the Jacobian is computed within a single nonlinear solve, 2 means every second time
1399          the Jacobian is built etc. -2 indicates rebuild preconditioner at next chance but then never rebuild after that
1400 
1401    Options Database Keys:
1402 .    -snes_lag_preconditioner <lag>
1403 
1404    Notes:
1405    The default is 1
1406    The preconditioner is ALWAYS built in the first iteration of a nonlinear solve unless lag is -1
1407    If  -1 is used before the very first nonlinear solve the preconditioner is still built because there is no previous preconditioner to use
1408 
1409    Level: intermediate
1410 
1411 .keywords: SNES, nonlinear, set, convergence, tolerances
1412 
1413 .seealso: SNESSetTrustRegionTolerance(), SNESGetLagPreconditioner(), SNESSetLagJacobian(), SNESGetLagJacobian()
1414 
1415 @*/
1416 PetscErrorCode PETSCSNES_DLLEXPORT SNESSetLagPreconditioner(SNES snes,PetscInt lag)
1417 {
1418   PetscFunctionBegin;
1419   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1420   if (lag < -2) SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Lag must be -2, -1, 1 or greater");
1421   if (!lag) SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Lag cannot be 0");
1422   snes->lagpreconditioner = lag;
1423   PetscFunctionReturn(0);
1424 }
1425 
1426 #undef __FUNCT__
1427 #define __FUNCT__ "SNESGetLagPreconditioner"
1428 /*@
1429    SNESGetLagPreconditioner - Indicates how often the preconditioner is rebuilt
1430 
1431    Collective on SNES
1432 
1433    Input Parameter:
1434 .  snes - the SNES context
1435 
1436    Output Parameter:
1437 .   lag - -1 indicates NEVER rebuild, 1 means rebuild every time the Jacobian is computed within a single nonlinear solve, 2 means every second time
1438          the Jacobian is built etc. -2 indicates rebuild preconditioner at next chance but then never rebuild after that
1439 
1440    Options Database Keys:
1441 .    -snes_lag_preconditioner <lag>
1442 
1443    Notes:
1444    The default is 1
1445    The preconditioner is ALWAYS built in the first iteration of a nonlinear solve unless lag is -1
1446 
1447    Level: intermediate
1448 
1449 .keywords: SNES, nonlinear, set, convergence, tolerances
1450 
1451 .seealso: SNESSetTrustRegionTolerance(), SNESSetLagPreconditioner()
1452 
1453 @*/
1454 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetLagPreconditioner(SNES snes,PetscInt *lag)
1455 {
1456   PetscFunctionBegin;
1457   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1458   *lag = snes->lagpreconditioner;
1459   PetscFunctionReturn(0);
1460 }
1461 
1462 #undef __FUNCT__
1463 #define __FUNCT__ "SNESSetLagJacobian"
1464 /*@
1465    SNESSetLagJacobian - Determines when the Jacobian is rebuilt in the nonlinear solve. See SNESSetLagPreconditioner() for determining how
1466      often the preconditioner is rebuilt.
1467 
1468    Collective on SNES
1469 
1470    Input Parameters:
1471 +  snes - the SNES context
1472 -  lag - -1 indicates NEVER rebuild, 1 means rebuild every time the Jacobian is computed within a single nonlinear solve, 2 means every second time
1473          the Jacobian is built etc. -2 means rebuild at next chance but then never again
1474 
1475    Options Database Keys:
1476 .    -snes_lag_jacobian <lag>
1477 
1478    Notes:
1479    The default is 1
1480    The Jacobian is ALWAYS built in the first iteration of a nonlinear solve unless lag is -1
1481    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
1482    at the next Newton step but never again (unless it is reset to another value)
1483 
1484    Level: intermediate
1485 
1486 .keywords: SNES, nonlinear, set, convergence, tolerances
1487 
1488 .seealso: SNESSetTrustRegionTolerance(), SNESGetLagPreconditioner(), SNESSetLagPreconditioner(), SNESGetLagJacobian()
1489 
1490 @*/
1491 PetscErrorCode PETSCSNES_DLLEXPORT SNESSetLagJacobian(SNES snes,PetscInt lag)
1492 {
1493   PetscFunctionBegin;
1494   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1495   if (lag < -2) SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Lag must be -2, -1, 1 or greater");
1496   if (!lag) SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Lag cannot be 0");
1497   snes->lagjacobian = lag;
1498   PetscFunctionReturn(0);
1499 }
1500 
1501 #undef __FUNCT__
1502 #define __FUNCT__ "SNESGetLagJacobian"
1503 /*@
1504    SNESGetLagJacobian - Indicates how often the Jacobian is rebuilt. See SNESGetLagPreconditioner() to determine when the preconditioner is rebuilt
1505 
1506    Collective on SNES
1507 
1508    Input Parameter:
1509 .  snes - the SNES context
1510 
1511    Output Parameter:
1512 .   lag - -1 indicates NEVER rebuild, 1 means rebuild every time the Jacobian is computed within a single nonlinear solve, 2 means every second time
1513          the Jacobian is built etc.
1514 
1515    Options Database Keys:
1516 .    -snes_lag_jacobian <lag>
1517 
1518    Notes:
1519    The default is 1
1520    The jacobian is ALWAYS built in the first iteration of a nonlinear solve unless lag is -1
1521 
1522    Level: intermediate
1523 
1524 .keywords: SNES, nonlinear, set, convergence, tolerances
1525 
1526 .seealso: SNESSetTrustRegionTolerance(), SNESSetLagJacobian(), SNESSetLagPreconditioner(), SNESGetLagPreconditioner()
1527 
1528 @*/
1529 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetLagJacobian(SNES snes,PetscInt *lag)
1530 {
1531   PetscFunctionBegin;
1532   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1533   *lag = snes->lagjacobian;
1534   PetscFunctionReturn(0);
1535 }
1536 
1537 #undef __FUNCT__
1538 #define __FUNCT__ "SNESSetTolerances"
1539 /*@
1540    SNESSetTolerances - Sets various parameters used in convergence tests.
1541 
1542    Collective on SNES
1543 
1544    Input Parameters:
1545 +  snes - the SNES context
1546 .  abstol - absolute convergence tolerance
1547 .  rtol - relative convergence tolerance
1548 .  stol -  convergence tolerance in terms of the norm
1549            of the change in the solution between steps
1550 .  maxit - maximum number of iterations
1551 -  maxf - maximum number of function evaluations
1552 
1553    Options Database Keys:
1554 +    -snes_atol <abstol> - Sets abstol
1555 .    -snes_rtol <rtol> - Sets rtol
1556 .    -snes_stol <stol> - Sets stol
1557 .    -snes_max_it <maxit> - Sets maxit
1558 -    -snes_max_funcs <maxf> - Sets maxf
1559 
1560    Notes:
1561    The default maximum number of iterations is 50.
1562    The default maximum number of function evaluations is 1000.
1563 
1564    Level: intermediate
1565 
1566 .keywords: SNES, nonlinear, set, convergence, tolerances
1567 
1568 .seealso: SNESSetTrustRegionTolerance()
1569 @*/
1570 PetscErrorCode PETSCSNES_DLLEXPORT SNESSetTolerances(SNES snes,PetscReal abstol,PetscReal rtol,PetscReal stol,PetscInt maxit,PetscInt maxf)
1571 {
1572   PetscFunctionBegin;
1573   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1574   if (abstol != PETSC_DEFAULT)  snes->abstol      = abstol;
1575   if (rtol != PETSC_DEFAULT)  snes->rtol      = rtol;
1576   if (stol != PETSC_DEFAULT)  snes->xtol      = stol;
1577   if (maxit != PETSC_DEFAULT) snes->max_its   = maxit;
1578   if (maxf != PETSC_DEFAULT)  snes->max_funcs = maxf;
1579   PetscFunctionReturn(0);
1580 }
1581 
1582 #undef __FUNCT__
1583 #define __FUNCT__ "SNESGetTolerances"
1584 /*@
1585    SNESGetTolerances - Gets various parameters used in convergence tests.
1586 
1587    Not Collective
1588 
1589    Input Parameters:
1590 +  snes - the SNES context
1591 .  atol - absolute convergence tolerance
1592 .  rtol - relative convergence tolerance
1593 .  stol -  convergence tolerance in terms of the norm
1594            of the change in the solution between steps
1595 .  maxit - maximum number of iterations
1596 -  maxf - maximum number of function evaluations
1597 
1598    Notes:
1599    The user can specify PETSC_NULL for any parameter that is not needed.
1600 
1601    Level: intermediate
1602 
1603 .keywords: SNES, nonlinear, get, convergence, tolerances
1604 
1605 .seealso: SNESSetTolerances()
1606 @*/
1607 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetTolerances(SNES snes,PetscReal *atol,PetscReal *rtol,PetscReal *stol,PetscInt *maxit,PetscInt *maxf)
1608 {
1609   PetscFunctionBegin;
1610   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1611   if (atol)  *atol  = snes->abstol;
1612   if (rtol)  *rtol  = snes->rtol;
1613   if (stol)  *stol  = snes->xtol;
1614   if (maxit) *maxit = snes->max_its;
1615   if (maxf)  *maxf  = snes->max_funcs;
1616   PetscFunctionReturn(0);
1617 }
1618 
1619 #undef __FUNCT__
1620 #define __FUNCT__ "SNESSetTrustRegionTolerance"
1621 /*@
1622    SNESSetTrustRegionTolerance - Sets the trust region parameter tolerance.
1623 
1624    Collective on SNES
1625 
1626    Input Parameters:
1627 +  snes - the SNES context
1628 -  tol - tolerance
1629 
1630    Options Database Key:
1631 .  -snes_trtol <tol> - Sets tol
1632 
1633    Level: intermediate
1634 
1635 .keywords: SNES, nonlinear, set, trust region, tolerance
1636 
1637 .seealso: SNESSetTolerances()
1638 @*/
1639 PetscErrorCode PETSCSNES_DLLEXPORT SNESSetTrustRegionTolerance(SNES snes,PetscReal tol)
1640 {
1641   PetscFunctionBegin;
1642   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1643   snes->deltatol = tol;
1644   PetscFunctionReturn(0);
1645 }
1646 
1647 /*
1648    Duplicate the lg monitors for SNES from KSP; for some reason with
1649    dynamic libraries things don't work under Sun4 if we just use
1650    macros instead of functions
1651 */
1652 #undef __FUNCT__
1653 #define __FUNCT__ "SNESMonitorLG"
1654 PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorLG(SNES snes,PetscInt it,PetscReal norm,void *ctx)
1655 {
1656   PetscErrorCode ierr;
1657 
1658   PetscFunctionBegin;
1659   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1660   ierr = KSPMonitorLG((KSP)snes,it,norm,ctx);CHKERRQ(ierr);
1661   PetscFunctionReturn(0);
1662 }
1663 
1664 #undef __FUNCT__
1665 #define __FUNCT__ "SNESMonitorLGCreate"
1666 PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorLGCreate(const char host[],const char label[],int x,int y,int m,int n,PetscDrawLG *draw)
1667 {
1668   PetscErrorCode ierr;
1669 
1670   PetscFunctionBegin;
1671   ierr = KSPMonitorLGCreate(host,label,x,y,m,n,draw);CHKERRQ(ierr);
1672   PetscFunctionReturn(0);
1673 }
1674 
1675 #undef __FUNCT__
1676 #define __FUNCT__ "SNESMonitorLGDestroy"
1677 PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorLGDestroy(PetscDrawLG draw)
1678 {
1679   PetscErrorCode ierr;
1680 
1681   PetscFunctionBegin;
1682   ierr = KSPMonitorLGDestroy(draw);CHKERRQ(ierr);
1683   PetscFunctionReturn(0);
1684 }
1685 
1686 extern PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorRange_Private(SNES,PetscInt,PetscReal*);
1687 #undef __FUNCT__
1688 #define __FUNCT__ "SNESMonitorLGRange"
1689 PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorLGRange(SNES snes,PetscInt n,PetscReal rnorm,void *monctx)
1690 {
1691   PetscDrawLG      lg;
1692   PetscErrorCode   ierr;
1693   PetscReal        x,y,per;
1694   PetscViewer      v = (PetscViewer)monctx;
1695   static PetscReal prev; /* should be in the context */
1696   PetscDraw        draw;
1697   PetscFunctionBegin;
1698   if (!monctx) {
1699     MPI_Comm    comm;
1700 
1701     ierr   = PetscObjectGetComm((PetscObject)snes,&comm);CHKERRQ(ierr);
1702     v      = PETSC_VIEWER_DRAW_(comm);
1703   }
1704   ierr   = PetscViewerDrawGetDrawLG(v,0,&lg);CHKERRQ(ierr);
1705   if (!n) {ierr = PetscDrawLGReset(lg);CHKERRQ(ierr);}
1706   ierr   = PetscDrawLGGetDraw(lg,&draw);CHKERRQ(ierr);
1707   ierr   = PetscDrawSetTitle(draw,"Residual norm");CHKERRQ(ierr);
1708   x = (PetscReal) n;
1709   if (rnorm > 0.0) y = log10(rnorm); else y = -15.0;
1710   ierr = PetscDrawLGAddPoint(lg,&x,&y);CHKERRQ(ierr);
1711   if (n < 20 || !(n % 5)) {
1712     ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr);
1713   }
1714 
1715   ierr = PetscViewerDrawGetDrawLG(v,1,&lg);CHKERRQ(ierr);
1716   if (!n) {ierr = PetscDrawLGReset(lg);CHKERRQ(ierr);}
1717   ierr = PetscDrawLGGetDraw(lg,&draw);CHKERRQ(ierr);
1718   ierr = PetscDrawSetTitle(draw,"% elemts > .2*max elemt");CHKERRQ(ierr);
1719   ierr =  SNESMonitorRange_Private(snes,n,&per);CHKERRQ(ierr);
1720   x = (PetscReal) n;
1721   y = 100.0*per;
1722   ierr = PetscDrawLGAddPoint(lg,&x,&y);CHKERRQ(ierr);
1723   if (n < 20 || !(n % 5)) {
1724     ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr);
1725   }
1726 
1727   ierr = PetscViewerDrawGetDrawLG(v,2,&lg);CHKERRQ(ierr);
1728   if (!n) {prev = rnorm;ierr = PetscDrawLGReset(lg);CHKERRQ(ierr);}
1729   ierr = PetscDrawLGGetDraw(lg,&draw);CHKERRQ(ierr);
1730   ierr = PetscDrawSetTitle(draw,"(norm -oldnorm)/oldnorm");CHKERRQ(ierr);
1731   x = (PetscReal) n;
1732   y = (prev - rnorm)/prev;
1733   ierr = PetscDrawLGAddPoint(lg,&x,&y);CHKERRQ(ierr);
1734   if (n < 20 || !(n % 5)) {
1735     ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr);
1736   }
1737 
1738   ierr = PetscViewerDrawGetDrawLG(v,3,&lg);CHKERRQ(ierr);
1739   if (!n) {ierr = PetscDrawLGReset(lg);CHKERRQ(ierr);}
1740   ierr = PetscDrawLGGetDraw(lg,&draw);CHKERRQ(ierr);
1741   ierr = PetscDrawSetTitle(draw,"(norm -oldnorm)/oldnorm*(% > .2 max)");CHKERRQ(ierr);
1742   x = (PetscReal) n;
1743   y = (prev - rnorm)/(prev*per);
1744   if (n > 2) { /*skip initial crazy value */
1745     ierr = PetscDrawLGAddPoint(lg,&x,&y);CHKERRQ(ierr);
1746   }
1747   if (n < 20 || !(n % 5)) {
1748     ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr);
1749   }
1750   prev = rnorm;
1751   PetscFunctionReturn(0);
1752 }
1753 
1754 #undef __FUNCT__
1755 #define __FUNCT__ "SNESMonitorLGRangeCreate"
1756 PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorLGRangeCreate(const char host[],const char label[],int x,int y,int m,int n,PetscDrawLG *draw)
1757 {
1758   PetscErrorCode ierr;
1759 
1760   PetscFunctionBegin;
1761   ierr = KSPMonitorLGCreate(host,label,x,y,m,n,draw);CHKERRQ(ierr);
1762   PetscFunctionReturn(0);
1763 }
1764 
1765 #undef __FUNCT__
1766 #define __FUNCT__ "SNESMonitorLGRangeDestroy"
1767 PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorLGRangeDestroy(PetscDrawLG draw)
1768 {
1769   PetscErrorCode ierr;
1770 
1771   PetscFunctionBegin;
1772   ierr = KSPMonitorLGDestroy(draw);CHKERRQ(ierr);
1773   PetscFunctionReturn(0);
1774 }
1775 
1776 /* ------------ Routines to set performance monitoring options ----------- */
1777 
1778 #undef __FUNCT__
1779 #define __FUNCT__ "SNESMonitorSet"
1780 /*@C
1781    SNESMonitorSet - Sets an ADDITIONAL function that is to be used at every
1782    iteration of the nonlinear solver to display the iteration's
1783    progress.
1784 
1785    Collective on SNES
1786 
1787    Input Parameters:
1788 +  snes - the SNES context
1789 .  func - monitoring routine
1790 .  mctx - [optional] user-defined context for private data for the
1791           monitor routine (use PETSC_NULL if no context is desired)
1792 -  monitordestroy - [optional] routine that frees monitor context
1793           (may be PETSC_NULL)
1794 
1795    Calling sequence of func:
1796 $     int func(SNES snes,PetscInt its, PetscReal norm,void *mctx)
1797 
1798 +    snes - the SNES context
1799 .    its - iteration number
1800 .    norm - 2-norm function value (may be estimated)
1801 -    mctx - [optional] monitoring context
1802 
1803    Options Database Keys:
1804 +    -snes_monitor        - sets SNESMonitorDefault()
1805 .    -snes_monitor_draw    - sets line graph monitor,
1806                             uses SNESMonitorLGCreate()
1807 _    -snes_monitor_cancel - cancels all monitors that have
1808                             been hardwired into a code by
1809                             calls to SNESMonitorSet(), but
1810                             does not cancel those set via
1811                             the options database.
1812 
1813    Notes:
1814    Several different monitoring routines may be set by calling
1815    SNESMonitorSet() multiple times; all will be called in the
1816    order in which they were set.
1817 
1818    Fortran notes: Only a single monitor function can be set for each SNES object
1819 
1820    Level: intermediate
1821 
1822 .keywords: SNES, nonlinear, set, monitor
1823 
1824 .seealso: SNESMonitorDefault(), SNESMonitorCancel()
1825 @*/
1826 PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorSet(SNES snes,PetscErrorCode (*monitor)(SNES,PetscInt,PetscReal,void*),void *mctx,PetscErrorCode (*monitordestroy)(void*))
1827 {
1828   PetscInt i;
1829 
1830   PetscFunctionBegin;
1831   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1832   if (snes->numbermonitors >= MAXSNESMONITORS) {
1833     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Too many monitors set");
1834   }
1835   for (i=0; i<snes->numbermonitors;i++) {
1836     if (monitor == snes->monitor[i] && monitordestroy == snes->monitordestroy[i] && mctx == snes->monitorcontext[i]) PetscFunctionReturn(0);
1837 
1838     /* check if both default monitors that share common ASCII viewer */
1839     if (monitor == snes->monitor[i] && monitor == SNESMonitorDefault) {
1840       if (mctx && snes->monitorcontext[i]) {
1841         PetscErrorCode          ierr;
1842         PetscViewerASCIIMonitor viewer1 = (PetscViewerASCIIMonitor) mctx;
1843         PetscViewerASCIIMonitor viewer2 = (PetscViewerASCIIMonitor) snes->monitorcontext[i];
1844         if (viewer1->viewer == viewer2->viewer) {
1845           ierr = (*monitordestroy)(mctx);CHKERRQ(ierr);
1846           PetscFunctionReturn(0);
1847         }
1848       }
1849     }
1850   }
1851   snes->monitor[snes->numbermonitors]           = monitor;
1852   snes->monitordestroy[snes->numbermonitors]    = monitordestroy;
1853   snes->monitorcontext[snes->numbermonitors++]  = (void*)mctx;
1854   PetscFunctionReturn(0);
1855 }
1856 
1857 #undef __FUNCT__
1858 #define __FUNCT__ "SNESMonitorCancel"
1859 /*@C
1860    SNESMonitorCancel - Clears all the monitor functions for a SNES object.
1861 
1862    Collective on SNES
1863 
1864    Input Parameters:
1865 .  snes - the SNES context
1866 
1867    Options Database Key:
1868 .  -snes_monitor_cancel - cancels all monitors that have been hardwired
1869     into a code by calls to SNESMonitorSet(), but does not cancel those
1870     set via the options database
1871 
1872    Notes:
1873    There is no way to clear one specific monitor from a SNES object.
1874 
1875    Level: intermediate
1876 
1877 .keywords: SNES, nonlinear, set, monitor
1878 
1879 .seealso: SNESMonitorDefault(), SNESMonitorSet()
1880 @*/
1881 PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorCancel(SNES snes)
1882 {
1883   PetscErrorCode ierr;
1884   PetscInt       i;
1885 
1886   PetscFunctionBegin;
1887   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1888   for (i=0; i<snes->numbermonitors; i++) {
1889     if (snes->monitordestroy[i]) {
1890       ierr = (*snes->monitordestroy[i])(snes->monitorcontext[i]);CHKERRQ(ierr);
1891     }
1892   }
1893   snes->numbermonitors = 0;
1894   PetscFunctionReturn(0);
1895 }
1896 
1897 #undef __FUNCT__
1898 #define __FUNCT__ "SNESSetConvergenceTest"
1899 /*@C
1900    SNESSetConvergenceTest - Sets the function that is to be used
1901    to test for convergence of the nonlinear iterative solution.
1902 
1903    Collective on SNES
1904 
1905    Input Parameters:
1906 +  snes - the SNES context
1907 .  func - routine to test for convergence
1908 .  cctx - [optional] context for private data for the convergence routine  (may be PETSC_NULL)
1909 -  destroy - [optional] destructor for the context (may be PETSC_NULL; PETSC_NULL_FUNCTION in Fortran)
1910 
1911    Calling sequence of func:
1912 $     PetscErrorCode func (SNES snes,PetscInt it,PetscReal xnorm,PetscReal gnorm,PetscReal f,SNESConvergedReason *reason,void *cctx)
1913 
1914 +    snes - the SNES context
1915 .    it - current iteration (0 is the first and is before any Newton step)
1916 .    cctx - [optional] convergence context
1917 .    reason - reason for convergence/divergence
1918 .    xnorm - 2-norm of current iterate
1919 .    gnorm - 2-norm of current step
1920 -    f - 2-norm of function
1921 
1922    Level: advanced
1923 
1924 .keywords: SNES, nonlinear, set, convergence, test
1925 
1926 .seealso: SNESDefaultConverged(), SNESSkipConverged()
1927 @*/
1928 PetscErrorCode PETSCSNES_DLLEXPORT SNESSetConvergenceTest(SNES snes,PetscErrorCode (*func)(SNES,PetscInt,PetscReal,PetscReal,PetscReal,SNESConvergedReason*,void*),void *cctx,PetscErrorCode (*destroy)(void*))
1929 {
1930   PetscErrorCode ierr;
1931 
1932   PetscFunctionBegin;
1933   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1934   if (!func) func = SNESSkipConverged;
1935   if (snes->ops->convergeddestroy) {
1936     ierr = (*snes->ops->convergeddestroy)(snes->cnvP);CHKERRQ(ierr);
1937   }
1938   snes->ops->converged        = func;
1939   snes->ops->convergeddestroy = destroy;
1940   snes->cnvP                  = cctx;
1941   PetscFunctionReturn(0);
1942 }
1943 
1944 #undef __FUNCT__
1945 #define __FUNCT__ "SNESGetConvergedReason"
1946 /*@
1947    SNESGetConvergedReason - Gets the reason the SNES iteration was stopped.
1948 
1949    Not Collective
1950 
1951    Input Parameter:
1952 .  snes - the SNES context
1953 
1954    Output Parameter:
1955 .  reason - negative value indicates diverged, positive value converged, see SNESConvergedReason or the
1956             manual pages for the individual convergence tests for complete lists
1957 
1958    Level: intermediate
1959 
1960    Notes: Can only be called after the call the SNESSolve() is complete.
1961 
1962 .keywords: SNES, nonlinear, set, convergence, test
1963 
1964 .seealso: SNESSetConvergenceTest(), SNESConvergedReason
1965 @*/
1966 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetConvergedReason(SNES snes,SNESConvergedReason *reason)
1967 {
1968   PetscFunctionBegin;
1969   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1970   PetscValidPointer(reason,2);
1971   *reason = snes->reason;
1972   PetscFunctionReturn(0);
1973 }
1974 
1975 #undef __FUNCT__
1976 #define __FUNCT__ "SNESSetConvergenceHistory"
1977 /*@
1978    SNESSetConvergenceHistory - Sets the array used to hold the convergence history.
1979 
1980    Collective on SNES
1981 
1982    Input Parameters:
1983 +  snes - iterative context obtained from SNESCreate()
1984 .  a   - array to hold history, this array will contain the function norms computed at each step
1985 .  its - integer array holds the number of linear iterations for each solve.
1986 .  na  - size of a and its
1987 -  reset - PETSC_TRUE indicates each new nonlinear solve resets the history counter to zero,
1988            else it continues storing new values for new nonlinear solves after the old ones
1989 
1990    This routine is useful, e.g., when running a code for purposes
1991    of accurate performance monitoring, when no I/O should be done
1992    during the section of code that is being timed.
1993 
1994    Level: intermediate
1995 
1996 .keywords: SNES, set, convergence, history
1997 
1998 .seealso: SNESGetConvergenceHistory()
1999 
2000 @*/
2001 PetscErrorCode PETSCSNES_DLLEXPORT SNESSetConvergenceHistory(SNES snes,PetscReal a[],PetscInt its[],PetscInt na,PetscTruth reset)
2002 {
2003   PetscFunctionBegin;
2004   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
2005   if (na)  PetscValidScalarPointer(a,2);
2006   if (its) PetscValidIntPointer(its,3);
2007   snes->conv_hist       = a;
2008   snes->conv_hist_its   = its;
2009   snes->conv_hist_max   = na;
2010   snes->conv_hist_len   = 0;
2011   snes->conv_hist_reset = reset;
2012   PetscFunctionReturn(0);
2013 }
2014 
2015 #undef __FUNCT__
2016 #define __FUNCT__ "SNESGetConvergenceHistory"
2017 /*@C
2018    SNESGetConvergenceHistory - Gets the array used to hold the convergence history.
2019 
2020    Collective on SNES
2021 
2022    Input Parameter:
2023 .  snes - iterative context obtained from SNESCreate()
2024 
2025    Output Parameters:
2026 .  a   - array to hold history
2027 .  its - integer array holds the number of linear iterations (or
2028          negative if not converged) for each solve.
2029 -  na  - size of a and its
2030 
2031    Notes:
2032     The calling sequence for this routine in Fortran is
2033 $   call SNESGetConvergenceHistory(SNES snes, integer na, integer ierr)
2034 
2035    This routine is useful, e.g., when running a code for purposes
2036    of accurate performance monitoring, when no I/O should be done
2037    during the section of code that is being timed.
2038 
2039    Level: intermediate
2040 
2041 .keywords: SNES, get, convergence, history
2042 
2043 .seealso: SNESSetConvergencHistory()
2044 
2045 @*/
2046 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetConvergenceHistory(SNES snes,PetscReal *a[],PetscInt *its[],PetscInt *na)
2047 {
2048   PetscFunctionBegin;
2049   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
2050   if (a)   *a   = snes->conv_hist;
2051   if (its) *its = snes->conv_hist_its;
2052   if (na)  *na  = snes->conv_hist_len;
2053   PetscFunctionReturn(0);
2054 }
2055 
2056 #undef __FUNCT__
2057 #define __FUNCT__ "SNESSetUpdate"
2058 /*@C
2059   SNESSetUpdate - Sets the general-purpose update function called
2060   at the beginning o every iteration of the nonlinear solve. Specifically
2061   it is called just before the Jacobian is "evaluated".
2062 
2063   Collective on SNES
2064 
2065   Input Parameters:
2066 . snes - The nonlinear solver context
2067 . func - The function
2068 
2069   Calling sequence of func:
2070 . func (SNES snes, PetscInt step);
2071 
2072 . step - The current step of the iteration
2073 
2074   Level: intermediate
2075 
2076 .keywords: SNES, update
2077 
2078 .seealso SNESDefaultUpdate(), SNESSetJacobian(), SNESSolve()
2079 @*/
2080 PetscErrorCode PETSCSNES_DLLEXPORT SNESSetUpdate(SNES snes, PetscErrorCode (*func)(SNES, PetscInt))
2081 {
2082   PetscFunctionBegin;
2083   PetscValidHeaderSpecific(snes, SNES_COOKIE,1);
2084   snes->ops->update = func;
2085   PetscFunctionReturn(0);
2086 }
2087 
2088 #undef __FUNCT__
2089 #define __FUNCT__ "SNESDefaultUpdate"
2090 /*@
2091   SNESDefaultUpdate - The default update function which does nothing.
2092 
2093   Not collective
2094 
2095   Input Parameters:
2096 . snes - The nonlinear solver context
2097 . step - The current step of the iteration
2098 
2099   Level: intermediate
2100 
2101 .keywords: SNES, update
2102 .seealso SNESSetUpdate(), SNESDefaultRhsBC(), SNESDefaultShortolutionBC()
2103 @*/
2104 PetscErrorCode PETSCSNES_DLLEXPORT SNESDefaultUpdate(SNES snes, PetscInt step)
2105 {
2106   PetscFunctionBegin;
2107   PetscFunctionReturn(0);
2108 }
2109 
2110 #undef __FUNCT__
2111 #define __FUNCT__ "SNESScaleStep_Private"
2112 /*
2113    SNESScaleStep_Private - Scales a step so that its length is less than the
2114    positive parameter delta.
2115 
2116     Input Parameters:
2117 +   snes - the SNES context
2118 .   y - approximate solution of linear system
2119 .   fnorm - 2-norm of current function
2120 -   delta - trust region size
2121 
2122     Output Parameters:
2123 +   gpnorm - predicted function norm at the new point, assuming local
2124     linearization.  The value is zero if the step lies within the trust
2125     region, and exceeds zero otherwise.
2126 -   ynorm - 2-norm of the step
2127 
2128     Note:
2129     For non-trust region methods such as SNESLS, the parameter delta
2130     is set to be the maximum allowable step size.
2131 
2132 .keywords: SNES, nonlinear, scale, step
2133 */
2134 PetscErrorCode SNESScaleStep_Private(SNES snes,Vec y,PetscReal *fnorm,PetscReal *delta,PetscReal *gpnorm,PetscReal *ynorm)
2135 {
2136   PetscReal      nrm;
2137   PetscScalar    cnorm;
2138   PetscErrorCode ierr;
2139 
2140   PetscFunctionBegin;
2141   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
2142   PetscValidHeaderSpecific(y,VEC_COOKIE,2);
2143   PetscCheckSameComm(snes,1,y,2);
2144 
2145   ierr = VecNorm(y,NORM_2,&nrm);CHKERRQ(ierr);
2146   if (nrm > *delta) {
2147      nrm = *delta/nrm;
2148      *gpnorm = (1.0 - nrm)*(*fnorm);
2149      cnorm = nrm;
2150      ierr = VecScale(y,cnorm);CHKERRQ(ierr);
2151      *ynorm = *delta;
2152   } else {
2153      *gpnorm = 0.0;
2154      *ynorm = nrm;
2155   }
2156   PetscFunctionReturn(0);
2157 }
2158 
2159 #undef __FUNCT__
2160 #define __FUNCT__ "SNESSolve"
2161 /*@C
2162    SNESSolve - Solves a nonlinear system F(x) = b.
2163    Call SNESSolve() after calling SNESCreate() and optional routines of the form SNESSetXXX().
2164 
2165    Collective on SNES
2166 
2167    Input Parameters:
2168 +  snes - the SNES context
2169 .  b - the constant part of the equation, or PETSC_NULL to use zero.
2170 -  x - the solution vector.
2171 
2172    Notes:
2173    The user should initialize the vector,x, with the initial guess
2174    for the nonlinear solve prior to calling SNESSolve.  In particular,
2175    to employ an initial guess of zero, the user should explicitly set
2176    this vector to zero by calling VecSet().
2177 
2178    Level: beginner
2179 
2180 .keywords: SNES, nonlinear, solve
2181 
2182 .seealso: SNESCreate(), SNESDestroy(), SNESSetFunction(), SNESSetJacobian()
2183 @*/
2184 PetscErrorCode PETSCSNES_DLLEXPORT SNESSolve(SNES snes,Vec b,Vec x)
2185 {
2186   PetscErrorCode ierr;
2187   PetscTruth     flg;
2188   char           filename[PETSC_MAX_PATH_LEN];
2189   PetscViewer    viewer;
2190 
2191   PetscFunctionBegin;
2192   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
2193   PetscValidHeaderSpecific(x,VEC_COOKIE,3);
2194   PetscCheckSameComm(snes,1,x,3);
2195   if (b) PetscValidHeaderSpecific(b,VEC_COOKIE,2);
2196   if (b) PetscCheckSameComm(snes,1,b,2);
2197 
2198   /* set solution vector */
2199   ierr = PetscObjectReference((PetscObject)x);CHKERRQ(ierr);
2200   if (snes->vec_sol) { ierr = VecDestroy(snes->vec_sol);CHKERRQ(ierr); }
2201   snes->vec_sol = x;
2202   /* set afine vector if provided */
2203   if (b) { ierr = PetscObjectReference((PetscObject)b);CHKERRQ(ierr); }
2204   if (snes->vec_rhs) { ierr = VecDestroy(snes->vec_rhs);CHKERRQ(ierr); }
2205   snes->vec_rhs = b;
2206 
2207   if (!snes->vec_func && snes->vec_rhs) {
2208     ierr = VecDuplicate(b, &snes->vec_func);CHKERRQ(ierr);
2209   }
2210 
2211   ierr = SNESSetUp(snes);CHKERRQ(ierr);
2212 
2213   if (snes->conv_hist_reset) snes->conv_hist_len = 0;
2214   snes->nfuncs = 0; snes->linear_its = 0; snes->numFailures = 0;
2215 
2216   ierr = PetscLogEventBegin(SNES_Solve,snes,0,0,0);CHKERRQ(ierr);
2217   ierr = (*snes->ops->solve)(snes);CHKERRQ(ierr);
2218   ierr = PetscLogEventEnd(SNES_Solve,snes,0,0,0);CHKERRQ(ierr);
2219   if (snes->domainerror){
2220     snes->reason      = SNES_DIVERGED_FUNCTION_DOMAIN;
2221     snes->domainerror = PETSC_FALSE;
2222   }
2223 
2224   if (!snes->reason) {
2225     SETERRQ(PETSC_ERR_PLIB,"Internal error, solver returned without setting converged reason");
2226   }
2227 
2228   ierr = PetscOptionsGetString(((PetscObject)snes)->prefix,"-snes_view",filename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
2229   if (flg && !PetscPreLoadingOn) {
2230     ierr = PetscViewerASCIIOpen(((PetscObject)snes)->comm,filename,&viewer);CHKERRQ(ierr);
2231     ierr = SNESView(snes,viewer);CHKERRQ(ierr);
2232     ierr = PetscViewerDestroy(viewer);CHKERRQ(ierr);
2233   }
2234 
2235   ierr = PetscOptionsHasName(((PetscObject)snes)->prefix,"-snes_test_local_min",&flg);CHKERRQ(ierr);
2236   if (flg && !PetscPreLoadingOn) { ierr = SNESTestLocalMin(snes);CHKERRQ(ierr); }
2237   if (snes->printreason) {
2238     if (snes->reason > 0) {
2239       ierr = PetscPrintf(((PetscObject)snes)->comm,"Nonlinear solve converged due to %s\n",SNESConvergedReasons[snes->reason]);CHKERRQ(ierr);
2240     } else {
2241       ierr = PetscPrintf(((PetscObject)snes)->comm,"Nonlinear solve did not converge due to %s\n",SNESConvergedReasons[snes->reason]);CHKERRQ(ierr);
2242     }
2243   }
2244 
2245   PetscFunctionReturn(0);
2246 }
2247 
2248 /* --------- Internal routines for SNES Package --------- */
2249 
2250 #undef __FUNCT__
2251 #define __FUNCT__ "SNESSetType"
2252 /*@C
2253    SNESSetType - Sets the method for the nonlinear solver.
2254 
2255    Collective on SNES
2256 
2257    Input Parameters:
2258 +  snes - the SNES context
2259 -  type - a known method
2260 
2261    Options Database Key:
2262 .  -snes_type <type> - Sets the method; use -help for a list
2263    of available methods (for instance, ls or tr)
2264 
2265    Notes:
2266    See "petsc/include/petscsnes.h" for available methods (for instance)
2267 +    SNESLS - Newton's method with line search
2268      (systems of nonlinear equations)
2269 .    SNESTR - Newton's method with trust region
2270      (systems of nonlinear equations)
2271 
2272   Normally, it is best to use the SNESSetFromOptions() command and then
2273   set the SNES solver type from the options database rather than by using
2274   this routine.  Using the options database provides the user with
2275   maximum flexibility in evaluating the many nonlinear solvers.
2276   The SNESSetType() routine is provided for those situations where it
2277   is necessary to set the nonlinear solver independently of the command
2278   line or options database.  This might be the case, for example, when
2279   the choice of solver changes during the execution of the program,
2280   and the user's application is taking responsibility for choosing the
2281   appropriate method.
2282 
2283   Level: intermediate
2284 
2285 .keywords: SNES, set, type
2286 
2287 .seealso: SNESType, SNESCreate()
2288 
2289 @*/
2290 PetscErrorCode PETSCSNES_DLLEXPORT SNESSetType(SNES snes,const SNESType type)
2291 {
2292   PetscErrorCode ierr,(*r)(SNES);
2293   PetscTruth     match;
2294 
2295   PetscFunctionBegin;
2296   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
2297   PetscValidCharPointer(type,2);
2298 
2299   ierr = PetscTypeCompare((PetscObject)snes,type,&match);CHKERRQ(ierr);
2300   if (match) PetscFunctionReturn(0);
2301 
2302   ierr =  PetscFListFind(SNESList,((PetscObject)snes)->comm,type,(void (**)(void)) &r);CHKERRQ(ierr);
2303   if (!r) SETERRQ1(PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested SNES type %s",type);
2304   /* Destroy the previous private SNES context */
2305   if (snes->ops->destroy) { ierr = (*(snes)->ops->destroy)(snes);CHKERRQ(ierr); }
2306   /* Reinitialize function pointers in SNESOps structure */
2307   snes->ops->setup          = 0;
2308   snes->ops->solve          = 0;
2309   snes->ops->view           = 0;
2310   snes->ops->setfromoptions = 0;
2311   snes->ops->destroy        = 0;
2312   /* Call the SNESCreate_XXX routine for this particular Nonlinear solver */
2313   snes->setupcalled = PETSC_FALSE;
2314   ierr = (*r)(snes);CHKERRQ(ierr);
2315   ierr = PetscObjectChangeTypeName((PetscObject)snes,type);CHKERRQ(ierr);
2316   PetscFunctionReturn(0);
2317 }
2318 
2319 
2320 /* --------------------------------------------------------------------- */
2321 #undef __FUNCT__
2322 #define __FUNCT__ "SNESRegisterDestroy"
2323 /*@
2324    SNESRegisterDestroy - Frees the list of nonlinear solvers that were
2325    registered by SNESRegisterDynamic().
2326 
2327    Not Collective
2328 
2329    Level: advanced
2330 
2331 .keywords: SNES, nonlinear, register, destroy
2332 
2333 .seealso: SNESRegisterAll(), SNESRegisterAll()
2334 @*/
2335 PetscErrorCode PETSCSNES_DLLEXPORT SNESRegisterDestroy(void)
2336 {
2337   PetscErrorCode ierr;
2338 
2339   PetscFunctionBegin;
2340   ierr = PetscFListDestroy(&SNESList);CHKERRQ(ierr);
2341   SNESRegisterAllCalled = PETSC_FALSE;
2342   PetscFunctionReturn(0);
2343 }
2344 
2345 #undef __FUNCT__
2346 #define __FUNCT__ "SNESGetType"
2347 /*@C
2348    SNESGetType - Gets the SNES method type and name (as a string).
2349 
2350    Not Collective
2351 
2352    Input Parameter:
2353 .  snes - nonlinear solver context
2354 
2355    Output Parameter:
2356 .  type - SNES method (a character string)
2357 
2358    Level: intermediate
2359 
2360 .keywords: SNES, nonlinear, get, type, name
2361 @*/
2362 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetType(SNES snes,const SNESType *type)
2363 {
2364   PetscFunctionBegin;
2365   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
2366   PetscValidPointer(type,2);
2367   *type = ((PetscObject)snes)->type_name;
2368   PetscFunctionReturn(0);
2369 }
2370 
2371 #undef __FUNCT__
2372 #define __FUNCT__ "SNESGetSolution"
2373 /*@
2374    SNESGetSolution - Returns the vector where the approximate solution is
2375    stored.
2376 
2377    Not Collective, but Vec is parallel if SNES is parallel
2378 
2379    Input Parameter:
2380 .  snes - the SNES context
2381 
2382    Output Parameter:
2383 .  x - the solution
2384 
2385    Level: intermediate
2386 
2387 .keywords: SNES, nonlinear, get, solution
2388 
2389 .seealso:  SNESGetSolutionUpdate(), SNESGetFunction()
2390 @*/
2391 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetSolution(SNES snes,Vec *x)
2392 {
2393   PetscFunctionBegin;
2394   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
2395   PetscValidPointer(x,2);
2396   *x = snes->vec_sol;
2397   PetscFunctionReturn(0);
2398 }
2399 
2400 #undef __FUNCT__
2401 #define __FUNCT__ "SNESGetSolutionUpdate"
2402 /*@
2403    SNESGetSolutionUpdate - Returns the vector where the solution update is
2404    stored.
2405 
2406    Not Collective, but Vec is parallel if SNES is parallel
2407 
2408    Input Parameter:
2409 .  snes - the SNES context
2410 
2411    Output Parameter:
2412 .  x - the solution update
2413 
2414    Level: advanced
2415 
2416 .keywords: SNES, nonlinear, get, solution, update
2417 
2418 .seealso: SNESGetSolution(), SNESGetFunction()
2419 @*/
2420 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetSolutionUpdate(SNES snes,Vec *x)
2421 {
2422   PetscFunctionBegin;
2423   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
2424   PetscValidPointer(x,2);
2425   *x = snes->vec_sol_update;
2426   PetscFunctionReturn(0);
2427 }
2428 
2429 #undef __FUNCT__
2430 #define __FUNCT__ "SNESGetFunction"
2431 /*@C
2432    SNESGetFunction - Returns the vector where the function is stored.
2433 
2434    Not Collective, but Vec is parallel if SNES is parallel
2435 
2436    Input Parameter:
2437 .  snes - the SNES context
2438 
2439    Output Parameter:
2440 +  r - the function (or PETSC_NULL)
2441 .  func - the function (or PETSC_NULL)
2442 -  ctx - the function context (or PETSC_NULL)
2443 
2444    Level: advanced
2445 
2446 .keywords: SNES, nonlinear, get, function
2447 
2448 .seealso: SNESSetFunction(), SNESGetSolution()
2449 @*/
2450 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetFunction(SNES snes,Vec *r,PetscErrorCode (**func)(SNES,Vec,Vec,void*),void **ctx)
2451 {
2452   PetscFunctionBegin;
2453   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
2454   if (r)    *r    = snes->vec_func;
2455   if (func) *func = snes->ops->computefunction;
2456   if (ctx)  *ctx  = snes->funP;
2457   PetscFunctionReturn(0);
2458 }
2459 
2460 #undef __FUNCT__
2461 #define __FUNCT__ "SNESSetOptionsPrefix"
2462 /*@C
2463    SNESSetOptionsPrefix - Sets the prefix used for searching for all
2464    SNES options in the database.
2465 
2466    Collective on SNES
2467 
2468    Input Parameter:
2469 +  snes - the SNES context
2470 -  prefix - the prefix to prepend to all option names
2471 
2472    Notes:
2473    A hyphen (-) must NOT be given at the beginning of the prefix name.
2474    The first character of all runtime options is AUTOMATICALLY the hyphen.
2475 
2476    Level: advanced
2477 
2478 .keywords: SNES, set, options, prefix, database
2479 
2480 .seealso: SNESSetFromOptions()
2481 @*/
2482 PetscErrorCode PETSCSNES_DLLEXPORT SNESSetOptionsPrefix(SNES snes,const char prefix[])
2483 {
2484   PetscErrorCode ierr;
2485 
2486   PetscFunctionBegin;
2487   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
2488   ierr = PetscObjectSetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr);
2489   if (!snes->ksp) {ierr = SNESGetKSP(snes,&snes->ksp);CHKERRQ(ierr);}
2490   ierr = KSPSetOptionsPrefix(snes->ksp,prefix);CHKERRQ(ierr);
2491   PetscFunctionReturn(0);
2492 }
2493 
2494 #undef __FUNCT__
2495 #define __FUNCT__ "SNESAppendOptionsPrefix"
2496 /*@C
2497    SNESAppendOptionsPrefix - Appends to the prefix used for searching for all
2498    SNES options in the database.
2499 
2500    Collective on SNES
2501 
2502    Input Parameters:
2503 +  snes - the SNES context
2504 -  prefix - the prefix to prepend to all option names
2505 
2506    Notes:
2507    A hyphen (-) must NOT be given at the beginning of the prefix name.
2508    The first character of all runtime options is AUTOMATICALLY the hyphen.
2509 
2510    Level: advanced
2511 
2512 .keywords: SNES, append, options, prefix, database
2513 
2514 .seealso: SNESGetOptionsPrefix()
2515 @*/
2516 PetscErrorCode PETSCSNES_DLLEXPORT SNESAppendOptionsPrefix(SNES snes,const char prefix[])
2517 {
2518   PetscErrorCode ierr;
2519 
2520   PetscFunctionBegin;
2521   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
2522   ierr = PetscObjectAppendOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr);
2523   if (!snes->ksp) {ierr = SNESGetKSP(snes,&snes->ksp);CHKERRQ(ierr);}
2524   ierr = KSPAppendOptionsPrefix(snes->ksp,prefix);CHKERRQ(ierr);
2525   PetscFunctionReturn(0);
2526 }
2527 
2528 #undef __FUNCT__
2529 #define __FUNCT__ "SNESGetOptionsPrefix"
2530 /*@C
2531    SNESGetOptionsPrefix - Sets the prefix used for searching for all
2532    SNES options in the database.
2533 
2534    Not Collective
2535 
2536    Input Parameter:
2537 .  snes - the SNES context
2538 
2539    Output Parameter:
2540 .  prefix - pointer to the prefix string used
2541 
2542    Notes: On the fortran side, the user should pass in a string 'prefix' of
2543    sufficient length to hold the prefix.
2544 
2545    Level: advanced
2546 
2547 .keywords: SNES, get, options, prefix, database
2548 
2549 .seealso: SNESAppendOptionsPrefix()
2550 @*/
2551 PetscErrorCode PETSCSNES_DLLEXPORT SNESGetOptionsPrefix(SNES snes,const char *prefix[])
2552 {
2553   PetscErrorCode ierr;
2554 
2555   PetscFunctionBegin;
2556   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
2557   ierr = PetscObjectGetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr);
2558   PetscFunctionReturn(0);
2559 }
2560 
2561 
2562 #undef __FUNCT__
2563 #define __FUNCT__ "SNESRegister"
2564 /*@C
2565   SNESRegister - See SNESRegisterDynamic()
2566 
2567   Level: advanced
2568 @*/
2569 PetscErrorCode PETSCSNES_DLLEXPORT SNESRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(SNES))
2570 {
2571   char           fullname[PETSC_MAX_PATH_LEN];
2572   PetscErrorCode ierr;
2573 
2574   PetscFunctionBegin;
2575   ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr);
2576   ierr = PetscFListAdd(&SNESList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
2577   PetscFunctionReturn(0);
2578 }
2579 
2580 #undef __FUNCT__
2581 #define __FUNCT__ "SNESTestLocalMin"
2582 PetscErrorCode PETSCSNES_DLLEXPORT SNESTestLocalMin(SNES snes)
2583 {
2584   PetscErrorCode ierr;
2585   PetscInt       N,i,j;
2586   Vec            u,uh,fh;
2587   PetscScalar    value;
2588   PetscReal      norm;
2589 
2590   PetscFunctionBegin;
2591   ierr = SNESGetSolution(snes,&u);CHKERRQ(ierr);
2592   ierr = VecDuplicate(u,&uh);CHKERRQ(ierr);
2593   ierr = VecDuplicate(u,&fh);CHKERRQ(ierr);
2594 
2595   /* currently only works for sequential */
2596   ierr = PetscPrintf(PETSC_COMM_WORLD,"Testing FormFunction() for local min\n");
2597   ierr = VecGetSize(u,&N);CHKERRQ(ierr);
2598   for (i=0; i<N; i++) {
2599     ierr = VecCopy(u,uh);CHKERRQ(ierr);
2600     ierr  = PetscPrintf(PETSC_COMM_WORLD,"i = %D\n",i);CHKERRQ(ierr);
2601     for (j=-10; j<11; j++) {
2602       value = PetscSign(j)*exp(PetscAbs(j)-10.0);
2603       ierr  = VecSetValue(uh,i,value,ADD_VALUES);CHKERRQ(ierr);
2604       ierr  = SNESComputeFunction(snes,uh,fh);CHKERRQ(ierr);
2605       ierr  = VecNorm(fh,NORM_2,&norm);CHKERRQ(ierr);
2606       ierr  = PetscPrintf(PETSC_COMM_WORLD,"       j norm %D %18.16e\n",j,norm);CHKERRQ(ierr);
2607       value = -value;
2608       ierr  = VecSetValue(uh,i,value,ADD_VALUES);CHKERRQ(ierr);
2609     }
2610   }
2611   ierr = VecDestroy(uh);CHKERRQ(ierr);
2612   ierr = VecDestroy(fh);CHKERRQ(ierr);
2613   PetscFunctionReturn(0);
2614 }
2615 
2616 #undef __FUNCT__
2617 #define __FUNCT__ "SNESKSPSetUseEW"
2618 /*@
2619    SNESKSPSetUseEW - Sets SNES use Eisenstat-Walker method for
2620    computing relative tolerance for linear solvers within an inexact
2621    Newton method.
2622 
2623    Collective on SNES
2624 
2625    Input Parameters:
2626 +  snes - SNES context
2627 -  flag - PETSC_TRUE or PETSC_FALSE
2628 
2629    Notes:
2630    Currently, the default is to use a constant relative tolerance for
2631    the inner linear solvers.  Alternatively, one can use the
2632    Eisenstat-Walker method, where the relative convergence tolerance
2633    is reset at each Newton iteration according progress of the nonlinear
2634    solver.
2635 
2636    Level: advanced
2637 
2638    Reference:
2639    S. C. Eisenstat and H. F. Walker, "Choosing the forcing terms in an
2640    inexact Newton method", SISC 17 (1), pp.16-32, 1996.
2641 
2642 .keywords: SNES, KSP, Eisenstat, Walker, convergence, test, inexact, Newton
2643 
2644 .seealso: SNESKSPGetUseEW(), SNESKSPGetParametersEW(), SNESKSPSetParametersEW()
2645 @*/
2646 PetscErrorCode PETSCSNES_DLLEXPORT SNESKSPSetUseEW(SNES snes,PetscTruth flag)
2647 {
2648   PetscFunctionBegin;
2649   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
2650   snes->ksp_ewconv = flag;
2651   PetscFunctionReturn(0);
2652 }
2653 
2654 #undef __FUNCT__
2655 #define __FUNCT__ "SNESKSPGetUseEW"
2656 /*@
2657    SNESKSPGetUseEW - Gets if SNES is using Eisenstat-Walker method
2658    for computing relative tolerance for linear solvers within an
2659    inexact Newton method.
2660 
2661    Not Collective
2662 
2663    Input Parameter:
2664 .  snes - SNES context
2665 
2666    Output Parameter:
2667 .  flag - PETSC_TRUE or PETSC_FALSE
2668 
2669    Notes:
2670    Currently, the default is to use a constant relative tolerance for
2671    the inner linear solvers.  Alternatively, one can use the
2672    Eisenstat-Walker method, where the relative convergence tolerance
2673    is reset at each Newton iteration according progress of the nonlinear
2674    solver.
2675 
2676    Level: advanced
2677 
2678    Reference:
2679    S. C. Eisenstat and H. F. Walker, "Choosing the forcing terms in an
2680    inexact Newton method", SISC 17 (1), pp.16-32, 1996.
2681 
2682 .keywords: SNES, KSP, Eisenstat, Walker, convergence, test, inexact, Newton
2683 
2684 .seealso: SNESKSPSetUseEW(), SNESKSPGetParametersEW(), SNESKSPSetParametersEW()
2685 @*/
2686 PetscErrorCode PETSCSNES_DLLEXPORT SNESKSPGetUseEW(SNES snes, PetscTruth *flag)
2687 {
2688   PetscFunctionBegin;
2689   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
2690   PetscValidPointer(flag,2);
2691   *flag = snes->ksp_ewconv;
2692   PetscFunctionReturn(0);
2693 }
2694 
2695 #undef __FUNCT__
2696 #define __FUNCT__ "SNESKSPSetParametersEW"
2697 /*@
2698    SNESKSPSetParametersEW - Sets parameters for Eisenstat-Walker
2699    convergence criteria for the linear solvers within an inexact
2700    Newton method.
2701 
2702    Collective on SNES
2703 
2704    Input Parameters:
2705 +    snes - SNES context
2706 .    version - version 1, 2 (default is 2) or 3
2707 .    rtol_0 - initial relative tolerance (0 <= rtol_0 < 1)
2708 .    rtol_max - maximum relative tolerance (0 <= rtol_max < 1)
2709 .    gamma - multiplicative factor for version 2 rtol computation
2710              (0 <= gamma2 <= 1)
2711 .    alpha - power for version 2 rtol computation (1 < alpha <= 2)
2712 .    alpha2 - power for safeguard
2713 -    threshold - threshold for imposing safeguard (0 < threshold < 1)
2714 
2715    Note:
2716    Version 3 was contributed by Luis Chacon, June 2006.
2717 
2718    Use PETSC_DEFAULT to retain the default for any of the parameters.
2719 
2720    Level: advanced
2721 
2722    Reference:
2723    S. C. Eisenstat and H. F. Walker, "Choosing the forcing terms in an
2724    inexact Newton method", Utah State University Math. Stat. Dept. Res.
2725    Report 6/94/75, June, 1994, to appear in SIAM J. Sci. Comput.
2726 
2727 .keywords: SNES, KSP, Eisenstat, Walker, set, parameters
2728 
2729 .seealso: SNESKSPSetUseEW(), SNESKSPGetUseEW(), SNESKSPGetParametersEW()
2730 @*/
2731 PetscErrorCode PETSCSNES_DLLEXPORT SNESKSPSetParametersEW(SNES snes,PetscInt version,PetscReal rtol_0,PetscReal rtol_max,
2732 							    PetscReal gamma,PetscReal alpha,PetscReal alpha2,PetscReal threshold)
2733 {
2734   SNESKSPEW *kctx;
2735   PetscFunctionBegin;
2736   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
2737   kctx = (SNESKSPEW*)snes->kspconvctx;
2738   if (!kctx) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"No Eisenstat-Walker context existing");
2739 
2740   if (version != PETSC_DEFAULT)   kctx->version   = version;
2741   if (rtol_0 != PETSC_DEFAULT)    kctx->rtol_0    = rtol_0;
2742   if (rtol_max != PETSC_DEFAULT)  kctx->rtol_max  = rtol_max;
2743   if (gamma != PETSC_DEFAULT)     kctx->gamma     = gamma;
2744   if (alpha != PETSC_DEFAULT)     kctx->alpha     = alpha;
2745   if (alpha2 != PETSC_DEFAULT)    kctx->alpha2    = alpha2;
2746   if (threshold != PETSC_DEFAULT) kctx->threshold = threshold;
2747 
2748   if (kctx->version < 1 || kctx->version > 3) {
2749     SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Only versions 1, 2 and 3 are supported: %D",kctx->version);
2750   }
2751   if (kctx->rtol_0 < 0.0 || kctx->rtol_0 >= 1.0) {
2752     SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"0.0 <= rtol_0 < 1.0: %G",kctx->rtol_0);
2753   }
2754   if (kctx->rtol_max < 0.0 || kctx->rtol_max >= 1.0) {
2755     SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"0.0 <= rtol_max (%G) < 1.0\n",kctx->rtol_max);
2756   }
2757   if (kctx->gamma < 0.0 || kctx->gamma > 1.0) {
2758     SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"0.0 <= gamma (%G) <= 1.0\n",kctx->gamma);
2759   }
2760   if (kctx->alpha <= 1.0 || kctx->alpha > 2.0) {
2761     SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"1.0 < alpha (%G) <= 2.0\n",kctx->alpha);
2762   }
2763   if (kctx->threshold <= 0.0 || kctx->threshold >= 1.0) {
2764     SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"0.0 < threshold (%G) < 1.0\n",kctx->threshold);
2765   }
2766   PetscFunctionReturn(0);
2767 }
2768 
2769 #undef __FUNCT__
2770 #define __FUNCT__ "SNESKSPGetParametersEW"
2771 /*@
2772    SNESKSPGetParametersEW - Gets parameters for Eisenstat-Walker
2773    convergence criteria for the linear solvers within an inexact
2774    Newton method.
2775 
2776    Not Collective
2777 
2778    Input Parameters:
2779      snes - SNES context
2780 
2781    Output Parameters:
2782 +    version - version 1, 2 (default is 2) or 3
2783 .    rtol_0 - initial relative tolerance (0 <= rtol_0 < 1)
2784 .    rtol_max - maximum relative tolerance (0 <= rtol_max < 1)
2785 .    gamma - multiplicative factor for version 2 rtol computation
2786              (0 <= gamma2 <= 1)
2787 .    alpha - power for version 2 rtol computation (1 < alpha <= 2)
2788 .    alpha2 - power for safeguard
2789 -    threshold - threshold for imposing safeguard (0 < threshold < 1)
2790 
2791    Level: advanced
2792 
2793 .keywords: SNES, KSP, Eisenstat, Walker, get, parameters
2794 
2795 .seealso: SNESKSPSetUseEW(), SNESKSPGetUseEW(), SNESKSPSetParametersEW()
2796 @*/
2797 PetscErrorCode PETSCSNES_DLLEXPORT SNESKSPGetParametersEW(SNES snes,PetscInt *version,PetscReal *rtol_0,PetscReal *rtol_max,
2798 							    PetscReal *gamma,PetscReal *alpha,PetscReal *alpha2,PetscReal *threshold)
2799 {
2800   SNESKSPEW *kctx;
2801   PetscFunctionBegin;
2802   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
2803   kctx = (SNESKSPEW*)snes->kspconvctx;
2804   if (!kctx) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"No Eisenstat-Walker context existing");
2805   if(version)   *version   = kctx->version;
2806   if(rtol_0)    *rtol_0    = kctx->rtol_0;
2807   if(rtol_max)  *rtol_max  = kctx->rtol_max;
2808   if(gamma)     *gamma     = kctx->gamma;
2809   if(alpha)     *alpha     = kctx->alpha;
2810   if(alpha2)    *alpha2    = kctx->alpha2;
2811   if(threshold) *threshold = kctx->threshold;
2812   PetscFunctionReturn(0);
2813 }
2814 
2815 #undef __FUNCT__
2816 #define __FUNCT__ "SNESKSPEW_PreSolve"
2817 static PetscErrorCode SNESKSPEW_PreSolve(SNES snes, KSP ksp, Vec b, Vec x)
2818 {
2819   PetscErrorCode ierr;
2820   SNESKSPEW      *kctx = (SNESKSPEW*)snes->kspconvctx;
2821   PetscReal      rtol=PETSC_DEFAULT,stol;
2822 
2823   PetscFunctionBegin;
2824   if (!kctx) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"No Eisenstat-Walker context exists");
2825   if (!snes->iter) { /* first time in, so use the original user rtol */
2826     rtol = kctx->rtol_0;
2827   } else {
2828     if (kctx->version == 1) {
2829       rtol = (snes->norm - kctx->lresid_last)/kctx->norm_last;
2830       if (rtol < 0.0) rtol = -rtol;
2831       stol = pow(kctx->rtol_last,kctx->alpha2);
2832       if (stol > kctx->threshold) rtol = PetscMax(rtol,stol);
2833     } else if (kctx->version == 2) {
2834       rtol = kctx->gamma * pow(snes->norm/kctx->norm_last,kctx->alpha);
2835       stol = kctx->gamma * pow(kctx->rtol_last,kctx->alpha);
2836       if (stol > kctx->threshold) rtol = PetscMax(rtol,stol);
2837     } else if (kctx->version == 3) {/* contributed by Luis Chacon, June 2006. */
2838       rtol = kctx->gamma * pow(snes->norm/kctx->norm_last,kctx->alpha);
2839       /* safeguard: avoid sharp decrease of rtol */
2840       stol = kctx->gamma*pow(kctx->rtol_last,kctx->alpha);
2841       stol = PetscMax(rtol,stol);
2842       rtol = PetscMin(kctx->rtol_0,stol);
2843       /* safeguard: avoid oversolving */
2844       stol = kctx->gamma*(snes->ttol)/snes->norm;
2845       stol = PetscMax(rtol,stol);
2846       rtol = PetscMin(kctx->rtol_0,stol);
2847     } else SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Only versions 1, 2 or 3 are supported: %D",kctx->version);
2848   }
2849   /* safeguard: avoid rtol greater than one */
2850   rtol = PetscMin(rtol,kctx->rtol_max);
2851   ierr = KSPSetTolerances(ksp,rtol,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_DEFAULT);CHKERRQ(ierr);
2852   ierr = PetscInfo3(snes,"iter %D, Eisenstat-Walker (version %D) KSP rtol=%G\n",snes->iter,kctx->version,rtol);CHKERRQ(ierr);
2853   PetscFunctionReturn(0);
2854 }
2855 
2856 #undef __FUNCT__
2857 #define __FUNCT__ "SNESKSPEW_PostSolve"
2858 static PetscErrorCode SNESKSPEW_PostSolve(SNES snes, KSP ksp, Vec b, Vec x)
2859 {
2860   PetscErrorCode ierr;
2861   SNESKSPEW      *kctx = (SNESKSPEW*)snes->kspconvctx;
2862   PCSide         pcside;
2863   Vec            lres;
2864 
2865   PetscFunctionBegin;
2866   if (!kctx) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"No Eisenstat-Walker context exists");
2867   ierr = KSPGetTolerances(ksp,&kctx->rtol_last,0,0,0);CHKERRQ(ierr);
2868   ierr = SNESGetFunctionNorm(snes,&kctx->norm_last);CHKERRQ(ierr);
2869   if (kctx->version == 1) {
2870     ierr = KSPGetPreconditionerSide(ksp,&pcside);CHKERRQ(ierr);
2871     if (pcside == PC_RIGHT) { /* XXX Should we also test KSP_UNPRECONDITIONED_NORM ? */
2872       /* KSP residual is true linear residual */
2873       ierr = KSPGetResidualNorm(ksp,&kctx->lresid_last);CHKERRQ(ierr);
2874     } else {
2875       /* KSP residual is preconditioned residual */
2876       /* compute true linear residual norm */
2877       ierr = VecDuplicate(b,&lres);CHKERRQ(ierr);
2878       ierr = MatMult(snes->jacobian,x,lres);CHKERRQ(ierr);
2879       ierr = VecAYPX(lres,-1.0,b);CHKERRQ(ierr);
2880       ierr = VecNorm(lres,NORM_2,&kctx->lresid_last);CHKERRQ(ierr);
2881       ierr = VecDestroy(lres);CHKERRQ(ierr);
2882     }
2883   }
2884   PetscFunctionReturn(0);
2885 }
2886 
2887 #undef __FUNCT__
2888 #define __FUNCT__ "SNES_KSPSolve"
2889 PetscErrorCode SNES_KSPSolve(SNES snes, KSP ksp, Vec b, Vec x)
2890 {
2891   PetscErrorCode ierr;
2892 
2893   PetscFunctionBegin;
2894   if (snes->ksp_ewconv) { ierr = SNESKSPEW_PreSolve(snes,ksp,b,x);CHKERRQ(ierr);  }
2895   ierr = KSPSolve(ksp,b,x);CHKERRQ(ierr);
2896   if (snes->ksp_ewconv) { ierr = SNESKSPEW_PostSolve(snes,ksp,b,x);CHKERRQ(ierr); }
2897   PetscFunctionReturn(0);
2898 }
2899