xref: /petsc/src/snes/interface/snes.c (revision 72ce74bd30d5d09d1371a3eb387704f4af395d1a)
1 
2 #include "src/snes/snesimpl.h"      /*I "petscsnes.h"  I*/
3 
4 PetscTruth SNESRegisterAllCalled = PETSC_FALSE;
5 PetscFList SNESList              = PETSC_NULL;
6 
7 /* Logging support */
8 PetscCookieCode SNES_COOKIE = 0;
9 PetscLogCode    SNES_Solve = 0, SNES_LineSearch = 0, SNES_FunctionEval = 0, SNES_JacobianEval = 0;
10 
11 #undef __FUNCT__
12 #define __FUNCT__ "SNESView"
13 /*@C
14    SNESView - Prints the SNES data structure.
15 
16    Collective on SNES
17 
18    Input Parameters:
19 +  SNES - the SNES context
20 -  viewer - visualization context
21 
22    Options Database Key:
23 .  -snes_view - Calls SNESView() at end of SNESSolve()
24 
25    Notes:
26    The available visualization contexts include
27 +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
28 -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
29          output where only the first processor opens
30          the file.  All other processors send their
31          data to the first processor to print.
32 
33    The user can open an alternative visualization context with
34    PetscViewerASCIIOpen() - output to a specified file.
35 
36    Level: beginner
37 
38 .keywords: SNES, view
39 
40 .seealso: PetscViewerASCIIOpen()
41 @*/
42 PetscErrorCode SNESView(SNES snes,PetscViewer viewer)
43 {
44   SNES_KSP_EW_ConvCtx *kctx;
45   PetscErrorCode ierr;
46   KSP                 ksp;
47   char                *type;
48   PetscTruth          iascii,isstring;
49 
50   PetscFunctionBegin;
51   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
52   if (!viewer) viewer = PETSC_VIEWER_STDOUT_(snes->comm);
53   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_COOKIE,2);
54   PetscCheckSameComm(snes,1,viewer,2);
55 
56   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
57   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_STRING,&isstring);CHKERRQ(ierr);
58   if (iascii) {
59     if (snes->prefix) {
60       ierr = PetscViewerASCIIPrintf(viewer,"SNES Object:(%s)\n",snes->prefix);CHKERRQ(ierr);
61     } else {
62       ierr = PetscViewerASCIIPrintf(viewer,"SNES Object:\n");CHKERRQ(ierr);
63     }
64     ierr = SNESGetType(snes,&type);CHKERRQ(ierr);
65     if (type) {
66       ierr = PetscViewerASCIIPrintf(viewer,"  type: %s\n",type);CHKERRQ(ierr);
67     } else {
68       ierr = PetscViewerASCIIPrintf(viewer,"  type: not set yet\n");CHKERRQ(ierr);
69     }
70     if (snes->view) {
71       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
72       ierr = (*snes->view)(snes,viewer);CHKERRQ(ierr);
73       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
74     }
75     ierr = PetscViewerASCIIPrintf(viewer,"  maximum iterations=%d, maximum function evaluations=%d\n",snes->max_its,snes->max_funcs);CHKERRQ(ierr);
76     ierr = PetscViewerASCIIPrintf(viewer,"  tolerances: relative=%g, absolute=%g, solution=%g\n",
77                  snes->rtol,snes->atol,snes->xtol);CHKERRQ(ierr);
78     ierr = PetscViewerASCIIPrintf(viewer,"  total number of linear solver iterations=%d\n",snes->linear_its);CHKERRQ(ierr);
79     ierr = PetscViewerASCIIPrintf(viewer,"  total number of function evaluations=%d\n",snes->nfuncs);CHKERRQ(ierr);
80     if (snes->ksp_ewconv) {
81       kctx = (SNES_KSP_EW_ConvCtx *)snes->kspconvctx;
82       if (kctx) {
83         ierr = PetscViewerASCIIPrintf(viewer,"  Eisenstat-Walker computation of KSP relative tolerance (version %d)\n",kctx->version);CHKERRQ(ierr);
84         ierr = PetscViewerASCIIPrintf(viewer,"    rtol_0=%g, rtol_max=%g, threshold=%g\n",kctx->rtol_0,kctx->rtol_max,kctx->threshold);CHKERRQ(ierr);
85         ierr = PetscViewerASCIIPrintf(viewer,"    gamma=%g, alpha=%g, alpha2=%g\n",kctx->gamma,kctx->alpha,kctx->alpha2);CHKERRQ(ierr);
86       }
87     }
88   } else if (isstring) {
89     ierr = SNESGetType(snes,&type);CHKERRQ(ierr);
90     ierr = PetscViewerStringSPrintf(viewer," %-3.3s",type);CHKERRQ(ierr);
91   }
92   ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr);
93   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
94   ierr = KSPView(ksp,viewer);CHKERRQ(ierr);
95   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
96   PetscFunctionReturn(0);
97 }
98 
99 /*
100   We retain a list of functions that also take SNES command
101   line options. These are called at the end SNESSetFromOptions()
102 */
103 #define MAXSETFROMOPTIONS 5
104 static int numberofsetfromoptions;
105 static int (*othersetfromoptions[MAXSETFROMOPTIONS])(SNES);
106 
107 #undef __FUNCT__
108 #define __FUNCT__ "SNESAddOptionsChecker"
109 /*@C
110   SNESAddOptionsChecker - Adds an additional function to check for SNES options.
111 
112   Not Collective
113 
114   Input Parameter:
115 . snescheck - function that checks for options
116 
117   Level: developer
118 
119 .seealso: SNESSetFromOptions()
120 @*/
121 PetscErrorCode SNESAddOptionsChecker(int (*snescheck)(SNES))
122 {
123   PetscFunctionBegin;
124   if (numberofsetfromoptions >= MAXSETFROMOPTIONS) {
125     SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE, "Too many options checkers, only %d allowed", MAXSETFROMOPTIONS);
126   }
127 
128   othersetfromoptions[numberofsetfromoptions++] = snescheck;
129   PetscFunctionReturn(0);
130 }
131 
132 #undef __FUNCT__
133 #define __FUNCT__ "SNESSetFromOptions"
134 /*@
135    SNESSetFromOptions - Sets various SNES and KSP parameters from user options.
136 
137    Collective on SNES
138 
139    Input Parameter:
140 .  snes - the SNES context
141 
142    Options Database Keys:
143 +  -snes_type <type> - ls, tr, umls, umtr, test
144 .  -snes_stol - convergence tolerance in terms of the norm
145                 of the change in the solution between steps
146 .  -snes_atol <atol> - absolute tolerance of residual norm
147 .  -snes_rtol <rtol> - relative decrease in tolerance norm from initial
148 .  -snes_max_it <max_it> - maximum number of iterations
149 .  -snes_max_funcs <max_funcs> - maximum number of function evaluations
150 .  -snes_max_fail <max_fail> - maximum number of failures
151 .  -snes_trtol <trtol> - trust region tolerance
152 .  -snes_no_convergence_test - skip convergence test in nonlinear or minimization
153                                solver; hence iterations will continue until max_it
154                                or some other criterion is reached. Saves expense
155                                of convergence test
156 .  -snes_monitor - prints residual norm at each iteration
157 .  -snes_vecmonitor - plots solution at each iteration
158 .  -snes_vecmonitor_update - plots update to solution at each iteration
159 .  -snes_xmonitor - plots residual norm at each iteration
160 .  -snes_fd - use finite differences to compute Jacobian; very slow, only for testing
161 .  -snes_mf_ksp_monitor - if using matrix-free multiply then print h at each KSP iteration
162 -  -snes_print_converged_reason - print the reason for convergence/divergence after each solve
163 
164     Options Database for Eisenstat-Walker method:
165 +  -snes_ksp_ew_conv - use Eisenstat-Walker method for determining linear system convergence
166 .  -snes_ksp_ew_version ver - version of  Eisenstat-Walker method
167 .  -snes_ksp_ew_rtol0 <rtol0> - Sets rtol0
168 .  -snes_ksp_ew_rtolmax <rtolmax> - Sets rtolmax
169 .  -snes_ksp_ew_gamma <gamma> - Sets gamma
170 .  -snes_ksp_ew_alpha <alpha> - Sets alpha
171 .  -snes_ksp_ew_alpha2 <alpha2> - Sets alpha2
172 -  -snes_ksp_ew_threshold <threshold> - Sets threshold
173 
174    Notes:
175    To see all options, run your program with the -help option or consult
176    the users manual.
177 
178    Level: beginner
179 
180 .keywords: SNES, nonlinear, set, options, database
181 
182 .seealso: SNESSetOptionsPrefix()
183 @*/
184 PetscErrorCode SNESSetFromOptions(SNES snes)
185 {
186   KSP                 ksp;
187   SNES_KSP_EW_ConvCtx *kctx = (SNES_KSP_EW_ConvCtx *)snes->kspconvctx;
188   PetscTruth          flg;
189   PetscErrorCode ierr;
190   int  i;
191   const char          *deft;
192   char                type[256];
193 
194   PetscFunctionBegin;
195   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
196 
197   ierr = PetscOptionsBegin(snes->comm,snes->prefix,"Nonlinear solver (SNES) options","SNES");CHKERRQ(ierr);
198     if (snes->type_name) {
199       deft = snes->type_name;
200     } else {
201       deft = SNESLS;
202     }
203 
204     if (!SNESRegisterAllCalled) {ierr = SNESRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
205     ierr = PetscOptionsList("-snes_type","Nonlinear solver method","SNESSetType",SNESList,deft,type,256,&flg);CHKERRQ(ierr);
206     if (flg) {
207       ierr = SNESSetType(snes,type);CHKERRQ(ierr);
208     } else if (!snes->type_name) {
209       ierr = SNESSetType(snes,deft);CHKERRQ(ierr);
210     }
211     ierr = PetscOptionsName("-snes_view","Print detailed information on solver used","SNESView",0);CHKERRQ(ierr);
212 
213     ierr = PetscOptionsReal("-snes_stol","Stop if step length less then","SNESSetTolerances",snes->xtol,&snes->xtol,0);CHKERRQ(ierr);
214     ierr = PetscOptionsReal("-snes_atol","Stop if function norm less then","SNESSetTolerances",snes->atol,&snes->atol,0);CHKERRQ(ierr);
215 
216     ierr = PetscOptionsReal("-snes_rtol","Stop if decrease in function norm less then","SNESSetTolerances",snes->rtol,&snes->rtol,0);CHKERRQ(ierr);
217     ierr = PetscOptionsInt("-snes_max_it","Maximum iterations","SNESSetTolerances",snes->max_its,&snes->max_its,PETSC_NULL);CHKERRQ(ierr);
218     ierr = PetscOptionsInt("-snes_max_funcs","Maximum function evaluations","SNESSetTolerances",snes->max_funcs,&snes->max_funcs,PETSC_NULL);CHKERRQ(ierr);
219     ierr = PetscOptionsInt("-snes_max_fail","Maximum failures","SNESSetTolerances",snes->maxFailures,&snes->maxFailures,PETSC_NULL);CHKERRQ(ierr);
220     ierr = PetscOptionsName("-snes_converged_reason","Print reason for converged or diverged","SNESSolve",&flg);CHKERRQ(ierr);
221     if (flg) {
222       snes->printreason = PETSC_TRUE;
223     }
224 
225     ierr = PetscOptionsName("-snes_ksp_ew_conv","Use Eisentat-Walker linear system convergence test","SNES_KSP_SetParametersEW",&snes->ksp_ewconv);CHKERRQ(ierr);
226 
227     ierr = PetscOptionsInt("-snes_ksp_ew_version","Version 1 or 2","SNES_KSP_SetParametersEW",kctx->version,&kctx->version,0);CHKERRQ(ierr);
228     ierr = PetscOptionsReal("-snes_ksp_ew_rtol0","0 <= rtol0 < 1","SNES_KSP_SetParametersEW",kctx->rtol_0,&kctx->rtol_0,0);CHKERRQ(ierr);
229     ierr = PetscOptionsReal("-snes_ksp_ew_rtolmax","0 <= rtolmax < 1","SNES_KSP_SetParametersEW",kctx->rtol_max,&kctx->rtol_max,0);CHKERRQ(ierr);
230     ierr = PetscOptionsReal("-snes_ksp_ew_gamma","0 <= gamma <= 1","SNES_KSP_SetParametersEW",kctx->gamma,&kctx->gamma,0);CHKERRQ(ierr);
231     ierr = PetscOptionsReal("-snes_ksp_ew_alpha","1 < alpha <= 2","SNES_KSP_SetParametersEW",kctx->alpha,&kctx->alpha,0);CHKERRQ(ierr);
232     ierr = PetscOptionsReal("-snes_ksp_ew_alpha2","alpha2","SNES_KSP_SetParametersEW",kctx->alpha2,&kctx->alpha2,0);CHKERRQ(ierr);
233     ierr = PetscOptionsReal("-snes_ksp_ew_threshold","0 < threshold < 1","SNES_KSP_SetParametersEW",kctx->threshold,&kctx->threshold,0);CHKERRQ(ierr);
234 
235     ierr = PetscOptionsName("-snes_no_convergence_test","Don't test for convergence","None",&flg);CHKERRQ(ierr);
236     if (flg) {snes->converged = 0;}
237     ierr = PetscOptionsName("-snes_cancelmonitors","Remove all monitors","SNESClearMonitor",&flg);CHKERRQ(ierr);
238     if (flg) {ierr = SNESClearMonitor(snes);CHKERRQ(ierr);}
239     ierr = PetscOptionsName("-snes_monitor","Monitor norm of function","SNESDefaultMonitor",&flg);CHKERRQ(ierr);
240     if (flg) {ierr = SNESSetMonitor(snes,SNESDefaultMonitor,0,0);CHKERRQ(ierr);}
241     ierr = PetscOptionsName("-snes_ratiomonitor","Monitor norm of function","SNESSetRatioMonitor",&flg);CHKERRQ(ierr);
242     if (flg) {ierr = SNESSetRatioMonitor(snes);CHKERRQ(ierr);}
243     ierr = PetscOptionsName("-snes_smonitor","Monitor norm of function (fewer digits)","SNESDefaultSMonitor",&flg);CHKERRQ(ierr);
244     if (flg) {ierr = SNESSetMonitor(snes,SNESDefaultSMonitor,0,0);CHKERRQ(ierr);}
245     ierr = PetscOptionsName("-snes_vecmonitor","Plot solution at each iteration","SNESVecViewMonitor",&flg);CHKERRQ(ierr);
246     if (flg) {ierr = SNESSetMonitor(snes,SNESVecViewMonitor,0,0);CHKERRQ(ierr);}
247     ierr = PetscOptionsName("-snes_vecmonitor_update","Plot correction at each iteration","SNESVecViewUpdateMonitor",&flg);CHKERRQ(ierr);
248     if (flg) {ierr = SNESSetMonitor(snes,SNESVecViewUpdateMonitor,0,0);CHKERRQ(ierr);}
249     ierr = PetscOptionsName("-snes_vecmonitor_residual","Plot residual at each iteration","SNESVecViewResidualMonitor",&flg);CHKERRQ(ierr);
250     if (flg) {ierr = SNESSetMonitor(snes,SNESVecViewResidualMonitor,0,0);CHKERRQ(ierr);}
251     ierr = PetscOptionsName("-snes_xmonitor","Plot function norm at each iteration","SNESLGMonitor",&flg);CHKERRQ(ierr);
252     if (flg) {ierr = SNESSetMonitor(snes,SNESLGMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);}
253 
254     ierr = PetscOptionsName("-snes_fd","Use finite differences (slow) to compute Jacobian","SNESDefaultComputeJacobian",&flg);CHKERRQ(ierr);
255     if (flg) {
256       ierr = SNESSetJacobian(snes,snes->jacobian,snes->jacobian_pre,SNESDefaultComputeJacobian,snes->funP);CHKERRQ(ierr);
257       PetscLogInfo(snes,"SNESSetFromOptions: Setting default finite difference Jacobian matrix\n");
258     }
259 
260     for(i = 0; i < numberofsetfromoptions; i++) {
261       ierr = (*othersetfromoptions[i])(snes);CHKERRQ(ierr);
262     }
263 
264     if (snes->setfromoptions) {
265       ierr = (*snes->setfromoptions)(snes);CHKERRQ(ierr);
266     }
267 
268   ierr = PetscOptionsEnd();CHKERRQ(ierr);
269 
270   ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr);
271   ierr = KSPSetFromOptions(ksp);CHKERRQ(ierr);
272 
273   PetscFunctionReturn(0);
274 }
275 
276 
277 #undef __FUNCT__
278 #define __FUNCT__ "SNESSetApplicationContext"
279 /*@
280    SNESSetApplicationContext - Sets the optional user-defined context for
281    the nonlinear solvers.
282 
283    Collective on SNES
284 
285    Input Parameters:
286 +  snes - the SNES context
287 -  usrP - optional user context
288 
289    Level: intermediate
290 
291 .keywords: SNES, nonlinear, set, application, context
292 
293 .seealso: SNESGetApplicationContext()
294 @*/
295 PetscErrorCode SNESSetApplicationContext(SNES snes,void *usrP)
296 {
297   PetscFunctionBegin;
298   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
299   snes->user		= usrP;
300   PetscFunctionReturn(0);
301 }
302 
303 #undef __FUNCT__
304 #define __FUNCT__ "SNESGetApplicationContext"
305 /*@C
306    SNESGetApplicationContext - Gets the user-defined context for the
307    nonlinear solvers.
308 
309    Not Collective
310 
311    Input Parameter:
312 .  snes - SNES context
313 
314    Output Parameter:
315 .  usrP - user context
316 
317    Level: intermediate
318 
319 .keywords: SNES, nonlinear, get, application, context
320 
321 .seealso: SNESSetApplicationContext()
322 @*/
323 PetscErrorCode SNESGetApplicationContext(SNES snes,void **usrP)
324 {
325   PetscFunctionBegin;
326   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
327   *usrP = snes->user;
328   PetscFunctionReturn(0);
329 }
330 
331 #undef __FUNCT__
332 #define __FUNCT__ "SNESGetIterationNumber"
333 /*@
334    SNESGetIterationNumber - Gets the number of nonlinear iterations completed
335    at this time.
336 
337    Not Collective
338 
339    Input Parameter:
340 .  snes - SNES context
341 
342    Output Parameter:
343 .  iter - iteration number
344 
345    Notes:
346    For example, during the computation of iteration 2 this would return 1.
347 
348    This is useful for using lagged Jacobians (where one does not recompute the
349    Jacobian at each SNES iteration). For example, the code
350 .vb
351       ierr = SNESGetIterationNumber(snes,&it);
352       if (!(it % 2)) {
353         [compute Jacobian here]
354       }
355 .ve
356    can be used in your ComputeJacobian() function to cause the Jacobian to be
357    recomputed every second SNES iteration.
358 
359    Level: intermediate
360 
361 .keywords: SNES, nonlinear, get, iteration, number
362 @*/
363 PetscErrorCode SNESGetIterationNumber(SNES snes,int* iter)
364 {
365   PetscFunctionBegin;
366   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
367   PetscValidIntPointer(iter,2);
368   *iter = snes->iter;
369   PetscFunctionReturn(0);
370 }
371 
372 #undef __FUNCT__
373 #define __FUNCT__ "SNESGetFunctionNorm"
374 /*@
375    SNESGetFunctionNorm - Gets the norm of the current function that was set
376    with SNESSSetFunction().
377 
378    Collective on SNES
379 
380    Input Parameter:
381 .  snes - SNES context
382 
383    Output Parameter:
384 .  fnorm - 2-norm of function
385 
386    Level: intermediate
387 
388 .keywords: SNES, nonlinear, get, function, norm
389 
390 .seealso: SNESGetFunction()
391 @*/
392 PetscErrorCode SNESGetFunctionNorm(SNES snes,PetscScalar *fnorm)
393 {
394   PetscFunctionBegin;
395   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
396   PetscValidScalarPointer(fnorm,2);
397   *fnorm = snes->norm;
398   PetscFunctionReturn(0);
399 }
400 
401 #undef __FUNCT__
402 #define __FUNCT__ "SNESGetNumberUnsuccessfulSteps"
403 /*@
404    SNESGetNumberUnsuccessfulSteps - Gets the number of unsuccessful steps
405    attempted by the nonlinear solver.
406 
407    Not Collective
408 
409    Input Parameter:
410 .  snes - SNES context
411 
412    Output Parameter:
413 .  nfails - number of unsuccessful steps attempted
414 
415    Notes:
416    This counter is reset to zero for each successive call to SNESSolve().
417 
418    Level: intermediate
419 
420 .keywords: SNES, nonlinear, get, number, unsuccessful, steps
421 @*/
422 PetscErrorCode SNESGetNumberUnsuccessfulSteps(SNES snes,int* nfails)
423 {
424   PetscFunctionBegin;
425   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
426   PetscValidIntPointer(nfails,2);
427   *nfails = snes->numFailures;
428   PetscFunctionReturn(0);
429 }
430 
431 #undef __FUNCT__
432 #define __FUNCT__ "SNESSetMaximumUnsuccessfulSteps"
433 /*@
434    SNESSetMaximumUnsuccessfulSteps - Sets the maximum number of unsuccessful steps
435    attempted by the nonlinear solver before it gives up.
436 
437    Not Collective
438 
439    Input Parameters:
440 +  snes     - SNES context
441 -  maxFails - maximum of unsuccessful steps
442 
443    Level: intermediate
444 
445 .keywords: SNES, nonlinear, set, maximum, unsuccessful, steps
446 @*/
447 PetscErrorCode SNESSetMaximumUnsuccessfulSteps(SNES snes, int maxFails)
448 {
449   PetscFunctionBegin;
450   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
451   snes->maxFailures = maxFails;
452   PetscFunctionReturn(0);
453 }
454 
455 #undef __FUNCT__
456 #define __FUNCT__ "SNESGetMaximumUnsuccessfulSteps"
457 /*@
458    SNESGetMaximumUnsuccessfulSteps - Gets the maximum number of unsuccessful steps
459    attempted by the nonlinear solver before it gives up.
460 
461    Not Collective
462 
463    Input Parameter:
464 .  snes     - SNES context
465 
466    Output Parameter:
467 .  maxFails - maximum of unsuccessful steps
468 
469    Level: intermediate
470 
471 .keywords: SNES, nonlinear, get, maximum, unsuccessful, steps
472 @*/
473 PetscErrorCode SNESGetMaximumUnsuccessfulSteps(SNES snes, int *maxFails)
474 {
475   PetscFunctionBegin;
476   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
477   PetscValidIntPointer(maxFails,2);
478   *maxFails = snes->maxFailures;
479   PetscFunctionReturn(0);
480 }
481 
482 #undef __FUNCT__
483 #define __FUNCT__ "SNESGetNumberLinearIterations"
484 /*@
485    SNESGetNumberLinearIterations - Gets the total number of linear iterations
486    used by the nonlinear solver.
487 
488    Not Collective
489 
490    Input Parameter:
491 .  snes - SNES context
492 
493    Output Parameter:
494 .  lits - number of linear iterations
495 
496    Notes:
497    This counter is reset to zero for each successive call to SNESSolve().
498 
499    Level: intermediate
500 
501 .keywords: SNES, nonlinear, get, number, linear, iterations
502 @*/
503 PetscErrorCode SNESGetNumberLinearIterations(SNES snes,int* lits)
504 {
505   PetscFunctionBegin;
506   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
507   PetscValidIntPointer(lits,2);
508   *lits = snes->linear_its;
509   PetscFunctionReturn(0);
510 }
511 
512 #undef __FUNCT__
513 #define __FUNCT__ "SNESGetKSP"
514 /*@C
515    SNESGetKSP - Returns the KSP context for a SNES solver.
516 
517    Not Collective, but if SNES object is parallel, then KSP object is parallel
518 
519    Input Parameter:
520 .  snes - the SNES context
521 
522    Output Parameter:
523 .  ksp - the KSP context
524 
525    Notes:
526    The user can then directly manipulate the KSP context to set various
527    options, etc.  Likewise, the user can then extract and manipulate the
528    KSP and PC contexts as well.
529 
530    Level: beginner
531 
532 .keywords: SNES, nonlinear, get, KSP, context
533 
534 .seealso: KSPGetPC()
535 @*/
536 PetscErrorCode SNESGetKSP(SNES snes,KSP *ksp)
537 {
538   PetscFunctionBegin;
539   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
540   PetscValidPointer(ksp,2);
541   *ksp = snes->ksp;
542   PetscFunctionReturn(0);
543 }
544 
545 #undef __FUNCT__
546 #define __FUNCT__ "SNESPublish_Petsc"
547 static int SNESPublish_Petsc(PetscObject obj)
548 {
549 #if defined(PETSC_HAVE_AMS)
550   SNES          v = (SNES) obj;
551   PetscErrorCode ierr;
552 #endif
553 
554   PetscFunctionBegin;
555 
556 #if defined(PETSC_HAVE_AMS)
557   /* if it is already published then return */
558   if (v->amem >=0) PetscFunctionReturn(0);
559 
560   ierr = PetscObjectPublishBaseBegin(obj);CHKERRQ(ierr);
561   ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Iteration",&v->iter,1,AMS_INT,AMS_READ,
562                                 AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
563   ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Residual",&v->norm,1,AMS_DOUBLE,AMS_READ,
564                                 AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
565   ierr = PetscObjectPublishBaseEnd(obj);CHKERRQ(ierr);
566 #endif
567   PetscFunctionReturn(0);
568 }
569 
570 /* -----------------------------------------------------------*/
571 #undef __FUNCT__
572 #define __FUNCT__ "SNESCreate"
573 /*@C
574    SNESCreate - Creates a nonlinear solver context.
575 
576    Collective on MPI_Comm
577 
578    Input Parameters:
579 +  comm - MPI communicator
580 
581    Output Parameter:
582 .  outsnes - the new SNES context
583 
584    Options Database Keys:
585 +   -snes_mf - Activates default matrix-free Jacobian-vector products,
586                and no preconditioning matrix
587 .   -snes_mf_operator - Activates default matrix-free Jacobian-vector
588                products, and a user-provided preconditioning matrix
589                as set by SNESSetJacobian()
590 -   -snes_fd - Uses (slow!) finite differences to compute Jacobian
591 
592    Level: beginner
593 
594 .keywords: SNES, nonlinear, create, context
595 
596 .seealso: SNESSolve(), SNESDestroy(), SNES
597 @*/
598 PetscErrorCode SNESCreate(MPI_Comm comm,SNES *outsnes)
599 {
600   PetscErrorCode ierr;
601   SNES                snes;
602   SNES_KSP_EW_ConvCtx *kctx;
603 
604   PetscFunctionBegin;
605   PetscValidPointer(outsnes,1);
606   *outsnes = PETSC_NULL;
607 #ifndef PETSC_USE_DYNAMIC_LIBRARIES
608   ierr = SNESInitializePackage(PETSC_NULL);CHKERRQ(ierr);
609 #endif
610 
611   PetscHeaderCreate(snes,_p_SNES,int,SNES_COOKIE,0,"SNES",comm,SNESDestroy,SNESView);
612   PetscLogObjectCreate(snes);
613   snes->bops->publish     = SNESPublish_Petsc;
614   snes->max_its           = 50;
615   snes->max_funcs	  = 10000;
616   snes->norm		  = 0.0;
617   snes->rtol		  = 1.e-8;
618   snes->ttol              = 0.0;
619   snes->atol		  = 1.e-50;
620   snes->xtol		  = 1.e-8;
621   snes->deltatol	  = 1.e-12;
622   snes->nfuncs            = 0;
623   snes->numFailures       = 0;
624   snes->maxFailures       = 1;
625   snes->linear_its        = 0;
626   snes->numbermonitors    = 0;
627   snes->data              = 0;
628   snes->view              = 0;
629   snes->setupcalled       = 0;
630   snes->ksp_ewconv        = PETSC_FALSE;
631   snes->vwork             = 0;
632   snes->nwork             = 0;
633   snes->conv_hist_len     = 0;
634   snes->conv_hist_max     = 0;
635   snes->conv_hist         = PETSC_NULL;
636   snes->conv_hist_its     = PETSC_NULL;
637   snes->conv_hist_reset   = PETSC_TRUE;
638   snes->reason            = SNES_CONVERGED_ITERATING;
639 
640   /* Create context to compute Eisenstat-Walker relative tolerance for KSP */
641   ierr = PetscNew(SNES_KSP_EW_ConvCtx,&kctx);CHKERRQ(ierr);
642   PetscLogObjectMemory(snes,sizeof(SNES_KSP_EW_ConvCtx));
643   snes->kspconvctx  = (void*)kctx;
644   kctx->version     = 2;
645   kctx->rtol_0      = .3; /* Eisenstat and Walker suggest rtol_0=.5, but
646                              this was too large for some test cases */
647   kctx->rtol_last   = 0;
648   kctx->rtol_max    = .9;
649   kctx->gamma       = 1.0;
650   kctx->alpha2      = .5*(1.0 + sqrt(5.0));
651   kctx->alpha       = kctx->alpha2;
652   kctx->threshold   = .1;
653   kctx->lresid_last = 0;
654   kctx->norm_last   = 0;
655 
656   ierr = KSPCreate(comm,&snes->ksp);CHKERRQ(ierr);
657   PetscLogObjectParent(snes,snes->ksp)
658 
659   *outsnes = snes;
660   ierr = PetscPublishAll(snes);CHKERRQ(ierr);
661   PetscFunctionReturn(0);
662 }
663 
664 #undef __FUNCT__
665 #define __FUNCT__ "SNESSetFunction"
666 /*@C
667    SNESSetFunction - Sets the function evaluation routine and function
668    vector for use by the SNES routines in solving systems of nonlinear
669    equations.
670 
671    Collective on SNES
672 
673    Input Parameters:
674 +  snes - the SNES context
675 .  func - function evaluation routine
676 .  r - vector to store function value
677 -  ctx - [optional] user-defined context for private data for the
678          function evaluation routine (may be PETSC_NULL)
679 
680    Calling sequence of func:
681 $    func (SNES snes,Vec x,Vec f,void *ctx);
682 
683 .  f - function vector
684 -  ctx - optional user-defined function context
685 
686    Notes:
687    The Newton-like methods typically solve linear systems of the form
688 $      f'(x) x = -f(x),
689    where f'(x) denotes the Jacobian matrix and f(x) is the function.
690 
691    Level: beginner
692 
693 .keywords: SNES, nonlinear, set, function
694 
695 .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian()
696 @*/
697 PetscErrorCode SNESSetFunction(SNES snes,Vec r,int (*func)(SNES,Vec,Vec,void*),void *ctx)
698 {
699   PetscFunctionBegin;
700   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
701   PetscValidHeaderSpecific(r,VEC_COOKIE,2);
702   PetscCheckSameComm(snes,1,r,2);
703 
704   snes->computefunction     = func;
705   snes->vec_func            = snes->vec_func_always = r;
706   snes->funP                = ctx;
707   PetscFunctionReturn(0);
708 }
709 
710 /* --------------------------------------------------------------- */
711 #undef __FUNCT__
712 #define __FUNCT__ "SNESSetRhs"
713 /*@C
714    SNESSetRhs - Sets the vector for solving F(x) = rhs. If rhs is not set
715    it assumes a zero right hand side.
716 
717    Collective on SNES
718 
719    Input Parameters:
720 +  snes - the SNES context
721 -  rhs - the right hand side vector or PETSC_NULL for a zero right hand side
722 
723    Level: intermediate
724 
725 .keywords: SNES, nonlinear, set, function, right hand side
726 
727 .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian(), SNESSetFunction()
728 @*/
729 PetscErrorCode SNESSetRhs(SNES snes,Vec rhs)
730 {
731   PetscErrorCode ierr;
732 
733   PetscFunctionBegin;
734   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
735   if (rhs) {
736     PetscValidHeaderSpecific(rhs,VEC_COOKIE,2);
737     PetscCheckSameComm(snes,1,rhs,2);
738     ierr = PetscObjectReference((PetscObject)rhs);CHKERRQ(ierr);
739   }
740   if (snes->afine) {
741     ierr = VecDestroy(snes->afine);CHKERRQ(ierr);
742   }
743   snes->afine = rhs;
744   PetscFunctionReturn(0);
745 }
746 
747 #undef __FUNCT__
748 #define __FUNCT__ "SNESComputeFunction"
749 /*@
750    SNESComputeFunction - Calls the function that has been set with
751                          SNESSetFunction().
752 
753    Collective on SNES
754 
755    Input Parameters:
756 +  snes - the SNES context
757 -  x - input vector
758 
759    Output Parameter:
760 .  y - function vector, as set by SNESSetFunction()
761 
762    Notes:
763    SNESComputeFunction() is typically used within nonlinear solvers
764    implementations, so most users would not generally call this routine
765    themselves.
766 
767    Level: developer
768 
769 .keywords: SNES, nonlinear, compute, function
770 
771 .seealso: SNESSetFunction(), SNESGetFunction()
772 @*/
773 PetscErrorCode SNESComputeFunction(SNES snes,Vec x,Vec y)
774 {
775   PetscErrorCode ierr;
776 
777   PetscFunctionBegin;
778   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
779   PetscValidHeaderSpecific(x,VEC_COOKIE,2);
780   PetscValidHeaderSpecific(y,VEC_COOKIE,3);
781   PetscCheckSameComm(snes,1,x,2);
782   PetscCheckSameComm(snes,1,y,3);
783 
784   ierr = PetscLogEventBegin(SNES_FunctionEval,snes,x,y,0);CHKERRQ(ierr);
785   PetscStackPush("SNES user function");
786   ierr = (*snes->computefunction)(snes,x,y,snes->funP);CHKERRQ(ierr);
787   PetscStackPop;
788   if (snes->afine) {
789     PetscScalar mone = -1.0;
790     ierr = VecAXPY(&mone,snes->afine,y);CHKERRQ(ierr);
791   }
792   snes->nfuncs++;
793   ierr = PetscLogEventEnd(SNES_FunctionEval,snes,x,y,0);CHKERRQ(ierr);
794   PetscFunctionReturn(0);
795 }
796 
797 #undef __FUNCT__
798 #define __FUNCT__ "SNESComputeJacobian"
799 /*@
800    SNESComputeJacobian - Computes the Jacobian matrix that has been
801    set with SNESSetJacobian().
802 
803    Collective on SNES and Mat
804 
805    Input Parameters:
806 +  snes - the SNES context
807 -  x - input vector
808 
809    Output Parameters:
810 +  A - Jacobian matrix
811 .  B - optional preconditioning matrix
812 -  flag - flag indicating matrix structure
813 
814    Notes:
815    Most users should not need to explicitly call this routine, as it
816    is used internally within the nonlinear solvers.
817 
818    See KSPSetOperators() for important information about setting the
819    flag parameter.
820 
821    Level: developer
822 
823 .keywords: SNES, compute, Jacobian, matrix
824 
825 .seealso:  SNESSetJacobian(), KSPSetOperators()
826 @*/
827 PetscErrorCode SNESComputeJacobian(SNES snes,Vec X,Mat *A,Mat *B,MatStructure *flg)
828 {
829   PetscErrorCode ierr;
830 
831   PetscFunctionBegin;
832   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
833   PetscValidHeaderSpecific(X,VEC_COOKIE,2);
834   PetscValidPointer(flg,5);
835   PetscCheckSameComm(snes,1,X,2);
836   if (!snes->computejacobian) PetscFunctionReturn(0);
837   ierr = PetscLogEventBegin(SNES_JacobianEval,snes,X,*A,*B);CHKERRQ(ierr);
838   *flg = DIFFERENT_NONZERO_PATTERN;
839   PetscStackPush("SNES user Jacobian function");
840   ierr = (*snes->computejacobian)(snes,X,A,B,flg,snes->jacP);CHKERRQ(ierr);
841   PetscStackPop;
842   ierr = PetscLogEventEnd(SNES_JacobianEval,snes,X,*A,*B);CHKERRQ(ierr);
843   /* make sure user returned a correct Jacobian and preconditioner */
844   PetscValidHeaderSpecific(*A,MAT_COOKIE,3);
845   PetscValidHeaderSpecific(*B,MAT_COOKIE,4);
846   PetscFunctionReturn(0);
847 }
848 
849 #undef __FUNCT__
850 #define __FUNCT__ "SNESSetJacobian"
851 /*@C
852    SNESSetJacobian - Sets the function to compute Jacobian as well as the
853    location to store the matrix.
854 
855    Collective on SNES and Mat
856 
857    Input Parameters:
858 +  snes - the SNES context
859 .  A - Jacobian matrix
860 .  B - preconditioner matrix (usually same as the Jacobian)
861 .  func - Jacobian evaluation routine
862 -  ctx - [optional] user-defined context for private data for the
863          Jacobian evaluation routine (may be PETSC_NULL)
864 
865    Calling sequence of func:
866 $     func (SNES snes,Vec x,Mat *A,Mat *B,int *flag,void *ctx);
867 
868 +  x - input vector
869 .  A - Jacobian matrix
870 .  B - preconditioner matrix, usually the same as A
871 .  flag - flag indicating information about the preconditioner matrix
872    structure (same as flag in KSPSetOperators())
873 -  ctx - [optional] user-defined Jacobian context
874 
875    Notes:
876    See KSPSetOperators() for important information about setting the flag
877    output parameter in the routine func().  Be sure to read this information!
878 
879    The routine func() takes Mat * as the matrix arguments rather than Mat.
880    This allows the Jacobian evaluation routine to replace A and/or B with a
881    completely new new matrix structure (not just different matrix elements)
882    when appropriate, for instance, if the nonzero structure is changing
883    throughout the global iterations.
884 
885    Level: beginner
886 
887 .keywords: SNES, nonlinear, set, Jacobian, matrix
888 
889 .seealso: KSPSetOperators(), SNESSetFunction()
890 @*/
891 PetscErrorCode SNESSetJacobian(SNES snes,Mat A,Mat B,int (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx)
892 {
893   PetscErrorCode ierr;
894 
895   PetscFunctionBegin;
896   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
897   if (A) PetscValidHeaderSpecific(A,MAT_COOKIE,2);
898   if (B) PetscValidHeaderSpecific(B,MAT_COOKIE,3);
899   if (A) PetscCheckSameComm(snes,1,A,2);
900   if (B) PetscCheckSameComm(snes,1,B,2);
901   if (func) snes->computejacobian = func;
902   if (ctx)  snes->jacP            = ctx;
903   if (A) {
904     if (snes->jacobian) {ierr = MatDestroy(snes->jacobian);CHKERRQ(ierr);}
905     snes->jacobian = A;
906     ierr           = PetscObjectReference((PetscObject)A);CHKERRQ(ierr);
907   }
908   if (B) {
909     if (snes->jacobian_pre) {ierr = MatDestroy(snes->jacobian_pre);CHKERRQ(ierr);}
910     snes->jacobian_pre = B;
911     ierr               = PetscObjectReference((PetscObject)B);CHKERRQ(ierr);
912   }
913   PetscFunctionReturn(0);
914 }
915 
916 #undef __FUNCT__
917 #define __FUNCT__ "SNESGetJacobian"
918 /*@C
919    SNESGetJacobian - Returns the Jacobian matrix and optionally the user
920    provided context for evaluating the Jacobian.
921 
922    Not Collective, but Mat object will be parallel if SNES object is
923 
924    Input Parameter:
925 .  snes - the nonlinear solver context
926 
927    Output Parameters:
928 +  A - location to stash Jacobian matrix (or PETSC_NULL)
929 .  B - location to stash preconditioner matrix (or PETSC_NULL)
930 .  ctx - location to stash Jacobian ctx (or PETSC_NULL)
931 -  func - location to put Jacobian function (or PETSC_NULL)
932 
933    Level: advanced
934 
935 .seealso: SNESSetJacobian(), SNESComputeJacobian()
936 @*/
937 PetscErrorCode SNESGetJacobian(SNES snes,Mat *A,Mat *B,void **ctx,int (**func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*))
938 {
939   PetscFunctionBegin;
940   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
941   if (A)    *A    = snes->jacobian;
942   if (B)    *B    = snes->jacobian_pre;
943   if (ctx)  *ctx  = snes->jacP;
944   if (func) *func = snes->computejacobian;
945   PetscFunctionReturn(0);
946 }
947 
948 /* ----- Routines to initialize and destroy a nonlinear solver ---- */
949 EXTERN PetscErrorCode SNESDefaultMatrixFreeCreate2(SNES,Vec,Mat*);
950 
951 #undef __FUNCT__
952 #define __FUNCT__ "SNESSetUp"
953 /*@
954    SNESSetUp - Sets up the internal data structures for the later use
955    of a nonlinear solver.
956 
957    Collective on SNES
958 
959    Input Parameters:
960 +  snes - the SNES context
961 -  x - the solution vector
962 
963    Notes:
964    For basic use of the SNES solvers the user need not explicitly call
965    SNESSetUp(), since these actions will automatically occur during
966    the call to SNESSolve().  However, if one wishes to control this
967    phase separately, SNESSetUp() should be called after SNESCreate()
968    and optional routines of the form SNESSetXXX(), but before SNESSolve().
969 
970    Level: advanced
971 
972 .keywords: SNES, nonlinear, setup
973 
974 .seealso: SNESCreate(), SNESSolve(), SNESDestroy()
975 @*/
976 PetscErrorCode SNESSetUp(SNES snes,Vec x)
977 {
978   PetscErrorCode ierr;
979   PetscTruth flg, iseqtr;
980 
981   PetscFunctionBegin;
982   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
983   PetscValidHeaderSpecific(x,VEC_COOKIE,2);
984   PetscCheckSameComm(snes,1,x,2);
985   snes->vec_sol = snes->vec_sol_always = x;
986 
987   ierr = PetscOptionsHasName(snes->prefix,"-snes_mf_operator",&flg);CHKERRQ(ierr);
988   /*
989       This version replaces the user provided Jacobian matrix with a
990       matrix-free version but still employs the user-provided preconditioner matrix
991   */
992   if (flg) {
993     Mat J;
994     ierr = MatCreateSNESMF(snes,snes->vec_sol,&J);CHKERRQ(ierr);
995     ierr = MatSNESMFSetFromOptions(J);CHKERRQ(ierr);
996     PetscLogInfo(snes,"SNESSetUp: Setting default matrix-free operator routines\n");
997     ierr = SNESSetJacobian(snes,J,0,0,0);CHKERRQ(ierr);
998     ierr = MatDestroy(J);CHKERRQ(ierr);
999   }
1000 
1001 #if !defined(PETSC_USE_COMPLEX) && !defined(PETSC_USE_SINGLE)
1002   ierr = PetscOptionsHasName(snes->prefix,"-snes_mf_operator2",&flg);CHKERRQ(ierr);
1003   if (flg) {
1004     Mat J;
1005     ierr = SNESDefaultMatrixFreeCreate2(snes,snes->vec_sol,&J);CHKERRQ(ierr);
1006     ierr = SNESSetJacobian(snes,J,0,0,0);CHKERRQ(ierr);
1007     ierr = MatDestroy(J);CHKERRQ(ierr);
1008   }
1009 #endif
1010 
1011   ierr = PetscOptionsHasName(snes->prefix,"-snes_mf",&flg);CHKERRQ(ierr);
1012   /*
1013       This version replaces both the user-provided Jacobian and the user-
1014       provided preconditioner matrix with the default matrix free version.
1015    */
1016   if (flg) {
1017     Mat  J;
1018     KSP ksp;
1019     PC   pc;
1020 
1021     ierr = MatCreateSNESMF(snes,snes->vec_sol,&J);CHKERRQ(ierr);
1022     ierr = MatSNESMFSetFromOptions(J);CHKERRQ(ierr);
1023     PetscLogInfo(snes,"SNESSetUp: Setting default matrix-free operator and preconditioner routines\n");
1024     ierr = SNESSetJacobian(snes,J,J,MatSNESMFComputeJacobian,snes->funP);CHKERRQ(ierr);
1025     ierr = MatDestroy(J);CHKERRQ(ierr);
1026 
1027     /* force no preconditioner */
1028     ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr);
1029     ierr = KSPGetPC(ksp,&pc);CHKERRQ(ierr);
1030     ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr);
1031     if (!flg) {
1032       ierr = PCSetType(pc,PCNONE);CHKERRQ(ierr);
1033     }
1034   }
1035 
1036   if (!snes->vec_func) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetFunction() first");
1037   if (!snes->computefunction) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetFunction() first");
1038   if (!snes->jacobian) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetJacobian() first \n or use -snes_mf option");
1039   if (snes->vec_func == snes->vec_sol) {
1040     SETERRQ(PETSC_ERR_ARG_IDN,"Solution vector cannot be function vector");
1041   }
1042 
1043   /* Set the KSP stopping criterion to use the Eisenstat-Walker method */
1044   ierr = PetscTypeCompare((PetscObject)snes,SNESTR,&iseqtr);CHKERRQ(ierr);
1045   if (snes->ksp_ewconv && !iseqtr) {
1046     KSP ksp;
1047     ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr);
1048     ierr = KSPSetConvergenceTest(ksp,SNES_KSP_EW_Converged_Private,snes);CHKERRQ(ierr);
1049   }
1050 
1051   if (snes->setup) {ierr = (*snes->setup)(snes);CHKERRQ(ierr);}
1052   snes->setupcalled = 1;
1053   PetscFunctionReturn(0);
1054 }
1055 
1056 #undef __FUNCT__
1057 #define __FUNCT__ "SNESDestroy"
1058 /*@C
1059    SNESDestroy - Destroys the nonlinear solver context that was created
1060    with SNESCreate().
1061 
1062    Collective on SNES
1063 
1064    Input Parameter:
1065 .  snes - the SNES context
1066 
1067    Level: beginner
1068 
1069 .keywords: SNES, nonlinear, destroy
1070 
1071 .seealso: SNESCreate(), SNESSolve()
1072 @*/
1073 PetscErrorCode SNESDestroy(SNES snes)
1074 {
1075   int i,ierr;
1076 
1077   PetscFunctionBegin;
1078   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1079   if (--snes->refct > 0) PetscFunctionReturn(0);
1080 
1081   /* if memory was published with AMS then destroy it */
1082   ierr = PetscObjectDepublish(snes);CHKERRQ(ierr);
1083 
1084   if (snes->destroy) {ierr = (*(snes)->destroy)(snes);CHKERRQ(ierr);}
1085   if (snes->kspconvctx) {ierr = PetscFree(snes->kspconvctx);CHKERRQ(ierr);}
1086   if (snes->jacobian) {ierr = MatDestroy(snes->jacobian);CHKERRQ(ierr);}
1087   if (snes->jacobian_pre) {ierr = MatDestroy(snes->jacobian_pre);CHKERRQ(ierr);}
1088   if (snes->afine) {ierr = VecDestroy(snes->afine);CHKERRQ(ierr);}
1089   ierr = KSPDestroy(snes->ksp);CHKERRQ(ierr);
1090   if (snes->vwork) {ierr = VecDestroyVecs(snes->vwork,snes->nvwork);CHKERRQ(ierr);}
1091   for (i=0; i<snes->numbermonitors; i++) {
1092     if (snes->monitordestroy[i]) {
1093       ierr = (*snes->monitordestroy[i])(snes->monitorcontext[i]);CHKERRQ(ierr);
1094     }
1095   }
1096   PetscLogObjectDestroy((PetscObject)snes);
1097   PetscHeaderDestroy((PetscObject)snes);
1098   PetscFunctionReturn(0);
1099 }
1100 
1101 /* ----------- Routines to set solver parameters ---------- */
1102 
1103 #undef __FUNCT__
1104 #define __FUNCT__ "SNESSetTolerances"
1105 /*@
1106    SNESSetTolerances - Sets various parameters used in convergence tests.
1107 
1108    Collective on SNES
1109 
1110    Input Parameters:
1111 +  snes - the SNES context
1112 .  atol - absolute convergence tolerance
1113 .  rtol - relative convergence tolerance
1114 .  stol -  convergence tolerance in terms of the norm
1115            of the change in the solution between steps
1116 .  maxit - maximum number of iterations
1117 -  maxf - maximum number of function evaluations
1118 
1119    Options Database Keys:
1120 +    -snes_atol <atol> - Sets atol
1121 .    -snes_rtol <rtol> - Sets rtol
1122 .    -snes_stol <stol> - Sets stol
1123 .    -snes_max_it <maxit> - Sets maxit
1124 -    -snes_max_funcs <maxf> - Sets maxf
1125 
1126    Notes:
1127    The default maximum number of iterations is 50.
1128    The default maximum number of function evaluations is 1000.
1129 
1130    Level: intermediate
1131 
1132 .keywords: SNES, nonlinear, set, convergence, tolerances
1133 
1134 .seealso: SNESSetTrustRegionTolerance(), SNESSetMinimizationFunctionTolerance()
1135 @*/
1136 PetscErrorCode SNESSetTolerances(SNES snes,PetscReal atol,PetscReal rtol,PetscReal stol,int maxit,int maxf)
1137 {
1138   PetscFunctionBegin;
1139   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1140   if (atol != PETSC_DEFAULT)  snes->atol      = atol;
1141   if (rtol != PETSC_DEFAULT)  snes->rtol      = rtol;
1142   if (stol != PETSC_DEFAULT)  snes->xtol      = stol;
1143   if (maxit != PETSC_DEFAULT) snes->max_its   = maxit;
1144   if (maxf != PETSC_DEFAULT)  snes->max_funcs = maxf;
1145   PetscFunctionReturn(0);
1146 }
1147 
1148 #undef __FUNCT__
1149 #define __FUNCT__ "SNESGetTolerances"
1150 /*@
1151    SNESGetTolerances - Gets various parameters used in convergence tests.
1152 
1153    Not Collective
1154 
1155    Input Parameters:
1156 +  snes - the SNES context
1157 .  atol - absolute convergence tolerance
1158 .  rtol - relative convergence tolerance
1159 .  stol -  convergence tolerance in terms of the norm
1160            of the change in the solution between steps
1161 .  maxit - maximum number of iterations
1162 -  maxf - maximum number of function evaluations
1163 
1164    Notes:
1165    The user can specify PETSC_NULL for any parameter that is not needed.
1166 
1167    Level: intermediate
1168 
1169 .keywords: SNES, nonlinear, get, convergence, tolerances
1170 
1171 .seealso: SNESSetTolerances()
1172 @*/
1173 PetscErrorCode SNESGetTolerances(SNES snes,PetscReal *atol,PetscReal *rtol,PetscReal *stol,int *maxit,int *maxf)
1174 {
1175   PetscFunctionBegin;
1176   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1177   if (atol)  *atol  = snes->atol;
1178   if (rtol)  *rtol  = snes->rtol;
1179   if (stol)  *stol  = snes->xtol;
1180   if (maxit) *maxit = snes->max_its;
1181   if (maxf)  *maxf  = snes->max_funcs;
1182   PetscFunctionReturn(0);
1183 }
1184 
1185 #undef __FUNCT__
1186 #define __FUNCT__ "SNESSetTrustRegionTolerance"
1187 /*@
1188    SNESSetTrustRegionTolerance - Sets the trust region parameter tolerance.
1189 
1190    Collective on SNES
1191 
1192    Input Parameters:
1193 +  snes - the SNES context
1194 -  tol - tolerance
1195 
1196    Options Database Key:
1197 .  -snes_trtol <tol> - Sets tol
1198 
1199    Level: intermediate
1200 
1201 .keywords: SNES, nonlinear, set, trust region, tolerance
1202 
1203 .seealso: SNESSetTolerances(), SNESSetMinimizationFunctionTolerance()
1204 @*/
1205 PetscErrorCode SNESSetTrustRegionTolerance(SNES snes,PetscReal tol)
1206 {
1207   PetscFunctionBegin;
1208   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1209   snes->deltatol = tol;
1210   PetscFunctionReturn(0);
1211 }
1212 
1213 /*
1214    Duplicate the lg monitors for SNES from KSP; for some reason with
1215    dynamic libraries things don't work under Sun4 if we just use
1216    macros instead of functions
1217 */
1218 #undef __FUNCT__
1219 #define __FUNCT__ "SNESLGMonitor"
1220 PetscErrorCode SNESLGMonitor(SNES snes,int it,PetscReal norm,void *ctx)
1221 {
1222   PetscErrorCode ierr;
1223 
1224   PetscFunctionBegin;
1225   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1226   ierr = KSPLGMonitor((KSP)snes,it,norm,ctx);CHKERRQ(ierr);
1227   PetscFunctionReturn(0);
1228 }
1229 
1230 #undef __FUNCT__
1231 #define __FUNCT__ "SNESLGMonitorCreate"
1232 PetscErrorCode SNESLGMonitorCreate(const char host[],const char label[],int x,int y,int m,int n,PetscDrawLG *draw)
1233 {
1234   PetscErrorCode ierr;
1235 
1236   PetscFunctionBegin;
1237   ierr = KSPLGMonitorCreate(host,label,x,y,m,n,draw);CHKERRQ(ierr);
1238   PetscFunctionReturn(0);
1239 }
1240 
1241 #undef __FUNCT__
1242 #define __FUNCT__ "SNESLGMonitorDestroy"
1243 PetscErrorCode SNESLGMonitorDestroy(PetscDrawLG draw)
1244 {
1245   PetscErrorCode ierr;
1246 
1247   PetscFunctionBegin;
1248   ierr = KSPLGMonitorDestroy(draw);CHKERRQ(ierr);
1249   PetscFunctionReturn(0);
1250 }
1251 
1252 /* ------------ Routines to set performance monitoring options ----------- */
1253 
1254 #undef __FUNCT__
1255 #define __FUNCT__ "SNESSetMonitor"
1256 /*@C
1257    SNESSetMonitor - Sets an ADDITIONAL function that is to be used at every
1258    iteration of the nonlinear solver to display the iteration's
1259    progress.
1260 
1261    Collective on SNES
1262 
1263    Input Parameters:
1264 +  snes - the SNES context
1265 .  func - monitoring routine
1266 .  mctx - [optional] user-defined context for private data for the
1267           monitor routine (use PETSC_NULL if no context is desitre)
1268 -  monitordestroy - [optional] routine that frees monitor context
1269           (may be PETSC_NULL)
1270 
1271    Calling sequence of func:
1272 $     int func(SNES snes,int its, PetscReal norm,void *mctx)
1273 
1274 +    snes - the SNES context
1275 .    its - iteration number
1276 .    norm - 2-norm function value (may be estimated)
1277 -    mctx - [optional] monitoring context
1278 
1279    Options Database Keys:
1280 +    -snes_monitor        - sets SNESDefaultMonitor()
1281 .    -snes_xmonitor       - sets line graph monitor,
1282                             uses SNESLGMonitorCreate()
1283 _    -snes_cancelmonitors - cancels all monitors that have
1284                             been hardwired into a code by
1285                             calls to SNESSetMonitor(), but
1286                             does not cancel those set via
1287                             the options database.
1288 
1289    Notes:
1290    Several different monitoring routines may be set by calling
1291    SNESSetMonitor() multiple times; all will be called in the
1292    order in which they were set.
1293 
1294    Level: intermediate
1295 
1296 .keywords: SNES, nonlinear, set, monitor
1297 
1298 .seealso: SNESDefaultMonitor(), SNESClearMonitor()
1299 @*/
1300 PetscErrorCode SNESSetMonitor(SNES snes,int (*func)(SNES,int,PetscReal,void*),void *mctx,int (*monitordestroy)(void*))
1301 {
1302   PetscFunctionBegin;
1303   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1304   if (snes->numbermonitors >= MAXSNESMONITORS) {
1305     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Too many monitors set");
1306   }
1307 
1308   snes->monitor[snes->numbermonitors]           = func;
1309   snes->monitordestroy[snes->numbermonitors]    = monitordestroy;
1310   snes->monitorcontext[snes->numbermonitors++]  = (void*)mctx;
1311   PetscFunctionReturn(0);
1312 }
1313 
1314 #undef __FUNCT__
1315 #define __FUNCT__ "SNESClearMonitor"
1316 /*@C
1317    SNESClearMonitor - Clears all the monitor functions for a SNES object.
1318 
1319    Collective on SNES
1320 
1321    Input Parameters:
1322 .  snes - the SNES context
1323 
1324    Options Database Key:
1325 .  -snes_cancelmonitors - cancels all monitors that have been hardwired
1326     into a code by calls to SNESSetMonitor(), but does not cancel those
1327     set via the options database
1328 
1329    Notes:
1330    There is no way to clear one specific monitor from a SNES object.
1331 
1332    Level: intermediate
1333 
1334 .keywords: SNES, nonlinear, set, monitor
1335 
1336 .seealso: SNESDefaultMonitor(), SNESSetMonitor()
1337 @*/
1338 PetscErrorCode SNESClearMonitor(SNES snes)
1339 {
1340   PetscFunctionBegin;
1341   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1342   snes->numbermonitors = 0;
1343   PetscFunctionReturn(0);
1344 }
1345 
1346 #undef __FUNCT__
1347 #define __FUNCT__ "SNESSetConvergenceTest"
1348 /*@C
1349    SNESSetConvergenceTest - Sets the function that is to be used
1350    to test for convergence of the nonlinear iterative solution.
1351 
1352    Collective on SNES
1353 
1354    Input Parameters:
1355 +  snes - the SNES context
1356 .  func - routine to test for convergence
1357 -  cctx - [optional] context for private data for the convergence routine
1358           (may be PETSC_NULL)
1359 
1360    Calling sequence of func:
1361 $     int func (SNES snes,PetscReal xnorm,PetscReal gnorm,PetscReal f,SNESConvergedReason *reason,void *cctx)
1362 
1363 +    snes - the SNES context
1364 .    cctx - [optional] convergence context
1365 .    reason - reason for convergence/divergence
1366 .    xnorm - 2-norm of current iterate
1367 .    gnorm - 2-norm of current step
1368 -    f - 2-norm of function
1369 
1370    Level: advanced
1371 
1372 .keywords: SNES, nonlinear, set, convergence, test
1373 
1374 .seealso: SNESConverged_LS(), SNESConverged_TR()
1375 @*/
1376 PetscErrorCode SNESSetConvergenceTest(SNES snes,int (*func)(SNES,PetscReal,PetscReal,PetscReal,SNESConvergedReason*,void*),void *cctx)
1377 {
1378   PetscFunctionBegin;
1379   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1380   (snes)->converged = func;
1381   (snes)->cnvP      = cctx;
1382   PetscFunctionReturn(0);
1383 }
1384 
1385 #undef __FUNCT__
1386 #define __FUNCT__ "SNESGetConvergedReason"
1387 /*@C
1388    SNESGetConvergedReason - Gets the reason the SNES iteration was stopped.
1389 
1390    Not Collective
1391 
1392    Input Parameter:
1393 .  snes - the SNES context
1394 
1395    Output Parameter:
1396 .  reason - negative value indicates diverged, positive value converged, see petscsnes.h or the
1397             manual pages for the individual convergence tests for complete lists
1398 
1399    Level: intermediate
1400 
1401    Notes: Can only be called after the call the SNESSolve() is complete.
1402 
1403 .keywords: SNES, nonlinear, set, convergence, test
1404 
1405 .seealso: SNESSetConvergenceTest(), SNESConverged_LS(), SNESConverged_TR(), SNESConvergedReason
1406 @*/
1407 PetscErrorCode SNESGetConvergedReason(SNES snes,SNESConvergedReason *reason)
1408 {
1409   PetscFunctionBegin;
1410   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1411   PetscValidPointer(reason,2);
1412   *reason = snes->reason;
1413   PetscFunctionReturn(0);
1414 }
1415 
1416 #undef __FUNCT__
1417 #define __FUNCT__ "SNESSetConvergenceHistory"
1418 /*@
1419    SNESSetConvergenceHistory - Sets the array used to hold the convergence history.
1420 
1421    Collective on SNES
1422 
1423    Input Parameters:
1424 +  snes - iterative context obtained from SNESCreate()
1425 .  a   - array to hold history
1426 .  its - integer array holds the number of linear iterations for each solve.
1427 .  na  - size of a and its
1428 -  reset - PETSC_TRUE indicates each new nonlinear solve resets the history counter to zero,
1429            else it continues storing new values for new nonlinear solves after the old ones
1430 
1431    Notes:
1432    If set, this array will contain the function norms computed
1433    at each step.
1434 
1435    This routine is useful, e.g., when running a code for purposes
1436    of accurate performance monitoring, when no I/O should be done
1437    during the section of code that is being timed.
1438 
1439    Level: intermediate
1440 
1441 .keywords: SNES, set, convergence, history
1442 
1443 .seealso: SNESGetConvergenceHistory()
1444 
1445 @*/
1446 PetscErrorCode SNESSetConvergenceHistory(SNES snes,PetscReal a[],int *its,int na,PetscTruth reset)
1447 {
1448   PetscFunctionBegin;
1449   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1450   if (na) PetscValidScalarPointer(a,2);
1451   snes->conv_hist       = a;
1452   snes->conv_hist_its   = its;
1453   snes->conv_hist_max   = na;
1454   snes->conv_hist_reset = reset;
1455   PetscFunctionReturn(0);
1456 }
1457 
1458 #undef __FUNCT__
1459 #define __FUNCT__ "SNESGetConvergenceHistory"
1460 /*@C
1461    SNESGetConvergenceHistory - Gets the array used to hold the convergence history.
1462 
1463    Collective on SNES
1464 
1465    Input Parameter:
1466 .  snes - iterative context obtained from SNESCreate()
1467 
1468    Output Parameters:
1469 .  a   - array to hold history
1470 .  its - integer array holds the number of linear iterations (or
1471          negative if not converged) for each solve.
1472 -  na  - size of a and its
1473 
1474    Notes:
1475     The calling sequence for this routine in Fortran is
1476 $   call SNESGetConvergenceHistory(SNES snes, integer na, integer ierr)
1477 
1478    This routine is useful, e.g., when running a code for purposes
1479    of accurate performance monitoring, when no I/O should be done
1480    during the section of code that is being timed.
1481 
1482    Level: intermediate
1483 
1484 .keywords: SNES, get, convergence, history
1485 
1486 .seealso: SNESSetConvergencHistory()
1487 
1488 @*/
1489 PetscErrorCode SNESGetConvergenceHistory(SNES snes,PetscReal *a[],int *its[],int *na)
1490 {
1491   PetscFunctionBegin;
1492   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1493   if (a)   *a   = snes->conv_hist;
1494   if (its) *its = snes->conv_hist_its;
1495   if (na) *na   = snes->conv_hist_len;
1496   PetscFunctionReturn(0);
1497 }
1498 
1499 #undef __FUNCT__
1500 #define __FUNCT__ "SNESSetRhsBC"
1501 /*@C
1502   SNESSetRhsBC - Sets the function which applies boundary conditions
1503   to the Rhs of each system.
1504 
1505   Collective on SNES
1506 
1507   Input Parameters:
1508 . snes - The nonlinear solver context
1509 . func - The function
1510 
1511   Calling sequence of func:
1512 . func (SNES snes, Vec rhs, void *ctx);
1513 
1514 . rhs - The current rhs vector
1515 . ctx - The user-context
1516 
1517   Level: intermediate
1518 
1519 .keywords: SNES, Rhs, boundary conditions
1520 .seealso SNESDefaultRhsBC(), SNESSetSolutionBC(), SNESSetUpdate()
1521 @*/
1522 PetscErrorCode SNESSetRhsBC(SNES snes, int (*func)(SNES, Vec, void *))
1523 {
1524   PetscFunctionBegin;
1525   PetscValidHeaderSpecific(snes, SNES_COOKIE,1);
1526   snes->applyrhsbc = func;
1527   PetscFunctionReturn(0);
1528 }
1529 
1530 #undef __FUNCT__
1531 #define __FUNCT__ "SNESDefaultRhsBC"
1532 /*@
1533   SNESDefaultRhsBC - The default boundary condition function which does nothing.
1534 
1535   Not collective
1536 
1537   Input Parameters:
1538 . snes - The nonlinear solver context
1539 . rhs  - The Rhs
1540 . ctx  - The user-context
1541 
1542   Level: beginner
1543 
1544 .keywords: SNES, Rhs, boundary conditions
1545 .seealso SNESSetRhsBC(), SNESDefaultSolutionBC(), SNESDefaultUpdate()
1546 @*/
1547 PetscErrorCode SNESDefaultRhsBC(SNES snes, Vec rhs, void *ctx)
1548 {
1549   PetscFunctionBegin;
1550   PetscFunctionReturn(0);
1551 }
1552 
1553 #undef __FUNCT__
1554 #define __FUNCT__ "SNESSetSolutionBC"
1555 /*@C
1556   SNESSetSolutionBC - Sets the function which applies boundary conditions
1557   to the solution of each system.
1558 
1559   Collective on SNES
1560 
1561   Input Parameters:
1562 . snes - The nonlinear solver context
1563 . func - The function
1564 
1565   Calling sequence of func:
1566 . func (SNES snes, Vec rsol, void *ctx);
1567 
1568 . sol - The current solution vector
1569 . ctx - The user-context
1570 
1571   Level: intermediate
1572 
1573 .keywords: SNES, solution, boundary conditions
1574 .seealso SNESDefaultSolutionBC(), SNESSetRhsBC(), SNESSetUpdate()
1575 @*/
1576 PetscErrorCode SNESSetSolutionBC(SNES snes, int (*func)(SNES, Vec, void *))
1577 {
1578   PetscFunctionBegin;
1579   PetscValidHeaderSpecific(snes, SNES_COOKIE,1);
1580   snes->applysolbc = func;
1581   PetscFunctionReturn(0);
1582 }
1583 
1584 #undef __FUNCT__
1585 #define __FUNCT__ "SNESDefaultSolutionBC"
1586 /*@
1587   SNESDefaultSolutionBC - The default boundary condition function which does nothing.
1588 
1589   Not collective
1590 
1591   Input Parameters:
1592 . snes - The nonlinear solver context
1593 . sol  - The solution
1594 . ctx  - The user-context
1595 
1596   Level: beginner
1597 
1598 .keywords: SNES, solution, boundary conditions
1599 .seealso SNESSetSolutionBC(), SNESDefaultRhsBC(), SNESDefaultUpdate()
1600 @*/
1601 PetscErrorCode SNESDefaultSolutionBC(SNES snes, Vec sol, void *ctx)
1602 {
1603   PetscFunctionBegin;
1604   PetscFunctionReturn(0);
1605 }
1606 
1607 #undef __FUNCT__
1608 #define __FUNCT__ "SNESSetUpdate"
1609 /*@C
1610   SNESSetUpdate - Sets the general-purpose update function called
1611   at the beginning of every step of the iteration.
1612 
1613   Collective on SNES
1614 
1615   Input Parameters:
1616 . snes - The nonlinear solver context
1617 . func - The function
1618 
1619   Calling sequence of func:
1620 . func (TS ts, int step);
1621 
1622 . step - The current step of the iteration
1623 
1624   Level: intermediate
1625 
1626 .keywords: SNES, update
1627 .seealso SNESDefaultUpdate(), SNESSetRhsBC(), SNESSetSolutionBC()
1628 @*/
1629 PetscErrorCode SNESSetUpdate(SNES snes, int (*func)(SNES, int))
1630 {
1631   PetscFunctionBegin;
1632   PetscValidHeaderSpecific(snes, SNES_COOKIE,1);
1633   snes->update = func;
1634   PetscFunctionReturn(0);
1635 }
1636 
1637 #undef __FUNCT__
1638 #define __FUNCT__ "SNESDefaultUpdate"
1639 /*@
1640   SNESDefaultUpdate - The default update function which does nothing.
1641 
1642   Not collective
1643 
1644   Input Parameters:
1645 . snes - The nonlinear solver context
1646 . step - The current step of the iteration
1647 
1648   Level: intermediate
1649 
1650 .keywords: SNES, update
1651 .seealso SNESSetUpdate(), SNESDefaultRhsBC(), SNESDefaultSolutionBC()
1652 @*/
1653 PetscErrorCode SNESDefaultUpdate(SNES snes, int step)
1654 {
1655   PetscFunctionBegin;
1656   PetscFunctionReturn(0);
1657 }
1658 
1659 #undef __FUNCT__
1660 #define __FUNCT__ "SNESScaleStep_Private"
1661 /*
1662    SNESScaleStep_Private - Scales a step so that its length is less than the
1663    positive parameter delta.
1664 
1665     Input Parameters:
1666 +   snes - the SNES context
1667 .   y - approximate solution of linear system
1668 .   fnorm - 2-norm of current function
1669 -   delta - trust region size
1670 
1671     Output Parameters:
1672 +   gpnorm - predicted function norm at the new point, assuming local
1673     linearization.  The value is zero if the step lies within the trust
1674     region, and exceeds zero otherwise.
1675 -   ynorm - 2-norm of the step
1676 
1677     Note:
1678     For non-trust region methods such as SNESLS, the parameter delta
1679     is set to be the maximum allowable step size.
1680 
1681 .keywords: SNES, nonlinear, scale, step
1682 */
1683 PetscErrorCode SNESScaleStep_Private(SNES snes,Vec y,PetscReal *fnorm,PetscReal *delta,PetscReal *gpnorm,PetscReal *ynorm)
1684 {
1685   PetscReal   nrm;
1686   PetscScalar cnorm;
1687   PetscErrorCode ierr;
1688 
1689   PetscFunctionBegin;
1690   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1691   PetscValidHeaderSpecific(y,VEC_COOKIE,2);
1692   PetscCheckSameComm(snes,1,y,2);
1693 
1694   ierr = VecNorm(y,NORM_2,&nrm);CHKERRQ(ierr);
1695   if (nrm > *delta) {
1696      nrm = *delta/nrm;
1697      *gpnorm = (1.0 - nrm)*(*fnorm);
1698      cnorm = nrm;
1699      ierr = VecScale(&cnorm,y);CHKERRQ(ierr);
1700      *ynorm = *delta;
1701   } else {
1702      *gpnorm = 0.0;
1703      *ynorm = nrm;
1704   }
1705   PetscFunctionReturn(0);
1706 }
1707 
1708 static const char *convergedreasons[] = {"appears to located a local minimum instead of a zero",
1709                                          "not currently used",
1710                                          "line search failed",
1711                                          "reach maximum number of iterations",
1712                                          "function norm became NaN (not a number)",
1713                                          "not currently used",
1714                                          "number of function computations exceeded",
1715                                          "not currently used",
1716                                          "still iterating",
1717                                          "not currently used",
1718                                          "absolute size of function norm",
1719                                          "relative decrease in function norm",
1720                                          "step size is small",
1721                                          "not currently used",
1722                                          "not currently used",
1723                                          "small trust region"};
1724 
1725 #undef __FUNCT__
1726 #define __FUNCT__ "SNESSolve"
1727 /*@
1728    SNESSolve - Solves a nonlinear system.  Call SNESSolve after calling
1729    SNESCreate() and optional routines of the form SNESSetXXX().
1730 
1731    Collective on SNES
1732 
1733    Input Parameters:
1734 +  snes - the SNES context
1735 -  x - the solution vector
1736 
1737    Notes:
1738    The user should initialize the vector,x, with the initial guess
1739    for the nonlinear solve prior to calling SNESSolve.  In particular,
1740    to employ an initial guess of zero, the user should explicitly set
1741    this vector to zero by calling VecSet().
1742 
1743    Level: beginner
1744 
1745 .keywords: SNES, nonlinear, solve
1746 
1747 .seealso: SNESCreate(), SNESDestroy(), SNESSetFunction(), SNESSetJacobian(), SNESSetRhs()
1748 @*/
1749 PetscErrorCode SNESSolve(SNES snes,Vec x)
1750 {
1751   PetscErrorCode ierr;
1752   PetscTruth flg;
1753 
1754   PetscFunctionBegin;
1755   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1756   PetscValidHeaderSpecific(x,VEC_COOKIE,2);
1757   PetscCheckSameComm(snes,1,x,2);
1758   if (!snes->solve) SETERRQ(1,"SNESSetType() or SNESSetFromOptions() must be called before SNESSolve()");
1759 
1760   if (!snes->setupcalled) {ierr = SNESSetUp(snes,x);CHKERRQ(ierr);}
1761   else {snes->vec_sol = snes->vec_sol_always = x;}
1762   if (snes->conv_hist_reset == PETSC_TRUE) snes->conv_hist_len = 0;
1763   ierr = PetscLogEventBegin(SNES_Solve,snes,0,0,0);CHKERRQ(ierr);
1764   snes->nfuncs = 0; snes->linear_its = 0; snes->numFailures = 0;
1765   ierr = (*(snes)->solve)(snes);CHKERRQ(ierr);
1766   ierr = PetscLogEventEnd(SNES_Solve,snes,0,0,0);CHKERRQ(ierr);
1767   ierr = PetscOptionsHasName(snes->prefix,"-snes_view",&flg);CHKERRQ(ierr);
1768   if (flg && !PetscPreLoadingOn) { ierr = SNESView(snes,PETSC_VIEWER_STDOUT_(snes->comm));CHKERRQ(ierr); }
1769   ierr = PetscOptionsHasName(snes->prefix,"-snes_test_local_min",&flg);CHKERRQ(ierr);
1770   if (flg && !PetscPreLoadingOn) { ierr = SNESTestLocalMin(snes);CHKERRQ(ierr); }
1771   if (snes->printreason) {
1772     if (snes->reason > 0) {
1773       ierr = PetscPrintf(snes->comm,"Nonlinear solve converged due to %s\n",convergedreasons[snes->reason+8]);CHKERRQ(ierr);
1774     } else {
1775       ierr = PetscPrintf(snes->comm,"Nonlinear solve did not converge due to %s\n",convergedreasons[snes->reason+8]);CHKERRQ(ierr);
1776     }
1777   }
1778 
1779   PetscFunctionReturn(0);
1780 }
1781 
1782 /* --------- Internal routines for SNES Package --------- */
1783 
1784 #undef __FUNCT__
1785 #define __FUNCT__ "SNESSetType"
1786 /*@C
1787    SNESSetType - Sets the method for the nonlinear solver.
1788 
1789    Collective on SNES
1790 
1791    Input Parameters:
1792 +  snes - the SNES context
1793 -  type - a known method
1794 
1795    Options Database Key:
1796 .  -snes_type <type> - Sets the method; use -help for a list
1797    of available methods (for instance, ls or tr)
1798 
1799    Notes:
1800    See "petsc/include/petscsnes.h" for available methods (for instance)
1801 +    SNESLS - Newton's method with line search
1802      (systems of nonlinear equations)
1803 .    SNESTR - Newton's method with trust region
1804      (systems of nonlinear equations)
1805 
1806   Normally, it is best to use the SNESSetFromOptions() command and then
1807   set the SNES solver type from the options database rather than by using
1808   this routine.  Using the options database provides the user with
1809   maximum flexibility in evaluating the many nonlinear solvers.
1810   The SNESSetType() routine is provided for those situations where it
1811   is necessary to set the nonlinear solver independently of the command
1812   line or options database.  This might be the case, for example, when
1813   the choice of solver changes during the execution of the program,
1814   and the user's application is taking responsibility for choosing the
1815   appropriate method.
1816 
1817   Level: intermediate
1818 
1819 .keywords: SNES, set, type
1820 
1821 .seealso: SNESType, SNESCreate()
1822 
1823 @*/
1824 PetscErrorCode SNESSetType(SNES snes,const SNESType type)
1825 {
1826   PetscErrorCode ierr,(*r)(SNES);
1827   PetscTruth match;
1828 
1829   PetscFunctionBegin;
1830   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1831   PetscValidCharPointer(type,2);
1832 
1833   ierr = PetscTypeCompare((PetscObject)snes,type,&match);CHKERRQ(ierr);
1834   if (match) PetscFunctionReturn(0);
1835 
1836   if (snes->setupcalled) {
1837     ierr       = (*(snes)->destroy)(snes);CHKERRQ(ierr);
1838     snes->data = 0;
1839   }
1840 
1841   /* Get the function pointers for the iterative method requested */
1842   if (!SNESRegisterAllCalled) {ierr = SNESRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
1843   ierr =  PetscFListFind(snes->comm,SNESList,type,(void (**)(void)) &r);CHKERRQ(ierr);
1844   if (!r) SETERRQ1(PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested SNES type %s",type);
1845   if (snes->data) {ierr = PetscFree(snes->data);CHKERRQ(ierr);}
1846   snes->data = 0;
1847   ierr = (*r)(snes);CHKERRQ(ierr);
1848   ierr = PetscObjectChangeTypeName((PetscObject)snes,type);CHKERRQ(ierr);
1849   PetscFunctionReturn(0);
1850 }
1851 
1852 
1853 /* --------------------------------------------------------------------- */
1854 #undef __FUNCT__
1855 #define __FUNCT__ "SNESRegisterDestroy"
1856 /*@C
1857    SNESRegisterDestroy - Frees the list of nonlinear solvers that were
1858    registered by SNESRegisterDynamic().
1859 
1860    Not Collective
1861 
1862    Level: advanced
1863 
1864 .keywords: SNES, nonlinear, register, destroy
1865 
1866 .seealso: SNESRegisterAll(), SNESRegisterAll()
1867 @*/
1868 PetscErrorCode SNESRegisterDestroy(void)
1869 {
1870   PetscErrorCode ierr;
1871 
1872   PetscFunctionBegin;
1873   if (SNESList) {
1874     ierr = PetscFListDestroy(&SNESList);CHKERRQ(ierr);
1875     SNESList = 0;
1876   }
1877   SNESRegisterAllCalled = PETSC_FALSE;
1878   PetscFunctionReturn(0);
1879 }
1880 
1881 #undef __FUNCT__
1882 #define __FUNCT__ "SNESGetType"
1883 /*@C
1884    SNESGetType - Gets the SNES method type and name (as a string).
1885 
1886    Not Collective
1887 
1888    Input Parameter:
1889 .  snes - nonlinear solver context
1890 
1891    Output Parameter:
1892 .  type - SNES method (a character string)
1893 
1894    Level: intermediate
1895 
1896 .keywords: SNES, nonlinear, get, type, name
1897 @*/
1898 PetscErrorCode SNESGetType(SNES snes,SNESType *type)
1899 {
1900   PetscFunctionBegin;
1901   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1902   PetscValidPointer(type,2);
1903   *type = snes->type_name;
1904   PetscFunctionReturn(0);
1905 }
1906 
1907 #undef __FUNCT__
1908 #define __FUNCT__ "SNESGetSolution"
1909 /*@C
1910    SNESGetSolution - Returns the vector where the approximate solution is
1911    stored.
1912 
1913    Not Collective, but Vec is parallel if SNES is parallel
1914 
1915    Input Parameter:
1916 .  snes - the SNES context
1917 
1918    Output Parameter:
1919 .  x - the solution
1920 
1921    Level: advanced
1922 
1923 .keywords: SNES, nonlinear, get, solution
1924 
1925 .seealso: SNESGetFunction(), SNESGetSolutionUpdate()
1926 @*/
1927 PetscErrorCode SNESGetSolution(SNES snes,Vec *x)
1928 {
1929   PetscFunctionBegin;
1930   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1931   PetscValidPointer(x,2);
1932   *x = snes->vec_sol_always;
1933   PetscFunctionReturn(0);
1934 }
1935 
1936 #undef __FUNCT__
1937 #define __FUNCT__ "SNESGetSolutionUpdate"
1938 /*@C
1939    SNESGetSolutionUpdate - Returns the vector where the solution update is
1940    stored.
1941 
1942    Not Collective, but Vec is parallel if SNES is parallel
1943 
1944    Input Parameter:
1945 .  snes - the SNES context
1946 
1947    Output Parameter:
1948 .  x - the solution update
1949 
1950    Level: advanced
1951 
1952 .keywords: SNES, nonlinear, get, solution, update
1953 
1954 .seealso: SNESGetSolution(), SNESGetFunction
1955 @*/
1956 PetscErrorCode SNESGetSolutionUpdate(SNES snes,Vec *x)
1957 {
1958   PetscFunctionBegin;
1959   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1960   PetscValidPointer(x,2);
1961   *x = snes->vec_sol_update_always;
1962   PetscFunctionReturn(0);
1963 }
1964 
1965 #undef __FUNCT__
1966 #define __FUNCT__ "SNESGetFunction"
1967 /*@C
1968    SNESGetFunction - Returns the vector where the function is stored.
1969 
1970    Not Collective, but Vec is parallel if SNES is parallel
1971 
1972    Input Parameter:
1973 .  snes - the SNES context
1974 
1975    Output Parameter:
1976 +  r - the function (or PETSC_NULL)
1977 .  ctx - the function context (or PETSC_NULL)
1978 -  func - the function (or PETSC_NULL)
1979 
1980    Level: advanced
1981 
1982 .keywords: SNES, nonlinear, get, function
1983 
1984 .seealso: SNESSetFunction(), SNESGetSolution()
1985 @*/
1986 PetscErrorCode SNESGetFunction(SNES snes,Vec *r,void **ctx,int (**func)(SNES,Vec,Vec,void*))
1987 {
1988   PetscFunctionBegin;
1989   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
1990   if (r)    *r    = snes->vec_func_always;
1991   if (ctx)  *ctx  = snes->funP;
1992   if (func) *func = snes->computefunction;
1993   PetscFunctionReturn(0);
1994 }
1995 
1996 #undef __FUNCT__
1997 #define __FUNCT__ "SNESSetOptionsPrefix"
1998 /*@C
1999    SNESSetOptionsPrefix - Sets the prefix used for searching for all
2000    SNES options in the database.
2001 
2002    Collective on SNES
2003 
2004    Input Parameter:
2005 +  snes - the SNES context
2006 -  prefix - the prefix to prepend to all option names
2007 
2008    Notes:
2009    A hyphen (-) must NOT be given at the beginning of the prefix name.
2010    The first character of all runtime options is AUTOMATICALLY the hyphen.
2011 
2012    Level: advanced
2013 
2014 .keywords: SNES, set, options, prefix, database
2015 
2016 .seealso: SNESSetFromOptions()
2017 @*/
2018 PetscErrorCode SNESSetOptionsPrefix(SNES snes,const char prefix[])
2019 {
2020   PetscErrorCode ierr;
2021 
2022   PetscFunctionBegin;
2023   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
2024   ierr = PetscObjectSetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr);
2025   ierr = KSPSetOptionsPrefix(snes->ksp,prefix);CHKERRQ(ierr);
2026   PetscFunctionReturn(0);
2027 }
2028 
2029 #undef __FUNCT__
2030 #define __FUNCT__ "SNESAppendOptionsPrefix"
2031 /*@C
2032    SNESAppendOptionsPrefix - Appends to the prefix used for searching for all
2033    SNES options in the database.
2034 
2035    Collective on SNES
2036 
2037    Input Parameters:
2038 +  snes - the SNES context
2039 -  prefix - the prefix to prepend to all option names
2040 
2041    Notes:
2042    A hyphen (-) must NOT be given at the beginning of the prefix name.
2043    The first character of all runtime options is AUTOMATICALLY the hyphen.
2044 
2045    Level: advanced
2046 
2047 .keywords: SNES, append, options, prefix, database
2048 
2049 .seealso: SNESGetOptionsPrefix()
2050 @*/
2051 PetscErrorCode SNESAppendOptionsPrefix(SNES snes,const char prefix[])
2052 {
2053   PetscErrorCode ierr;
2054 
2055   PetscFunctionBegin;
2056   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
2057   ierr = PetscObjectAppendOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr);
2058   ierr = KSPAppendOptionsPrefix(snes->ksp,prefix);CHKERRQ(ierr);
2059   PetscFunctionReturn(0);
2060 }
2061 
2062 #undef __FUNCT__
2063 #define __FUNCT__ "SNESGetOptionsPrefix"
2064 /*@C
2065    SNESGetOptionsPrefix - Sets the prefix used for searching for all
2066    SNES options in the database.
2067 
2068    Not Collective
2069 
2070    Input Parameter:
2071 .  snes - the SNES context
2072 
2073    Output Parameter:
2074 .  prefix - pointer to the prefix string used
2075 
2076    Notes: On the fortran side, the user should pass in a string 'prifix' of
2077    sufficient length to hold the prefix.
2078 
2079    Level: advanced
2080 
2081 .keywords: SNES, get, options, prefix, database
2082 
2083 .seealso: SNESAppendOptionsPrefix()
2084 @*/
2085 PetscErrorCode SNESGetOptionsPrefix(SNES snes,char *prefix[])
2086 {
2087   PetscErrorCode ierr;
2088 
2089   PetscFunctionBegin;
2090   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
2091   ierr = PetscObjectGetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr);
2092   PetscFunctionReturn(0);
2093 }
2094 
2095 
2096 #undef __FUNCT__
2097 #define __FUNCT__ "SNESRegister"
2098 /*@C
2099   SNESRegister - See SNESRegisterDynamic()
2100 
2101   Level: advanced
2102 @*/
2103 PetscErrorCode SNESRegister(const char sname[],const char path[],const char name[],int (*function)(SNES))
2104 {
2105   char fullname[PETSC_MAX_PATH_LEN];
2106   PetscErrorCode ierr;
2107 
2108   PetscFunctionBegin;
2109   ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr);
2110   ierr = PetscFListAdd(&SNESList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
2111   PetscFunctionReturn(0);
2112 }
2113 
2114 #undef __FUNCT__
2115 #define __FUNCT__ "SNESTestLocalMin"
2116 PetscErrorCode SNESTestLocalMin(SNES snes)
2117 {
2118   PetscErrorCode ierr;
2119   int N,i,j;
2120   Vec         u,uh,fh;
2121   PetscScalar value;
2122   PetscReal   norm;
2123 
2124   PetscFunctionBegin;
2125   ierr = SNESGetSolution(snes,&u);CHKERRQ(ierr);
2126   ierr = VecDuplicate(u,&uh);CHKERRQ(ierr);
2127   ierr = VecDuplicate(u,&fh);CHKERRQ(ierr);
2128 
2129   /* currently only works for sequential */
2130   ierr = PetscPrintf(PETSC_COMM_WORLD,"Testing FormFunction() for local min\n");
2131   ierr = VecGetSize(u,&N);CHKERRQ(ierr);
2132   for (i=0; i<N; i++) {
2133     ierr = VecCopy(u,uh);CHKERRQ(ierr);
2134     ierr  = PetscPrintf(PETSC_COMM_WORLD,"i = %d\n",i);CHKERRQ(ierr);
2135     for (j=-10; j<11; j++) {
2136       value = PetscSign(j)*exp(PetscAbs(j)-10.0);
2137       ierr  = VecSetValue(uh,i,value,ADD_VALUES);CHKERRQ(ierr);
2138       ierr  = SNESComputeFunction(snes,uh,fh);CHKERRQ(ierr);
2139       ierr  = VecNorm(fh,NORM_2,&norm);CHKERRQ(ierr);
2140       ierr  = PetscPrintf(PETSC_COMM_WORLD,"       j norm %d %18.16e\n",j,norm);CHKERRQ(ierr);
2141       value = -value;
2142       ierr  = VecSetValue(uh,i,value,ADD_VALUES);CHKERRQ(ierr);
2143     }
2144   }
2145   ierr = VecDestroy(uh);CHKERRQ(ierr);
2146   ierr = VecDestroy(fh);CHKERRQ(ierr);
2147   PetscFunctionReturn(0);
2148 }
2149