xref: /petsc/src/snes/interface/snes.c (revision ea709b57ddb8cc304f11df2e9a39d6a8fdb28b53)
1*ea709b57SSatish Balay /*$Id: snes.c,v 1.233 2001/08/06 21:17:07 bsmith Exp balay $*/
29b94acceSBarry Smith 
3e090d566SSatish Balay #include "src/snes/snesimpl.h"      /*I "petscsnes.h"  I*/
49b94acceSBarry Smith 
54c49b128SBarry Smith PetscTruth SNESRegisterAllCalled = PETSC_FALSE;
6b0a32e0cSBarry Smith PetscFList      SNESList = 0;
782bf6240SBarry Smith 
84a2ae208SSatish Balay #undef __FUNCT__
9a09944afSBarry Smith #define __FUNCT__ "SNESGetProblemType"
10a09944afSBarry Smith /*@C
11a09944afSBarry Smith    SNESGetProblemType -Indicates if SNES is solving a nonlinear system or a minimization
12a09944afSBarry Smith 
13a09944afSBarry Smith    Not Collective
14a09944afSBarry Smith 
15a09944afSBarry Smith    Input Parameter:
16a09944afSBarry Smith .  SNES - the SNES context
17a09944afSBarry Smith 
18a09944afSBarry Smith    Output Parameter:
19a09944afSBarry Smith .   type - SNES_NONLINEAR_EQUATIONS (for systems of nonlinear equations)
20a09944afSBarry Smith    or SNES_UNCONSTRAINED_MINIMIZATION (for unconstrained minimization)
21a09944afSBarry Smith 
22a09944afSBarry Smith    Level: intermediate
23a09944afSBarry Smith 
24a09944afSBarry Smith .keywords: SNES, problem type
25a09944afSBarry Smith 
26a09944afSBarry Smith .seealso: SNESCreate()
27a09944afSBarry Smith @*/
28a09944afSBarry Smith int SNESGetProblemType(SNES snes,SNESProblemType *type)
29a09944afSBarry Smith {
30a09944afSBarry Smith   PetscFunctionBegin;
31a09944afSBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
32a09944afSBarry Smith   *type = snes->method_class;
33a09944afSBarry Smith   PetscFunctionReturn(0);
34a09944afSBarry Smith }
35a09944afSBarry Smith 
36a09944afSBarry Smith #undef __FUNCT__
374a2ae208SSatish Balay #define __FUNCT__ "SNESView"
387e2c5f70SBarry Smith /*@C
399b94acceSBarry Smith    SNESView - Prints the SNES data structure.
409b94acceSBarry Smith 
414c49b128SBarry Smith    Collective on SNES
42fee21e36SBarry Smith 
43c7afd0dbSLois Curfman McInnes    Input Parameters:
44c7afd0dbSLois Curfman McInnes +  SNES - the SNES context
45c7afd0dbSLois Curfman McInnes -  viewer - visualization context
46c7afd0dbSLois Curfman McInnes 
479b94acceSBarry Smith    Options Database Key:
48c8a8ba5cSLois Curfman McInnes .  -snes_view - Calls SNESView() at end of SNESSolve()
499b94acceSBarry Smith 
509b94acceSBarry Smith    Notes:
519b94acceSBarry Smith    The available visualization contexts include
52b0a32e0cSBarry Smith +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
53b0a32e0cSBarry Smith -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
54c8a8ba5cSLois Curfman McInnes          output where only the first processor opens
55c8a8ba5cSLois Curfman McInnes          the file.  All other processors send their
56c8a8ba5cSLois Curfman McInnes          data to the first processor to print.
579b94acceSBarry Smith 
583e081fefSLois Curfman McInnes    The user can open an alternative visualization context with
59b0a32e0cSBarry Smith    PetscViewerASCIIOpen() - output to a specified file.
609b94acceSBarry Smith 
6136851e7fSLois Curfman McInnes    Level: beginner
6236851e7fSLois Curfman McInnes 
639b94acceSBarry Smith .keywords: SNES, view
649b94acceSBarry Smith 
65b0a32e0cSBarry Smith .seealso: PetscViewerASCIIOpen()
669b94acceSBarry Smith @*/
67b0a32e0cSBarry Smith int SNESView(SNES snes,PetscViewer viewer)
689b94acceSBarry Smith {
699b94acceSBarry Smith   SNES_KSP_EW_ConvCtx *kctx;
709b94acceSBarry Smith   int                 ierr;
719b94acceSBarry Smith   SLES                sles;
72454a90a3SBarry Smith   char                *type;
736831982aSBarry Smith   PetscTruth          isascii,isstring;
749b94acceSBarry Smith 
753a40ed3dSBarry Smith   PetscFunctionBegin;
7674679c65SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
77b0a32e0cSBarry Smith   if (!viewer) viewer = PETSC_VIEWER_STDOUT_(snes->comm);
78b0a32e0cSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_COOKIE);
796831982aSBarry Smith   PetscCheckSameComm(snes,viewer);
8074679c65SBarry Smith 
81b0a32e0cSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);CHKERRQ(ierr);
82b0a32e0cSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_STRING,&isstring);CHKERRQ(ierr);
830f5bd95cSBarry Smith   if (isascii) {
843a7fca6bSBarry Smith     if (snes->prefix) {
853a7fca6bSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"SNES Object:(%s)\n",snes->prefix);CHKERRQ(ierr);
863a7fca6bSBarry Smith     } else {
87b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"SNES Object:\n");CHKERRQ(ierr);
883a7fca6bSBarry Smith     }
89454a90a3SBarry Smith     ierr = SNESGetType(snes,&type);CHKERRQ(ierr);
90454a90a3SBarry Smith     if (type) {
91b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"  type: %s\n",type);CHKERRQ(ierr);
92184914b5SBarry Smith     } else {
93b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"  type: not set yet\n");CHKERRQ(ierr);
94184914b5SBarry Smith     }
950ef38995SBarry Smith     if (snes->view) {
96b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
970ef38995SBarry Smith       ierr = (*snes->view)(snes,viewer);CHKERRQ(ierr);
98b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
990ef38995SBarry Smith     }
100b0a32e0cSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  maximum iterations=%d, maximum function evaluations=%d\n",snes->max_its,snes->max_funcs);CHKERRQ(ierr);
101b0a32e0cSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  tolerances: relative=%g, absolute=%g, truncation=%g, solution=%g\n",
102d132466eSBarry Smith                  snes->rtol,snes->atol,snes->trunctol,snes->xtol);CHKERRQ(ierr);
103b0a32e0cSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  total number of linear solver iterations=%d\n",snes->linear_its);CHKERRQ(ierr);
104b0a32e0cSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  total number of function evaluations=%d\n",snes->nfuncs);CHKERRQ(ierr);
1050ef38995SBarry Smith     if (snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) {
106b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"  min function tolerance=%g\n",snes->fmin);CHKERRQ(ierr);
1070ef38995SBarry Smith     }
1089b94acceSBarry Smith     if (snes->ksp_ewconv) {
1099b94acceSBarry Smith       kctx = (SNES_KSP_EW_ConvCtx *)snes->kspconvctx;
1109b94acceSBarry Smith       if (kctx) {
111b0a32e0cSBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"  Eisenstat-Walker computation of KSP relative tolerance (version %d)\n",kctx->version);CHKERRQ(ierr);
112b0a32e0cSBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    rtol_0=%g, rtol_max=%g, threshold=%g\n",kctx->rtol_0,kctx->rtol_max,kctx->threshold);CHKERRQ(ierr);
113b0a32e0cSBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    gamma=%g, alpha=%g, alpha2=%g\n",kctx->gamma,kctx->alpha,kctx->alpha2);CHKERRQ(ierr);
1149b94acceSBarry Smith       }
1159b94acceSBarry Smith     }
1160f5bd95cSBarry Smith   } else if (isstring) {
117454a90a3SBarry Smith     ierr = SNESGetType(snes,&type);CHKERRQ(ierr);
118b0a32e0cSBarry Smith     ierr = PetscViewerStringSPrintf(viewer," %-3.3s",type);CHKERRQ(ierr);
11919bcc07fSBarry Smith   }
12077ed5343SBarry Smith   ierr = SNESGetSLES(snes,&sles);CHKERRQ(ierr);
121b0a32e0cSBarry Smith   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1229b94acceSBarry Smith   ierr = SLESView(sles,viewer);CHKERRQ(ierr);
123b0a32e0cSBarry Smith   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1243a40ed3dSBarry Smith   PetscFunctionReturn(0);
1259b94acceSBarry Smith }
1269b94acceSBarry Smith 
1274a2ae208SSatish Balay #undef __FUNCT__
1284a2ae208SSatish Balay #define __FUNCT__ "SNESSetFromOptions"
1299b94acceSBarry Smith /*@
130682d7d0cSBarry Smith    SNESSetFromOptions - Sets various SNES and SLES parameters from user options.
1319b94acceSBarry Smith 
132c7afd0dbSLois Curfman McInnes    Collective on SNES
133c7afd0dbSLois Curfman McInnes 
1349b94acceSBarry Smith    Input Parameter:
1359b94acceSBarry Smith .  snes - the SNES context
1369b94acceSBarry Smith 
13736851e7fSLois Curfman McInnes    Options Database Keys:
1386831982aSBarry Smith +  -snes_type <type> - ls, tr, umls, umtr, test
13982738288SBarry Smith .  -snes_stol - convergence tolerance in terms of the norm
14082738288SBarry Smith                 of the change in the solution between steps
141b39c3a46SLois Curfman McInnes .  -snes_atol <atol> - absolute tolerance of residual norm
142b39c3a46SLois Curfman McInnes .  -snes_rtol <rtol> - relative decrease in tolerance norm from initial
143b39c3a46SLois Curfman McInnes .  -snes_max_it <max_it> - maximum number of iterations
144b39c3a46SLois Curfman McInnes .  -snes_max_funcs <max_funcs> - maximum number of function evaluations
145b39c3a46SLois Curfman McInnes .  -snes_trtol <trtol> - trust region tolerance
14682738288SBarry Smith .  -snes_no_convergence_test - skip convergence test in nonlinear or minimization
14782738288SBarry Smith                                solver; hence iterations will continue until max_it
1481fbbfb26SLois Curfman McInnes                                or some other criterion is reached. Saves expense
14982738288SBarry Smith                                of convergence test
15082738288SBarry Smith .  -snes_monitor - prints residual norm at each iteration
151d132466eSBarry Smith .  -snes_vecmonitor - plots solution at each iteration
152d132466eSBarry Smith .  -snes_vecmonitor_update - plots update to solution at each iteration
15382738288SBarry Smith .  -snes_xmonitor - plots residual norm at each iteration
154e24b481bSBarry Smith .  -snes_fd - use finite differences to compute Jacobian; very slow, only for testing
15536851e7fSLois Curfman McInnes -  -snes_mf_ksp_monitor - if using matrix-free multiply then print h at each KSP iteration
15682738288SBarry Smith 
15782738288SBarry Smith     Options Database for Eisenstat-Walker method:
15882738288SBarry Smith +  -snes_ksp_eq_conv - use Eisenstat-Walker method for determining linear system convergence
15982738288SBarry Smith .  -snes_ksp_eq_version ver - version of  Eisenstat-Walker method
16036851e7fSLois Curfman McInnes .  -snes_ksp_ew_rtol0 <rtol0> - Sets rtol0
16136851e7fSLois Curfman McInnes .  -snes_ksp_ew_rtolmax <rtolmax> - Sets rtolmax
16236851e7fSLois Curfman McInnes .  -snes_ksp_ew_gamma <gamma> - Sets gamma
16336851e7fSLois Curfman McInnes .  -snes_ksp_ew_alpha <alpha> - Sets alpha
16436851e7fSLois Curfman McInnes .  -snes_ksp_ew_alpha2 <alpha2> - Sets alpha2
16536851e7fSLois Curfman McInnes -  -snes_ksp_ew_threshold <threshold> - Sets threshold
16682738288SBarry Smith 
16711ca99fdSLois Curfman McInnes    Notes:
16811ca99fdSLois Curfman McInnes    To see all options, run your program with the -help option or consult
16911ca99fdSLois Curfman McInnes    the users manual.
17083e2fdc7SBarry Smith 
17136851e7fSLois Curfman McInnes    Level: beginner
17236851e7fSLois Curfman McInnes 
1739b94acceSBarry Smith .keywords: SNES, nonlinear, set, options, database
1749b94acceSBarry Smith 
17569ed319cSSatish Balay .seealso: SNESSetOptionsPrefix()
1769b94acceSBarry Smith @*/
1779b94acceSBarry Smith int SNESSetFromOptions(SNES snes)
1789b94acceSBarry Smith {
1799b94acceSBarry Smith   SLES                sles;
180186905e3SBarry Smith   SNES_KSP_EW_ConvCtx *kctx = (SNES_KSP_EW_ConvCtx *)snes->kspconvctx;
181f1af5d2fSBarry Smith   PetscTruth          flg;
182186905e3SBarry Smith   int                 ierr;
183186905e3SBarry Smith   char                *deft,type[256];
1849b94acceSBarry Smith 
1853a40ed3dSBarry Smith   PetscFunctionBegin;
18677c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
187ca161407SBarry Smith 
188b0a32e0cSBarry Smith   ierr = PetscOptionsBegin(snes->comm,snes->prefix,"Nonlinear solver (SNES) options","SNES");CHKERRQ(ierr);
189186905e3SBarry Smith     if (snes->type_name) {
190186905e3SBarry Smith       deft = snes->type_name;
191186905e3SBarry Smith     } else {
192186905e3SBarry Smith       if (snes->method_class == SNES_NONLINEAR_EQUATIONS) {
193186905e3SBarry Smith         deft = SNESEQLS;
194186905e3SBarry Smith       } else {
195186905e3SBarry Smith         deft = SNESUMTR;
196d64ed03dSBarry Smith       }
197d64ed03dSBarry Smith     }
1984bbc92c1SBarry Smith 
199186905e3SBarry Smith     if (!SNESRegisterAllCalled) {ierr = SNESRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
200b0a32e0cSBarry Smith     ierr = PetscOptionsList("-snes_type","Nonlinear solver method","SNESSetType",SNESList,deft,type,256,&flg);CHKERRQ(ierr);
201d64ed03dSBarry Smith     if (flg) {
202186905e3SBarry Smith       ierr = SNESSetType(snes,type);CHKERRQ(ierr);
203186905e3SBarry Smith     } else if (!snes->type_name) {
204186905e3SBarry Smith       ierr = SNESSetType(snes,deft);CHKERRQ(ierr);
205d64ed03dSBarry Smith     }
20693c39befSBarry Smith 
20787828ca2SBarry Smith     ierr = PetscOptionsReal("-snes_stol","Stop if step length less then","SNESSetTolerances",snes->xtol,&snes->xtol,0);CHKERRQ(ierr);
20887828ca2SBarry Smith     ierr = PetscOptionsReal("-snes_atol","Stop if function norm less then","SNESSetTolerances",snes->atol,&snes->atol,0);CHKERRQ(ierr);
209186905e3SBarry Smith 
21087828ca2SBarry Smith     ierr = PetscOptionsReal("-snes_rtol","Stop if decrease in function norm less then","SNESSetTolerances",snes->rtol,&snes->rtol,0);CHKERRQ(ierr);
211b0a32e0cSBarry Smith     ierr = PetscOptionsInt("-snes_max_it","Maximum iterations","SNESSetTolerances",snes->max_its,&snes->max_its,PETSC_NULL);CHKERRQ(ierr);
212b0a32e0cSBarry Smith     ierr = PetscOptionsInt("-snes_max_funcs","Maximum function evaluations","SNESSetTolerances",snes->max_funcs,&snes->max_funcs,PETSC_NULL);CHKERRQ(ierr);
21387828ca2SBarry Smith     ierr = PetscOptionsReal("-snes_fmin","Minimization function tolerance","SNESSetMinimizationFunctionTolerance",snes->fmin,&snes->fmin,0);CHKERRQ(ierr);
214186905e3SBarry Smith 
215b0a32e0cSBarry Smith     ierr = PetscOptionsName("-snes_ksp_ew_conv","Use Eisentat-Walker linear system convergence test","SNES_KSP_SetParametersEW",&snes->ksp_ewconv);CHKERRQ(ierr);
216186905e3SBarry Smith 
217b0a32e0cSBarry Smith     ierr = PetscOptionsInt("-snes_ksp_ew_version","Version 1 or 2","SNES_KSP_SetParametersEW",kctx->version,&kctx->version,0);CHKERRQ(ierr);
21887828ca2SBarry Smith     ierr = PetscOptionsReal("-snes_ksp_ew_rtol0","0 <= rtol0 < 1","SNES_KSP_SetParametersEW",kctx->rtol_0,&kctx->rtol_0,0);CHKERRQ(ierr);
21987828ca2SBarry Smith     ierr = PetscOptionsReal("-snes_ksp_ew_rtolmax","0 <= rtolmax < 1","SNES_KSP_SetParametersEW",kctx->rtol_max,&kctx->rtol_max,0);CHKERRQ(ierr);
22087828ca2SBarry Smith     ierr = PetscOptionsReal("-snes_ksp_ew_gamma","0 <= gamma <= 1","SNES_KSP_SetParametersEW",kctx->gamma,&kctx->gamma,0);CHKERRQ(ierr);
22187828ca2SBarry Smith     ierr = PetscOptionsReal("-snes_ksp_ew_alpha","1 < alpha <= 2","SNES_KSP_SetParametersEW",kctx->alpha,&kctx->alpha,0);CHKERRQ(ierr);
22287828ca2SBarry Smith     ierr = PetscOptionsReal("-snes_ksp_ew_alpha2","alpha2","SNES_KSP_SetParametersEW",kctx->alpha2,&kctx->alpha2,0);CHKERRQ(ierr);
22387828ca2SBarry Smith     ierr = PetscOptionsReal("-snes_ksp_ew_threshold","0 < threshold < 1","SNES_KSP_SetParametersEW",kctx->threshold,&kctx->threshold,0);CHKERRQ(ierr);
224186905e3SBarry Smith 
225b0a32e0cSBarry Smith     ierr = PetscOptionsName("-snes_no_convergence_test","Don't test for convergence","None",&flg);CHKERRQ(ierr);
22693c39befSBarry Smith     if (flg) {snes->converged = 0;}
227b0a32e0cSBarry Smith     ierr = PetscOptionsName("-snes_cancelmonitors","Remove all monitors","SNESClearMonitor",&flg);CHKERRQ(ierr);
2285cd90555SBarry Smith     if (flg) {ierr = SNESClearMonitor(snes);CHKERRQ(ierr);}
229b0a32e0cSBarry Smith     ierr = PetscOptionsName("-snes_monitor","Monitor norm of function","SNESDefaultMonitor",&flg);CHKERRQ(ierr);
230b8a78c4aSBarry Smith     if (flg) {ierr = SNESSetMonitor(snes,SNESDefaultMonitor,0,0);CHKERRQ(ierr);}
2313a7fca6bSBarry Smith     ierr = PetscOptionsName("-snes_ratiomonitor","Monitor norm of function","SNESSetRatioMonitor",&flg);CHKERRQ(ierr);
2323a7fca6bSBarry Smith     if (flg) {ierr = SNESSetRatioMonitor(snes);CHKERRQ(ierr);}
233b0a32e0cSBarry Smith     ierr = PetscOptionsName("-snes_smonitor","Monitor norm of function (fewer digits)","SNESDefaultSMonitor",&flg);CHKERRQ(ierr);
234b8a78c4aSBarry Smith     if (flg) {ierr = SNESSetMonitor(snes,SNESDefaultSMonitor,0,0);CHKERRQ(ierr);}
235b0a32e0cSBarry Smith     ierr = PetscOptionsName("-snes_vecmonitor","Plot solution at each iteration","SNESVecViewMonitor",&flg);CHKERRQ(ierr);
236b8a78c4aSBarry Smith     if (flg) {ierr = SNESSetMonitor(snes,SNESVecViewMonitor,0,0);CHKERRQ(ierr);}
237b0a32e0cSBarry Smith     ierr = PetscOptionsName("-snes_vecmonitor_update","Plot correction at each iteration","SNESVecViewUpdateMonitor",&flg);CHKERRQ(ierr);
2387c922b88SBarry Smith     if (flg) {ierr = SNESSetMonitor(snes,SNESVecViewUpdateMonitor,0,0);CHKERRQ(ierr);}
239b0a32e0cSBarry Smith     ierr = PetscOptionsName("-snes_xmonitor","Plot function norm at each iteration","SNESLGMonitor",&flg);CHKERRQ(ierr);
240186905e3SBarry Smith     if (flg) {ierr = SNESSetMonitor(snes,SNESLGMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);}
241e24b481bSBarry Smith 
242b0a32e0cSBarry Smith     ierr = PetscOptionsName("-snes_fd","Use finite differences (slow) to compute Jacobian","SNESDefaultComputeJacobian",&flg);CHKERRQ(ierr);
2433c7409f5SSatish Balay     if (flg && snes->method_class == SNES_NONLINEAR_EQUATIONS) {
244186905e3SBarry Smith       ierr = SNESSetJacobian(snes,snes->jacobian,snes->jacobian_pre,SNESDefaultComputeJacobian,snes->funP);CHKERRQ(ierr);
245b0a32e0cSBarry Smith       PetscLogInfo(snes,"SNESSetFromOptions: Setting default finite difference Jacobian matrix\n");
246981c4779SBarry Smith     } else if (flg && snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) {
247186905e3SBarry Smith       ierr = SNESSetHessian(snes,snes->jacobian,snes->jacobian_pre,SNESDefaultComputeHessian,snes->funP);CHKERRQ(ierr);
248b0a32e0cSBarry Smith       PetscLogInfo(snes,"SNESSetFromOptions: Setting default finite difference Hessian matrix\n");
2499b94acceSBarry Smith     }
250639f9d9dSBarry Smith 
251186905e3SBarry Smith     if (snes->setfromoptions) {
252186905e3SBarry Smith       ierr = (*snes->setfromoptions)(snes);CHKERRQ(ierr);
253639f9d9dSBarry Smith     }
254639f9d9dSBarry Smith 
255b0a32e0cSBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
2564bbc92c1SBarry Smith 
2579b94acceSBarry Smith   ierr = SNESGetSLES(snes,&sles);CHKERRQ(ierr);
2589b94acceSBarry Smith   ierr = SLESSetFromOptions(sles);CHKERRQ(ierr);
25993993e2dSLois Curfman McInnes 
2603a40ed3dSBarry Smith   PetscFunctionReturn(0);
2619b94acceSBarry Smith }
2629b94acceSBarry Smith 
263a847f771SSatish Balay 
2644a2ae208SSatish Balay #undef __FUNCT__
2654a2ae208SSatish Balay #define __FUNCT__ "SNESSetApplicationContext"
2669b94acceSBarry Smith /*@
2679b94acceSBarry Smith    SNESSetApplicationContext - Sets the optional user-defined context for
2689b94acceSBarry Smith    the nonlinear solvers.
2699b94acceSBarry Smith 
270fee21e36SBarry Smith    Collective on SNES
271fee21e36SBarry Smith 
272c7afd0dbSLois Curfman McInnes    Input Parameters:
273c7afd0dbSLois Curfman McInnes +  snes - the SNES context
274c7afd0dbSLois Curfman McInnes -  usrP - optional user context
275c7afd0dbSLois Curfman McInnes 
27636851e7fSLois Curfman McInnes    Level: intermediate
27736851e7fSLois Curfman McInnes 
2789b94acceSBarry Smith .keywords: SNES, nonlinear, set, application, context
2799b94acceSBarry Smith 
2809b94acceSBarry Smith .seealso: SNESGetApplicationContext()
2819b94acceSBarry Smith @*/
2829b94acceSBarry Smith int SNESSetApplicationContext(SNES snes,void *usrP)
2839b94acceSBarry Smith {
2843a40ed3dSBarry Smith   PetscFunctionBegin;
28577c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2869b94acceSBarry Smith   snes->user		= usrP;
2873a40ed3dSBarry Smith   PetscFunctionReturn(0);
2889b94acceSBarry Smith }
28974679c65SBarry Smith 
2904a2ae208SSatish Balay #undef __FUNCT__
2914a2ae208SSatish Balay #define __FUNCT__ "SNESGetApplicationContext"
2929b94acceSBarry Smith /*@C
2939b94acceSBarry Smith    SNESGetApplicationContext - Gets the user-defined context for the
2949b94acceSBarry Smith    nonlinear solvers.
2959b94acceSBarry Smith 
296c7afd0dbSLois Curfman McInnes    Not Collective
297c7afd0dbSLois Curfman McInnes 
2989b94acceSBarry Smith    Input Parameter:
2999b94acceSBarry Smith .  snes - SNES context
3009b94acceSBarry Smith 
3019b94acceSBarry Smith    Output Parameter:
3029b94acceSBarry Smith .  usrP - user context
3039b94acceSBarry Smith 
30436851e7fSLois Curfman McInnes    Level: intermediate
30536851e7fSLois Curfman McInnes 
3069b94acceSBarry Smith .keywords: SNES, nonlinear, get, application, context
3079b94acceSBarry Smith 
3089b94acceSBarry Smith .seealso: SNESSetApplicationContext()
3099b94acceSBarry Smith @*/
3109b94acceSBarry Smith int SNESGetApplicationContext(SNES snes,void **usrP)
3119b94acceSBarry Smith {
3123a40ed3dSBarry Smith   PetscFunctionBegin;
31377c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
3149b94acceSBarry Smith   *usrP = snes->user;
3153a40ed3dSBarry Smith   PetscFunctionReturn(0);
3169b94acceSBarry Smith }
31774679c65SBarry Smith 
3184a2ae208SSatish Balay #undef __FUNCT__
3194a2ae208SSatish Balay #define __FUNCT__ "SNESGetIterationNumber"
3209b94acceSBarry Smith /*@
321c8228a4eSBarry Smith    SNESGetIterationNumber - Gets the number of nonlinear iterations completed
322c8228a4eSBarry Smith    at this time.
3239b94acceSBarry Smith 
324c7afd0dbSLois Curfman McInnes    Not Collective
325c7afd0dbSLois Curfman McInnes 
3269b94acceSBarry Smith    Input Parameter:
3279b94acceSBarry Smith .  snes - SNES context
3289b94acceSBarry Smith 
3299b94acceSBarry Smith    Output Parameter:
3309b94acceSBarry Smith .  iter - iteration number
3319b94acceSBarry Smith 
332c8228a4eSBarry Smith    Notes:
333c8228a4eSBarry Smith    For example, during the computation of iteration 2 this would return 1.
334c8228a4eSBarry Smith 
335c8228a4eSBarry Smith    This is useful for using lagged Jacobians (where one does not recompute the
33608405cd6SLois Curfman McInnes    Jacobian at each SNES iteration). For example, the code
33708405cd6SLois Curfman McInnes .vb
33808405cd6SLois Curfman McInnes       ierr = SNESGetIterationNumber(snes,&it);
33908405cd6SLois Curfman McInnes       if (!(it % 2)) {
34008405cd6SLois Curfman McInnes         [compute Jacobian here]
34108405cd6SLois Curfman McInnes       }
34208405cd6SLois Curfman McInnes .ve
343c8228a4eSBarry Smith    can be used in your ComputeJacobian() function to cause the Jacobian to be
34408405cd6SLois Curfman McInnes    recomputed every second SNES iteration.
345c8228a4eSBarry Smith 
34636851e7fSLois Curfman McInnes    Level: intermediate
34736851e7fSLois Curfman McInnes 
3489b94acceSBarry Smith .keywords: SNES, nonlinear, get, iteration, number
3499b94acceSBarry Smith @*/
3509b94acceSBarry Smith int SNESGetIterationNumber(SNES snes,int* iter)
3519b94acceSBarry Smith {
3523a40ed3dSBarry Smith   PetscFunctionBegin;
35377c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
35474679c65SBarry Smith   PetscValidIntPointer(iter);
3559b94acceSBarry Smith   *iter = snes->iter;
3563a40ed3dSBarry Smith   PetscFunctionReturn(0);
3579b94acceSBarry Smith }
35874679c65SBarry Smith 
3594a2ae208SSatish Balay #undef __FUNCT__
3604a2ae208SSatish Balay #define __FUNCT__ "SNESGetFunctionNorm"
3619b94acceSBarry Smith /*@
3629b94acceSBarry Smith    SNESGetFunctionNorm - Gets the norm of the current function that was set
3639b94acceSBarry Smith    with SNESSSetFunction().
3649b94acceSBarry Smith 
365c7afd0dbSLois Curfman McInnes    Collective on SNES
366c7afd0dbSLois Curfman McInnes 
3679b94acceSBarry Smith    Input Parameter:
3689b94acceSBarry Smith .  snes - SNES context
3699b94acceSBarry Smith 
3709b94acceSBarry Smith    Output Parameter:
3719b94acceSBarry Smith .  fnorm - 2-norm of function
3729b94acceSBarry Smith 
3739b94acceSBarry Smith    Note:
3749b94acceSBarry Smith    SNESGetFunctionNorm() is valid for SNES_NONLINEAR_EQUATIONS methods only.
375a86d99e1SLois Curfman McInnes    A related routine for SNES_UNCONSTRAINED_MINIMIZATION methods is
376a86d99e1SLois Curfman McInnes    SNESGetGradientNorm().
3779b94acceSBarry Smith 
37836851e7fSLois Curfman McInnes    Level: intermediate
37936851e7fSLois Curfman McInnes 
3809b94acceSBarry Smith .keywords: SNES, nonlinear, get, function, norm
381a86d99e1SLois Curfman McInnes 
38208405cd6SLois Curfman McInnes .seealso: SNESGetFunction()
3839b94acceSBarry Smith @*/
38487828ca2SBarry Smith int SNESGetFunctionNorm(SNES snes,PetscScalar *fnorm)
3859b94acceSBarry Smith {
3863a40ed3dSBarry Smith   PetscFunctionBegin;
38777c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
38874679c65SBarry Smith   PetscValidScalarPointer(fnorm);
38974679c65SBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
39029bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"For SNES_NONLINEAR_EQUATIONS only");
39174679c65SBarry Smith   }
3929b94acceSBarry Smith   *fnorm = snes->norm;
3933a40ed3dSBarry Smith   PetscFunctionReturn(0);
3949b94acceSBarry Smith }
39574679c65SBarry Smith 
3964a2ae208SSatish Balay #undef __FUNCT__
3974a2ae208SSatish Balay #define __FUNCT__ "SNESGetGradientNorm"
3989b94acceSBarry Smith /*@
3999b94acceSBarry Smith    SNESGetGradientNorm - Gets the norm of the current gradient that was set
4009b94acceSBarry Smith    with SNESSSetGradient().
4019b94acceSBarry Smith 
402c7afd0dbSLois Curfman McInnes    Collective on SNES
403c7afd0dbSLois Curfman McInnes 
4049b94acceSBarry Smith    Input Parameter:
4059b94acceSBarry Smith .  snes - SNES context
4069b94acceSBarry Smith 
4079b94acceSBarry Smith    Output Parameter:
4089b94acceSBarry Smith .  fnorm - 2-norm of gradient
4099b94acceSBarry Smith 
4109b94acceSBarry Smith    Note:
4119b94acceSBarry Smith    SNESGetGradientNorm() is valid for SNES_UNCONSTRAINED_MINIMIZATION
412a86d99e1SLois Curfman McInnes    methods only.  A related routine for SNES_NONLINEAR_EQUATIONS methods
413a86d99e1SLois Curfman McInnes    is SNESGetFunctionNorm().
4149b94acceSBarry Smith 
41536851e7fSLois Curfman McInnes    Level: intermediate
41636851e7fSLois Curfman McInnes 
4179b94acceSBarry Smith .keywords: SNES, nonlinear, get, gradient, norm
418a86d99e1SLois Curfman McInnes 
419a86d99e1SLois Curfman McInnes .seelso: SNESSetGradient()
4209b94acceSBarry Smith @*/
42187828ca2SBarry Smith int SNESGetGradientNorm(SNES snes,PetscScalar *gnorm)
4229b94acceSBarry Smith {
4233a40ed3dSBarry Smith   PetscFunctionBegin;
42477c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
42574679c65SBarry Smith   PetscValidScalarPointer(gnorm);
42674679c65SBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
42729bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"For SNES_UNCONSTRAINED_MINIMIZATION only");
42874679c65SBarry Smith   }
4299b94acceSBarry Smith   *gnorm = snes->norm;
4303a40ed3dSBarry Smith   PetscFunctionReturn(0);
4319b94acceSBarry Smith }
43274679c65SBarry Smith 
4334a2ae208SSatish Balay #undef __FUNCT__
4344a2ae208SSatish Balay #define __FUNCT__ "SNESGetNumberUnsuccessfulSteps"
4359b94acceSBarry Smith /*@
4369b94acceSBarry Smith    SNESGetNumberUnsuccessfulSteps - Gets the number of unsuccessful steps
4379b94acceSBarry Smith    attempted by the nonlinear solver.
4389b94acceSBarry Smith 
439c7afd0dbSLois Curfman McInnes    Not Collective
440c7afd0dbSLois Curfman McInnes 
4419b94acceSBarry Smith    Input Parameter:
4429b94acceSBarry Smith .  snes - SNES context
4439b94acceSBarry Smith 
4449b94acceSBarry Smith    Output Parameter:
4459b94acceSBarry Smith .  nfails - number of unsuccessful steps attempted
4469b94acceSBarry Smith 
447c96a6f78SLois Curfman McInnes    Notes:
448c96a6f78SLois Curfman McInnes    This counter is reset to zero for each successive call to SNESSolve().
449c96a6f78SLois Curfman McInnes 
45036851e7fSLois Curfman McInnes    Level: intermediate
45136851e7fSLois Curfman McInnes 
4529b94acceSBarry Smith .keywords: SNES, nonlinear, get, number, unsuccessful, steps
4539b94acceSBarry Smith @*/
4549b94acceSBarry Smith int SNESGetNumberUnsuccessfulSteps(SNES snes,int* nfails)
4559b94acceSBarry Smith {
4563a40ed3dSBarry Smith   PetscFunctionBegin;
45777c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
45874679c65SBarry Smith   PetscValidIntPointer(nfails);
4599b94acceSBarry Smith   *nfails = snes->nfailures;
4603a40ed3dSBarry Smith   PetscFunctionReturn(0);
4619b94acceSBarry Smith }
462a847f771SSatish Balay 
4634a2ae208SSatish Balay #undef __FUNCT__
4644a2ae208SSatish Balay #define __FUNCT__ "SNESGetNumberLinearIterations"
465c96a6f78SLois Curfman McInnes /*@
466c96a6f78SLois Curfman McInnes    SNESGetNumberLinearIterations - Gets the total number of linear iterations
467c96a6f78SLois Curfman McInnes    used by the nonlinear solver.
468c96a6f78SLois Curfman McInnes 
469c7afd0dbSLois Curfman McInnes    Not Collective
470c7afd0dbSLois Curfman McInnes 
471c96a6f78SLois Curfman McInnes    Input Parameter:
472c96a6f78SLois Curfman McInnes .  snes - SNES context
473c96a6f78SLois Curfman McInnes 
474c96a6f78SLois Curfman McInnes    Output Parameter:
475c96a6f78SLois Curfman McInnes .  lits - number of linear iterations
476c96a6f78SLois Curfman McInnes 
477c96a6f78SLois Curfman McInnes    Notes:
478c96a6f78SLois Curfman McInnes    This counter is reset to zero for each successive call to SNESSolve().
479c96a6f78SLois Curfman McInnes 
48036851e7fSLois Curfman McInnes    Level: intermediate
48136851e7fSLois Curfman McInnes 
482c96a6f78SLois Curfman McInnes .keywords: SNES, nonlinear, get, number, linear, iterations
483c96a6f78SLois Curfman McInnes @*/
48486bddb7dSBarry Smith int SNESGetNumberLinearIterations(SNES snes,int* lits)
485c96a6f78SLois Curfman McInnes {
4863a40ed3dSBarry Smith   PetscFunctionBegin;
487c96a6f78SLois Curfman McInnes   PetscValidHeaderSpecific(snes,SNES_COOKIE);
488c96a6f78SLois Curfman McInnes   PetscValidIntPointer(lits);
489c96a6f78SLois Curfman McInnes   *lits = snes->linear_its;
4903a40ed3dSBarry Smith   PetscFunctionReturn(0);
491c96a6f78SLois Curfman McInnes }
492c96a6f78SLois Curfman McInnes 
4934a2ae208SSatish Balay #undef __FUNCT__
4944a2ae208SSatish Balay #define __FUNCT__ "SNESGetSLES"
4959b94acceSBarry Smith /*@C
4969b94acceSBarry Smith    SNESGetSLES - Returns the SLES context for a SNES solver.
4979b94acceSBarry Smith 
498c7afd0dbSLois Curfman McInnes    Not Collective, but if SNES object is parallel, then SLES object is parallel
499c7afd0dbSLois Curfman McInnes 
5009b94acceSBarry Smith    Input Parameter:
5019b94acceSBarry Smith .  snes - the SNES context
5029b94acceSBarry Smith 
5039b94acceSBarry Smith    Output Parameter:
5049b94acceSBarry Smith .  sles - the SLES context
5059b94acceSBarry Smith 
5069b94acceSBarry Smith    Notes:
5079b94acceSBarry Smith    The user can then directly manipulate the SLES context to set various
5089b94acceSBarry Smith    options, etc.  Likewise, the user can then extract and manipulate the
5099b94acceSBarry Smith    KSP and PC contexts as well.
5109b94acceSBarry Smith 
51136851e7fSLois Curfman McInnes    Level: beginner
51236851e7fSLois Curfman McInnes 
5139b94acceSBarry Smith .keywords: SNES, nonlinear, get, SLES, context
5149b94acceSBarry Smith 
5159b94acceSBarry Smith .seealso: SLESGetPC(), SLESGetKSP()
5169b94acceSBarry Smith @*/
5179b94acceSBarry Smith int SNESGetSLES(SNES snes,SLES *sles)
5189b94acceSBarry Smith {
5193a40ed3dSBarry Smith   PetscFunctionBegin;
52077c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
5219b94acceSBarry Smith   *sles = snes->sles;
5223a40ed3dSBarry Smith   PetscFunctionReturn(0);
5239b94acceSBarry Smith }
52482bf6240SBarry Smith 
5254a2ae208SSatish Balay #undef __FUNCT__
5264a2ae208SSatish Balay #define __FUNCT__ "SNESPublish_Petsc"
527454a90a3SBarry Smith static int SNESPublish_Petsc(PetscObject obj)
528e24b481bSBarry Smith {
529aa482453SBarry Smith #if defined(PETSC_HAVE_AMS)
530454a90a3SBarry Smith   SNES          v = (SNES) obj;
531e24b481bSBarry Smith   int          ierr;
53243d6d2cbSBarry Smith #endif
533e24b481bSBarry Smith 
534e24b481bSBarry Smith   PetscFunctionBegin;
535e24b481bSBarry Smith 
53643d6d2cbSBarry Smith #if defined(PETSC_HAVE_AMS)
537e24b481bSBarry Smith   /* if it is already published then return */
538e24b481bSBarry Smith   if (v->amem >=0) PetscFunctionReturn(0);
539e24b481bSBarry Smith 
540454a90a3SBarry Smith   ierr = PetscObjectPublishBaseBegin(obj);CHKERRQ(ierr);
541e24b481bSBarry Smith   ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Iteration",&v->iter,1,AMS_INT,AMS_READ,
542e24b481bSBarry Smith                                 AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
543e24b481bSBarry Smith   ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Residual",&v->norm,1,AMS_DOUBLE,AMS_READ,
544e24b481bSBarry Smith                                 AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
545454a90a3SBarry Smith   ierr = PetscObjectPublishBaseEnd(obj);CHKERRQ(ierr);
546433994e6SBarry Smith #endif
547e24b481bSBarry Smith   PetscFunctionReturn(0);
548e24b481bSBarry Smith }
549e24b481bSBarry Smith 
5509b94acceSBarry Smith /* -----------------------------------------------------------*/
5514a2ae208SSatish Balay #undef __FUNCT__
5524a2ae208SSatish Balay #define __FUNCT__ "SNESCreate"
5539b94acceSBarry Smith /*@C
5549b94acceSBarry Smith    SNESCreate - Creates a nonlinear solver context.
5559b94acceSBarry Smith 
556c7afd0dbSLois Curfman McInnes    Collective on MPI_Comm
557c7afd0dbSLois Curfman McInnes 
558c7afd0dbSLois Curfman McInnes    Input Parameters:
559c7afd0dbSLois Curfman McInnes +  comm - MPI communicator
560c7afd0dbSLois Curfman McInnes -  type - type of method, either
561c7afd0dbSLois Curfman McInnes    SNES_NONLINEAR_EQUATIONS (for systems of nonlinear equations)
562c7afd0dbSLois Curfman McInnes    or SNES_UNCONSTRAINED_MINIMIZATION (for unconstrained minimization)
5639b94acceSBarry Smith 
5649b94acceSBarry Smith    Output Parameter:
5659b94acceSBarry Smith .  outsnes - the new SNES context
5669b94acceSBarry Smith 
567c7afd0dbSLois Curfman McInnes    Options Database Keys:
568c7afd0dbSLois Curfman McInnes +   -snes_mf - Activates default matrix-free Jacobian-vector products,
569c7afd0dbSLois Curfman McInnes                and no preconditioning matrix
570c7afd0dbSLois Curfman McInnes .   -snes_mf_operator - Activates default matrix-free Jacobian-vector
571c7afd0dbSLois Curfman McInnes                products, and a user-provided preconditioning matrix
572c7afd0dbSLois Curfman McInnes                as set by SNESSetJacobian()
573c7afd0dbSLois Curfman McInnes -   -snes_fd - Uses (slow!) finite differences to compute Jacobian
574c1f60f51SBarry Smith 
57536851e7fSLois Curfman McInnes    Level: beginner
57636851e7fSLois Curfman McInnes 
5779b94acceSBarry Smith .keywords: SNES, nonlinear, create, context
5789b94acceSBarry Smith 
579435da068SBarry Smith .seealso: SNESSolve(), SNESDestroy(), SNESProblemType, SNES
5809b94acceSBarry Smith @*/
5814b0e389bSBarry Smith int SNESCreate(MPI_Comm comm,SNESProblemType type,SNES *outsnes)
5829b94acceSBarry Smith {
5839b94acceSBarry Smith   int                 ierr;
5849b94acceSBarry Smith   SNES                snes;
5859b94acceSBarry Smith   SNES_KSP_EW_ConvCtx *kctx;
58637fcc0dbSBarry Smith 
5873a40ed3dSBarry Smith   PetscFunctionBegin;
5889b94acceSBarry Smith   *outsnes = 0;
589d64ed03dSBarry Smith   if (type != SNES_UNCONSTRAINED_MINIMIZATION && type != SNES_NONLINEAR_EQUATIONS){
59029bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"incorrect method type");
591d64ed03dSBarry Smith   }
5923f1db9ecSBarry Smith   PetscHeaderCreate(snes,_p_SNES,int,SNES_COOKIE,0,"SNES",comm,SNESDestroy,SNESView);
593b0a32e0cSBarry Smith   PetscLogObjectCreate(snes);
594e24b481bSBarry Smith   snes->bops->publish     = SNESPublish_Petsc;
5959b94acceSBarry Smith   snes->max_its           = 50;
5969750a799SBarry Smith   snes->max_funcs	  = 10000;
5979b94acceSBarry Smith   snes->norm		  = 0.0;
5985a2d0531SBarry Smith   if (type == SNES_UNCONSTRAINED_MINIMIZATION) {
599b18e04deSLois Curfman McInnes     snes->rtol		  = 1.e-8;
600b18e04deSLois Curfman McInnes     snes->ttol            = 0.0;
6019b94acceSBarry Smith     snes->atol		  = 1.e-10;
602d64ed03dSBarry Smith   } else {
603b4874afaSBarry Smith     snes->rtol		  = 1.e-8;
604b4874afaSBarry Smith     snes->ttol            = 0.0;
605b4874afaSBarry Smith     snes->atol		  = 1.e-50;
606b4874afaSBarry Smith   }
6079b94acceSBarry Smith   snes->xtol		  = 1.e-8;
608b18e04deSLois Curfman McInnes   snes->trunctol	  = 1.e-12; /* no longer used */
6099b94acceSBarry Smith   snes->nfuncs            = 0;
6109b94acceSBarry Smith   snes->nfailures         = 0;
6117a00f4a9SLois Curfman McInnes   snes->linear_its        = 0;
612639f9d9dSBarry Smith   snes->numbermonitors    = 0;
6139b94acceSBarry Smith   snes->data              = 0;
6149b94acceSBarry Smith   snes->view              = 0;
6159b94acceSBarry Smith   snes->computeumfunction = 0;
6169b94acceSBarry Smith   snes->umfunP            = 0;
6179b94acceSBarry Smith   snes->fc                = 0;
6189b94acceSBarry Smith   snes->deltatol          = 1.e-12;
6199b94acceSBarry Smith   snes->fmin              = -1.e30;
6209b94acceSBarry Smith   snes->method_class      = type;
6219b94acceSBarry Smith   snes->set_method_called = 0;
62282bf6240SBarry Smith   snes->setupcalled       = 0;
623186905e3SBarry Smith   snes->ksp_ewconv        = PETSC_FALSE;
6246f24a144SLois Curfman McInnes   snes->vwork             = 0;
6256f24a144SLois Curfman McInnes   snes->nwork             = 0;
626758f92a0SBarry Smith   snes->conv_hist_len     = 0;
627758f92a0SBarry Smith   snes->conv_hist_max     = 0;
628758f92a0SBarry Smith   snes->conv_hist         = PETSC_NULL;
629758f92a0SBarry Smith   snes->conv_hist_its     = PETSC_NULL;
630758f92a0SBarry Smith   snes->conv_hist_reset   = PETSC_TRUE;
631184914b5SBarry Smith   snes->reason            = SNES_CONVERGED_ITERATING;
6329b94acceSBarry Smith 
6339b94acceSBarry Smith   /* Create context to compute Eisenstat-Walker relative tolerance for KSP */
634b0a32e0cSBarry Smith   ierr = PetscNew(SNES_KSP_EW_ConvCtx,&kctx);CHKERRQ(ierr);
635b0a32e0cSBarry Smith   PetscLogObjectMemory(snes,sizeof(SNES_KSP_EW_ConvCtx));
6369b94acceSBarry Smith   snes->kspconvctx  = (void*)kctx;
6379b94acceSBarry Smith   kctx->version     = 2;
6389b94acceSBarry Smith   kctx->rtol_0      = .3; /* Eisenstat and Walker suggest rtol_0=.5, but
6399b94acceSBarry Smith                              this was too large for some test cases */
6409b94acceSBarry Smith   kctx->rtol_last   = 0;
6419b94acceSBarry Smith   kctx->rtol_max    = .9;
6429b94acceSBarry Smith   kctx->gamma       = 1.0;
6439b94acceSBarry Smith   kctx->alpha2      = .5*(1.0 + sqrt(5.0));
6449b94acceSBarry Smith   kctx->alpha       = kctx->alpha2;
6459b94acceSBarry Smith   kctx->threshold   = .1;
6469b94acceSBarry Smith   kctx->lresid_last = 0;
6479b94acceSBarry Smith   kctx->norm_last   = 0;
6489b94acceSBarry Smith 
6499b94acceSBarry Smith   ierr = SLESCreate(comm,&snes->sles);CHKERRQ(ierr);
650b0a32e0cSBarry Smith   PetscLogObjectParent(snes,snes->sles)
6515334005bSBarry Smith 
6529b94acceSBarry Smith   *outsnes = snes;
65300036973SBarry Smith   ierr = PetscPublishAll(snes);CHKERRQ(ierr);
6543a40ed3dSBarry Smith   PetscFunctionReturn(0);
6559b94acceSBarry Smith }
6569b94acceSBarry Smith 
6579b94acceSBarry Smith /* --------------------------------------------------------------- */
6584a2ae208SSatish Balay #undef __FUNCT__
6594a2ae208SSatish Balay #define __FUNCT__ "SNESSetFunction"
6609b94acceSBarry Smith /*@C
6619b94acceSBarry Smith    SNESSetFunction - Sets the function evaluation routine and function
6629b94acceSBarry Smith    vector for use by the SNES routines in solving systems of nonlinear
6639b94acceSBarry Smith    equations.
6649b94acceSBarry Smith 
665fee21e36SBarry Smith    Collective on SNES
666fee21e36SBarry Smith 
667c7afd0dbSLois Curfman McInnes    Input Parameters:
668c7afd0dbSLois Curfman McInnes +  snes - the SNES context
669c7afd0dbSLois Curfman McInnes .  func - function evaluation routine
670c7afd0dbSLois Curfman McInnes .  r - vector to store function value
671c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined context for private data for the
672c7afd0dbSLois Curfman McInnes          function evaluation routine (may be PETSC_NULL)
6739b94acceSBarry Smith 
674c7afd0dbSLois Curfman McInnes    Calling sequence of func:
6758d76a1e5SLois Curfman McInnes $    func (SNES snes,Vec x,Vec f,void *ctx);
676c7afd0dbSLois Curfman McInnes 
677313e4042SLois Curfman McInnes .  f - function vector
678c7afd0dbSLois Curfman McInnes -  ctx - optional user-defined function context
6799b94acceSBarry Smith 
6809b94acceSBarry Smith    Notes:
6819b94acceSBarry Smith    The Newton-like methods typically solve linear systems of the form
6829b94acceSBarry Smith $      f'(x) x = -f(x),
683c7afd0dbSLois Curfman McInnes    where f'(x) denotes the Jacobian matrix and f(x) is the function.
6849b94acceSBarry Smith 
6859b94acceSBarry Smith    SNESSetFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only.
6869b94acceSBarry Smith    Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are
6879b94acceSBarry Smith    SNESSetMinimizationFunction() and SNESSetGradient();
6889b94acceSBarry Smith 
68936851e7fSLois Curfman McInnes    Level: beginner
69036851e7fSLois Curfman McInnes 
6919b94acceSBarry Smith .keywords: SNES, nonlinear, set, function
6929b94acceSBarry Smith 
693a86d99e1SLois Curfman McInnes .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian()
6949b94acceSBarry Smith @*/
6955334005bSBarry Smith int SNESSetFunction(SNES snes,Vec r,int (*func)(SNES,Vec,Vec,void*),void *ctx)
6969b94acceSBarry Smith {
6973a40ed3dSBarry Smith   PetscFunctionBegin;
69877c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
699184914b5SBarry Smith   PetscValidHeaderSpecific(r,VEC_COOKIE);
700184914b5SBarry Smith   PetscCheckSameComm(snes,r);
701a8c6a408SBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
70229bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only");
703a8c6a408SBarry Smith   }
704184914b5SBarry Smith 
7059b94acceSBarry Smith   snes->computefunction     = func;
7069b94acceSBarry Smith   snes->vec_func            = snes->vec_func_always = r;
7079b94acceSBarry Smith   snes->funP                = ctx;
7083a40ed3dSBarry Smith   PetscFunctionReturn(0);
7099b94acceSBarry Smith }
7109b94acceSBarry Smith 
7114a2ae208SSatish Balay #undef __FUNCT__
7124a2ae208SSatish Balay #define __FUNCT__ "SNESComputeFunction"
7139b94acceSBarry Smith /*@
71436851e7fSLois Curfman McInnes    SNESComputeFunction - Calls the function that has been set with
7159b94acceSBarry Smith                          SNESSetFunction().
7169b94acceSBarry Smith 
717c7afd0dbSLois Curfman McInnes    Collective on SNES
718c7afd0dbSLois Curfman McInnes 
7199b94acceSBarry Smith    Input Parameters:
720c7afd0dbSLois Curfman McInnes +  snes - the SNES context
721c7afd0dbSLois Curfman McInnes -  x - input vector
7229b94acceSBarry Smith 
7239b94acceSBarry Smith    Output Parameter:
7243638b69dSLois Curfman McInnes .  y - function vector, as set by SNESSetFunction()
7259b94acceSBarry Smith 
7261bffabb2SLois Curfman McInnes    Notes:
7279b94acceSBarry Smith    SNESComputeFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only.
7289b94acceSBarry Smith    Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are
7299b94acceSBarry Smith    SNESComputeMinimizationFunction() and SNESComputeGradient();
7309b94acceSBarry Smith 
73136851e7fSLois Curfman McInnes    SNESComputeFunction() is typically used within nonlinear solvers
73236851e7fSLois Curfman McInnes    implementations, so most users would not generally call this routine
73336851e7fSLois Curfman McInnes    themselves.
73436851e7fSLois Curfman McInnes 
73536851e7fSLois Curfman McInnes    Level: developer
73636851e7fSLois Curfman McInnes 
7379b94acceSBarry Smith .keywords: SNES, nonlinear, compute, function
7389b94acceSBarry Smith 
739a86d99e1SLois Curfman McInnes .seealso: SNESSetFunction(), SNESGetFunction()
7409b94acceSBarry Smith @*/
7419b94acceSBarry Smith int SNESComputeFunction(SNES snes,Vec x,Vec y)
7429b94acceSBarry Smith {
7439b94acceSBarry Smith   int    ierr;
7449b94acceSBarry Smith 
7453a40ed3dSBarry Smith   PetscFunctionBegin;
746184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
747184914b5SBarry Smith   PetscValidHeaderSpecific(x,VEC_COOKIE);
748184914b5SBarry Smith   PetscValidHeaderSpecific(y,VEC_COOKIE);
749184914b5SBarry Smith   PetscCheckSameComm(snes,x);
750184914b5SBarry Smith   PetscCheckSameComm(snes,y);
751d4bb536fSBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
75229bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only");
753d4bb536fSBarry Smith   }
754184914b5SBarry Smith 
755b0a32e0cSBarry Smith   ierr = PetscLogEventBegin(SNES_FunctionEval,snes,x,y,0);CHKERRQ(ierr);
756d64ed03dSBarry Smith   PetscStackPush("SNES user function");
7579b94acceSBarry Smith   ierr = (*snes->computefunction)(snes,x,y,snes->funP);CHKERRQ(ierr);
758d64ed03dSBarry Smith   PetscStackPop;
759ae3c334cSLois Curfman McInnes   snes->nfuncs++;
760b0a32e0cSBarry Smith   ierr = PetscLogEventEnd(SNES_FunctionEval,snes,x,y,0);CHKERRQ(ierr);
7613a40ed3dSBarry Smith   PetscFunctionReturn(0);
7629b94acceSBarry Smith }
7639b94acceSBarry Smith 
7644a2ae208SSatish Balay #undef __FUNCT__
7654a2ae208SSatish Balay #define __FUNCT__ "SNESSetMinimizationFunction"
7669b94acceSBarry Smith /*@C
7679b94acceSBarry Smith    SNESSetMinimizationFunction - Sets the function evaluation routine for
7689b94acceSBarry Smith    unconstrained minimization.
7699b94acceSBarry Smith 
770fee21e36SBarry Smith    Collective on SNES
771fee21e36SBarry Smith 
772c7afd0dbSLois Curfman McInnes    Input Parameters:
773c7afd0dbSLois Curfman McInnes +  snes - the SNES context
774c7afd0dbSLois Curfman McInnes .  func - function evaluation routine
775c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined context for private data for the
776c7afd0dbSLois Curfman McInnes          function evaluation routine (may be PETSC_NULL)
7779b94acceSBarry Smith 
778c7afd0dbSLois Curfman McInnes    Calling sequence of func:
779329f5518SBarry Smith $     func (SNES snes,Vec x,PetscReal *f,void *ctx);
780c7afd0dbSLois Curfman McInnes 
781c7afd0dbSLois Curfman McInnes +  x - input vector
7829b94acceSBarry Smith .  f - function
783c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined function context
7849b94acceSBarry Smith 
78536851e7fSLois Curfman McInnes    Level: beginner
78636851e7fSLois Curfman McInnes 
7879b94acceSBarry Smith    Notes:
7889b94acceSBarry Smith    SNESSetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION
7899b94acceSBarry Smith    methods only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is
7909b94acceSBarry Smith    SNESSetFunction().
7919b94acceSBarry Smith 
7929b94acceSBarry Smith .keywords: SNES, nonlinear, set, minimization, function
7939b94acceSBarry Smith 
794a86d99e1SLois Curfman McInnes .seealso:  SNESGetMinimizationFunction(), SNESComputeMinimizationFunction(),
795a86d99e1SLois Curfman McInnes            SNESSetHessian(), SNESSetGradient()
7969b94acceSBarry Smith @*/
797329f5518SBarry Smith int SNESSetMinimizationFunction(SNES snes,int (*func)(SNES,Vec,PetscReal*,void*),void *ctx)
7989b94acceSBarry Smith {
7993a40ed3dSBarry Smith   PetscFunctionBegin;
80077c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
801a8c6a408SBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
80229bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"Only for SNES_UNCONSTRAINED_MINIMIZATION");
803a8c6a408SBarry Smith   }
8049b94acceSBarry Smith   snes->computeumfunction   = func;
8059b94acceSBarry Smith   snes->umfunP              = ctx;
8063a40ed3dSBarry Smith   PetscFunctionReturn(0);
8079b94acceSBarry Smith }
8089b94acceSBarry Smith 
8094a2ae208SSatish Balay #undef __FUNCT__
8104a2ae208SSatish Balay #define __FUNCT__ "SNESComputeMinimizationFunction"
8119b94acceSBarry Smith /*@
8129b94acceSBarry Smith    SNESComputeMinimizationFunction - Computes the function that has been
8139b94acceSBarry Smith    set with SNESSetMinimizationFunction().
8149b94acceSBarry Smith 
815c7afd0dbSLois Curfman McInnes    Collective on SNES
816c7afd0dbSLois Curfman McInnes 
8179b94acceSBarry Smith    Input Parameters:
818c7afd0dbSLois Curfman McInnes +  snes - the SNES context
819c7afd0dbSLois Curfman McInnes -  x - input vector
8209b94acceSBarry Smith 
8219b94acceSBarry Smith    Output Parameter:
8229b94acceSBarry Smith .  y - function value
8239b94acceSBarry Smith 
8249b94acceSBarry Smith    Notes:
8259b94acceSBarry Smith    SNESComputeMinimizationFunction() is valid only for
8269b94acceSBarry Smith    SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for
8279b94acceSBarry Smith    SNES_NONLINEAR_EQUATIONS methods is SNESComputeFunction().
828a86d99e1SLois Curfman McInnes 
82936851e7fSLois Curfman McInnes    SNESComputeMinimizationFunction() is typically used within minimization
83036851e7fSLois Curfman McInnes    implementations, so most users would not generally call this routine
83136851e7fSLois Curfman McInnes    themselves.
83236851e7fSLois Curfman McInnes 
83336851e7fSLois Curfman McInnes    Level: developer
83436851e7fSLois Curfman McInnes 
835a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, compute, minimization, function
836a86d99e1SLois Curfman McInnes 
837a86d99e1SLois Curfman McInnes .seealso: SNESSetMinimizationFunction(), SNESGetMinimizationFunction(),
838a86d99e1SLois Curfman McInnes           SNESComputeGradient(), SNESComputeHessian()
8399b94acceSBarry Smith @*/
840329f5518SBarry Smith int SNESComputeMinimizationFunction(SNES snes,Vec x,PetscReal *y)
8419b94acceSBarry Smith {
8429b94acceSBarry Smith   int    ierr;
8433a40ed3dSBarry Smith 
8443a40ed3dSBarry Smith   PetscFunctionBegin;
845184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
846184914b5SBarry Smith   PetscValidHeaderSpecific(x,VEC_COOKIE);
847184914b5SBarry Smith   PetscCheckSameComm(snes,x);
848a8c6a408SBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
84929bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"Only for SNES_UNCONSTRAINED_MINIMIZATION");
850a8c6a408SBarry Smith   }
851184914b5SBarry Smith 
852b0a32e0cSBarry Smith   ierr = PetscLogEventBegin(SNES_MinimizationFunctionEval,snes,x,y,0);CHKERRQ(ierr);
853d64ed03dSBarry Smith   PetscStackPush("SNES user minimzation function");
8549b94acceSBarry Smith   ierr = (*snes->computeumfunction)(snes,x,y,snes->umfunP);CHKERRQ(ierr);
855d64ed03dSBarry Smith   PetscStackPop;
856ae3c334cSLois Curfman McInnes   snes->nfuncs++;
857b0a32e0cSBarry Smith   ierr = PetscLogEventEnd(SNES_MinimizationFunctionEval,snes,x,y,0);CHKERRQ(ierr);
8583a40ed3dSBarry Smith   PetscFunctionReturn(0);
8599b94acceSBarry Smith }
8609b94acceSBarry Smith 
8614a2ae208SSatish Balay #undef __FUNCT__
8624a2ae208SSatish Balay #define __FUNCT__ "SNESSetGradient"
8639b94acceSBarry Smith /*@C
8649b94acceSBarry Smith    SNESSetGradient - Sets the gradient evaluation routine and gradient
8659b94acceSBarry Smith    vector for use by the SNES routines.
8669b94acceSBarry Smith 
867c7afd0dbSLois Curfman McInnes    Collective on SNES
868c7afd0dbSLois Curfman McInnes 
8699b94acceSBarry Smith    Input Parameters:
870c7afd0dbSLois Curfman McInnes +  snes - the SNES context
8719b94acceSBarry Smith .  func - function evaluation routine
872044dda88SLois Curfman McInnes .  ctx - optional user-defined context for private data for the
873044dda88SLois Curfman McInnes          gradient evaluation routine (may be PETSC_NULL)
874c7afd0dbSLois Curfman McInnes -  r - vector to store gradient value
875fee21e36SBarry Smith 
8769b94acceSBarry Smith    Calling sequence of func:
8778d76a1e5SLois Curfman McInnes $     func (SNES, Vec x, Vec g, void *ctx);
8789b94acceSBarry Smith 
879c7afd0dbSLois Curfman McInnes +  x - input vector
8809b94acceSBarry Smith .  g - gradient vector
881c7afd0dbSLois Curfman McInnes -  ctx - optional user-defined gradient context
8829b94acceSBarry Smith 
8839b94acceSBarry Smith    Notes:
8849b94acceSBarry Smith    SNESSetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION
8859b94acceSBarry Smith    methods only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is
8869b94acceSBarry Smith    SNESSetFunction().
8879b94acceSBarry Smith 
88836851e7fSLois Curfman McInnes    Level: beginner
88936851e7fSLois Curfman McInnes 
8909b94acceSBarry Smith .keywords: SNES, nonlinear, set, function
8919b94acceSBarry Smith 
892a86d99e1SLois Curfman McInnes .seealso: SNESGetGradient(), SNESComputeGradient(), SNESSetHessian(),
893a86d99e1SLois Curfman McInnes           SNESSetMinimizationFunction(),
8949b94acceSBarry Smith @*/
89574679c65SBarry Smith int SNESSetGradient(SNES snes,Vec r,int (*func)(SNES,Vec,Vec,void*),void *ctx)
8969b94acceSBarry Smith {
8973a40ed3dSBarry Smith   PetscFunctionBegin;
89877c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
899184914b5SBarry Smith   PetscValidHeaderSpecific(r,VEC_COOKIE);
900184914b5SBarry Smith   PetscCheckSameComm(snes,r);
901a8c6a408SBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
90229bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only");
903a8c6a408SBarry Smith   }
9049b94acceSBarry Smith   snes->computefunction     = func;
9059b94acceSBarry Smith   snes->vec_func            = snes->vec_func_always = r;
9069b94acceSBarry Smith   snes->funP                = ctx;
9073a40ed3dSBarry Smith   PetscFunctionReturn(0);
9089b94acceSBarry Smith }
9099b94acceSBarry Smith 
9104a2ae208SSatish Balay #undef __FUNCT__
9114a2ae208SSatish Balay #define __FUNCT__ "SNESComputeGradient"
9129b94acceSBarry Smith /*@
913a86d99e1SLois Curfman McInnes    SNESComputeGradient - Computes the gradient that has been set with
914a86d99e1SLois Curfman McInnes    SNESSetGradient().
9159b94acceSBarry Smith 
916c7afd0dbSLois Curfman McInnes    Collective on SNES
917c7afd0dbSLois Curfman McInnes 
9189b94acceSBarry Smith    Input Parameters:
919c7afd0dbSLois Curfman McInnes +  snes - the SNES context
920c7afd0dbSLois Curfman McInnes -  x - input vector
9219b94acceSBarry Smith 
9229b94acceSBarry Smith    Output Parameter:
9239b94acceSBarry Smith .  y - gradient vector
9249b94acceSBarry Smith 
9259b94acceSBarry Smith    Notes:
9269b94acceSBarry Smith    SNESComputeGradient() is valid only for
9279b94acceSBarry Smith    SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for
9289b94acceSBarry Smith    SNES_NONLINEAR_EQUATIONS methods is SNESComputeFunction().
929a86d99e1SLois Curfman McInnes 
93036851e7fSLois Curfman McInnes    SNESComputeGradient() is typically used within minimization
93136851e7fSLois Curfman McInnes    implementations, so most users would not generally call this routine
93236851e7fSLois Curfman McInnes    themselves.
93336851e7fSLois Curfman McInnes 
93436851e7fSLois Curfman McInnes    Level: developer
93536851e7fSLois Curfman McInnes 
936a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, compute, gradient
937a86d99e1SLois Curfman McInnes 
938a86d99e1SLois Curfman McInnes .seealso:  SNESSetGradient(), SNESGetGradient(),
939a86d99e1SLois Curfman McInnes            SNESComputeMinimizationFunction(), SNESComputeHessian()
9409b94acceSBarry Smith @*/
9419b94acceSBarry Smith int SNESComputeGradient(SNES snes,Vec x,Vec y)
9429b94acceSBarry Smith {
9439b94acceSBarry Smith   int    ierr;
9443a40ed3dSBarry Smith 
9453a40ed3dSBarry Smith   PetscFunctionBegin;
946184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
947184914b5SBarry Smith   PetscValidHeaderSpecific(x,VEC_COOKIE);
948184914b5SBarry Smith   PetscValidHeaderSpecific(y,VEC_COOKIE);
949184914b5SBarry Smith   PetscCheckSameComm(snes,x);
950184914b5SBarry Smith   PetscCheckSameComm(snes,y);
9513a40ed3dSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
95229bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only");
9533a40ed3dSBarry Smith   }
954b0a32e0cSBarry Smith   ierr = PetscLogEventBegin(SNES_GradientEval,snes,x,y,0);CHKERRQ(ierr);
955d64ed03dSBarry Smith   PetscStackPush("SNES user gradient function");
9569b94acceSBarry Smith   ierr = (*snes->computefunction)(snes,x,y,snes->funP);CHKERRQ(ierr);
957d64ed03dSBarry Smith   PetscStackPop;
958b0a32e0cSBarry Smith   ierr = PetscLogEventEnd(SNES_GradientEval,snes,x,y,0);CHKERRQ(ierr);
9593a40ed3dSBarry Smith   PetscFunctionReturn(0);
9609b94acceSBarry Smith }
9619b94acceSBarry Smith 
9624a2ae208SSatish Balay #undef __FUNCT__
9634a2ae208SSatish Balay #define __FUNCT__ "SNESComputeJacobian"
96462fef451SLois Curfman McInnes /*@
96562fef451SLois Curfman McInnes    SNESComputeJacobian - Computes the Jacobian matrix that has been
96662fef451SLois Curfman McInnes    set with SNESSetJacobian().
96762fef451SLois Curfman McInnes 
968c7afd0dbSLois Curfman McInnes    Collective on SNES and Mat
969c7afd0dbSLois Curfman McInnes 
97062fef451SLois Curfman McInnes    Input Parameters:
971c7afd0dbSLois Curfman McInnes +  snes - the SNES context
972c7afd0dbSLois Curfman McInnes -  x - input vector
97362fef451SLois Curfman McInnes 
97462fef451SLois Curfman McInnes    Output Parameters:
975c7afd0dbSLois Curfman McInnes +  A - Jacobian matrix
97662fef451SLois Curfman McInnes .  B - optional preconditioning matrix
977c7afd0dbSLois Curfman McInnes -  flag - flag indicating matrix structure
978fee21e36SBarry Smith 
97962fef451SLois Curfman McInnes    Notes:
98062fef451SLois Curfman McInnes    Most users should not need to explicitly call this routine, as it
98162fef451SLois Curfman McInnes    is used internally within the nonlinear solvers.
98262fef451SLois Curfman McInnes 
983dc5a77f8SLois Curfman McInnes    See SLESSetOperators() for important information about setting the
984dc5a77f8SLois Curfman McInnes    flag parameter.
98562fef451SLois Curfman McInnes 
98662fef451SLois Curfman McInnes    SNESComputeJacobian() is valid only for SNES_NONLINEAR_EQUATIONS
98762fef451SLois Curfman McInnes    methods. An analogous routine for SNES_UNCONSTRAINED_MINIMIZATION
988005c665bSBarry Smith    methods is SNESComputeHessian().
98962fef451SLois Curfman McInnes 
99036851e7fSLois Curfman McInnes    Level: developer
99136851e7fSLois Curfman McInnes 
99262fef451SLois Curfman McInnes .keywords: SNES, compute, Jacobian, matrix
99362fef451SLois Curfman McInnes 
99462fef451SLois Curfman McInnes .seealso:  SNESSetJacobian(), SLESSetOperators()
99562fef451SLois Curfman McInnes @*/
9969b94acceSBarry Smith int SNESComputeJacobian(SNES snes,Vec X,Mat *A,Mat *B,MatStructure *flg)
9979b94acceSBarry Smith {
9989b94acceSBarry Smith   int    ierr;
9993a40ed3dSBarry Smith 
10003a40ed3dSBarry Smith   PetscFunctionBegin;
1001184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1002184914b5SBarry Smith   PetscValidHeaderSpecific(X,VEC_COOKIE);
1003184914b5SBarry Smith   PetscCheckSameComm(snes,X);
10043a40ed3dSBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
100529bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only");
10063a40ed3dSBarry Smith   }
10073a40ed3dSBarry Smith   if (!snes->computejacobian) PetscFunctionReturn(0);
1008b0a32e0cSBarry Smith   ierr = PetscLogEventBegin(SNES_JacobianEval,snes,X,*A,*B);CHKERRQ(ierr);
1009c4fc05e7SBarry Smith   *flg = DIFFERENT_NONZERO_PATTERN;
1010d64ed03dSBarry Smith   PetscStackPush("SNES user Jacobian function");
10119b94acceSBarry Smith   ierr = (*snes->computejacobian)(snes,X,A,B,flg,snes->jacP);CHKERRQ(ierr);
1012d64ed03dSBarry Smith   PetscStackPop;
1013b0a32e0cSBarry Smith   ierr = PetscLogEventEnd(SNES_JacobianEval,snes,X,*A,*B);CHKERRQ(ierr);
10146d84be18SBarry Smith   /* make sure user returned a correct Jacobian and preconditioner */
101577c4ece6SBarry Smith   PetscValidHeaderSpecific(*A,MAT_COOKIE);
101677c4ece6SBarry Smith   PetscValidHeaderSpecific(*B,MAT_COOKIE);
10173a40ed3dSBarry Smith   PetscFunctionReturn(0);
10189b94acceSBarry Smith }
10199b94acceSBarry Smith 
10204a2ae208SSatish Balay #undef __FUNCT__
10214a2ae208SSatish Balay #define __FUNCT__ "SNESComputeHessian"
102262fef451SLois Curfman McInnes /*@
102362fef451SLois Curfman McInnes    SNESComputeHessian - Computes the Hessian matrix that has been
102462fef451SLois Curfman McInnes    set with SNESSetHessian().
102562fef451SLois Curfman McInnes 
1026c7afd0dbSLois Curfman McInnes    Collective on SNES and Mat
1027c7afd0dbSLois Curfman McInnes 
102862fef451SLois Curfman McInnes    Input Parameters:
1029c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1030c7afd0dbSLois Curfman McInnes -  x - input vector
103162fef451SLois Curfman McInnes 
103262fef451SLois Curfman McInnes    Output Parameters:
1033c7afd0dbSLois Curfman McInnes +  A - Hessian matrix
103462fef451SLois Curfman McInnes .  B - optional preconditioning matrix
1035c7afd0dbSLois Curfman McInnes -  flag - flag indicating matrix structure
1036fee21e36SBarry Smith 
103762fef451SLois Curfman McInnes    Notes:
103862fef451SLois Curfman McInnes    Most users should not need to explicitly call this routine, as it
103962fef451SLois Curfman McInnes    is used internally within the nonlinear solvers.
104062fef451SLois Curfman McInnes 
1041dc5a77f8SLois Curfman McInnes    See SLESSetOperators() for important information about setting the
1042dc5a77f8SLois Curfman McInnes    flag parameter.
104362fef451SLois Curfman McInnes 
104462fef451SLois Curfman McInnes    SNESComputeHessian() is valid only for
104562fef451SLois Curfman McInnes    SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for
104662fef451SLois Curfman McInnes    SNES_NONLINEAR_EQUATIONS methods is SNESComputeJacobian().
104762fef451SLois Curfman McInnes 
104836851e7fSLois Curfman McInnes    SNESComputeHessian() is typically used within minimization
104936851e7fSLois Curfman McInnes    implementations, so most users would not generally call this routine
105036851e7fSLois Curfman McInnes    themselves.
105136851e7fSLois Curfman McInnes 
105236851e7fSLois Curfman McInnes    Level: developer
105336851e7fSLois Curfman McInnes 
105462fef451SLois Curfman McInnes .keywords: SNES, compute, Hessian, matrix
105562fef451SLois Curfman McInnes 
1056a86d99e1SLois Curfman McInnes .seealso:  SNESSetHessian(), SLESSetOperators(), SNESComputeGradient(),
1057a86d99e1SLois Curfman McInnes            SNESComputeMinimizationFunction()
105862fef451SLois Curfman McInnes @*/
105962fef451SLois Curfman McInnes int SNESComputeHessian(SNES snes,Vec x,Mat *A,Mat *B,MatStructure *flag)
10609b94acceSBarry Smith {
10619b94acceSBarry Smith   int    ierr;
10623a40ed3dSBarry Smith 
10633a40ed3dSBarry Smith   PetscFunctionBegin;
1064184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1065184914b5SBarry Smith   PetscValidHeaderSpecific(x,VEC_COOKIE);
1066184914b5SBarry Smith   PetscCheckSameComm(snes,x);
10673a40ed3dSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
106829bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only");
10693a40ed3dSBarry Smith   }
10703a40ed3dSBarry Smith   if (!snes->computejacobian) PetscFunctionReturn(0);
1071b0a32e0cSBarry Smith   ierr = PetscLogEventBegin(SNES_HessianEval,snes,x,*A,*B);CHKERRQ(ierr);
10720f4a323eSLois Curfman McInnes   *flag = DIFFERENT_NONZERO_PATTERN;
1073d64ed03dSBarry Smith   PetscStackPush("SNES user Hessian function");
107462fef451SLois Curfman McInnes   ierr = (*snes->computejacobian)(snes,x,A,B,flag,snes->jacP);CHKERRQ(ierr);
1075d64ed03dSBarry Smith   PetscStackPop;
1076b0a32e0cSBarry Smith   ierr = PetscLogEventEnd(SNES_HessianEval,snes,x,*A,*B);CHKERRQ(ierr);
10770f4a323eSLois Curfman McInnes   /* make sure user returned a correct Jacobian and preconditioner */
107877c4ece6SBarry Smith   PetscValidHeaderSpecific(*A,MAT_COOKIE);
107977c4ece6SBarry Smith   PetscValidHeaderSpecific(*B,MAT_COOKIE);
10803a40ed3dSBarry Smith   PetscFunctionReturn(0);
10819b94acceSBarry Smith }
10829b94acceSBarry Smith 
10834a2ae208SSatish Balay #undef __FUNCT__
10844a2ae208SSatish Balay #define __FUNCT__ "SNESSetJacobian"
10859b94acceSBarry Smith /*@C
10869b94acceSBarry Smith    SNESSetJacobian - Sets the function to compute Jacobian as well as the
1087044dda88SLois Curfman McInnes    location to store the matrix.
10889b94acceSBarry Smith 
1089c7afd0dbSLois Curfman McInnes    Collective on SNES and Mat
1090c7afd0dbSLois Curfman McInnes 
10919b94acceSBarry Smith    Input Parameters:
1092c7afd0dbSLois Curfman McInnes +  snes - the SNES context
10939b94acceSBarry Smith .  A - Jacobian matrix
10949b94acceSBarry Smith .  B - preconditioner matrix (usually same as the Jacobian)
10959b94acceSBarry Smith .  func - Jacobian evaluation routine
1096c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined context for private data for the
10972cd2dfdcSLois Curfman McInnes          Jacobian evaluation routine (may be PETSC_NULL)
10989b94acceSBarry Smith 
10999b94acceSBarry Smith    Calling sequence of func:
11008d76a1e5SLois Curfman McInnes $     func (SNES snes,Vec x,Mat *A,Mat *B,int *flag,void *ctx);
11019b94acceSBarry Smith 
1102c7afd0dbSLois Curfman McInnes +  x - input vector
11039b94acceSBarry Smith .  A - Jacobian matrix
11049b94acceSBarry Smith .  B - preconditioner matrix, usually the same as A
1105ac21db08SLois Curfman McInnes .  flag - flag indicating information about the preconditioner matrix
1106ac21db08SLois Curfman McInnes    structure (same as flag in SLESSetOperators())
1107c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined Jacobian context
11089b94acceSBarry Smith 
11099b94acceSBarry Smith    Notes:
1110dc5a77f8SLois Curfman McInnes    See SLESSetOperators() for important information about setting the flag
11112cd2dfdcSLois Curfman McInnes    output parameter in the routine func().  Be sure to read this information!
1112ac21db08SLois Curfman McInnes 
1113ac21db08SLois Curfman McInnes    The routine func() takes Mat * as the matrix arguments rather than Mat.
11149b94acceSBarry Smith    This allows the Jacobian evaluation routine to replace A and/or B with a
11159b94acceSBarry Smith    completely new new matrix structure (not just different matrix elements)
11169b94acceSBarry Smith    when appropriate, for instance, if the nonzero structure is changing
11179b94acceSBarry Smith    throughout the global iterations.
11189b94acceSBarry Smith 
111936851e7fSLois Curfman McInnes    Level: beginner
112036851e7fSLois Curfman McInnes 
11219b94acceSBarry Smith .keywords: SNES, nonlinear, set, Jacobian, matrix
11229b94acceSBarry Smith 
1123ac21db08SLois Curfman McInnes .seealso: SLESSetOperators(), SNESSetFunction()
11249b94acceSBarry Smith @*/
1125454a90a3SBarry Smith int SNESSetJacobian(SNES snes,Mat A,Mat B,int (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx)
11269b94acceSBarry Smith {
11273a7fca6bSBarry Smith   int ierr;
11283a7fca6bSBarry Smith 
11293a40ed3dSBarry Smith   PetscFunctionBegin;
113077c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
113100036973SBarry Smith   if (A) PetscValidHeaderSpecific(A,MAT_COOKIE);
113200036973SBarry Smith   if (B) PetscValidHeaderSpecific(B,MAT_COOKIE);
113300036973SBarry Smith   if (A) PetscCheckSameComm(snes,A);
113400036973SBarry Smith   if (B) PetscCheckSameComm(snes,B);
1135a8c6a408SBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
113629bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only");
1137a8c6a408SBarry Smith   }
1138184914b5SBarry Smith 
11393a7fca6bSBarry Smith   if (func) snes->computejacobian = func;
11403a7fca6bSBarry Smith   if (ctx)  snes->jacP            = ctx;
11413a7fca6bSBarry Smith   if (A) {
11423a7fca6bSBarry Smith     if (snes->jacobian) {ierr = MatDestroy(snes->jacobian);CHKERRQ(ierr);}
11439b94acceSBarry Smith     snes->jacobian = A;
11443a7fca6bSBarry Smith     ierr           = PetscObjectReference((PetscObject)A);CHKERRQ(ierr);
11453a7fca6bSBarry Smith   }
11463a7fca6bSBarry Smith   if (B) {
11473a7fca6bSBarry Smith     if (snes->jacobian_pre) {ierr = MatDestroy(snes->jacobian_pre);CHKERRQ(ierr);}
11489b94acceSBarry Smith     snes->jacobian_pre = B;
11493a7fca6bSBarry Smith     ierr               = PetscObjectReference((PetscObject)B);CHKERRQ(ierr);
11503a7fca6bSBarry Smith   }
11513a40ed3dSBarry Smith   PetscFunctionReturn(0);
11529b94acceSBarry Smith }
115362fef451SLois Curfman McInnes 
11544a2ae208SSatish Balay #undef __FUNCT__
11554a2ae208SSatish Balay #define __FUNCT__ "SNESGetJacobian"
1156c2aafc4cSSatish Balay /*@C
1157b4fd4287SBarry Smith    SNESGetJacobian - Returns the Jacobian matrix and optionally the user
1158b4fd4287SBarry Smith    provided context for evaluating the Jacobian.
1159b4fd4287SBarry Smith 
1160c7afd0dbSLois Curfman McInnes    Not Collective, but Mat object will be parallel if SNES object is
1161c7afd0dbSLois Curfman McInnes 
1162b4fd4287SBarry Smith    Input Parameter:
1163b4fd4287SBarry Smith .  snes - the nonlinear solver context
1164b4fd4287SBarry Smith 
1165b4fd4287SBarry Smith    Output Parameters:
1166c7afd0dbSLois Curfman McInnes +  A - location to stash Jacobian matrix (or PETSC_NULL)
1167b4fd4287SBarry Smith .  B - location to stash preconditioner matrix (or PETSC_NULL)
116800036973SBarry Smith .  ctx - location to stash Jacobian ctx (or PETSC_NULL)
116900036973SBarry Smith -  func - location to put Jacobian function (or PETSC_NULL)
1170fee21e36SBarry Smith 
117136851e7fSLois Curfman McInnes    Level: advanced
117236851e7fSLois Curfman McInnes 
1173b4fd4287SBarry Smith .seealso: SNESSetJacobian(), SNESComputeJacobian()
1174b4fd4287SBarry Smith @*/
117500036973SBarry Smith int SNESGetJacobian(SNES snes,Mat *A,Mat *B,void **ctx,int (**func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*))
1176b4fd4287SBarry Smith {
11773a40ed3dSBarry Smith   PetscFunctionBegin;
1178184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
11793a40ed3dSBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
118029bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only");
11813a40ed3dSBarry Smith   }
1182b4fd4287SBarry Smith   if (A)    *A    = snes->jacobian;
1183b4fd4287SBarry Smith   if (B)    *B    = snes->jacobian_pre;
1184b4fd4287SBarry Smith   if (ctx)  *ctx  = snes->jacP;
118500036973SBarry Smith   if (func) *func = snes->computejacobian;
11863a40ed3dSBarry Smith   PetscFunctionReturn(0);
1187b4fd4287SBarry Smith }
1188b4fd4287SBarry Smith 
11894a2ae208SSatish Balay #undef __FUNCT__
11904a2ae208SSatish Balay #define __FUNCT__ "SNESSetHessian"
11919b94acceSBarry Smith /*@C
11929b94acceSBarry Smith    SNESSetHessian - Sets the function to compute Hessian as well as the
1193044dda88SLois Curfman McInnes    location to store the matrix.
11949b94acceSBarry Smith 
1195c7afd0dbSLois Curfman McInnes    Collective on SNES and Mat
1196c7afd0dbSLois Curfman McInnes 
11979b94acceSBarry Smith    Input Parameters:
1198c7afd0dbSLois Curfman McInnes +  snes - the SNES context
11999b94acceSBarry Smith .  A - Hessian matrix
12009b94acceSBarry Smith .  B - preconditioner matrix (usually same as the Hessian)
12019b94acceSBarry Smith .  func - Jacobian evaluation routine
1202c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined context for private data for the
1203313e4042SLois Curfman McInnes          Hessian evaluation routine (may be PETSC_NULL)
12049b94acceSBarry Smith 
12059b94acceSBarry Smith    Calling sequence of func:
12068d76a1e5SLois Curfman McInnes $    func (SNES snes,Vec x,Mat *A,Mat *B,int *flag,void *ctx);
12079b94acceSBarry Smith 
1208c7afd0dbSLois Curfman McInnes +  x - input vector
12099b94acceSBarry Smith .  A - Hessian matrix
12109b94acceSBarry Smith .  B - preconditioner matrix, usually the same as A
1211ac21db08SLois Curfman McInnes .  flag - flag indicating information about the preconditioner matrix
1212ac21db08SLois Curfman McInnes    structure (same as flag in SLESSetOperators())
1213c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined Hessian context
12149b94acceSBarry Smith 
12159b94acceSBarry Smith    Notes:
1216dc5a77f8SLois Curfman McInnes    See SLESSetOperators() for important information about setting the flag
12172cd2dfdcSLois Curfman McInnes    output parameter in the routine func().  Be sure to read this information!
1218ac21db08SLois Curfman McInnes 
12199b94acceSBarry Smith    The function func() takes Mat * as the matrix arguments rather than Mat.
12209b94acceSBarry Smith    This allows the Hessian evaluation routine to replace A and/or B with a
12219b94acceSBarry Smith    completely new new matrix structure (not just different matrix elements)
12229b94acceSBarry Smith    when appropriate, for instance, if the nonzero structure is changing
12239b94acceSBarry Smith    throughout the global iterations.
12249b94acceSBarry Smith 
122536851e7fSLois Curfman McInnes    Level: beginner
122636851e7fSLois Curfman McInnes 
12279b94acceSBarry Smith .keywords: SNES, nonlinear, set, Hessian, matrix
12289b94acceSBarry Smith 
1229ac21db08SLois Curfman McInnes .seealso: SNESSetMinimizationFunction(), SNESSetGradient(), SLESSetOperators()
12309b94acceSBarry Smith @*/
1231454a90a3SBarry Smith int SNESSetHessian(SNES snes,Mat A,Mat B,int (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx)
12329b94acceSBarry Smith {
12333a7fca6bSBarry Smith   int ierr;
12343a7fca6bSBarry Smith 
12353a40ed3dSBarry Smith   PetscFunctionBegin;
123677c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1237184914b5SBarry Smith   PetscValidHeaderSpecific(A,MAT_COOKIE);
1238184914b5SBarry Smith   PetscValidHeaderSpecific(B,MAT_COOKIE);
1239184914b5SBarry Smith   PetscCheckSameComm(snes,A);
1240184914b5SBarry Smith   PetscCheckSameComm(snes,B);
1241d4bb536fSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
124229bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only");
1243d4bb536fSBarry Smith   }
12443a7fca6bSBarry Smith   if (func) snes->computejacobian = func;
12453a7fca6bSBarry Smith   if (ctx)  snes->jacP            = ctx;
12463a7fca6bSBarry Smith   if (A) {
12473a7fca6bSBarry Smith     if (snes->jacobian) {ierr = MatDestroy(snes->jacobian);CHKERRQ(ierr);}
12489b94acceSBarry Smith     snes->jacobian = A;
12493a7fca6bSBarry Smith     ierr           = PetscObjectReference((PetscObject)A);CHKERRQ(ierr);
12503a7fca6bSBarry Smith   }
12513a7fca6bSBarry Smith   if (B) {
12523a7fca6bSBarry Smith     if (snes->jacobian_pre) {ierr = MatDestroy(snes->jacobian_pre);CHKERRQ(ierr);}
12539b94acceSBarry Smith     snes->jacobian_pre = B;
12543a7fca6bSBarry Smith     ierr               = PetscObjectReference((PetscObject)B);CHKERRQ(ierr);
12553a7fca6bSBarry Smith   }
12563a40ed3dSBarry Smith   PetscFunctionReturn(0);
12579b94acceSBarry Smith }
12589b94acceSBarry Smith 
12594a2ae208SSatish Balay #undef __FUNCT__
12604a2ae208SSatish Balay #define __FUNCT__ "SNESGetHessian"
126162fef451SLois Curfman McInnes /*@
126262fef451SLois Curfman McInnes    SNESGetHessian - Returns the Hessian matrix and optionally the user
126362fef451SLois Curfman McInnes    provided context for evaluating the Hessian.
126462fef451SLois Curfman McInnes 
1265c7afd0dbSLois Curfman McInnes    Not Collective, but Mat object is parallel if SNES object is parallel
1266c7afd0dbSLois Curfman McInnes 
126762fef451SLois Curfman McInnes    Input Parameter:
126862fef451SLois Curfman McInnes .  snes - the nonlinear solver context
126962fef451SLois Curfman McInnes 
127062fef451SLois Curfman McInnes    Output Parameters:
1271c7afd0dbSLois Curfman McInnes +  A - location to stash Hessian matrix (or PETSC_NULL)
127262fef451SLois Curfman McInnes .  B - location to stash preconditioner matrix (or PETSC_NULL)
1273c7afd0dbSLois Curfman McInnes -  ctx - location to stash Hessian ctx (or PETSC_NULL)
1274fee21e36SBarry Smith 
127536851e7fSLois Curfman McInnes    Level: advanced
127636851e7fSLois Curfman McInnes 
127762fef451SLois Curfman McInnes .seealso: SNESSetHessian(), SNESComputeHessian()
1278c7afd0dbSLois Curfman McInnes 
1279c7afd0dbSLois Curfman McInnes .keywords: SNES, get, Hessian
128062fef451SLois Curfman McInnes @*/
128162fef451SLois Curfman McInnes int SNESGetHessian(SNES snes,Mat *A,Mat *B,void **ctx)
128262fef451SLois Curfman McInnes {
12833a40ed3dSBarry Smith   PetscFunctionBegin;
1284184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
12853a40ed3dSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION){
128629bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only");
12873a40ed3dSBarry Smith   }
128862fef451SLois Curfman McInnes   if (A)   *A = snes->jacobian;
128962fef451SLois Curfman McInnes   if (B)   *B = snes->jacobian_pre;
129062fef451SLois Curfman McInnes   if (ctx) *ctx = snes->jacP;
12913a40ed3dSBarry Smith   PetscFunctionReturn(0);
129262fef451SLois Curfman McInnes }
129362fef451SLois Curfman McInnes 
12949b94acceSBarry Smith /* ----- Routines to initialize and destroy a nonlinear solver ---- */
12959b94acceSBarry Smith 
12964a2ae208SSatish Balay #undef __FUNCT__
12974a2ae208SSatish Balay #define __FUNCT__ "SNESSetUp"
12989b94acceSBarry Smith /*@
12999b94acceSBarry Smith    SNESSetUp - Sets up the internal data structures for the later use
1300272ac6f2SLois Curfman McInnes    of a nonlinear solver.
13019b94acceSBarry Smith 
1302fee21e36SBarry Smith    Collective on SNES
1303fee21e36SBarry Smith 
1304c7afd0dbSLois Curfman McInnes    Input Parameters:
1305c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1306c7afd0dbSLois Curfman McInnes -  x - the solution vector
1307c7afd0dbSLois Curfman McInnes 
1308272ac6f2SLois Curfman McInnes    Notes:
1309272ac6f2SLois Curfman McInnes    For basic use of the SNES solvers the user need not explicitly call
1310272ac6f2SLois Curfman McInnes    SNESSetUp(), since these actions will automatically occur during
1311272ac6f2SLois Curfman McInnes    the call to SNESSolve().  However, if one wishes to control this
1312272ac6f2SLois Curfman McInnes    phase separately, SNESSetUp() should be called after SNESCreate()
1313272ac6f2SLois Curfman McInnes    and optional routines of the form SNESSetXXX(), but before SNESSolve().
1314272ac6f2SLois Curfman McInnes 
131536851e7fSLois Curfman McInnes    Level: advanced
131636851e7fSLois Curfman McInnes 
13179b94acceSBarry Smith .keywords: SNES, nonlinear, setup
13189b94acceSBarry Smith 
13199b94acceSBarry Smith .seealso: SNESCreate(), SNESSolve(), SNESDestroy()
13209b94acceSBarry Smith @*/
13218ddd3da0SLois Curfman McInnes int SNESSetUp(SNES snes,Vec x)
13229b94acceSBarry Smith {
1323f1af5d2fSBarry Smith   int        ierr;
1324f1af5d2fSBarry Smith   PetscTruth flg;
13253a40ed3dSBarry Smith 
13263a40ed3dSBarry Smith   PetscFunctionBegin;
132777c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
132877c4ece6SBarry Smith   PetscValidHeaderSpecific(x,VEC_COOKIE);
1329184914b5SBarry Smith   PetscCheckSameComm(snes,x);
13308ddd3da0SLois Curfman McInnes   snes->vec_sol = snes->vec_sol_always = x;
13319b94acceSBarry Smith 
1332b0a32e0cSBarry Smith   ierr = PetscOptionsHasName(snes->prefix,"-snes_mf_operator",&flg);CHKERRQ(ierr);
1333c1f60f51SBarry Smith   /*
1334c1f60f51SBarry Smith       This version replaces the user provided Jacobian matrix with a
1335dfa02198SLois Curfman McInnes       matrix-free version but still employs the user-provided preconditioner matrix
1336c1f60f51SBarry Smith   */
1337c1f60f51SBarry Smith   if (flg) {
1338c1f60f51SBarry Smith     Mat J;
13395a655dc6SBarry Smith     ierr = MatCreateSNESMF(snes,snes->vec_sol,&J);CHKERRQ(ierr);
13405a655dc6SBarry Smith     ierr = MatSNESMFSetFromOptions(J);CHKERRQ(ierr);
13413a7fca6bSBarry Smith     PetscLogInfo(snes,"SNESSetUp: Setting default matrix-free operator routines\n");
13423a7fca6bSBarry Smith     ierr = SNESSetJacobian(snes,J,0,0,0);CHKERRQ(ierr);
13433a7fca6bSBarry Smith     ierr = MatDestroy(J);CHKERRQ(ierr);
1344c1f60f51SBarry Smith   }
1345b0a32e0cSBarry Smith   ierr = PetscOptionsHasName(snes->prefix,"-snes_mf",&flg);CHKERRQ(ierr);
1346c1f60f51SBarry Smith   /*
1347dfa02198SLois Curfman McInnes       This version replaces both the user-provided Jacobian and the user-
1348c1f60f51SBarry Smith       provided preconditioner matrix with the default matrix free version.
1349c1f60f51SBarry Smith    */
135031615d04SLois Curfman McInnes   if (flg) {
1351272ac6f2SLois Curfman McInnes     Mat  J;
1352f3ef73ceSBarry Smith     SLES sles;
1353f3ef73ceSBarry Smith     PC   pc;
1354f3ef73ceSBarry Smith 
13555a655dc6SBarry Smith     ierr = MatCreateSNESMF(snes,snes->vec_sol,&J);CHKERRQ(ierr);
13563a7fca6bSBarry Smith     ierr = MatSNESMFSetFromOptions(J);CHKERRQ(ierr);
135793b98531SBarry Smith     PetscLogInfo(snes,"SNESSetUp: Setting default matrix-free operator and preconditioner routines\n");
135883e56afdSLois Curfman McInnes     if (snes->method_class == SNES_NONLINEAR_EQUATIONS) {
13593a7fca6bSBarry Smith       ierr = SNESSetJacobian(snes,J,J,MatSNESMFComputeJacobian,snes->funP);CHKERRQ(ierr);
1360d64ed03dSBarry Smith     } else if (snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) {
13613a7fca6bSBarry Smith       ierr = SNESSetHessian(snes,J,J,MatSNESMFComputeJacobian,snes->funP);CHKERRQ(ierr);
1362d4bb536fSBarry Smith     } else {
136329bbc08cSBarry Smith       SETERRQ(PETSC_ERR_SUP,"Method class doesn't support matrix-free option");
1364d4bb536fSBarry Smith     }
13653a7fca6bSBarry Smith     ierr = MatDestroy(J);CHKERRQ(ierr);
13663a7fca6bSBarry Smith 
1367f3ef73ceSBarry Smith     /* force no preconditioner */
1368f3ef73ceSBarry Smith     ierr = SNESGetSLES(snes,&sles);CHKERRQ(ierr);
1369f3ef73ceSBarry Smith     ierr = SLESGetPC(sles,&pc);CHKERRQ(ierr);
1370f3ef73ceSBarry Smith     ierr = PCSetType(pc,PCNONE);CHKERRQ(ierr);
1371272ac6f2SLois Curfman McInnes   }
1372f3ef73ceSBarry Smith 
13739b94acceSBarry Smith   if ((snes->method_class == SNES_NONLINEAR_EQUATIONS)) {
13746831982aSBarry Smith     PetscTruth iseqtr;
13756831982aSBarry Smith 
137629bbc08cSBarry Smith     if (!snes->vec_func) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetFunction() first");
137729bbc08cSBarry Smith     if (!snes->computefunction) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetFunction() first");
137829bbc08cSBarry Smith     if (!snes->jacobian) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetJacobian() first \n or use -snes_mf option");
1379a8c6a408SBarry Smith     if (snes->vec_func == snes->vec_sol) {
138029bbc08cSBarry Smith       SETERRQ(PETSC_ERR_ARG_IDN,"Solution vector cannot be function vector");
1381a8c6a408SBarry Smith     }
1382a703fe33SLois Curfman McInnes 
1383a703fe33SLois Curfman McInnes     /* Set the KSP stopping criterion to use the Eisenstat-Walker method */
13846831982aSBarry Smith     ierr = PetscTypeCompare((PetscObject)snes,SNESEQTR,&iseqtr);CHKERRQ(ierr);
13856831982aSBarry Smith     if (snes->ksp_ewconv && !iseqtr) {
1386a703fe33SLois Curfman McInnes       SLES sles; KSP ksp;
1387a703fe33SLois Curfman McInnes       ierr = SNESGetSLES(snes,&sles);CHKERRQ(ierr);
1388a703fe33SLois Curfman McInnes       ierr = SLESGetKSP(sles,&ksp);CHKERRQ(ierr);
1389186905e3SBarry Smith       ierr = KSPSetConvergenceTest(ksp,SNES_KSP_EW_Converged_Private,snes);CHKERRQ(ierr);
1390a703fe33SLois Curfman McInnes     }
13919b94acceSBarry Smith   } else if ((snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION)) {
139229bbc08cSBarry Smith     if (!snes->vec_func) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetGradient() first");
139329bbc08cSBarry Smith     if (!snes->computefunction) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetGradient() first");
1394a8c6a408SBarry Smith     if (!snes->computeumfunction) {
139529bbc08cSBarry Smith       SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetMinimizationFunction() first");
1396a8c6a408SBarry Smith     }
139729bbc08cSBarry Smith     if (!snes->jacobian) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetHessian()");
1398d4bb536fSBarry Smith   } else {
139929bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Unknown method class");
1400d4bb536fSBarry Smith   }
1401a703fe33SLois Curfman McInnes   if (snes->setup) {ierr = (*snes->setup)(snes);CHKERRQ(ierr);}
140282bf6240SBarry Smith   snes->setupcalled = 1;
14033a40ed3dSBarry Smith   PetscFunctionReturn(0);
14049b94acceSBarry Smith }
14059b94acceSBarry Smith 
14064a2ae208SSatish Balay #undef __FUNCT__
14074a2ae208SSatish Balay #define __FUNCT__ "SNESDestroy"
14089b94acceSBarry Smith /*@C
14099b94acceSBarry Smith    SNESDestroy - Destroys the nonlinear solver context that was created
14109b94acceSBarry Smith    with SNESCreate().
14119b94acceSBarry Smith 
1412c7afd0dbSLois Curfman McInnes    Collective on SNES
1413c7afd0dbSLois Curfman McInnes 
14149b94acceSBarry Smith    Input Parameter:
14159b94acceSBarry Smith .  snes - the SNES context
14169b94acceSBarry Smith 
141736851e7fSLois Curfman McInnes    Level: beginner
141836851e7fSLois Curfman McInnes 
14199b94acceSBarry Smith .keywords: SNES, nonlinear, destroy
14209b94acceSBarry Smith 
142163a78c88SLois Curfman McInnes .seealso: SNESCreate(), SNESSolve()
14229b94acceSBarry Smith @*/
14239b94acceSBarry Smith int SNESDestroy(SNES snes)
14249b94acceSBarry Smith {
1425b8a78c4aSBarry Smith   int i,ierr;
14263a40ed3dSBarry Smith 
14273a40ed3dSBarry Smith   PetscFunctionBegin;
142877c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
14293a40ed3dSBarry Smith   if (--snes->refct > 0) PetscFunctionReturn(0);
1430d4bb536fSBarry Smith 
1431be0abb6dSBarry Smith   /* if memory was published with AMS then destroy it */
14320f5bd95cSBarry Smith   ierr = PetscObjectDepublish(snes);CHKERRQ(ierr);
1433be0abb6dSBarry Smith 
1434e1311b90SBarry Smith   if (snes->destroy) {ierr = (*(snes)->destroy)(snes);CHKERRQ(ierr);}
1435606d414cSSatish Balay   if (snes->kspconvctx) {ierr = PetscFree(snes->kspconvctx);CHKERRQ(ierr);}
14363a7fca6bSBarry Smith   if (snes->jacobian) {ierr = MatDestroy(snes->jacobian);CHKERRQ(ierr);}
14373a7fca6bSBarry Smith   if (snes->jacobian_pre) {ierr = MatDestroy(snes->jacobian_pre);CHKERRQ(ierr);}
14389b94acceSBarry Smith   ierr = SLESDestroy(snes->sles);CHKERRQ(ierr);
1439522c5e43SBarry Smith   if (snes->vwork) {ierr = VecDestroyVecs(snes->vwork,snes->nvwork);CHKERRQ(ierr);}
1440b8a78c4aSBarry Smith   for (i=0; i<snes->numbermonitors; i++) {
1441b8a78c4aSBarry Smith     if (snes->monitordestroy[i]) {
1442b8a78c4aSBarry Smith       ierr = (*snes->monitordestroy[i])(snes->monitorcontext[i]);CHKERRQ(ierr);
1443b8a78c4aSBarry Smith     }
1444b8a78c4aSBarry Smith   }
1445b0a32e0cSBarry Smith   PetscLogObjectDestroy((PetscObject)snes);
14460452661fSBarry Smith   PetscHeaderDestroy((PetscObject)snes);
14473a40ed3dSBarry Smith   PetscFunctionReturn(0);
14489b94acceSBarry Smith }
14499b94acceSBarry Smith 
14509b94acceSBarry Smith /* ----------- Routines to set solver parameters ---------- */
14519b94acceSBarry Smith 
14524a2ae208SSatish Balay #undef __FUNCT__
14534a2ae208SSatish Balay #define __FUNCT__ "SNESSetTolerances"
14549b94acceSBarry Smith /*@
1455d7a720efSLois Curfman McInnes    SNESSetTolerances - Sets various parameters used in convergence tests.
14569b94acceSBarry Smith 
1457c7afd0dbSLois Curfman McInnes    Collective on SNES
1458c7afd0dbSLois Curfman McInnes 
14599b94acceSBarry Smith    Input Parameters:
1460c7afd0dbSLois Curfman McInnes +  snes - the SNES context
146133174efeSLois Curfman McInnes .  atol - absolute convergence tolerance
146233174efeSLois Curfman McInnes .  rtol - relative convergence tolerance
146333174efeSLois Curfman McInnes .  stol -  convergence tolerance in terms of the norm
146433174efeSLois Curfman McInnes            of the change in the solution between steps
146533174efeSLois Curfman McInnes .  maxit - maximum number of iterations
1466c7afd0dbSLois Curfman McInnes -  maxf - maximum number of function evaluations
1467fee21e36SBarry Smith 
146833174efeSLois Curfman McInnes    Options Database Keys:
1469c7afd0dbSLois Curfman McInnes +    -snes_atol <atol> - Sets atol
1470c7afd0dbSLois Curfman McInnes .    -snes_rtol <rtol> - Sets rtol
1471c7afd0dbSLois Curfman McInnes .    -snes_stol <stol> - Sets stol
1472c7afd0dbSLois Curfman McInnes .    -snes_max_it <maxit> - Sets maxit
1473c7afd0dbSLois Curfman McInnes -    -snes_max_funcs <maxf> - Sets maxf
14749b94acceSBarry Smith 
1475d7a720efSLois Curfman McInnes    Notes:
14769b94acceSBarry Smith    The default maximum number of iterations is 50.
14779b94acceSBarry Smith    The default maximum number of function evaluations is 1000.
14789b94acceSBarry Smith 
147936851e7fSLois Curfman McInnes    Level: intermediate
148036851e7fSLois Curfman McInnes 
148133174efeSLois Curfman McInnes .keywords: SNES, nonlinear, set, convergence, tolerances
14829b94acceSBarry Smith 
1483d7a720efSLois Curfman McInnes .seealso: SNESSetTrustRegionTolerance(), SNESSetMinimizationFunctionTolerance()
14849b94acceSBarry Smith @*/
1485329f5518SBarry Smith int SNESSetTolerances(SNES snes,PetscReal atol,PetscReal rtol,PetscReal stol,int maxit,int maxf)
14869b94acceSBarry Smith {
14873a40ed3dSBarry Smith   PetscFunctionBegin;
148877c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1489d7a720efSLois Curfman McInnes   if (atol != PETSC_DEFAULT)  snes->atol      = atol;
1490d7a720efSLois Curfman McInnes   if (rtol != PETSC_DEFAULT)  snes->rtol      = rtol;
1491d7a720efSLois Curfman McInnes   if (stol != PETSC_DEFAULT)  snes->xtol      = stol;
1492d7a720efSLois Curfman McInnes   if (maxit != PETSC_DEFAULT) snes->max_its   = maxit;
1493d7a720efSLois Curfman McInnes   if (maxf != PETSC_DEFAULT)  snes->max_funcs = maxf;
14943a40ed3dSBarry Smith   PetscFunctionReturn(0);
14959b94acceSBarry Smith }
14969b94acceSBarry Smith 
14974a2ae208SSatish Balay #undef __FUNCT__
14984a2ae208SSatish Balay #define __FUNCT__ "SNESGetTolerances"
14999b94acceSBarry Smith /*@
150033174efeSLois Curfman McInnes    SNESGetTolerances - Gets various parameters used in convergence tests.
150133174efeSLois Curfman McInnes 
1502c7afd0dbSLois Curfman McInnes    Not Collective
1503c7afd0dbSLois Curfman McInnes 
150433174efeSLois Curfman McInnes    Input Parameters:
1505c7afd0dbSLois Curfman McInnes +  snes - the SNES context
150633174efeSLois Curfman McInnes .  atol - absolute convergence tolerance
150733174efeSLois Curfman McInnes .  rtol - relative convergence tolerance
150833174efeSLois Curfman McInnes .  stol -  convergence tolerance in terms of the norm
150933174efeSLois Curfman McInnes            of the change in the solution between steps
151033174efeSLois Curfman McInnes .  maxit - maximum number of iterations
1511c7afd0dbSLois Curfman McInnes -  maxf - maximum number of function evaluations
1512fee21e36SBarry Smith 
151333174efeSLois Curfman McInnes    Notes:
151433174efeSLois Curfman McInnes    The user can specify PETSC_NULL for any parameter that is not needed.
151533174efeSLois Curfman McInnes 
151636851e7fSLois Curfman McInnes    Level: intermediate
151736851e7fSLois Curfman McInnes 
151833174efeSLois Curfman McInnes .keywords: SNES, nonlinear, get, convergence, tolerances
151933174efeSLois Curfman McInnes 
152033174efeSLois Curfman McInnes .seealso: SNESSetTolerances()
152133174efeSLois Curfman McInnes @*/
1522329f5518SBarry Smith int SNESGetTolerances(SNES snes,PetscReal *atol,PetscReal *rtol,PetscReal *stol,int *maxit,int *maxf)
152333174efeSLois Curfman McInnes {
15243a40ed3dSBarry Smith   PetscFunctionBegin;
152533174efeSLois Curfman McInnes   PetscValidHeaderSpecific(snes,SNES_COOKIE);
152633174efeSLois Curfman McInnes   if (atol)  *atol  = snes->atol;
152733174efeSLois Curfman McInnes   if (rtol)  *rtol  = snes->rtol;
152833174efeSLois Curfman McInnes   if (stol)  *stol  = snes->xtol;
152933174efeSLois Curfman McInnes   if (maxit) *maxit = snes->max_its;
153033174efeSLois Curfman McInnes   if (maxf)  *maxf  = snes->max_funcs;
15313a40ed3dSBarry Smith   PetscFunctionReturn(0);
153233174efeSLois Curfman McInnes }
153333174efeSLois Curfman McInnes 
15344a2ae208SSatish Balay #undef __FUNCT__
15354a2ae208SSatish Balay #define __FUNCT__ "SNESSetTrustRegionTolerance"
153633174efeSLois Curfman McInnes /*@
15379b94acceSBarry Smith    SNESSetTrustRegionTolerance - Sets the trust region parameter tolerance.
15389b94acceSBarry Smith 
1539fee21e36SBarry Smith    Collective on SNES
1540fee21e36SBarry Smith 
1541c7afd0dbSLois Curfman McInnes    Input Parameters:
1542c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1543c7afd0dbSLois Curfman McInnes -  tol - tolerance
1544c7afd0dbSLois Curfman McInnes 
15459b94acceSBarry Smith    Options Database Key:
1546c7afd0dbSLois Curfman McInnes .  -snes_trtol <tol> - Sets tol
15479b94acceSBarry Smith 
154836851e7fSLois Curfman McInnes    Level: intermediate
154936851e7fSLois Curfman McInnes 
15509b94acceSBarry Smith .keywords: SNES, nonlinear, set, trust region, tolerance
15519b94acceSBarry Smith 
1552d7a720efSLois Curfman McInnes .seealso: SNESSetTolerances(), SNESSetMinimizationFunctionTolerance()
15539b94acceSBarry Smith @*/
1554329f5518SBarry Smith int SNESSetTrustRegionTolerance(SNES snes,PetscReal tol)
15559b94acceSBarry Smith {
15563a40ed3dSBarry Smith   PetscFunctionBegin;
155777c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
15589b94acceSBarry Smith   snes->deltatol = tol;
15593a40ed3dSBarry Smith   PetscFunctionReturn(0);
15609b94acceSBarry Smith }
15619b94acceSBarry Smith 
15624a2ae208SSatish Balay #undef __FUNCT__
15634a2ae208SSatish Balay #define __FUNCT__ "SNESSetMinimizationFunctionTolerance"
15649b94acceSBarry Smith /*@
156577c4ece6SBarry Smith    SNESSetMinimizationFunctionTolerance - Sets the minimum allowable function tolerance
15669b94acceSBarry Smith    for unconstrained minimization solvers.
15679b94acceSBarry Smith 
1568fee21e36SBarry Smith    Collective on SNES
1569fee21e36SBarry Smith 
1570c7afd0dbSLois Curfman McInnes    Input Parameters:
1571c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1572c7afd0dbSLois Curfman McInnes -  ftol - minimum function tolerance
1573c7afd0dbSLois Curfman McInnes 
15749b94acceSBarry Smith    Options Database Key:
1575c7afd0dbSLois Curfman McInnes .  -snes_fmin <ftol> - Sets ftol
15769b94acceSBarry Smith 
15779b94acceSBarry Smith    Note:
157877c4ece6SBarry Smith    SNESSetMinimizationFunctionTolerance() is valid for SNES_UNCONSTRAINED_MINIMIZATION
15799b94acceSBarry Smith    methods only.
15809b94acceSBarry Smith 
158136851e7fSLois Curfman McInnes    Level: intermediate
158236851e7fSLois Curfman McInnes 
15839b94acceSBarry Smith .keywords: SNES, nonlinear, set, minimum, convergence, function, tolerance
15849b94acceSBarry Smith 
1585d7a720efSLois Curfman McInnes .seealso: SNESSetTolerances(), SNESSetTrustRegionTolerance()
15869b94acceSBarry Smith @*/
1587329f5518SBarry Smith int SNESSetMinimizationFunctionTolerance(SNES snes,PetscReal ftol)
15889b94acceSBarry Smith {
15893a40ed3dSBarry Smith   PetscFunctionBegin;
159077c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
15919b94acceSBarry Smith   snes->fmin = ftol;
15923a40ed3dSBarry Smith   PetscFunctionReturn(0);
15939b94acceSBarry Smith }
1594df9fa365SBarry Smith /*
1595df9fa365SBarry Smith    Duplicate the lg monitors for SNES from KSP; for some reason with
1596df9fa365SBarry Smith    dynamic libraries things don't work under Sun4 if we just use
1597df9fa365SBarry Smith    macros instead of functions
1598df9fa365SBarry Smith */
15994a2ae208SSatish Balay #undef __FUNCT__
16004a2ae208SSatish Balay #define __FUNCT__ "SNESLGMonitor"
1601329f5518SBarry Smith int SNESLGMonitor(SNES snes,int it,PetscReal norm,void *ctx)
1602ce1608b8SBarry Smith {
1603ce1608b8SBarry Smith   int ierr;
1604ce1608b8SBarry Smith 
1605ce1608b8SBarry Smith   PetscFunctionBegin;
1606184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1607ce1608b8SBarry Smith   ierr = KSPLGMonitor((KSP)snes,it,norm,ctx);CHKERRQ(ierr);
1608ce1608b8SBarry Smith   PetscFunctionReturn(0);
1609ce1608b8SBarry Smith }
1610ce1608b8SBarry Smith 
16114a2ae208SSatish Balay #undef __FUNCT__
16124a2ae208SSatish Balay #define __FUNCT__ "SNESLGMonitorCreate"
1613b0a32e0cSBarry Smith int SNESLGMonitorCreate(char *host,char *label,int x,int y,int m,int n,PetscDrawLG *draw)
1614df9fa365SBarry Smith {
1615df9fa365SBarry Smith   int ierr;
1616df9fa365SBarry Smith 
1617df9fa365SBarry Smith   PetscFunctionBegin;
1618df9fa365SBarry Smith   ierr = KSPLGMonitorCreate(host,label,x,y,m,n,draw);CHKERRQ(ierr);
1619df9fa365SBarry Smith   PetscFunctionReturn(0);
1620df9fa365SBarry Smith }
1621df9fa365SBarry Smith 
16224a2ae208SSatish Balay #undef __FUNCT__
16234a2ae208SSatish Balay #define __FUNCT__ "SNESLGMonitorDestroy"
1624b0a32e0cSBarry Smith int SNESLGMonitorDestroy(PetscDrawLG draw)
1625df9fa365SBarry Smith {
1626df9fa365SBarry Smith   int ierr;
1627df9fa365SBarry Smith 
1628df9fa365SBarry Smith   PetscFunctionBegin;
1629df9fa365SBarry Smith   ierr = KSPLGMonitorDestroy(draw);CHKERRQ(ierr);
1630df9fa365SBarry Smith   PetscFunctionReturn(0);
1631df9fa365SBarry Smith }
1632df9fa365SBarry Smith 
16339b94acceSBarry Smith /* ------------ Routines to set performance monitoring options ----------- */
16349b94acceSBarry Smith 
16354a2ae208SSatish Balay #undef __FUNCT__
16364a2ae208SSatish Balay #define __FUNCT__ "SNESSetMonitor"
16379b94acceSBarry Smith /*@C
16385cd90555SBarry Smith    SNESSetMonitor - Sets an ADDITIONAL function that is to be used at every
16399b94acceSBarry Smith    iteration of the nonlinear solver to display the iteration's
16409b94acceSBarry Smith    progress.
16419b94acceSBarry Smith 
1642fee21e36SBarry Smith    Collective on SNES
1643fee21e36SBarry Smith 
1644c7afd0dbSLois Curfman McInnes    Input Parameters:
1645c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1646c7afd0dbSLois Curfman McInnes .  func - monitoring routine
1647b8a78c4aSBarry Smith .  mctx - [optional] user-defined context for private data for the
1648b3006f0bSLois Curfman McInnes           monitor routine (use PETSC_NULL if no context is desitre)
1649b3006f0bSLois Curfman McInnes -  monitordestroy - [optional] routine that frees monitor context
1650b3006f0bSLois Curfman McInnes           (may be PETSC_NULL)
16519b94acceSBarry Smith 
1652c7afd0dbSLois Curfman McInnes    Calling sequence of func:
1653329f5518SBarry Smith $     int func(SNES snes,int its, PetscReal norm,void *mctx)
1654c7afd0dbSLois Curfman McInnes 
1655c7afd0dbSLois Curfman McInnes +    snes - the SNES context
1656c7afd0dbSLois Curfman McInnes .    its - iteration number
1657c7afd0dbSLois Curfman McInnes .    norm - 2-norm function value (may be estimated)
1658c7afd0dbSLois Curfman McInnes             for SNES_NONLINEAR_EQUATIONS methods
165940a0c1c6SLois Curfman McInnes .    norm - 2-norm gradient value (may be estimated)
1660c7afd0dbSLois Curfman McInnes             for SNES_UNCONSTRAINED_MINIMIZATION methods
166140a0c1c6SLois Curfman McInnes -    mctx - [optional] monitoring context
16629b94acceSBarry Smith 
16639665c990SLois Curfman McInnes    Options Database Keys:
1664c7afd0dbSLois Curfman McInnes +    -snes_monitor        - sets SNESDefaultMonitor()
1665c7afd0dbSLois Curfman McInnes .    -snes_xmonitor       - sets line graph monitor,
1666c7afd0dbSLois Curfman McInnes                             uses SNESLGMonitorCreate()
1667c7afd0dbSLois Curfman McInnes _    -snes_cancelmonitors - cancels all monitors that have
1668c7afd0dbSLois Curfman McInnes                             been hardwired into a code by
1669c7afd0dbSLois Curfman McInnes                             calls to SNESSetMonitor(), but
1670c7afd0dbSLois Curfman McInnes                             does not cancel those set via
1671c7afd0dbSLois Curfman McInnes                             the options database.
16729665c990SLois Curfman McInnes 
1673639f9d9dSBarry Smith    Notes:
16746bc08f3fSLois Curfman McInnes    Several different monitoring routines may be set by calling
16756bc08f3fSLois Curfman McInnes    SNESSetMonitor() multiple times; all will be called in the
16766bc08f3fSLois Curfman McInnes    order in which they were set.
1677639f9d9dSBarry Smith 
167836851e7fSLois Curfman McInnes    Level: intermediate
167936851e7fSLois Curfman McInnes 
16809b94acceSBarry Smith .keywords: SNES, nonlinear, set, monitor
16819b94acceSBarry Smith 
16825cd90555SBarry Smith .seealso: SNESDefaultMonitor(), SNESClearMonitor()
16839b94acceSBarry Smith @*/
1684329f5518SBarry Smith int SNESSetMonitor(SNES snes,int (*func)(SNES,int,PetscReal,void*),void *mctx,int (*monitordestroy)(void *))
16859b94acceSBarry Smith {
16863a40ed3dSBarry Smith   PetscFunctionBegin;
1687184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1688639f9d9dSBarry Smith   if (snes->numbermonitors >= MAXSNESMONITORS) {
168929bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Too many monitors set");
1690639f9d9dSBarry Smith   }
1691639f9d9dSBarry Smith 
1692639f9d9dSBarry Smith   snes->monitor[snes->numbermonitors]           = func;
1693b8a78c4aSBarry Smith   snes->monitordestroy[snes->numbermonitors]    = monitordestroy;
1694639f9d9dSBarry Smith   snes->monitorcontext[snes->numbermonitors++]  = (void*)mctx;
16953a40ed3dSBarry Smith   PetscFunctionReturn(0);
16969b94acceSBarry Smith }
16979b94acceSBarry Smith 
16984a2ae208SSatish Balay #undef __FUNCT__
16994a2ae208SSatish Balay #define __FUNCT__ "SNESClearMonitor"
17005cd90555SBarry Smith /*@C
17015cd90555SBarry Smith    SNESClearMonitor - Clears all the monitor functions for a SNES object.
17025cd90555SBarry Smith 
1703c7afd0dbSLois Curfman McInnes    Collective on SNES
1704c7afd0dbSLois Curfman McInnes 
17055cd90555SBarry Smith    Input Parameters:
17065cd90555SBarry Smith .  snes - the SNES context
17075cd90555SBarry Smith 
17085cd90555SBarry Smith    Options Database:
1709c7afd0dbSLois Curfman McInnes .  -snes_cancelmonitors - cancels all monitors that have been hardwired
1710c7afd0dbSLois Curfman McInnes     into a code by calls to SNESSetMonitor(), but does not cancel those
1711c7afd0dbSLois Curfman McInnes     set via the options database
17125cd90555SBarry Smith 
17135cd90555SBarry Smith    Notes:
17145cd90555SBarry Smith    There is no way to clear one specific monitor from a SNES object.
17155cd90555SBarry Smith 
171636851e7fSLois Curfman McInnes    Level: intermediate
171736851e7fSLois Curfman McInnes 
17185cd90555SBarry Smith .keywords: SNES, nonlinear, set, monitor
17195cd90555SBarry Smith 
17205cd90555SBarry Smith .seealso: SNESDefaultMonitor(), SNESSetMonitor()
17215cd90555SBarry Smith @*/
17225cd90555SBarry Smith int SNESClearMonitor(SNES snes)
17235cd90555SBarry Smith {
17245cd90555SBarry Smith   PetscFunctionBegin;
1725184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
17265cd90555SBarry Smith   snes->numbermonitors = 0;
17275cd90555SBarry Smith   PetscFunctionReturn(0);
17285cd90555SBarry Smith }
17295cd90555SBarry Smith 
17304a2ae208SSatish Balay #undef __FUNCT__
17314a2ae208SSatish Balay #define __FUNCT__ "SNESSetConvergenceTest"
17329b94acceSBarry Smith /*@C
17339b94acceSBarry Smith    SNESSetConvergenceTest - Sets the function that is to be used
17349b94acceSBarry Smith    to test for convergence of the nonlinear iterative solution.
17359b94acceSBarry Smith 
1736fee21e36SBarry Smith    Collective on SNES
1737fee21e36SBarry Smith 
1738c7afd0dbSLois Curfman McInnes    Input Parameters:
1739c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1740c7afd0dbSLois Curfman McInnes .  func - routine to test for convergence
1741c7afd0dbSLois Curfman McInnes -  cctx - [optional] context for private data for the convergence routine
1742c7afd0dbSLois Curfman McInnes           (may be PETSC_NULL)
17439b94acceSBarry Smith 
1744c7afd0dbSLois Curfman McInnes    Calling sequence of func:
1745329f5518SBarry Smith $     int func (SNES snes,PetscReal xnorm,PetscReal gnorm,PetscReal f,SNESConvergedReason *reason,void *cctx)
1746c7afd0dbSLois Curfman McInnes 
1747c7afd0dbSLois Curfman McInnes +    snes - the SNES context
1748c7afd0dbSLois Curfman McInnes .    cctx - [optional] convergence context
1749184914b5SBarry Smith .    reason - reason for convergence/divergence
1750c7afd0dbSLois Curfman McInnes .    xnorm - 2-norm of current iterate
1751c7afd0dbSLois Curfman McInnes .    gnorm - 2-norm of current step (SNES_NONLINEAR_EQUATIONS methods)
1752c7afd0dbSLois Curfman McInnes .    f - 2-norm of function (SNES_NONLINEAR_EQUATIONS methods)
1753c7afd0dbSLois Curfman McInnes .    gnorm - 2-norm of current gradient (SNES_UNCONSTRAINED_MINIMIZATION methods)
1754c7afd0dbSLois Curfman McInnes -    f - function value (SNES_UNCONSTRAINED_MINIMIZATION methods)
17559b94acceSBarry Smith 
175636851e7fSLois Curfman McInnes    Level: advanced
175736851e7fSLois Curfman McInnes 
17589b94acceSBarry Smith .keywords: SNES, nonlinear, set, convergence, test
17599b94acceSBarry Smith 
176040191667SLois Curfman McInnes .seealso: SNESConverged_EQ_LS(), SNESConverged_EQ_TR(),
176140191667SLois Curfman McInnes           SNESConverged_UM_LS(), SNESConverged_UM_TR()
17629b94acceSBarry Smith @*/
1763329f5518SBarry Smith int SNESSetConvergenceTest(SNES snes,int (*func)(SNES,PetscReal,PetscReal,PetscReal,SNESConvergedReason*,void*),void *cctx)
17649b94acceSBarry Smith {
17653a40ed3dSBarry Smith   PetscFunctionBegin;
1766184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
17679b94acceSBarry Smith   (snes)->converged = func;
17689b94acceSBarry Smith   (snes)->cnvP      = cctx;
17693a40ed3dSBarry Smith   PetscFunctionReturn(0);
17709b94acceSBarry Smith }
17719b94acceSBarry Smith 
17724a2ae208SSatish Balay #undef __FUNCT__
17734a2ae208SSatish Balay #define __FUNCT__ "SNESGetConvergedReason"
1774184914b5SBarry Smith /*@C
1775184914b5SBarry Smith    SNESGetConvergedReason - Gets the reason the SNES iteration was stopped.
1776184914b5SBarry Smith 
1777184914b5SBarry Smith    Not Collective
1778184914b5SBarry Smith 
1779184914b5SBarry Smith    Input Parameter:
1780184914b5SBarry Smith .  snes - the SNES context
1781184914b5SBarry Smith 
1782184914b5SBarry Smith    Output Parameter:
1783e090d566SSatish Balay .  reason - negative value indicates diverged, positive value converged, see petscsnes.h or the
1784184914b5SBarry Smith             manual pages for the individual convergence tests for complete lists
1785184914b5SBarry Smith 
1786184914b5SBarry Smith    Level: intermediate
1787184914b5SBarry Smith 
1788184914b5SBarry Smith    Notes: Can only be called after the call the SNESSolve() is complete.
1789184914b5SBarry Smith 
1790184914b5SBarry Smith .keywords: SNES, nonlinear, set, convergence, test
1791184914b5SBarry Smith 
1792184914b5SBarry Smith .seealso: SNESSetConvergenceTest(), SNESConverged_EQ_LS(), SNESConverged_EQ_TR(),
1793435da068SBarry Smith           SNESConverged_UM_LS(), SNESConverged_UM_TR(), SNESConvergedReason
1794184914b5SBarry Smith @*/
1795184914b5SBarry Smith int SNESGetConvergedReason(SNES snes,SNESConvergedReason *reason)
1796184914b5SBarry Smith {
1797184914b5SBarry Smith   PetscFunctionBegin;
1798184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1799184914b5SBarry Smith   *reason = snes->reason;
1800184914b5SBarry Smith   PetscFunctionReturn(0);
1801184914b5SBarry Smith }
1802184914b5SBarry Smith 
18034a2ae208SSatish Balay #undef __FUNCT__
18044a2ae208SSatish Balay #define __FUNCT__ "SNESSetConvergenceHistory"
1805c9005455SLois Curfman McInnes /*@
1806c9005455SLois Curfman McInnes    SNESSetConvergenceHistory - Sets the array used to hold the convergence history.
1807c9005455SLois Curfman McInnes 
1808fee21e36SBarry Smith    Collective on SNES
1809fee21e36SBarry Smith 
1810c7afd0dbSLois Curfman McInnes    Input Parameters:
1811c7afd0dbSLois Curfman McInnes +  snes - iterative context obtained from SNESCreate()
1812c7afd0dbSLois Curfman McInnes .  a   - array to hold history
1813cd5578b5SBarry Smith .  its - integer array holds the number of linear iterations for each solve.
1814758f92a0SBarry Smith .  na  - size of a and its
181564731454SLois Curfman McInnes -  reset - PETSC_TRUE indicates each new nonlinear solve resets the history counter to zero,
1816758f92a0SBarry Smith            else it continues storing new values for new nonlinear solves after the old ones
1817c7afd0dbSLois Curfman McInnes 
1818c9005455SLois Curfman McInnes    Notes:
1819c9005455SLois Curfman McInnes    If set, this array will contain the function norms (for
1820c9005455SLois Curfman McInnes    SNES_NONLINEAR_EQUATIONS methods) or gradient norms
1821c9005455SLois Curfman McInnes    (for SNES_UNCONSTRAINED_MINIMIZATION methods) computed
1822c9005455SLois Curfman McInnes    at each step.
1823c9005455SLois Curfman McInnes 
1824c9005455SLois Curfman McInnes    This routine is useful, e.g., when running a code for purposes
1825c9005455SLois Curfman McInnes    of accurate performance monitoring, when no I/O should be done
1826c9005455SLois Curfman McInnes    during the section of code that is being timed.
1827c9005455SLois Curfman McInnes 
182836851e7fSLois Curfman McInnes    Level: intermediate
182936851e7fSLois Curfman McInnes 
1830c9005455SLois Curfman McInnes .keywords: SNES, set, convergence, history
1831758f92a0SBarry Smith 
183208405cd6SLois Curfman McInnes .seealso: SNESGetConvergenceHistory()
1833758f92a0SBarry Smith 
1834c9005455SLois Curfman McInnes @*/
1835329f5518SBarry Smith int SNESSetConvergenceHistory(SNES snes,PetscReal *a,int *its,int na,PetscTruth reset)
1836c9005455SLois Curfman McInnes {
18373a40ed3dSBarry Smith   PetscFunctionBegin;
1838c9005455SLois Curfman McInnes   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1839c9005455SLois Curfman McInnes   if (na) PetscValidScalarPointer(a);
1840c9005455SLois Curfman McInnes   snes->conv_hist       = a;
1841758f92a0SBarry Smith   snes->conv_hist_its   = its;
1842758f92a0SBarry Smith   snes->conv_hist_max   = na;
1843758f92a0SBarry Smith   snes->conv_hist_reset = reset;
1844758f92a0SBarry Smith   PetscFunctionReturn(0);
1845758f92a0SBarry Smith }
1846758f92a0SBarry Smith 
18474a2ae208SSatish Balay #undef __FUNCT__
18484a2ae208SSatish Balay #define __FUNCT__ "SNESGetConvergenceHistory"
18490c4c9dddSBarry Smith /*@C
1850758f92a0SBarry Smith    SNESGetConvergenceHistory - Gets the array used to hold the convergence history.
1851758f92a0SBarry Smith 
1852758f92a0SBarry Smith    Collective on SNES
1853758f92a0SBarry Smith 
1854758f92a0SBarry Smith    Input Parameter:
1855758f92a0SBarry Smith .  snes - iterative context obtained from SNESCreate()
1856758f92a0SBarry Smith 
1857758f92a0SBarry Smith    Output Parameters:
1858758f92a0SBarry Smith .  a   - array to hold history
1859758f92a0SBarry Smith .  its - integer array holds the number of linear iterations (or
1860758f92a0SBarry Smith          negative if not converged) for each solve.
1861758f92a0SBarry Smith -  na  - size of a and its
1862758f92a0SBarry Smith 
1863758f92a0SBarry Smith    Notes:
1864758f92a0SBarry Smith     The calling sequence for this routine in Fortran is
1865758f92a0SBarry Smith $   call SNESGetConvergenceHistory(SNES snes, integer na, integer ierr)
1866758f92a0SBarry Smith 
1867758f92a0SBarry Smith    This routine is useful, e.g., when running a code for purposes
1868758f92a0SBarry Smith    of accurate performance monitoring, when no I/O should be done
1869758f92a0SBarry Smith    during the section of code that is being timed.
1870758f92a0SBarry Smith 
1871758f92a0SBarry Smith    Level: intermediate
1872758f92a0SBarry Smith 
1873758f92a0SBarry Smith .keywords: SNES, get, convergence, history
1874758f92a0SBarry Smith 
1875758f92a0SBarry Smith .seealso: SNESSetConvergencHistory()
1876758f92a0SBarry Smith 
1877758f92a0SBarry Smith @*/
1878329f5518SBarry Smith int SNESGetConvergenceHistory(SNES snes,PetscReal **a,int **its,int *na)
1879758f92a0SBarry Smith {
1880758f92a0SBarry Smith   PetscFunctionBegin;
1881758f92a0SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1882758f92a0SBarry Smith   if (a)   *a   = snes->conv_hist;
1883758f92a0SBarry Smith   if (its) *its = snes->conv_hist_its;
1884758f92a0SBarry Smith   if (na) *na   = snes->conv_hist_len;
18853a40ed3dSBarry Smith   PetscFunctionReturn(0);
1886c9005455SLois Curfman McInnes }
1887c9005455SLois Curfman McInnes 
18884a2ae208SSatish Balay #undef __FUNCT__
18894a2ae208SSatish Balay #define __FUNCT__ "SNESScaleStep_Private"
18909b94acceSBarry Smith /*
18919b94acceSBarry Smith    SNESScaleStep_Private - Scales a step so that its length is less than the
18929b94acceSBarry Smith    positive parameter delta.
18939b94acceSBarry Smith 
18949b94acceSBarry Smith     Input Parameters:
1895c7afd0dbSLois Curfman McInnes +   snes - the SNES context
18969b94acceSBarry Smith .   y - approximate solution of linear system
18979b94acceSBarry Smith .   fnorm - 2-norm of current function
1898c7afd0dbSLois Curfman McInnes -   delta - trust region size
18999b94acceSBarry Smith 
19009b94acceSBarry Smith     Output Parameters:
1901c7afd0dbSLois Curfman McInnes +   gpnorm - predicted function norm at the new point, assuming local
19029b94acceSBarry Smith     linearization.  The value is zero if the step lies within the trust
19039b94acceSBarry Smith     region, and exceeds zero otherwise.
1904c7afd0dbSLois Curfman McInnes -   ynorm - 2-norm of the step
19059b94acceSBarry Smith 
19069b94acceSBarry Smith     Note:
19076831982aSBarry Smith     For non-trust region methods such as SNESEQLS, the parameter delta
19089b94acceSBarry Smith     is set to be the maximum allowable step size.
19099b94acceSBarry Smith 
19109b94acceSBarry Smith .keywords: SNES, nonlinear, scale, step
19119b94acceSBarry Smith */
1912329f5518SBarry Smith int SNESScaleStep_Private(SNES snes,Vec y,PetscReal *fnorm,PetscReal *delta,
1913329f5518SBarry Smith                           PetscReal *gpnorm,PetscReal *ynorm)
19149b94acceSBarry Smith {
1915329f5518SBarry Smith   PetscReal norm;
1916*ea709b57SSatish Balay   PetscScalar cnorm;
19173a40ed3dSBarry Smith   int    ierr;
19183a40ed3dSBarry Smith 
19193a40ed3dSBarry Smith   PetscFunctionBegin;
1920184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1921184914b5SBarry Smith   PetscValidHeaderSpecific(y,VEC_COOKIE);
1922184914b5SBarry Smith   PetscCheckSameComm(snes,y);
1923184914b5SBarry Smith 
19243a40ed3dSBarry Smith   ierr = VecNorm(y,NORM_2,&norm);CHKERRQ(ierr);
19259b94acceSBarry Smith   if (norm > *delta) {
19269b94acceSBarry Smith      norm = *delta/norm;
19279b94acceSBarry Smith      *gpnorm = (1.0 - norm)*(*fnorm);
19289b94acceSBarry Smith      cnorm = norm;
1929329f5518SBarry Smith      ierr = VecScale(&cnorm,y);CHKERRQ(ierr);
19309b94acceSBarry Smith      *ynorm = *delta;
19319b94acceSBarry Smith   } else {
19329b94acceSBarry Smith      *gpnorm = 0.0;
19339b94acceSBarry Smith      *ynorm = norm;
19349b94acceSBarry Smith   }
19353a40ed3dSBarry Smith   PetscFunctionReturn(0);
19369b94acceSBarry Smith }
19379b94acceSBarry Smith 
19384a2ae208SSatish Balay #undef __FUNCT__
19394a2ae208SSatish Balay #define __FUNCT__ "SNESSolve"
19409b94acceSBarry Smith /*@
19419b94acceSBarry Smith    SNESSolve - Solves a nonlinear system.  Call SNESSolve after calling
194263a78c88SLois Curfman McInnes    SNESCreate() and optional routines of the form SNESSetXXX().
19439b94acceSBarry Smith 
1944c7afd0dbSLois Curfman McInnes    Collective on SNES
1945c7afd0dbSLois Curfman McInnes 
1946b2002411SLois Curfman McInnes    Input Parameters:
1947c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1948c7afd0dbSLois Curfman McInnes -  x - the solution vector
19499b94acceSBarry Smith 
19509b94acceSBarry Smith    Output Parameter:
1951b2002411SLois Curfman McInnes .  its - number of iterations until termination
19529b94acceSBarry Smith 
1953b2002411SLois Curfman McInnes    Notes:
19548ddd3da0SLois Curfman McInnes    The user should initialize the vector,x, with the initial guess
19558ddd3da0SLois Curfman McInnes    for the nonlinear solve prior to calling SNESSolve.  In particular,
19568ddd3da0SLois Curfman McInnes    to employ an initial guess of zero, the user should explicitly set
19578ddd3da0SLois Curfman McInnes    this vector to zero by calling VecSet().
19588ddd3da0SLois Curfman McInnes 
195936851e7fSLois Curfman McInnes    Level: beginner
196036851e7fSLois Curfman McInnes 
19619b94acceSBarry Smith .keywords: SNES, nonlinear, solve
19629b94acceSBarry Smith 
196363a78c88SLois Curfman McInnes .seealso: SNESCreate(), SNESDestroy()
19649b94acceSBarry Smith @*/
19658ddd3da0SLois Curfman McInnes int SNESSolve(SNES snes,Vec x,int *its)
19669b94acceSBarry Smith {
1967f1af5d2fSBarry Smith   int        ierr;
1968f1af5d2fSBarry Smith   PetscTruth flg;
1969052efed2SBarry Smith 
19703a40ed3dSBarry Smith   PetscFunctionBegin;
197177c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1972184914b5SBarry Smith   PetscValidHeaderSpecific(x,VEC_COOKIE);
1973184914b5SBarry Smith   PetscCheckSameComm(snes,x);
197474679c65SBarry Smith   PetscValidIntPointer(its);
197529bbc08cSBarry Smith   if (!snes->solve) SETERRQ(1,"SNESSetType() or SNESSetFromOptions() must be called before SNESSolve()");
197674637425SBarry Smith 
197782bf6240SBarry Smith   if (!snes->setupcalled) {ierr = SNESSetUp(snes,x);CHKERRQ(ierr);}
1978c4fc05e7SBarry Smith   else {snes->vec_sol = snes->vec_sol_always = x;}
1979758f92a0SBarry Smith   if (snes->conv_hist_reset == PETSC_TRUE) snes->conv_hist_len = 0;
1980b0a32e0cSBarry Smith   ierr = PetscLogEventBegin(SNES_Solve,snes,0,0,0);CHKERRQ(ierr);
1981c96a6f78SLois Curfman McInnes   snes->nfuncs = 0; snes->linear_its = 0; snes->nfailures = 0;
19829b94acceSBarry Smith   ierr = (*(snes)->solve)(snes,its);CHKERRQ(ierr);
1983b0a32e0cSBarry Smith   ierr = PetscLogEventEnd(SNES_Solve,snes,0,0,0);CHKERRQ(ierr);
1984b0a32e0cSBarry Smith   ierr = PetscOptionsHasName(snes->prefix,"-snes_view",&flg);CHKERRQ(ierr);
198593b98531SBarry Smith   if (flg && !PetscPreLoadingOn) { ierr = SNESView(snes,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); }
19863a40ed3dSBarry Smith   PetscFunctionReturn(0);
19879b94acceSBarry Smith }
19889b94acceSBarry Smith 
19899b94acceSBarry Smith /* --------- Internal routines for SNES Package --------- */
19909b94acceSBarry Smith 
19914a2ae208SSatish Balay #undef __FUNCT__
19924a2ae208SSatish Balay #define __FUNCT__ "SNESSetType"
199382bf6240SBarry Smith /*@C
19944b0e389bSBarry Smith    SNESSetType - Sets the method for the nonlinear solver.
19959b94acceSBarry Smith 
1996fee21e36SBarry Smith    Collective on SNES
1997fee21e36SBarry Smith 
1998c7afd0dbSLois Curfman McInnes    Input Parameters:
1999c7afd0dbSLois Curfman McInnes +  snes - the SNES context
2000454a90a3SBarry Smith -  type - a known method
2001c7afd0dbSLois Curfman McInnes 
2002c7afd0dbSLois Curfman McInnes    Options Database Key:
2003454a90a3SBarry Smith .  -snes_type <type> - Sets the method; use -help for a list
2004c7afd0dbSLois Curfman McInnes    of available methods (for instance, ls or tr)
2005ae12b187SLois Curfman McInnes 
20069b94acceSBarry Smith    Notes:
2007e090d566SSatish Balay    See "petsc/include/petscsnes.h" for available methods (for instance)
20086831982aSBarry Smith +    SNESEQLS - Newton's method with line search
2009c7afd0dbSLois Curfman McInnes      (systems of nonlinear equations)
20106831982aSBarry Smith .    SNESEQTR - Newton's method with trust region
2011c7afd0dbSLois Curfman McInnes      (systems of nonlinear equations)
20126831982aSBarry Smith .    SNESUMTR - Newton's method with trust region
2013c7afd0dbSLois Curfman McInnes      (unconstrained minimization)
20146831982aSBarry Smith -    SNESUMLS - Newton's method with line search
2015c7afd0dbSLois Curfman McInnes      (unconstrained minimization)
20169b94acceSBarry Smith 
2017ae12b187SLois Curfman McInnes   Normally, it is best to use the SNESSetFromOptions() command and then
2018ae12b187SLois Curfman McInnes   set the SNES solver type from the options database rather than by using
2019ae12b187SLois Curfman McInnes   this routine.  Using the options database provides the user with
2020ae12b187SLois Curfman McInnes   maximum flexibility in evaluating the many nonlinear solvers.
2021ae12b187SLois Curfman McInnes   The SNESSetType() routine is provided for those situations where it
2022ae12b187SLois Curfman McInnes   is necessary to set the nonlinear solver independently of the command
2023ae12b187SLois Curfman McInnes   line or options database.  This might be the case, for example, when
2024ae12b187SLois Curfman McInnes   the choice of solver changes during the execution of the program,
2025ae12b187SLois Curfman McInnes   and the user's application is taking responsibility for choosing the
2026b0a32e0cSBarry Smith   appropriate method.
202736851e7fSLois Curfman McInnes 
202836851e7fSLois Curfman McInnes   Level: intermediate
2029a703fe33SLois Curfman McInnes 
2030454a90a3SBarry Smith .keywords: SNES, set, type
2031435da068SBarry Smith 
2032435da068SBarry Smith .seealso: SNESType, SNESCreate()
2033435da068SBarry Smith 
20349b94acceSBarry Smith @*/
2035454a90a3SBarry Smith int SNESSetType(SNES snes,SNESType type)
20369b94acceSBarry Smith {
20370f5bd95cSBarry Smith   int        ierr,(*r)(SNES);
20386831982aSBarry Smith   PetscTruth match;
20393a40ed3dSBarry Smith 
20403a40ed3dSBarry Smith   PetscFunctionBegin;
204177c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
20420f5bd95cSBarry Smith   PetscValidCharPointer(type);
204382bf6240SBarry Smith 
20446831982aSBarry Smith   ierr = PetscTypeCompare((PetscObject)snes,type,&match);CHKERRQ(ierr);
20450f5bd95cSBarry Smith   if (match) PetscFunctionReturn(0);
204682bf6240SBarry Smith 
204782bf6240SBarry Smith   if (snes->setupcalled) {
2048e1311b90SBarry Smith     ierr       = (*(snes)->destroy)(snes);CHKERRQ(ierr);
204982bf6240SBarry Smith     snes->data = 0;
205082bf6240SBarry Smith   }
20517d1a2b2bSBarry Smith 
20529b94acceSBarry Smith   /* Get the function pointers for the iterative method requested */
205382bf6240SBarry Smith   if (!SNESRegisterAllCalled) {ierr = SNESRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
205482bf6240SBarry Smith 
2055b9617806SBarry Smith   ierr =  PetscFListFind(snes->comm,SNESList,type,(void (**)(void)) &r);CHKERRQ(ierr);
205682bf6240SBarry Smith 
205729bbc08cSBarry Smith   if (!r) SETERRQ1(1,"Unable to find requested SNES type %s",type);
20581548b14aSBarry Smith 
2059606d414cSSatish Balay   if (snes->data) {ierr = PetscFree(snes->data);CHKERRQ(ierr);}
206082bf6240SBarry Smith   snes->data = 0;
20613a40ed3dSBarry Smith   ierr = (*r)(snes);CHKERRQ(ierr);
206282bf6240SBarry Smith 
2063454a90a3SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)snes,type);CHKERRQ(ierr);
206482bf6240SBarry Smith   snes->set_method_called = 1;
206582bf6240SBarry Smith 
20663a40ed3dSBarry Smith   PetscFunctionReturn(0);
20679b94acceSBarry Smith }
20689b94acceSBarry Smith 
2069a847f771SSatish Balay 
20709b94acceSBarry Smith /* --------------------------------------------------------------------- */
20714a2ae208SSatish Balay #undef __FUNCT__
20724a2ae208SSatish Balay #define __FUNCT__ "SNESRegisterDestroy"
20739b94acceSBarry Smith /*@C
20749b94acceSBarry Smith    SNESRegisterDestroy - Frees the list of nonlinear solvers that were
2075f1af5d2fSBarry Smith    registered by SNESRegisterDynamic().
20769b94acceSBarry Smith 
2077fee21e36SBarry Smith    Not Collective
2078fee21e36SBarry Smith 
207936851e7fSLois Curfman McInnes    Level: advanced
208036851e7fSLois Curfman McInnes 
20819b94acceSBarry Smith .keywords: SNES, nonlinear, register, destroy
20829b94acceSBarry Smith 
20839b94acceSBarry Smith .seealso: SNESRegisterAll(), SNESRegisterAll()
20849b94acceSBarry Smith @*/
2085cf256101SBarry Smith int SNESRegisterDestroy(void)
20869b94acceSBarry Smith {
208782bf6240SBarry Smith   int ierr;
208882bf6240SBarry Smith 
20893a40ed3dSBarry Smith   PetscFunctionBegin;
209082bf6240SBarry Smith   if (SNESList) {
2091b0a32e0cSBarry Smith     ierr = PetscFListDestroy(&SNESList);CHKERRQ(ierr);
209282bf6240SBarry Smith     SNESList = 0;
20939b94acceSBarry Smith   }
20944c49b128SBarry Smith   SNESRegisterAllCalled = PETSC_FALSE;
20953a40ed3dSBarry Smith   PetscFunctionReturn(0);
20969b94acceSBarry Smith }
20979b94acceSBarry Smith 
20984a2ae208SSatish Balay #undef __FUNCT__
20994a2ae208SSatish Balay #define __FUNCT__ "SNESGetType"
21009b94acceSBarry Smith /*@C
21019a28b0a6SLois Curfman McInnes    SNESGetType - Gets the SNES method type and name (as a string).
21029b94acceSBarry Smith 
2103c7afd0dbSLois Curfman McInnes    Not Collective
2104c7afd0dbSLois Curfman McInnes 
21059b94acceSBarry Smith    Input Parameter:
21064b0e389bSBarry Smith .  snes - nonlinear solver context
21079b94acceSBarry Smith 
21089b94acceSBarry Smith    Output Parameter:
21093a7fca6bSBarry Smith .  type - SNES method (a character string)
21109b94acceSBarry Smith 
211136851e7fSLois Curfman McInnes    Level: intermediate
211236851e7fSLois Curfman McInnes 
2113454a90a3SBarry Smith .keywords: SNES, nonlinear, get, type, name
21149b94acceSBarry Smith @*/
2115454a90a3SBarry Smith int SNESGetType(SNES snes,SNESType *type)
21169b94acceSBarry Smith {
21173a40ed3dSBarry Smith   PetscFunctionBegin;
2118184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2119454a90a3SBarry Smith   *type = snes->type_name;
21203a40ed3dSBarry Smith   PetscFunctionReturn(0);
21219b94acceSBarry Smith }
21229b94acceSBarry Smith 
21234a2ae208SSatish Balay #undef __FUNCT__
21244a2ae208SSatish Balay #define __FUNCT__ "SNESGetSolution"
21259b94acceSBarry Smith /*@C
21269b94acceSBarry Smith    SNESGetSolution - Returns the vector where the approximate solution is
21279b94acceSBarry Smith    stored.
21289b94acceSBarry Smith 
2129c7afd0dbSLois Curfman McInnes    Not Collective, but Vec is parallel if SNES is parallel
2130c7afd0dbSLois Curfman McInnes 
21319b94acceSBarry Smith    Input Parameter:
21329b94acceSBarry Smith .  snes - the SNES context
21339b94acceSBarry Smith 
21349b94acceSBarry Smith    Output Parameter:
21359b94acceSBarry Smith .  x - the solution
21369b94acceSBarry Smith 
213736851e7fSLois Curfman McInnes    Level: advanced
213836851e7fSLois Curfman McInnes 
21399b94acceSBarry Smith .keywords: SNES, nonlinear, get, solution
21409b94acceSBarry Smith 
2141a86d99e1SLois Curfman McInnes .seealso: SNESGetFunction(), SNESGetGradient(), SNESGetSolutionUpdate()
21429b94acceSBarry Smith @*/
21439b94acceSBarry Smith int SNESGetSolution(SNES snes,Vec *x)
21449b94acceSBarry Smith {
21453a40ed3dSBarry Smith   PetscFunctionBegin;
214677c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
21479b94acceSBarry Smith   *x = snes->vec_sol_always;
21483a40ed3dSBarry Smith   PetscFunctionReturn(0);
21499b94acceSBarry Smith }
21509b94acceSBarry Smith 
21514a2ae208SSatish Balay #undef __FUNCT__
21524a2ae208SSatish Balay #define __FUNCT__ "SNESGetSolutionUpdate"
21539b94acceSBarry Smith /*@C
21549b94acceSBarry Smith    SNESGetSolutionUpdate - Returns the vector where the solution update is
21559b94acceSBarry Smith    stored.
21569b94acceSBarry Smith 
2157c7afd0dbSLois Curfman McInnes    Not Collective, but Vec is parallel if SNES is parallel
2158c7afd0dbSLois Curfman McInnes 
21599b94acceSBarry Smith    Input Parameter:
21609b94acceSBarry Smith .  snes - the SNES context
21619b94acceSBarry Smith 
21629b94acceSBarry Smith    Output Parameter:
21639b94acceSBarry Smith .  x - the solution update
21649b94acceSBarry Smith 
216536851e7fSLois Curfman McInnes    Level: advanced
216636851e7fSLois Curfman McInnes 
21679b94acceSBarry Smith .keywords: SNES, nonlinear, get, solution, update
21689b94acceSBarry Smith 
21699b94acceSBarry Smith .seealso: SNESGetSolution(), SNESGetFunction
21709b94acceSBarry Smith @*/
21719b94acceSBarry Smith int SNESGetSolutionUpdate(SNES snes,Vec *x)
21729b94acceSBarry Smith {
21733a40ed3dSBarry Smith   PetscFunctionBegin;
217477c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
21759b94acceSBarry Smith   *x = snes->vec_sol_update_always;
21763a40ed3dSBarry Smith   PetscFunctionReturn(0);
21779b94acceSBarry Smith }
21789b94acceSBarry Smith 
21794a2ae208SSatish Balay #undef __FUNCT__
21804a2ae208SSatish Balay #define __FUNCT__ "SNESGetFunction"
21819b94acceSBarry Smith /*@C
21823638b69dSLois Curfman McInnes    SNESGetFunction - Returns the vector where the function is stored.
21839b94acceSBarry Smith 
2184c7afd0dbSLois Curfman McInnes    Not Collective, but Vec is parallel if SNES is parallel
2185c7afd0dbSLois Curfman McInnes 
21869b94acceSBarry Smith    Input Parameter:
21879b94acceSBarry Smith .  snes - the SNES context
21889b94acceSBarry Smith 
21899b94acceSBarry Smith    Output Parameter:
21907bf4e008SBarry Smith +  r - the function (or PETSC_NULL)
219100036973SBarry Smith .  ctx - the function context (or PETSC_NULL)
219200036973SBarry Smith -  func - the function (or PETSC_NULL)
21939b94acceSBarry Smith 
21949b94acceSBarry Smith    Notes:
21959b94acceSBarry Smith    SNESGetFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only
21969b94acceSBarry Smith    Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are
21979b94acceSBarry Smith    SNESGetMinimizationFunction() and SNESGetGradient();
21989b94acceSBarry Smith 
219936851e7fSLois Curfman McInnes    Level: advanced
220036851e7fSLois Curfman McInnes 
2201a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, get, function
22029b94acceSBarry Smith 
220331615d04SLois Curfman McInnes .seealso: SNESSetFunction(), SNESGetSolution(), SNESGetMinimizationFunction(),
220431615d04SLois Curfman McInnes           SNESGetGradient()
22057bf4e008SBarry Smith 
22069b94acceSBarry Smith @*/
220700036973SBarry Smith int SNESGetFunction(SNES snes,Vec *r,void **ctx,int (**func)(SNES,Vec,Vec,void*))
22089b94acceSBarry Smith {
22093a40ed3dSBarry Smith   PetscFunctionBegin;
221077c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2211a8c6a408SBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
221229bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only");
2213a8c6a408SBarry Smith   }
22147bf4e008SBarry Smith   if (r)    *r    = snes->vec_func_always;
22157bf4e008SBarry Smith   if (ctx)  *ctx  = snes->funP;
221600036973SBarry Smith   if (func) *func = snes->computefunction;
22173a40ed3dSBarry Smith   PetscFunctionReturn(0);
22189b94acceSBarry Smith }
22199b94acceSBarry Smith 
22204a2ae208SSatish Balay #undef __FUNCT__
22214a2ae208SSatish Balay #define __FUNCT__ "SNESGetGradient"
22229b94acceSBarry Smith /*@C
22233638b69dSLois Curfman McInnes    SNESGetGradient - Returns the vector where the gradient is stored.
22249b94acceSBarry Smith 
2225c7afd0dbSLois Curfman McInnes    Not Collective, but Vec is parallel if SNES is parallel
2226c7afd0dbSLois Curfman McInnes 
22279b94acceSBarry Smith    Input Parameter:
22289b94acceSBarry Smith .  snes - the SNES context
22299b94acceSBarry Smith 
22309b94acceSBarry Smith    Output Parameter:
22317bf4e008SBarry Smith +  r - the gradient (or PETSC_NULL)
22327bf4e008SBarry Smith -  ctx - the gradient context (or PETSC_NULL)
22339b94acceSBarry Smith 
22349b94acceSBarry Smith    Notes:
22359b94acceSBarry Smith    SNESGetGradient() is valid for SNES_UNCONSTRAINED_MINIMIZATION methods
22369b94acceSBarry Smith    only.  An analogous routine for SNES_NONLINEAR_EQUATIONS methods is
22379b94acceSBarry Smith    SNESGetFunction().
22389b94acceSBarry Smith 
223936851e7fSLois Curfman McInnes    Level: advanced
224036851e7fSLois Curfman McInnes 
22419b94acceSBarry Smith .keywords: SNES, nonlinear, get, gradient
22429b94acceSBarry Smith 
22437bf4e008SBarry Smith .seealso: SNESGetMinimizationFunction(), SNESGetSolution(), SNESGetFunction(),
22447bf4e008SBarry Smith           SNESSetGradient(), SNESSetFunction()
22457bf4e008SBarry Smith 
22469b94acceSBarry Smith @*/
22477bf4e008SBarry Smith int SNESGetGradient(SNES snes,Vec *r,void **ctx)
22489b94acceSBarry Smith {
22493a40ed3dSBarry Smith   PetscFunctionBegin;
225077c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
22513a40ed3dSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
225229bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only");
22533a40ed3dSBarry Smith   }
22547bf4e008SBarry Smith   if (r)   *r = snes->vec_func_always;
22557bf4e008SBarry Smith   if (ctx) *ctx = snes->funP;
22563a40ed3dSBarry Smith   PetscFunctionReturn(0);
22579b94acceSBarry Smith }
22589b94acceSBarry Smith 
22594a2ae208SSatish Balay #undef __FUNCT__
22604a2ae208SSatish Balay #define __FUNCT__ "SNESGetMinimizationFunction"
22617bf4e008SBarry Smith /*@C
22629b94acceSBarry Smith    SNESGetMinimizationFunction - Returns the scalar function value for
22639b94acceSBarry Smith    unconstrained minimization problems.
22649b94acceSBarry Smith 
2265c7afd0dbSLois Curfman McInnes    Not Collective
2266c7afd0dbSLois Curfman McInnes 
22679b94acceSBarry Smith    Input Parameter:
22689b94acceSBarry Smith .  snes - the SNES context
22699b94acceSBarry Smith 
22709b94acceSBarry Smith    Output Parameter:
22717bf4e008SBarry Smith +  r - the function (or PETSC_NULL)
22727bf4e008SBarry Smith -  ctx - the function context (or PETSC_NULL)
22739b94acceSBarry Smith 
22749b94acceSBarry Smith    Notes:
22759b94acceSBarry Smith    SNESGetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION
22769b94acceSBarry Smith    methods only.  An analogous routine for SNES_NONLINEAR_EQUATIONS methods is
22779b94acceSBarry Smith    SNESGetFunction().
22789b94acceSBarry Smith 
227936851e7fSLois Curfman McInnes    Level: advanced
228036851e7fSLois Curfman McInnes 
22819b94acceSBarry Smith .keywords: SNES, nonlinear, get, function
22829b94acceSBarry Smith 
22837bf4e008SBarry Smith .seealso: SNESGetGradient(), SNESGetSolution(), SNESGetFunction(), SNESSetFunction()
22847bf4e008SBarry Smith 
22859b94acceSBarry Smith @*/
2286329f5518SBarry Smith int SNESGetMinimizationFunction(SNES snes,PetscReal *r,void **ctx)
22879b94acceSBarry Smith {
22883a40ed3dSBarry Smith   PetscFunctionBegin;
228977c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
229074679c65SBarry Smith   PetscValidScalarPointer(r);
22913a40ed3dSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
229229bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only");
22933a40ed3dSBarry Smith   }
22947bf4e008SBarry Smith   if (r)   *r = snes->fc;
22957bf4e008SBarry Smith   if (ctx) *ctx = snes->umfunP;
22963a40ed3dSBarry Smith   PetscFunctionReturn(0);
22979b94acceSBarry Smith }
22989b94acceSBarry Smith 
22994a2ae208SSatish Balay #undef __FUNCT__
23004a2ae208SSatish Balay #define __FUNCT__ "SNESSetOptionsPrefix"
23013c7409f5SSatish Balay /*@C
23023c7409f5SSatish Balay    SNESSetOptionsPrefix - Sets the prefix used for searching for all
2303d850072dSLois Curfman McInnes    SNES options in the database.
23043c7409f5SSatish Balay 
2305fee21e36SBarry Smith    Collective on SNES
2306fee21e36SBarry Smith 
2307c7afd0dbSLois Curfman McInnes    Input Parameter:
2308c7afd0dbSLois Curfman McInnes +  snes - the SNES context
2309c7afd0dbSLois Curfman McInnes -  prefix - the prefix to prepend to all option names
2310c7afd0dbSLois Curfman McInnes 
2311d850072dSLois Curfman McInnes    Notes:
2312a83b1b31SSatish Balay    A hyphen (-) must NOT be given at the beginning of the prefix name.
2313c7afd0dbSLois Curfman McInnes    The first character of all runtime options is AUTOMATICALLY the hyphen.
2314d850072dSLois Curfman McInnes 
231536851e7fSLois Curfman McInnes    Level: advanced
231636851e7fSLois Curfman McInnes 
23173c7409f5SSatish Balay .keywords: SNES, set, options, prefix, database
2318a86d99e1SLois Curfman McInnes 
2319a86d99e1SLois Curfman McInnes .seealso: SNESSetFromOptions()
23203c7409f5SSatish Balay @*/
23213c7409f5SSatish Balay int SNESSetOptionsPrefix(SNES snes,char *prefix)
23223c7409f5SSatish Balay {
23233c7409f5SSatish Balay   int ierr;
23243c7409f5SSatish Balay 
23253a40ed3dSBarry Smith   PetscFunctionBegin;
232677c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2327639f9d9dSBarry Smith   ierr = PetscObjectSetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr);
23283c7409f5SSatish Balay   ierr = SLESSetOptionsPrefix(snes->sles,prefix);CHKERRQ(ierr);
23293a40ed3dSBarry Smith   PetscFunctionReturn(0);
23303c7409f5SSatish Balay }
23313c7409f5SSatish Balay 
23324a2ae208SSatish Balay #undef __FUNCT__
23334a2ae208SSatish Balay #define __FUNCT__ "SNESAppendOptionsPrefix"
23343c7409f5SSatish Balay /*@C
2335f525115eSLois Curfman McInnes    SNESAppendOptionsPrefix - Appends to the prefix used for searching for all
2336d850072dSLois Curfman McInnes    SNES options in the database.
23373c7409f5SSatish Balay 
2338fee21e36SBarry Smith    Collective on SNES
2339fee21e36SBarry Smith 
2340c7afd0dbSLois Curfman McInnes    Input Parameters:
2341c7afd0dbSLois Curfman McInnes +  snes - the SNES context
2342c7afd0dbSLois Curfman McInnes -  prefix - the prefix to prepend to all option names
2343c7afd0dbSLois Curfman McInnes 
2344d850072dSLois Curfman McInnes    Notes:
2345a83b1b31SSatish Balay    A hyphen (-) must NOT be given at the beginning of the prefix name.
2346c7afd0dbSLois Curfman McInnes    The first character of all runtime options is AUTOMATICALLY the hyphen.
2347d850072dSLois Curfman McInnes 
234836851e7fSLois Curfman McInnes    Level: advanced
234936851e7fSLois Curfman McInnes 
23503c7409f5SSatish Balay .keywords: SNES, append, options, prefix, database
2351a86d99e1SLois Curfman McInnes 
2352a86d99e1SLois Curfman McInnes .seealso: SNESGetOptionsPrefix()
23533c7409f5SSatish Balay @*/
23543c7409f5SSatish Balay int SNESAppendOptionsPrefix(SNES snes,char *prefix)
23553c7409f5SSatish Balay {
23563c7409f5SSatish Balay   int ierr;
23573c7409f5SSatish Balay 
23583a40ed3dSBarry Smith   PetscFunctionBegin;
235977c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2360639f9d9dSBarry Smith   ierr = PetscObjectAppendOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr);
23613c7409f5SSatish Balay   ierr = SLESAppendOptionsPrefix(snes->sles,prefix);CHKERRQ(ierr);
23623a40ed3dSBarry Smith   PetscFunctionReturn(0);
23633c7409f5SSatish Balay }
23643c7409f5SSatish Balay 
23654a2ae208SSatish Balay #undef __FUNCT__
23664a2ae208SSatish Balay #define __FUNCT__ "SNESGetOptionsPrefix"
23679ab63eb5SSatish Balay /*@C
23683c7409f5SSatish Balay    SNESGetOptionsPrefix - Sets the prefix used for searching for all
23693c7409f5SSatish Balay    SNES options in the database.
23703c7409f5SSatish Balay 
2371c7afd0dbSLois Curfman McInnes    Not Collective
2372c7afd0dbSLois Curfman McInnes 
23733c7409f5SSatish Balay    Input Parameter:
23743c7409f5SSatish Balay .  snes - the SNES context
23753c7409f5SSatish Balay 
23763c7409f5SSatish Balay    Output Parameter:
23773c7409f5SSatish Balay .  prefix - pointer to the prefix string used
23783c7409f5SSatish Balay 
23799ab63eb5SSatish Balay    Notes: On the fortran side, the user should pass in a string 'prifix' of
23809ab63eb5SSatish Balay    sufficient length to hold the prefix.
23819ab63eb5SSatish Balay 
238236851e7fSLois Curfman McInnes    Level: advanced
238336851e7fSLois Curfman McInnes 
23843c7409f5SSatish Balay .keywords: SNES, get, options, prefix, database
2385a86d99e1SLois Curfman McInnes 
2386a86d99e1SLois Curfman McInnes .seealso: SNESAppendOptionsPrefix()
23873c7409f5SSatish Balay @*/
23883c7409f5SSatish Balay int SNESGetOptionsPrefix(SNES snes,char **prefix)
23893c7409f5SSatish Balay {
23903c7409f5SSatish Balay   int ierr;
23913c7409f5SSatish Balay 
23923a40ed3dSBarry Smith   PetscFunctionBegin;
239377c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2394639f9d9dSBarry Smith   ierr = PetscObjectGetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr);
23953a40ed3dSBarry Smith   PetscFunctionReturn(0);
23963c7409f5SSatish Balay }
23973c7409f5SSatish Balay 
2398acb85ae6SSatish Balay /*MC
2399f1af5d2fSBarry Smith    SNESRegisterDynamic - Adds a method to the nonlinear solver package.
24009b94acceSBarry Smith 
2401b2002411SLois Curfman McInnes    Synopsis:
24023a7fca6bSBarry Smith    int SNESRegisterDynamic(char *name_solver,char *path,char *name_create,int (*routine_create)(SNES))
24039b94acceSBarry Smith 
24048d76a1e5SLois Curfman McInnes    Not collective
24058d76a1e5SLois Curfman McInnes 
2406b2002411SLois Curfman McInnes    Input Parameters:
2407c7afd0dbSLois Curfman McInnes +  name_solver - name of a new user-defined solver
2408b2002411SLois Curfman McInnes .  path - path (either absolute or relative) the library containing this solver
2409b2002411SLois Curfman McInnes .  name_create - name of routine to create method context
2410c7afd0dbSLois Curfman McInnes -  routine_create - routine to create method context
24119b94acceSBarry Smith 
2412b2002411SLois Curfman McInnes    Notes:
2413f1af5d2fSBarry Smith    SNESRegisterDynamic() may be called multiple times to add several user-defined solvers.
24143a40ed3dSBarry Smith 
2415b2002411SLois Curfman McInnes    If dynamic libraries are used, then the fourth input argument (routine_create)
2416b2002411SLois Curfman McInnes    is ignored.
2417b2002411SLois Curfman McInnes 
2418b9617806SBarry Smith    Environmental variables such as ${PETSC_ARCH}, ${PETSC_DIR}, ${PETSC_LIB_DIR}, ${BOPT},
24195ba88a07SLois Curfman McInnes    and others of the form ${any_environmental_variable} occuring in pathname will be
24205ba88a07SLois Curfman McInnes    replaced with appropriate values.
24215ba88a07SLois Curfman McInnes 
2422b2002411SLois Curfman McInnes    Sample usage:
242369225d78SLois Curfman McInnes .vb
2424f1af5d2fSBarry Smith    SNESRegisterDynamic("my_solver",/home/username/my_lib/lib/libg/solaris/mylib.a,
2425b2002411SLois Curfman McInnes                 "MySolverCreate",MySolverCreate);
242669225d78SLois Curfman McInnes .ve
2427b2002411SLois Curfman McInnes 
2428b2002411SLois Curfman McInnes    Then, your solver can be chosen with the procedural interface via
2429b2002411SLois Curfman McInnes $     SNESSetType(snes,"my_solver")
2430b2002411SLois Curfman McInnes    or at runtime via the option
2431b2002411SLois Curfman McInnes $     -snes_type my_solver
2432b2002411SLois Curfman McInnes 
243336851e7fSLois Curfman McInnes    Level: advanced
243436851e7fSLois Curfman McInnes 
2435b2002411SLois Curfman McInnes .keywords: SNES, nonlinear, register
2436b2002411SLois Curfman McInnes 
2437b2002411SLois Curfman McInnes .seealso: SNESRegisterAll(), SNESRegisterDestroy()
2438b2002411SLois Curfman McInnes M*/
2439b2002411SLois Curfman McInnes 
24404a2ae208SSatish Balay #undef __FUNCT__
24414a2ae208SSatish Balay #define __FUNCT__ "SNESRegister"
2442f1af5d2fSBarry Smith int SNESRegister(char *sname,char *path,char *name,int (*function)(SNES))
2443b2002411SLois Curfman McInnes {
2444b2002411SLois Curfman McInnes   char fullname[256];
2445b2002411SLois Curfman McInnes   int  ierr;
2446b2002411SLois Curfman McInnes 
2447b2002411SLois Curfman McInnes   PetscFunctionBegin;
2448b0a32e0cSBarry Smith   ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr);
2449b9617806SBarry Smith   ierr = PetscFListAdd(&SNESList,sname,fullname,(void (*)())function);CHKERRQ(ierr);
2450b2002411SLois Curfman McInnes   PetscFunctionReturn(0);
2451b2002411SLois Curfman McInnes }
2452