xref: /petsc/src/snes/interface/snes.c (revision 3a7fca6b988f1faea172e46abdf950477dbfaf76)
1*3a7fca6bSBarry Smith /*$Id: snes.c,v 1.229 2001/04/10 19:36:48 bsmith Exp bsmith $*/
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__
94a2ae208SSatish Balay #define __FUNCT__ "SNESView"
107e2c5f70SBarry Smith /*@C
119b94acceSBarry Smith    SNESView - Prints the SNES data structure.
129b94acceSBarry Smith 
134c49b128SBarry Smith    Collective on SNES
14fee21e36SBarry Smith 
15c7afd0dbSLois Curfman McInnes    Input Parameters:
16c7afd0dbSLois Curfman McInnes +  SNES - the SNES context
17c7afd0dbSLois Curfman McInnes -  viewer - visualization context
18c7afd0dbSLois Curfman McInnes 
199b94acceSBarry Smith    Options Database Key:
20c8a8ba5cSLois Curfman McInnes .  -snes_view - Calls SNESView() at end of SNESSolve()
219b94acceSBarry Smith 
229b94acceSBarry Smith    Notes:
239b94acceSBarry Smith    The available visualization contexts include
24b0a32e0cSBarry Smith +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
25b0a32e0cSBarry Smith -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
26c8a8ba5cSLois Curfman McInnes          output where only the first processor opens
27c8a8ba5cSLois Curfman McInnes          the file.  All other processors send their
28c8a8ba5cSLois Curfman McInnes          data to the first processor to print.
299b94acceSBarry Smith 
303e081fefSLois Curfman McInnes    The user can open an alternative visualization context with
31b0a32e0cSBarry Smith    PetscViewerASCIIOpen() - output to a specified file.
329b94acceSBarry Smith 
3336851e7fSLois Curfman McInnes    Level: beginner
3436851e7fSLois Curfman McInnes 
359b94acceSBarry Smith .keywords: SNES, view
369b94acceSBarry Smith 
37b0a32e0cSBarry Smith .seealso: PetscViewerASCIIOpen()
389b94acceSBarry Smith @*/
39b0a32e0cSBarry Smith int SNESView(SNES snes,PetscViewer viewer)
409b94acceSBarry Smith {
419b94acceSBarry Smith   SNES_KSP_EW_ConvCtx *kctx;
429b94acceSBarry Smith   int                 ierr;
439b94acceSBarry Smith   SLES                sles;
44454a90a3SBarry Smith   char                *type;
456831982aSBarry Smith   PetscTruth          isascii,isstring;
469b94acceSBarry Smith 
473a40ed3dSBarry Smith   PetscFunctionBegin;
4874679c65SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
49b0a32e0cSBarry Smith   if (!viewer) viewer = PETSC_VIEWER_STDOUT_(snes->comm);
50b0a32e0cSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_COOKIE);
516831982aSBarry Smith   PetscCheckSameComm(snes,viewer);
5274679c65SBarry Smith 
53b0a32e0cSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);CHKERRQ(ierr);
54b0a32e0cSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_STRING,&isstring);CHKERRQ(ierr);
550f5bd95cSBarry Smith   if (isascii) {
56*3a7fca6bSBarry Smith     if (snes->prefix) {
57*3a7fca6bSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"SNES Object:(%s)\n",snes->prefix);CHKERRQ(ierr);
58*3a7fca6bSBarry Smith     } else {
59b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"SNES Object:\n");CHKERRQ(ierr);
60*3a7fca6bSBarry Smith     }
61454a90a3SBarry Smith     ierr = SNESGetType(snes,&type);CHKERRQ(ierr);
62454a90a3SBarry Smith     if (type) {
63b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"  type: %s\n",type);CHKERRQ(ierr);
64184914b5SBarry Smith     } else {
65b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"  type: not set yet\n");CHKERRQ(ierr);
66184914b5SBarry Smith     }
670ef38995SBarry Smith     if (snes->view) {
68b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
690ef38995SBarry Smith       ierr = (*snes->view)(snes,viewer);CHKERRQ(ierr);
70b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
710ef38995SBarry Smith     }
72b0a32e0cSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  maximum iterations=%d, maximum function evaluations=%d\n",snes->max_its,snes->max_funcs);CHKERRQ(ierr);
73b0a32e0cSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  tolerances: relative=%g, absolute=%g, truncation=%g, solution=%g\n",
74d132466eSBarry Smith                  snes->rtol,snes->atol,snes->trunctol,snes->xtol);CHKERRQ(ierr);
75b0a32e0cSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  total number of linear solver iterations=%d\n",snes->linear_its);CHKERRQ(ierr);
76b0a32e0cSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  total number of function evaluations=%d\n",snes->nfuncs);CHKERRQ(ierr);
770ef38995SBarry Smith     if (snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) {
78b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"  min function tolerance=%g\n",snes->fmin);CHKERRQ(ierr);
790ef38995SBarry Smith     }
809b94acceSBarry Smith     if (snes->ksp_ewconv) {
819b94acceSBarry Smith       kctx = (SNES_KSP_EW_ConvCtx *)snes->kspconvctx;
829b94acceSBarry Smith       if (kctx) {
83b0a32e0cSBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"  Eisenstat-Walker computation of KSP relative tolerance (version %d)\n",kctx->version);CHKERRQ(ierr);
84b0a32e0cSBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    rtol_0=%g, rtol_max=%g, threshold=%g\n",kctx->rtol_0,kctx->rtol_max,kctx->threshold);CHKERRQ(ierr);
85b0a32e0cSBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"    gamma=%g, alpha=%g, alpha2=%g\n",kctx->gamma,kctx->alpha,kctx->alpha2);CHKERRQ(ierr);
869b94acceSBarry Smith       }
879b94acceSBarry Smith     }
880f5bd95cSBarry Smith   } else if (isstring) {
89454a90a3SBarry Smith     ierr = SNESGetType(snes,&type);CHKERRQ(ierr);
90b0a32e0cSBarry Smith     ierr = PetscViewerStringSPrintf(viewer," %-3.3s",type);CHKERRQ(ierr);
9119bcc07fSBarry Smith   }
9277ed5343SBarry Smith   ierr = SNESGetSLES(snes,&sles);CHKERRQ(ierr);
93b0a32e0cSBarry Smith   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
949b94acceSBarry Smith   ierr = SLESView(sles,viewer);CHKERRQ(ierr);
95b0a32e0cSBarry Smith   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
963a40ed3dSBarry Smith   PetscFunctionReturn(0);
979b94acceSBarry Smith }
989b94acceSBarry Smith 
994a2ae208SSatish Balay #undef __FUNCT__
1004a2ae208SSatish Balay #define __FUNCT__ "SNESSetFromOptions"
1019b94acceSBarry Smith /*@
102682d7d0cSBarry Smith    SNESSetFromOptions - Sets various SNES and SLES parameters from user options.
1039b94acceSBarry Smith 
104c7afd0dbSLois Curfman McInnes    Collective on SNES
105c7afd0dbSLois Curfman McInnes 
1069b94acceSBarry Smith    Input Parameter:
1079b94acceSBarry Smith .  snes - the SNES context
1089b94acceSBarry Smith 
10936851e7fSLois Curfman McInnes    Options Database Keys:
1106831982aSBarry Smith +  -snes_type <type> - ls, tr, umls, umtr, test
11182738288SBarry Smith .  -snes_stol - convergence tolerance in terms of the norm
11282738288SBarry Smith                 of the change in the solution between steps
113b39c3a46SLois Curfman McInnes .  -snes_atol <atol> - absolute tolerance of residual norm
114b39c3a46SLois Curfman McInnes .  -snes_rtol <rtol> - relative decrease in tolerance norm from initial
115b39c3a46SLois Curfman McInnes .  -snes_max_it <max_it> - maximum number of iterations
116b39c3a46SLois Curfman McInnes .  -snes_max_funcs <max_funcs> - maximum number of function evaluations
117b39c3a46SLois Curfman McInnes .  -snes_trtol <trtol> - trust region tolerance
11882738288SBarry Smith .  -snes_no_convergence_test - skip convergence test in nonlinear or minimization
11982738288SBarry Smith                                solver; hence iterations will continue until max_it
1201fbbfb26SLois Curfman McInnes                                or some other criterion is reached. Saves expense
12182738288SBarry Smith                                of convergence test
12282738288SBarry Smith .  -snes_monitor - prints residual norm at each iteration
123d132466eSBarry Smith .  -snes_vecmonitor - plots solution at each iteration
124d132466eSBarry Smith .  -snes_vecmonitor_update - plots update to solution at each iteration
12582738288SBarry Smith .  -snes_xmonitor - plots residual norm at each iteration
126e24b481bSBarry Smith .  -snes_fd - use finite differences to compute Jacobian; very slow, only for testing
12736851e7fSLois Curfman McInnes -  -snes_mf_ksp_monitor - if using matrix-free multiply then print h at each KSP iteration
12882738288SBarry Smith 
12982738288SBarry Smith     Options Database for Eisenstat-Walker method:
13082738288SBarry Smith +  -snes_ksp_eq_conv - use Eisenstat-Walker method for determining linear system convergence
13182738288SBarry Smith .  -snes_ksp_eq_version ver - version of  Eisenstat-Walker method
13236851e7fSLois Curfman McInnes .  -snes_ksp_ew_rtol0 <rtol0> - Sets rtol0
13336851e7fSLois Curfman McInnes .  -snes_ksp_ew_rtolmax <rtolmax> - Sets rtolmax
13436851e7fSLois Curfman McInnes .  -snes_ksp_ew_gamma <gamma> - Sets gamma
13536851e7fSLois Curfman McInnes .  -snes_ksp_ew_alpha <alpha> - Sets alpha
13636851e7fSLois Curfman McInnes .  -snes_ksp_ew_alpha2 <alpha2> - Sets alpha2
13736851e7fSLois Curfman McInnes -  -snes_ksp_ew_threshold <threshold> - Sets threshold
13882738288SBarry Smith 
13911ca99fdSLois Curfman McInnes    Notes:
14011ca99fdSLois Curfman McInnes    To see all options, run your program with the -help option or consult
14111ca99fdSLois Curfman McInnes    the users manual.
14283e2fdc7SBarry Smith 
14336851e7fSLois Curfman McInnes    Level: beginner
14436851e7fSLois Curfman McInnes 
1459b94acceSBarry Smith .keywords: SNES, nonlinear, set, options, database
1469b94acceSBarry Smith 
147186905e3SBarry Smith .seealso: SNESSetOptionsPrefix(), SNESSetTypeFromOptions()
1489b94acceSBarry Smith @*/
1499b94acceSBarry Smith int SNESSetFromOptions(SNES snes)
1509b94acceSBarry Smith {
1519b94acceSBarry Smith   SLES                sles;
152186905e3SBarry Smith   SNES_KSP_EW_ConvCtx *kctx = (SNES_KSP_EW_ConvCtx *)snes->kspconvctx;
153f1af5d2fSBarry Smith   PetscTruth          flg;
154186905e3SBarry Smith   int                 ierr;
155186905e3SBarry Smith   char                *deft,type[256];
1569b94acceSBarry Smith 
1573a40ed3dSBarry Smith   PetscFunctionBegin;
15877c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
159ca161407SBarry Smith 
160b0a32e0cSBarry Smith   ierr = PetscOptionsBegin(snes->comm,snes->prefix,"Nonlinear solver (SNES) options","SNES");CHKERRQ(ierr);
161186905e3SBarry Smith     if (snes->type_name) {
162186905e3SBarry Smith       deft = snes->type_name;
163186905e3SBarry Smith     } else {
164186905e3SBarry Smith       if (snes->method_class == SNES_NONLINEAR_EQUATIONS) {
165186905e3SBarry Smith         deft = SNESEQLS;
166186905e3SBarry Smith       } else {
167186905e3SBarry Smith         deft = SNESUMTR;
168d64ed03dSBarry Smith       }
169d64ed03dSBarry Smith     }
1704bbc92c1SBarry Smith 
171186905e3SBarry Smith     if (!SNESRegisterAllCalled) {ierr = SNESRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
172b0a32e0cSBarry Smith     ierr = PetscOptionsList("-snes_type","Nonlinear solver method","SNESSetType",SNESList,deft,type,256,&flg);CHKERRQ(ierr);
173d64ed03dSBarry Smith     if (flg) {
174186905e3SBarry Smith       ierr = SNESSetType(snes,type);CHKERRQ(ierr);
175186905e3SBarry Smith     } else if (!snes->type_name) {
176186905e3SBarry Smith       ierr = SNESSetType(snes,deft);CHKERRQ(ierr);
177d64ed03dSBarry Smith     }
17893c39befSBarry Smith 
179b0a32e0cSBarry Smith     ierr = PetscOptionsDouble("-snes_stol","Stop if step length less then","SNESSetTolerances",snes->xtol,&snes->xtol,0);CHKERRQ(ierr);
180b0a32e0cSBarry Smith     ierr = PetscOptionsDouble("-snes_atol","Stop if function norm less then","SNESSetTolerances",snes->atol,&snes->atol,0);CHKERRQ(ierr);
181186905e3SBarry Smith 
182b0a32e0cSBarry Smith     ierr = PetscOptionsDouble("-snes_rtol","Stop if decrease in function norm less then","SNESSetTolerances",snes->rtol,&snes->rtol,0);CHKERRQ(ierr);
183b0a32e0cSBarry Smith     ierr = PetscOptionsInt("-snes_max_it","Maximum iterations","SNESSetTolerances",snes->max_its,&snes->max_its,PETSC_NULL);CHKERRQ(ierr);
184b0a32e0cSBarry Smith     ierr = PetscOptionsInt("-snes_max_funcs","Maximum function evaluations","SNESSetTolerances",snes->max_funcs,&snes->max_funcs,PETSC_NULL);CHKERRQ(ierr);
185b0a32e0cSBarry Smith     ierr = PetscOptionsDouble("-snes_fmin","Minimization function tolerance","SNESSetMinimizationFunctionTolerance",snes->fmin,&snes->fmin,0);CHKERRQ(ierr);
186186905e3SBarry Smith 
187b0a32e0cSBarry Smith     ierr = PetscOptionsName("-snes_ksp_ew_conv","Use Eisentat-Walker linear system convergence test","SNES_KSP_SetParametersEW",&snes->ksp_ewconv);CHKERRQ(ierr);
188186905e3SBarry Smith 
189b0a32e0cSBarry Smith     ierr = PetscOptionsInt("-snes_ksp_ew_version","Version 1 or 2","SNES_KSP_SetParametersEW",kctx->version,&kctx->version,0);CHKERRQ(ierr);
190b0a32e0cSBarry Smith     ierr = PetscOptionsDouble("-snes_ksp_ew_rtol0","0 <= rtol0 < 1","SNES_KSP_SetParametersEW",kctx->rtol_0,&kctx->rtol_0,0);CHKERRQ(ierr);
191b0a32e0cSBarry Smith     ierr = PetscOptionsDouble("-snes_ksp_ew_rtolmax","0 <= rtolmax < 1","SNES_KSP_SetParametersEW",kctx->rtol_max,&kctx->rtol_max,0);CHKERRQ(ierr);
192b0a32e0cSBarry Smith     ierr = PetscOptionsDouble("-snes_ksp_ew_gamma","0 <= gamma <= 1","SNES_KSP_SetParametersEW",kctx->gamma,&kctx->gamma,0);CHKERRQ(ierr);
193b0a32e0cSBarry Smith     ierr = PetscOptionsDouble("-snes_ksp_ew_alpha","1 < alpha <= 2","SNES_KSP_SetParametersEW",kctx->alpha,&kctx->alpha,0);CHKERRQ(ierr);
194b0a32e0cSBarry Smith     ierr = PetscOptionsDouble("-snes_ksp_ew_alpha2","alpha2","SNES_KSP_SetParametersEW",kctx->alpha2,&kctx->alpha2,0);CHKERRQ(ierr);
195b0a32e0cSBarry Smith     ierr = PetscOptionsDouble("-snes_ksp_ew_threshold","0 < threshold < 1","SNES_KSP_SetParametersEW",kctx->threshold,&kctx->threshold,0);CHKERRQ(ierr);
196186905e3SBarry Smith 
197b0a32e0cSBarry Smith     ierr = PetscOptionsName("-snes_no_convergence_test","Don't test for convergence","None",&flg);CHKERRQ(ierr);
19893c39befSBarry Smith     if (flg) {snes->converged = 0;}
199b0a32e0cSBarry Smith     ierr = PetscOptionsName("-snes_cancelmonitors","Remove all monitors","SNESClearMonitor",&flg);CHKERRQ(ierr);
2005cd90555SBarry Smith     if (flg) {ierr = SNESClearMonitor(snes);CHKERRQ(ierr);}
201b0a32e0cSBarry Smith     ierr = PetscOptionsName("-snes_monitor","Monitor norm of function","SNESDefaultMonitor",&flg);CHKERRQ(ierr);
202b8a78c4aSBarry Smith     if (flg) {ierr = SNESSetMonitor(snes,SNESDefaultMonitor,0,0);CHKERRQ(ierr);}
203*3a7fca6bSBarry Smith     ierr = PetscOptionsName("-snes_ratiomonitor","Monitor norm of function","SNESSetRatioMonitor",&flg);CHKERRQ(ierr);
204*3a7fca6bSBarry Smith     if (flg) {ierr = SNESSetRatioMonitor(snes);CHKERRQ(ierr);}
205b0a32e0cSBarry Smith     ierr = PetscOptionsName("-snes_smonitor","Monitor norm of function (fewer digits)","SNESDefaultSMonitor",&flg);CHKERRQ(ierr);
206b8a78c4aSBarry Smith     if (flg) {ierr = SNESSetMonitor(snes,SNESDefaultSMonitor,0,0);CHKERRQ(ierr);}
207b0a32e0cSBarry Smith     ierr = PetscOptionsName("-snes_vecmonitor","Plot solution at each iteration","SNESVecViewMonitor",&flg);CHKERRQ(ierr);
208b8a78c4aSBarry Smith     if (flg) {ierr = SNESSetMonitor(snes,SNESVecViewMonitor,0,0);CHKERRQ(ierr);}
209b0a32e0cSBarry Smith     ierr = PetscOptionsName("-snes_vecmonitor_update","Plot correction at each iteration","SNESVecViewUpdateMonitor",&flg);CHKERRQ(ierr);
2107c922b88SBarry Smith     if (flg) {ierr = SNESSetMonitor(snes,SNESVecViewUpdateMonitor,0,0);CHKERRQ(ierr);}
211b0a32e0cSBarry Smith     ierr = PetscOptionsName("-snes_xmonitor","Plot function norm at each iteration","SNESLGMonitor",&flg);CHKERRQ(ierr);
212186905e3SBarry Smith     if (flg) {ierr = SNESSetMonitor(snes,SNESLGMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);}
213e24b481bSBarry Smith 
214b0a32e0cSBarry Smith     ierr = PetscOptionsName("-snes_fd","Use finite differences (slow) to compute Jacobian","SNESDefaultComputeJacobian",&flg);CHKERRQ(ierr);
2153c7409f5SSatish Balay     if (flg && snes->method_class == SNES_NONLINEAR_EQUATIONS) {
216186905e3SBarry Smith       ierr = SNESSetJacobian(snes,snes->jacobian,snes->jacobian_pre,SNESDefaultComputeJacobian,snes->funP);CHKERRQ(ierr);
217b0a32e0cSBarry Smith       PetscLogInfo(snes,"SNESSetFromOptions: Setting default finite difference Jacobian matrix\n");
218981c4779SBarry Smith     } else if (flg && snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) {
219186905e3SBarry Smith       ierr = SNESSetHessian(snes,snes->jacobian,snes->jacobian_pre,SNESDefaultComputeHessian,snes->funP);CHKERRQ(ierr);
220b0a32e0cSBarry Smith       PetscLogInfo(snes,"SNESSetFromOptions: Setting default finite difference Hessian matrix\n");
2219b94acceSBarry Smith     }
222639f9d9dSBarry Smith 
223186905e3SBarry Smith     if (snes->setfromoptions) {
224186905e3SBarry Smith       ierr = (*snes->setfromoptions)(snes);CHKERRQ(ierr);
225639f9d9dSBarry Smith     }
226639f9d9dSBarry Smith 
227b0a32e0cSBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
2284bbc92c1SBarry Smith 
2299b94acceSBarry Smith   ierr = SNESGetSLES(snes,&sles);CHKERRQ(ierr);
2309b94acceSBarry Smith   ierr = SLESSetFromOptions(sles);CHKERRQ(ierr);
23193993e2dSLois Curfman McInnes 
2323a40ed3dSBarry Smith   PetscFunctionReturn(0);
2339b94acceSBarry Smith }
2349b94acceSBarry Smith 
235a847f771SSatish Balay 
2364a2ae208SSatish Balay #undef __FUNCT__
2374a2ae208SSatish Balay #define __FUNCT__ "SNESSetApplicationContext"
2389b94acceSBarry Smith /*@
2399b94acceSBarry Smith    SNESSetApplicationContext - Sets the optional user-defined context for
2409b94acceSBarry Smith    the nonlinear solvers.
2419b94acceSBarry Smith 
242fee21e36SBarry Smith    Collective on SNES
243fee21e36SBarry Smith 
244c7afd0dbSLois Curfman McInnes    Input Parameters:
245c7afd0dbSLois Curfman McInnes +  snes - the SNES context
246c7afd0dbSLois Curfman McInnes -  usrP - optional user context
247c7afd0dbSLois Curfman McInnes 
24836851e7fSLois Curfman McInnes    Level: intermediate
24936851e7fSLois Curfman McInnes 
2509b94acceSBarry Smith .keywords: SNES, nonlinear, set, application, context
2519b94acceSBarry Smith 
2529b94acceSBarry Smith .seealso: SNESGetApplicationContext()
2539b94acceSBarry Smith @*/
2549b94acceSBarry Smith int SNESSetApplicationContext(SNES snes,void *usrP)
2559b94acceSBarry Smith {
2563a40ed3dSBarry Smith   PetscFunctionBegin;
25777c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2589b94acceSBarry Smith   snes->user		= usrP;
2593a40ed3dSBarry Smith   PetscFunctionReturn(0);
2609b94acceSBarry Smith }
26174679c65SBarry Smith 
2624a2ae208SSatish Balay #undef __FUNCT__
2634a2ae208SSatish Balay #define __FUNCT__ "SNESGetApplicationContext"
2649b94acceSBarry Smith /*@C
2659b94acceSBarry Smith    SNESGetApplicationContext - Gets the user-defined context for the
2669b94acceSBarry Smith    nonlinear solvers.
2679b94acceSBarry Smith 
268c7afd0dbSLois Curfman McInnes    Not Collective
269c7afd0dbSLois Curfman McInnes 
2709b94acceSBarry Smith    Input Parameter:
2719b94acceSBarry Smith .  snes - SNES context
2729b94acceSBarry Smith 
2739b94acceSBarry Smith    Output Parameter:
2749b94acceSBarry Smith .  usrP - user context
2759b94acceSBarry Smith 
27636851e7fSLois Curfman McInnes    Level: intermediate
27736851e7fSLois Curfman McInnes 
2789b94acceSBarry Smith .keywords: SNES, nonlinear, get, application, context
2799b94acceSBarry Smith 
2809b94acceSBarry Smith .seealso: SNESSetApplicationContext()
2819b94acceSBarry Smith @*/
2829b94acceSBarry Smith int SNESGetApplicationContext(SNES snes,void **usrP)
2839b94acceSBarry Smith {
2843a40ed3dSBarry Smith   PetscFunctionBegin;
28577c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2869b94acceSBarry Smith   *usrP = snes->user;
2873a40ed3dSBarry Smith   PetscFunctionReturn(0);
2889b94acceSBarry Smith }
28974679c65SBarry Smith 
2904a2ae208SSatish Balay #undef __FUNCT__
2914a2ae208SSatish Balay #define __FUNCT__ "SNESGetIterationNumber"
2929b94acceSBarry Smith /*@
293c8228a4eSBarry Smith    SNESGetIterationNumber - Gets the number of nonlinear iterations completed
294c8228a4eSBarry Smith    at this time.
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 .  iter - iteration number
3039b94acceSBarry Smith 
304c8228a4eSBarry Smith    Notes:
305c8228a4eSBarry Smith    For example, during the computation of iteration 2 this would return 1.
306c8228a4eSBarry Smith 
307c8228a4eSBarry Smith    This is useful for using lagged Jacobians (where one does not recompute the
30808405cd6SLois Curfman McInnes    Jacobian at each SNES iteration). For example, the code
30908405cd6SLois Curfman McInnes .vb
31008405cd6SLois Curfman McInnes       ierr = SNESGetIterationNumber(snes,&it);
31108405cd6SLois Curfman McInnes       if (!(it % 2)) {
31208405cd6SLois Curfman McInnes         [compute Jacobian here]
31308405cd6SLois Curfman McInnes       }
31408405cd6SLois Curfman McInnes .ve
315c8228a4eSBarry Smith    can be used in your ComputeJacobian() function to cause the Jacobian to be
31608405cd6SLois Curfman McInnes    recomputed every second SNES iteration.
317c8228a4eSBarry Smith 
31836851e7fSLois Curfman McInnes    Level: intermediate
31936851e7fSLois Curfman McInnes 
3209b94acceSBarry Smith .keywords: SNES, nonlinear, get, iteration, number
3219b94acceSBarry Smith @*/
3229b94acceSBarry Smith int SNESGetIterationNumber(SNES snes,int* iter)
3239b94acceSBarry Smith {
3243a40ed3dSBarry Smith   PetscFunctionBegin;
32577c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
32674679c65SBarry Smith   PetscValidIntPointer(iter);
3279b94acceSBarry Smith   *iter = snes->iter;
3283a40ed3dSBarry Smith   PetscFunctionReturn(0);
3299b94acceSBarry Smith }
33074679c65SBarry Smith 
3314a2ae208SSatish Balay #undef __FUNCT__
3324a2ae208SSatish Balay #define __FUNCT__ "SNESGetFunctionNorm"
3339b94acceSBarry Smith /*@
3349b94acceSBarry Smith    SNESGetFunctionNorm - Gets the norm of the current function that was set
3359b94acceSBarry Smith    with SNESSSetFunction().
3369b94acceSBarry Smith 
337c7afd0dbSLois Curfman McInnes    Collective on SNES
338c7afd0dbSLois Curfman McInnes 
3399b94acceSBarry Smith    Input Parameter:
3409b94acceSBarry Smith .  snes - SNES context
3419b94acceSBarry Smith 
3429b94acceSBarry Smith    Output Parameter:
3439b94acceSBarry Smith .  fnorm - 2-norm of function
3449b94acceSBarry Smith 
3459b94acceSBarry Smith    Note:
3469b94acceSBarry Smith    SNESGetFunctionNorm() is valid for SNES_NONLINEAR_EQUATIONS methods only.
347a86d99e1SLois Curfman McInnes    A related routine for SNES_UNCONSTRAINED_MINIMIZATION methods is
348a86d99e1SLois Curfman McInnes    SNESGetGradientNorm().
3499b94acceSBarry Smith 
35036851e7fSLois Curfman McInnes    Level: intermediate
35136851e7fSLois Curfman McInnes 
3529b94acceSBarry Smith .keywords: SNES, nonlinear, get, function, norm
353a86d99e1SLois Curfman McInnes 
35408405cd6SLois Curfman McInnes .seealso: SNESGetFunction()
3559b94acceSBarry Smith @*/
3569b94acceSBarry Smith int SNESGetFunctionNorm(SNES snes,Scalar *fnorm)
3579b94acceSBarry Smith {
3583a40ed3dSBarry Smith   PetscFunctionBegin;
35977c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
36074679c65SBarry Smith   PetscValidScalarPointer(fnorm);
36174679c65SBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
36229bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"For SNES_NONLINEAR_EQUATIONS only");
36374679c65SBarry Smith   }
3649b94acceSBarry Smith   *fnorm = snes->norm;
3653a40ed3dSBarry Smith   PetscFunctionReturn(0);
3669b94acceSBarry Smith }
36774679c65SBarry Smith 
3684a2ae208SSatish Balay #undef __FUNCT__
3694a2ae208SSatish Balay #define __FUNCT__ "SNESGetGradientNorm"
3709b94acceSBarry Smith /*@
3719b94acceSBarry Smith    SNESGetGradientNorm - Gets the norm of the current gradient that was set
3729b94acceSBarry Smith    with SNESSSetGradient().
3739b94acceSBarry Smith 
374c7afd0dbSLois Curfman McInnes    Collective on SNES
375c7afd0dbSLois Curfman McInnes 
3769b94acceSBarry Smith    Input Parameter:
3779b94acceSBarry Smith .  snes - SNES context
3789b94acceSBarry Smith 
3799b94acceSBarry Smith    Output Parameter:
3809b94acceSBarry Smith .  fnorm - 2-norm of gradient
3819b94acceSBarry Smith 
3829b94acceSBarry Smith    Note:
3839b94acceSBarry Smith    SNESGetGradientNorm() is valid for SNES_UNCONSTRAINED_MINIMIZATION
384a86d99e1SLois Curfman McInnes    methods only.  A related routine for SNES_NONLINEAR_EQUATIONS methods
385a86d99e1SLois Curfman McInnes    is SNESGetFunctionNorm().
3869b94acceSBarry Smith 
38736851e7fSLois Curfman McInnes    Level: intermediate
38836851e7fSLois Curfman McInnes 
3899b94acceSBarry Smith .keywords: SNES, nonlinear, get, gradient, norm
390a86d99e1SLois Curfman McInnes 
391a86d99e1SLois Curfman McInnes .seelso: SNESSetGradient()
3929b94acceSBarry Smith @*/
3939b94acceSBarry Smith int SNESGetGradientNorm(SNES snes,Scalar *gnorm)
3949b94acceSBarry Smith {
3953a40ed3dSBarry Smith   PetscFunctionBegin;
39677c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
39774679c65SBarry Smith   PetscValidScalarPointer(gnorm);
39874679c65SBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
39929bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"For SNES_UNCONSTRAINED_MINIMIZATION only");
40074679c65SBarry Smith   }
4019b94acceSBarry Smith   *gnorm = snes->norm;
4023a40ed3dSBarry Smith   PetscFunctionReturn(0);
4039b94acceSBarry Smith }
40474679c65SBarry Smith 
4054a2ae208SSatish Balay #undef __FUNCT__
4064a2ae208SSatish Balay #define __FUNCT__ "SNESGetNumberUnsuccessfulSteps"
4079b94acceSBarry Smith /*@
4089b94acceSBarry Smith    SNESGetNumberUnsuccessfulSteps - Gets the number of unsuccessful steps
4099b94acceSBarry Smith    attempted by the nonlinear solver.
4109b94acceSBarry Smith 
411c7afd0dbSLois Curfman McInnes    Not Collective
412c7afd0dbSLois Curfman McInnes 
4139b94acceSBarry Smith    Input Parameter:
4149b94acceSBarry Smith .  snes - SNES context
4159b94acceSBarry Smith 
4169b94acceSBarry Smith    Output Parameter:
4179b94acceSBarry Smith .  nfails - number of unsuccessful steps attempted
4189b94acceSBarry Smith 
419c96a6f78SLois Curfman McInnes    Notes:
420c96a6f78SLois Curfman McInnes    This counter is reset to zero for each successive call to SNESSolve().
421c96a6f78SLois Curfman McInnes 
42236851e7fSLois Curfman McInnes    Level: intermediate
42336851e7fSLois Curfman McInnes 
4249b94acceSBarry Smith .keywords: SNES, nonlinear, get, number, unsuccessful, steps
4259b94acceSBarry Smith @*/
4269b94acceSBarry Smith int SNESGetNumberUnsuccessfulSteps(SNES snes,int* nfails)
4279b94acceSBarry Smith {
4283a40ed3dSBarry Smith   PetscFunctionBegin;
42977c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
43074679c65SBarry Smith   PetscValidIntPointer(nfails);
4319b94acceSBarry Smith   *nfails = snes->nfailures;
4323a40ed3dSBarry Smith   PetscFunctionReturn(0);
4339b94acceSBarry Smith }
434a847f771SSatish Balay 
4354a2ae208SSatish Balay #undef __FUNCT__
4364a2ae208SSatish Balay #define __FUNCT__ "SNESGetNumberLinearIterations"
437c96a6f78SLois Curfman McInnes /*@
438c96a6f78SLois Curfman McInnes    SNESGetNumberLinearIterations - Gets the total number of linear iterations
439c96a6f78SLois Curfman McInnes    used by the nonlinear solver.
440c96a6f78SLois Curfman McInnes 
441c7afd0dbSLois Curfman McInnes    Not Collective
442c7afd0dbSLois Curfman McInnes 
443c96a6f78SLois Curfman McInnes    Input Parameter:
444c96a6f78SLois Curfman McInnes .  snes - SNES context
445c96a6f78SLois Curfman McInnes 
446c96a6f78SLois Curfman McInnes    Output Parameter:
447c96a6f78SLois Curfman McInnes .  lits - number of linear iterations
448c96a6f78SLois Curfman McInnes 
449c96a6f78SLois Curfman McInnes    Notes:
450c96a6f78SLois Curfman McInnes    This counter is reset to zero for each successive call to SNESSolve().
451c96a6f78SLois Curfman McInnes 
45236851e7fSLois Curfman McInnes    Level: intermediate
45336851e7fSLois Curfman McInnes 
454c96a6f78SLois Curfman McInnes .keywords: SNES, nonlinear, get, number, linear, iterations
455c96a6f78SLois Curfman McInnes @*/
45686bddb7dSBarry Smith int SNESGetNumberLinearIterations(SNES snes,int* lits)
457c96a6f78SLois Curfman McInnes {
4583a40ed3dSBarry Smith   PetscFunctionBegin;
459c96a6f78SLois Curfman McInnes   PetscValidHeaderSpecific(snes,SNES_COOKIE);
460c96a6f78SLois Curfman McInnes   PetscValidIntPointer(lits);
461c96a6f78SLois Curfman McInnes   *lits = snes->linear_its;
4623a40ed3dSBarry Smith   PetscFunctionReturn(0);
463c96a6f78SLois Curfman McInnes }
464c96a6f78SLois Curfman McInnes 
4654a2ae208SSatish Balay #undef __FUNCT__
4664a2ae208SSatish Balay #define __FUNCT__ "SNESGetSLES"
4679b94acceSBarry Smith /*@C
4689b94acceSBarry Smith    SNESGetSLES - Returns the SLES context for a SNES solver.
4699b94acceSBarry Smith 
470c7afd0dbSLois Curfman McInnes    Not Collective, but if SNES object is parallel, then SLES object is parallel
471c7afd0dbSLois Curfman McInnes 
4729b94acceSBarry Smith    Input Parameter:
4739b94acceSBarry Smith .  snes - the SNES context
4749b94acceSBarry Smith 
4759b94acceSBarry Smith    Output Parameter:
4769b94acceSBarry Smith .  sles - the SLES context
4779b94acceSBarry Smith 
4789b94acceSBarry Smith    Notes:
4799b94acceSBarry Smith    The user can then directly manipulate the SLES context to set various
4809b94acceSBarry Smith    options, etc.  Likewise, the user can then extract and manipulate the
4819b94acceSBarry Smith    KSP and PC contexts as well.
4829b94acceSBarry Smith 
48336851e7fSLois Curfman McInnes    Level: beginner
48436851e7fSLois Curfman McInnes 
4859b94acceSBarry Smith .keywords: SNES, nonlinear, get, SLES, context
4869b94acceSBarry Smith 
4879b94acceSBarry Smith .seealso: SLESGetPC(), SLESGetKSP()
4889b94acceSBarry Smith @*/
4899b94acceSBarry Smith int SNESGetSLES(SNES snes,SLES *sles)
4909b94acceSBarry Smith {
4913a40ed3dSBarry Smith   PetscFunctionBegin;
49277c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
4939b94acceSBarry Smith   *sles = snes->sles;
4943a40ed3dSBarry Smith   PetscFunctionReturn(0);
4959b94acceSBarry Smith }
49682bf6240SBarry Smith 
4974a2ae208SSatish Balay #undef __FUNCT__
4984a2ae208SSatish Balay #define __FUNCT__ "SNESPublish_Petsc"
499454a90a3SBarry Smith static int SNESPublish_Petsc(PetscObject obj)
500e24b481bSBarry Smith {
501aa482453SBarry Smith #if defined(PETSC_HAVE_AMS)
502454a90a3SBarry Smith   SNES          v = (SNES) obj;
503e24b481bSBarry Smith   int          ierr;
50443d6d2cbSBarry Smith #endif
505e24b481bSBarry Smith 
506e24b481bSBarry Smith   PetscFunctionBegin;
507e24b481bSBarry Smith 
50843d6d2cbSBarry Smith #if defined(PETSC_HAVE_AMS)
509e24b481bSBarry Smith   /* if it is already published then return */
510e24b481bSBarry Smith   if (v->amem >=0) PetscFunctionReturn(0);
511e24b481bSBarry Smith 
512454a90a3SBarry Smith   ierr = PetscObjectPublishBaseBegin(obj);CHKERRQ(ierr);
513e24b481bSBarry Smith   ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Iteration",&v->iter,1,AMS_INT,AMS_READ,
514e24b481bSBarry Smith                                 AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
515e24b481bSBarry Smith   ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Residual",&v->norm,1,AMS_DOUBLE,AMS_READ,
516e24b481bSBarry Smith                                 AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
517454a90a3SBarry Smith   ierr = PetscObjectPublishBaseEnd(obj);CHKERRQ(ierr);
518433994e6SBarry Smith #endif
519e24b481bSBarry Smith   PetscFunctionReturn(0);
520e24b481bSBarry Smith }
521e24b481bSBarry Smith 
5229b94acceSBarry Smith /* -----------------------------------------------------------*/
5234a2ae208SSatish Balay #undef __FUNCT__
5244a2ae208SSatish Balay #define __FUNCT__ "SNESCreate"
5259b94acceSBarry Smith /*@C
5269b94acceSBarry Smith    SNESCreate - Creates a nonlinear solver context.
5279b94acceSBarry Smith 
528c7afd0dbSLois Curfman McInnes    Collective on MPI_Comm
529c7afd0dbSLois Curfman McInnes 
530c7afd0dbSLois Curfman McInnes    Input Parameters:
531c7afd0dbSLois Curfman McInnes +  comm - MPI communicator
532c7afd0dbSLois Curfman McInnes -  type - type of method, either
533c7afd0dbSLois Curfman McInnes    SNES_NONLINEAR_EQUATIONS (for systems of nonlinear equations)
534c7afd0dbSLois Curfman McInnes    or SNES_UNCONSTRAINED_MINIMIZATION (for unconstrained minimization)
5359b94acceSBarry Smith 
5369b94acceSBarry Smith    Output Parameter:
5379b94acceSBarry Smith .  outsnes - the new SNES context
5389b94acceSBarry Smith 
539c7afd0dbSLois Curfman McInnes    Options Database Keys:
540c7afd0dbSLois Curfman McInnes +   -snes_mf - Activates default matrix-free Jacobian-vector products,
541c7afd0dbSLois Curfman McInnes                and no preconditioning matrix
542c7afd0dbSLois Curfman McInnes .   -snes_mf_operator - Activates default matrix-free Jacobian-vector
543c7afd0dbSLois Curfman McInnes                products, and a user-provided preconditioning matrix
544c7afd0dbSLois Curfman McInnes                as set by SNESSetJacobian()
545c7afd0dbSLois Curfman McInnes -   -snes_fd - Uses (slow!) finite differences to compute Jacobian
546c1f60f51SBarry Smith 
54736851e7fSLois Curfman McInnes    Level: beginner
54836851e7fSLois Curfman McInnes 
5499b94acceSBarry Smith .keywords: SNES, nonlinear, create, context
5509b94acceSBarry Smith 
551435da068SBarry Smith .seealso: SNESSolve(), SNESDestroy(), SNESProblemType, SNES
5529b94acceSBarry Smith @*/
5534b0e389bSBarry Smith int SNESCreate(MPI_Comm comm,SNESProblemType type,SNES *outsnes)
5549b94acceSBarry Smith {
5559b94acceSBarry Smith   int                 ierr;
5569b94acceSBarry Smith   SNES                snes;
5579b94acceSBarry Smith   SNES_KSP_EW_ConvCtx *kctx;
55837fcc0dbSBarry Smith 
5593a40ed3dSBarry Smith   PetscFunctionBegin;
5609b94acceSBarry Smith   *outsnes = 0;
561d64ed03dSBarry Smith   if (type != SNES_UNCONSTRAINED_MINIMIZATION && type != SNES_NONLINEAR_EQUATIONS){
56229bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"incorrect method type");
563d64ed03dSBarry Smith   }
5643f1db9ecSBarry Smith   PetscHeaderCreate(snes,_p_SNES,int,SNES_COOKIE,0,"SNES",comm,SNESDestroy,SNESView);
565b0a32e0cSBarry Smith   PetscLogObjectCreate(snes);
566e24b481bSBarry Smith   snes->bops->publish     = SNESPublish_Petsc;
5679b94acceSBarry Smith   snes->max_its           = 50;
5689750a799SBarry Smith   snes->max_funcs	  = 10000;
5699b94acceSBarry Smith   snes->norm		  = 0.0;
5705a2d0531SBarry Smith   if (type == SNES_UNCONSTRAINED_MINIMIZATION) {
571b18e04deSLois Curfman McInnes     snes->rtol		  = 1.e-8;
572b18e04deSLois Curfman McInnes     snes->ttol            = 0.0;
5739b94acceSBarry Smith     snes->atol		  = 1.e-10;
574d64ed03dSBarry Smith   } else {
575b4874afaSBarry Smith     snes->rtol		  = 1.e-8;
576b4874afaSBarry Smith     snes->ttol            = 0.0;
577b4874afaSBarry Smith     snes->atol		  = 1.e-50;
578b4874afaSBarry Smith   }
5799b94acceSBarry Smith   snes->xtol		  = 1.e-8;
580b18e04deSLois Curfman McInnes   snes->trunctol	  = 1.e-12; /* no longer used */
5819b94acceSBarry Smith   snes->nfuncs            = 0;
5829b94acceSBarry Smith   snes->nfailures         = 0;
5837a00f4a9SLois Curfman McInnes   snes->linear_its        = 0;
584639f9d9dSBarry Smith   snes->numbermonitors    = 0;
5859b94acceSBarry Smith   snes->data              = 0;
5869b94acceSBarry Smith   snes->view              = 0;
5879b94acceSBarry Smith   snes->computeumfunction = 0;
5889b94acceSBarry Smith   snes->umfunP            = 0;
5899b94acceSBarry Smith   snes->fc                = 0;
5909b94acceSBarry Smith   snes->deltatol          = 1.e-12;
5919b94acceSBarry Smith   snes->fmin              = -1.e30;
5929b94acceSBarry Smith   snes->method_class      = type;
5939b94acceSBarry Smith   snes->set_method_called = 0;
59482bf6240SBarry Smith   snes->setupcalled       = 0;
595186905e3SBarry Smith   snes->ksp_ewconv        = PETSC_FALSE;
5966f24a144SLois Curfman McInnes   snes->vwork             = 0;
5976f24a144SLois Curfman McInnes   snes->nwork             = 0;
598758f92a0SBarry Smith   snes->conv_hist_len     = 0;
599758f92a0SBarry Smith   snes->conv_hist_max     = 0;
600758f92a0SBarry Smith   snes->conv_hist         = PETSC_NULL;
601758f92a0SBarry Smith   snes->conv_hist_its     = PETSC_NULL;
602758f92a0SBarry Smith   snes->conv_hist_reset   = PETSC_TRUE;
603184914b5SBarry Smith   snes->reason            = SNES_CONVERGED_ITERATING;
6049b94acceSBarry Smith 
6059b94acceSBarry Smith   /* Create context to compute Eisenstat-Walker relative tolerance for KSP */
606b0a32e0cSBarry Smith   ierr = PetscNew(SNES_KSP_EW_ConvCtx,&kctx);CHKERRQ(ierr);
607b0a32e0cSBarry Smith   PetscLogObjectMemory(snes,sizeof(SNES_KSP_EW_ConvCtx));
6089b94acceSBarry Smith   snes->kspconvctx  = (void*)kctx;
6099b94acceSBarry Smith   kctx->version     = 2;
6109b94acceSBarry Smith   kctx->rtol_0      = .3; /* Eisenstat and Walker suggest rtol_0=.5, but
6119b94acceSBarry Smith                              this was too large for some test cases */
6129b94acceSBarry Smith   kctx->rtol_last   = 0;
6139b94acceSBarry Smith   kctx->rtol_max    = .9;
6149b94acceSBarry Smith   kctx->gamma       = 1.0;
6159b94acceSBarry Smith   kctx->alpha2      = .5*(1.0 + sqrt(5.0));
6169b94acceSBarry Smith   kctx->alpha       = kctx->alpha2;
6179b94acceSBarry Smith   kctx->threshold   = .1;
6189b94acceSBarry Smith   kctx->lresid_last = 0;
6199b94acceSBarry Smith   kctx->norm_last   = 0;
6209b94acceSBarry Smith 
6219b94acceSBarry Smith   ierr = SLESCreate(comm,&snes->sles);CHKERRQ(ierr);
622b0a32e0cSBarry Smith   PetscLogObjectParent(snes,snes->sles)
6235334005bSBarry Smith 
6249b94acceSBarry Smith   *outsnes = snes;
62500036973SBarry Smith   ierr = PetscPublishAll(snes);CHKERRQ(ierr);
6263a40ed3dSBarry Smith   PetscFunctionReturn(0);
6279b94acceSBarry Smith }
6289b94acceSBarry Smith 
6299b94acceSBarry Smith /* --------------------------------------------------------------- */
6304a2ae208SSatish Balay #undef __FUNCT__
6314a2ae208SSatish Balay #define __FUNCT__ "SNESSetFunction"
6329b94acceSBarry Smith /*@C
6339b94acceSBarry Smith    SNESSetFunction - Sets the function evaluation routine and function
6349b94acceSBarry Smith    vector for use by the SNES routines in solving systems of nonlinear
6359b94acceSBarry Smith    equations.
6369b94acceSBarry Smith 
637fee21e36SBarry Smith    Collective on SNES
638fee21e36SBarry Smith 
639c7afd0dbSLois Curfman McInnes    Input Parameters:
640c7afd0dbSLois Curfman McInnes +  snes - the SNES context
641c7afd0dbSLois Curfman McInnes .  func - function evaluation routine
642c7afd0dbSLois Curfman McInnes .  r - vector to store function value
643c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined context for private data for the
644c7afd0dbSLois Curfman McInnes          function evaluation routine (may be PETSC_NULL)
6459b94acceSBarry Smith 
646c7afd0dbSLois Curfman McInnes    Calling sequence of func:
6478d76a1e5SLois Curfman McInnes $    func (SNES snes,Vec x,Vec f,void *ctx);
648c7afd0dbSLois Curfman McInnes 
649313e4042SLois Curfman McInnes .  f - function vector
650c7afd0dbSLois Curfman McInnes -  ctx - optional user-defined function context
6519b94acceSBarry Smith 
6529b94acceSBarry Smith    Notes:
6539b94acceSBarry Smith    The Newton-like methods typically solve linear systems of the form
6549b94acceSBarry Smith $      f'(x) x = -f(x),
655c7afd0dbSLois Curfman McInnes    where f'(x) denotes the Jacobian matrix and f(x) is the function.
6569b94acceSBarry Smith 
6579b94acceSBarry Smith    SNESSetFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only.
6589b94acceSBarry Smith    Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are
6599b94acceSBarry Smith    SNESSetMinimizationFunction() and SNESSetGradient();
6609b94acceSBarry Smith 
66136851e7fSLois Curfman McInnes    Level: beginner
66236851e7fSLois Curfman McInnes 
6639b94acceSBarry Smith .keywords: SNES, nonlinear, set, function
6649b94acceSBarry Smith 
665a86d99e1SLois Curfman McInnes .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian()
6669b94acceSBarry Smith @*/
6675334005bSBarry Smith int SNESSetFunction(SNES snes,Vec r,int (*func)(SNES,Vec,Vec,void*),void *ctx)
6689b94acceSBarry Smith {
6693a40ed3dSBarry Smith   PetscFunctionBegin;
67077c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
671184914b5SBarry Smith   PetscValidHeaderSpecific(r,VEC_COOKIE);
672184914b5SBarry Smith   PetscCheckSameComm(snes,r);
673a8c6a408SBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
67429bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only");
675a8c6a408SBarry Smith   }
676184914b5SBarry Smith 
6779b94acceSBarry Smith   snes->computefunction     = func;
6789b94acceSBarry Smith   snes->vec_func            = snes->vec_func_always = r;
6799b94acceSBarry Smith   snes->funP                = ctx;
6803a40ed3dSBarry Smith   PetscFunctionReturn(0);
6819b94acceSBarry Smith }
6829b94acceSBarry Smith 
6834a2ae208SSatish Balay #undef __FUNCT__
6844a2ae208SSatish Balay #define __FUNCT__ "SNESComputeFunction"
6859b94acceSBarry Smith /*@
68636851e7fSLois Curfman McInnes    SNESComputeFunction - Calls the function that has been set with
6879b94acceSBarry Smith                          SNESSetFunction().
6889b94acceSBarry Smith 
689c7afd0dbSLois Curfman McInnes    Collective on SNES
690c7afd0dbSLois Curfman McInnes 
6919b94acceSBarry Smith    Input Parameters:
692c7afd0dbSLois Curfman McInnes +  snes - the SNES context
693c7afd0dbSLois Curfman McInnes -  x - input vector
6949b94acceSBarry Smith 
6959b94acceSBarry Smith    Output Parameter:
6963638b69dSLois Curfman McInnes .  y - function vector, as set by SNESSetFunction()
6979b94acceSBarry Smith 
6981bffabb2SLois Curfman McInnes    Notes:
6999b94acceSBarry Smith    SNESComputeFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only.
7009b94acceSBarry Smith    Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are
7019b94acceSBarry Smith    SNESComputeMinimizationFunction() and SNESComputeGradient();
7029b94acceSBarry Smith 
70336851e7fSLois Curfman McInnes    SNESComputeFunction() is typically used within nonlinear solvers
70436851e7fSLois Curfman McInnes    implementations, so most users would not generally call this routine
70536851e7fSLois Curfman McInnes    themselves.
70636851e7fSLois Curfman McInnes 
70736851e7fSLois Curfman McInnes    Level: developer
70836851e7fSLois Curfman McInnes 
7099b94acceSBarry Smith .keywords: SNES, nonlinear, compute, function
7109b94acceSBarry Smith 
711a86d99e1SLois Curfman McInnes .seealso: SNESSetFunction(), SNESGetFunction()
7129b94acceSBarry Smith @*/
7139b94acceSBarry Smith int SNESComputeFunction(SNES snes,Vec x,Vec y)
7149b94acceSBarry Smith {
7159b94acceSBarry Smith   int    ierr;
7169b94acceSBarry Smith 
7173a40ed3dSBarry Smith   PetscFunctionBegin;
718184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
719184914b5SBarry Smith   PetscValidHeaderSpecific(x,VEC_COOKIE);
720184914b5SBarry Smith   PetscValidHeaderSpecific(y,VEC_COOKIE);
721184914b5SBarry Smith   PetscCheckSameComm(snes,x);
722184914b5SBarry Smith   PetscCheckSameComm(snes,y);
723d4bb536fSBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
72429bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only");
725d4bb536fSBarry Smith   }
726184914b5SBarry Smith 
727b0a32e0cSBarry Smith   ierr = PetscLogEventBegin(SNES_FunctionEval,snes,x,y,0);CHKERRQ(ierr);
728d64ed03dSBarry Smith   PetscStackPush("SNES user function");
7299b94acceSBarry Smith   ierr = (*snes->computefunction)(snes,x,y,snes->funP);CHKERRQ(ierr);
730d64ed03dSBarry Smith   PetscStackPop;
731ae3c334cSLois Curfman McInnes   snes->nfuncs++;
732b0a32e0cSBarry Smith   ierr = PetscLogEventEnd(SNES_FunctionEval,snes,x,y,0);CHKERRQ(ierr);
7333a40ed3dSBarry Smith   PetscFunctionReturn(0);
7349b94acceSBarry Smith }
7359b94acceSBarry Smith 
7364a2ae208SSatish Balay #undef __FUNCT__
7374a2ae208SSatish Balay #define __FUNCT__ "SNESSetMinimizationFunction"
7389b94acceSBarry Smith /*@C
7399b94acceSBarry Smith    SNESSetMinimizationFunction - Sets the function evaluation routine for
7409b94acceSBarry Smith    unconstrained minimization.
7419b94acceSBarry Smith 
742fee21e36SBarry Smith    Collective on SNES
743fee21e36SBarry Smith 
744c7afd0dbSLois Curfman McInnes    Input Parameters:
745c7afd0dbSLois Curfman McInnes +  snes - the SNES context
746c7afd0dbSLois Curfman McInnes .  func - function evaluation routine
747c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined context for private data for the
748c7afd0dbSLois Curfman McInnes          function evaluation routine (may be PETSC_NULL)
7499b94acceSBarry Smith 
750c7afd0dbSLois Curfman McInnes    Calling sequence of func:
751329f5518SBarry Smith $     func (SNES snes,Vec x,PetscReal *f,void *ctx);
752c7afd0dbSLois Curfman McInnes 
753c7afd0dbSLois Curfman McInnes +  x - input vector
7549b94acceSBarry Smith .  f - function
755c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined function context
7569b94acceSBarry Smith 
75736851e7fSLois Curfman McInnes    Level: beginner
75836851e7fSLois Curfman McInnes 
7599b94acceSBarry Smith    Notes:
7609b94acceSBarry Smith    SNESSetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION
7619b94acceSBarry Smith    methods only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is
7629b94acceSBarry Smith    SNESSetFunction().
7639b94acceSBarry Smith 
7649b94acceSBarry Smith .keywords: SNES, nonlinear, set, minimization, function
7659b94acceSBarry Smith 
766a86d99e1SLois Curfman McInnes .seealso:  SNESGetMinimizationFunction(), SNESComputeMinimizationFunction(),
767a86d99e1SLois Curfman McInnes            SNESSetHessian(), SNESSetGradient()
7689b94acceSBarry Smith @*/
769329f5518SBarry Smith int SNESSetMinimizationFunction(SNES snes,int (*func)(SNES,Vec,PetscReal*,void*),void *ctx)
7709b94acceSBarry Smith {
7713a40ed3dSBarry Smith   PetscFunctionBegin;
77277c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
773a8c6a408SBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
77429bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"Only for SNES_UNCONSTRAINED_MINIMIZATION");
775a8c6a408SBarry Smith   }
7769b94acceSBarry Smith   snes->computeumfunction   = func;
7779b94acceSBarry Smith   snes->umfunP              = ctx;
7783a40ed3dSBarry Smith   PetscFunctionReturn(0);
7799b94acceSBarry Smith }
7809b94acceSBarry Smith 
7814a2ae208SSatish Balay #undef __FUNCT__
7824a2ae208SSatish Balay #define __FUNCT__ "SNESComputeMinimizationFunction"
7839b94acceSBarry Smith /*@
7849b94acceSBarry Smith    SNESComputeMinimizationFunction - Computes the function that has been
7859b94acceSBarry Smith    set with SNESSetMinimizationFunction().
7869b94acceSBarry Smith 
787c7afd0dbSLois Curfman McInnes    Collective on SNES
788c7afd0dbSLois Curfman McInnes 
7899b94acceSBarry Smith    Input Parameters:
790c7afd0dbSLois Curfman McInnes +  snes - the SNES context
791c7afd0dbSLois Curfman McInnes -  x - input vector
7929b94acceSBarry Smith 
7939b94acceSBarry Smith    Output Parameter:
7949b94acceSBarry Smith .  y - function value
7959b94acceSBarry Smith 
7969b94acceSBarry Smith    Notes:
7979b94acceSBarry Smith    SNESComputeMinimizationFunction() is valid only for
7989b94acceSBarry Smith    SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for
7999b94acceSBarry Smith    SNES_NONLINEAR_EQUATIONS methods is SNESComputeFunction().
800a86d99e1SLois Curfman McInnes 
80136851e7fSLois Curfman McInnes    SNESComputeMinimizationFunction() is typically used within minimization
80236851e7fSLois Curfman McInnes    implementations, so most users would not generally call this routine
80336851e7fSLois Curfman McInnes    themselves.
80436851e7fSLois Curfman McInnes 
80536851e7fSLois Curfman McInnes    Level: developer
80636851e7fSLois Curfman McInnes 
807a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, compute, minimization, function
808a86d99e1SLois Curfman McInnes 
809a86d99e1SLois Curfman McInnes .seealso: SNESSetMinimizationFunction(), SNESGetMinimizationFunction(),
810a86d99e1SLois Curfman McInnes           SNESComputeGradient(), SNESComputeHessian()
8119b94acceSBarry Smith @*/
812329f5518SBarry Smith int SNESComputeMinimizationFunction(SNES snes,Vec x,PetscReal *y)
8139b94acceSBarry Smith {
8149b94acceSBarry Smith   int    ierr;
8153a40ed3dSBarry Smith 
8163a40ed3dSBarry Smith   PetscFunctionBegin;
817184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
818184914b5SBarry Smith   PetscValidHeaderSpecific(x,VEC_COOKIE);
819184914b5SBarry Smith   PetscCheckSameComm(snes,x);
820a8c6a408SBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
82129bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"Only for SNES_UNCONSTRAINED_MINIMIZATION");
822a8c6a408SBarry Smith   }
823184914b5SBarry Smith 
824b0a32e0cSBarry Smith   ierr = PetscLogEventBegin(SNES_MinimizationFunctionEval,snes,x,y,0);CHKERRQ(ierr);
825d64ed03dSBarry Smith   PetscStackPush("SNES user minimzation function");
8269b94acceSBarry Smith   ierr = (*snes->computeumfunction)(snes,x,y,snes->umfunP);CHKERRQ(ierr);
827d64ed03dSBarry Smith   PetscStackPop;
828ae3c334cSLois Curfman McInnes   snes->nfuncs++;
829b0a32e0cSBarry Smith   ierr = PetscLogEventEnd(SNES_MinimizationFunctionEval,snes,x,y,0);CHKERRQ(ierr);
8303a40ed3dSBarry Smith   PetscFunctionReturn(0);
8319b94acceSBarry Smith }
8329b94acceSBarry Smith 
8334a2ae208SSatish Balay #undef __FUNCT__
8344a2ae208SSatish Balay #define __FUNCT__ "SNESSetGradient"
8359b94acceSBarry Smith /*@C
8369b94acceSBarry Smith    SNESSetGradient - Sets the gradient evaluation routine and gradient
8379b94acceSBarry Smith    vector for use by the SNES routines.
8389b94acceSBarry Smith 
839c7afd0dbSLois Curfman McInnes    Collective on SNES
840c7afd0dbSLois Curfman McInnes 
8419b94acceSBarry Smith    Input Parameters:
842c7afd0dbSLois Curfman McInnes +  snes - the SNES context
8439b94acceSBarry Smith .  func - function evaluation routine
844044dda88SLois Curfman McInnes .  ctx - optional user-defined context for private data for the
845044dda88SLois Curfman McInnes          gradient evaluation routine (may be PETSC_NULL)
846c7afd0dbSLois Curfman McInnes -  r - vector to store gradient value
847fee21e36SBarry Smith 
8489b94acceSBarry Smith    Calling sequence of func:
8498d76a1e5SLois Curfman McInnes $     func (SNES, Vec x, Vec g, void *ctx);
8509b94acceSBarry Smith 
851c7afd0dbSLois Curfman McInnes +  x - input vector
8529b94acceSBarry Smith .  g - gradient vector
853c7afd0dbSLois Curfman McInnes -  ctx - optional user-defined gradient context
8549b94acceSBarry Smith 
8559b94acceSBarry Smith    Notes:
8569b94acceSBarry Smith    SNESSetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION
8579b94acceSBarry Smith    methods only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is
8589b94acceSBarry Smith    SNESSetFunction().
8599b94acceSBarry Smith 
86036851e7fSLois Curfman McInnes    Level: beginner
86136851e7fSLois Curfman McInnes 
8629b94acceSBarry Smith .keywords: SNES, nonlinear, set, function
8639b94acceSBarry Smith 
864a86d99e1SLois Curfman McInnes .seealso: SNESGetGradient(), SNESComputeGradient(), SNESSetHessian(),
865a86d99e1SLois Curfman McInnes           SNESSetMinimizationFunction(),
8669b94acceSBarry Smith @*/
86774679c65SBarry Smith int SNESSetGradient(SNES snes,Vec r,int (*func)(SNES,Vec,Vec,void*),void *ctx)
8689b94acceSBarry Smith {
8693a40ed3dSBarry Smith   PetscFunctionBegin;
87077c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
871184914b5SBarry Smith   PetscValidHeaderSpecific(r,VEC_COOKIE);
872184914b5SBarry Smith   PetscCheckSameComm(snes,r);
873a8c6a408SBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
87429bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only");
875a8c6a408SBarry Smith   }
8769b94acceSBarry Smith   snes->computefunction     = func;
8779b94acceSBarry Smith   snes->vec_func            = snes->vec_func_always = r;
8789b94acceSBarry Smith   snes->funP                = ctx;
8793a40ed3dSBarry Smith   PetscFunctionReturn(0);
8809b94acceSBarry Smith }
8819b94acceSBarry Smith 
8824a2ae208SSatish Balay #undef __FUNCT__
8834a2ae208SSatish Balay #define __FUNCT__ "SNESComputeGradient"
8849b94acceSBarry Smith /*@
885a86d99e1SLois Curfman McInnes    SNESComputeGradient - Computes the gradient that has been set with
886a86d99e1SLois Curfman McInnes    SNESSetGradient().
8879b94acceSBarry Smith 
888c7afd0dbSLois Curfman McInnes    Collective on SNES
889c7afd0dbSLois Curfman McInnes 
8909b94acceSBarry Smith    Input Parameters:
891c7afd0dbSLois Curfman McInnes +  snes - the SNES context
892c7afd0dbSLois Curfman McInnes -  x - input vector
8939b94acceSBarry Smith 
8949b94acceSBarry Smith    Output Parameter:
8959b94acceSBarry Smith .  y - gradient vector
8969b94acceSBarry Smith 
8979b94acceSBarry Smith    Notes:
8989b94acceSBarry Smith    SNESComputeGradient() is valid only for
8999b94acceSBarry Smith    SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for
9009b94acceSBarry Smith    SNES_NONLINEAR_EQUATIONS methods is SNESComputeFunction().
901a86d99e1SLois Curfman McInnes 
90236851e7fSLois Curfman McInnes    SNESComputeGradient() is typically used within minimization
90336851e7fSLois Curfman McInnes    implementations, so most users would not generally call this routine
90436851e7fSLois Curfman McInnes    themselves.
90536851e7fSLois Curfman McInnes 
90636851e7fSLois Curfman McInnes    Level: developer
90736851e7fSLois Curfman McInnes 
908a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, compute, gradient
909a86d99e1SLois Curfman McInnes 
910a86d99e1SLois Curfman McInnes .seealso:  SNESSetGradient(), SNESGetGradient(),
911a86d99e1SLois Curfman McInnes            SNESComputeMinimizationFunction(), SNESComputeHessian()
9129b94acceSBarry Smith @*/
9139b94acceSBarry Smith int SNESComputeGradient(SNES snes,Vec x,Vec y)
9149b94acceSBarry Smith {
9159b94acceSBarry Smith   int    ierr;
9163a40ed3dSBarry Smith 
9173a40ed3dSBarry Smith   PetscFunctionBegin;
918184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
919184914b5SBarry Smith   PetscValidHeaderSpecific(x,VEC_COOKIE);
920184914b5SBarry Smith   PetscValidHeaderSpecific(y,VEC_COOKIE);
921184914b5SBarry Smith   PetscCheckSameComm(snes,x);
922184914b5SBarry Smith   PetscCheckSameComm(snes,y);
9233a40ed3dSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
92429bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only");
9253a40ed3dSBarry Smith   }
926b0a32e0cSBarry Smith   ierr = PetscLogEventBegin(SNES_GradientEval,snes,x,y,0);CHKERRQ(ierr);
927d64ed03dSBarry Smith   PetscStackPush("SNES user gradient function");
9289b94acceSBarry Smith   ierr = (*snes->computefunction)(snes,x,y,snes->funP);CHKERRQ(ierr);
929d64ed03dSBarry Smith   PetscStackPop;
930b0a32e0cSBarry Smith   ierr = PetscLogEventEnd(SNES_GradientEval,snes,x,y,0);CHKERRQ(ierr);
9313a40ed3dSBarry Smith   PetscFunctionReturn(0);
9329b94acceSBarry Smith }
9339b94acceSBarry Smith 
9344a2ae208SSatish Balay #undef __FUNCT__
9354a2ae208SSatish Balay #define __FUNCT__ "SNESComputeJacobian"
93662fef451SLois Curfman McInnes /*@
93762fef451SLois Curfman McInnes    SNESComputeJacobian - Computes the Jacobian matrix that has been
93862fef451SLois Curfman McInnes    set with SNESSetJacobian().
93962fef451SLois Curfman McInnes 
940c7afd0dbSLois Curfman McInnes    Collective on SNES and Mat
941c7afd0dbSLois Curfman McInnes 
94262fef451SLois Curfman McInnes    Input Parameters:
943c7afd0dbSLois Curfman McInnes +  snes - the SNES context
944c7afd0dbSLois Curfman McInnes -  x - input vector
94562fef451SLois Curfman McInnes 
94662fef451SLois Curfman McInnes    Output Parameters:
947c7afd0dbSLois Curfman McInnes +  A - Jacobian matrix
94862fef451SLois Curfman McInnes .  B - optional preconditioning matrix
949c7afd0dbSLois Curfman McInnes -  flag - flag indicating matrix structure
950fee21e36SBarry Smith 
95162fef451SLois Curfman McInnes    Notes:
95262fef451SLois Curfman McInnes    Most users should not need to explicitly call this routine, as it
95362fef451SLois Curfman McInnes    is used internally within the nonlinear solvers.
95462fef451SLois Curfman McInnes 
955dc5a77f8SLois Curfman McInnes    See SLESSetOperators() for important information about setting the
956dc5a77f8SLois Curfman McInnes    flag parameter.
95762fef451SLois Curfman McInnes 
95862fef451SLois Curfman McInnes    SNESComputeJacobian() is valid only for SNES_NONLINEAR_EQUATIONS
95962fef451SLois Curfman McInnes    methods. An analogous routine for SNES_UNCONSTRAINED_MINIMIZATION
960005c665bSBarry Smith    methods is SNESComputeHessian().
96162fef451SLois Curfman McInnes 
96236851e7fSLois Curfman McInnes    Level: developer
96336851e7fSLois Curfman McInnes 
96462fef451SLois Curfman McInnes .keywords: SNES, compute, Jacobian, matrix
96562fef451SLois Curfman McInnes 
96662fef451SLois Curfman McInnes .seealso:  SNESSetJacobian(), SLESSetOperators()
96762fef451SLois Curfman McInnes @*/
9689b94acceSBarry Smith int SNESComputeJacobian(SNES snes,Vec X,Mat *A,Mat *B,MatStructure *flg)
9699b94acceSBarry Smith {
9709b94acceSBarry Smith   int    ierr;
9713a40ed3dSBarry Smith 
9723a40ed3dSBarry Smith   PetscFunctionBegin;
973184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
974184914b5SBarry Smith   PetscValidHeaderSpecific(X,VEC_COOKIE);
975184914b5SBarry Smith   PetscCheckSameComm(snes,X);
9763a40ed3dSBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
97729bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only");
9783a40ed3dSBarry Smith   }
9793a40ed3dSBarry Smith   if (!snes->computejacobian) PetscFunctionReturn(0);
980b0a32e0cSBarry Smith   ierr = PetscLogEventBegin(SNES_JacobianEval,snes,X,*A,*B);CHKERRQ(ierr);
981c4fc05e7SBarry Smith   *flg = DIFFERENT_NONZERO_PATTERN;
982d64ed03dSBarry Smith   PetscStackPush("SNES user Jacobian function");
9839b94acceSBarry Smith   ierr = (*snes->computejacobian)(snes,X,A,B,flg,snes->jacP);CHKERRQ(ierr);
984d64ed03dSBarry Smith   PetscStackPop;
985b0a32e0cSBarry Smith   ierr = PetscLogEventEnd(SNES_JacobianEval,snes,X,*A,*B);CHKERRQ(ierr);
9866d84be18SBarry Smith   /* make sure user returned a correct Jacobian and preconditioner */
98777c4ece6SBarry Smith   PetscValidHeaderSpecific(*A,MAT_COOKIE);
98877c4ece6SBarry Smith   PetscValidHeaderSpecific(*B,MAT_COOKIE);
9893a40ed3dSBarry Smith   PetscFunctionReturn(0);
9909b94acceSBarry Smith }
9919b94acceSBarry Smith 
9924a2ae208SSatish Balay #undef __FUNCT__
9934a2ae208SSatish Balay #define __FUNCT__ "SNESComputeHessian"
99462fef451SLois Curfman McInnes /*@
99562fef451SLois Curfman McInnes    SNESComputeHessian - Computes the Hessian matrix that has been
99662fef451SLois Curfman McInnes    set with SNESSetHessian().
99762fef451SLois Curfman McInnes 
998c7afd0dbSLois Curfman McInnes    Collective on SNES and Mat
999c7afd0dbSLois Curfman McInnes 
100062fef451SLois Curfman McInnes    Input Parameters:
1001c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1002c7afd0dbSLois Curfman McInnes -  x - input vector
100362fef451SLois Curfman McInnes 
100462fef451SLois Curfman McInnes    Output Parameters:
1005c7afd0dbSLois Curfman McInnes +  A - Hessian matrix
100662fef451SLois Curfman McInnes .  B - optional preconditioning matrix
1007c7afd0dbSLois Curfman McInnes -  flag - flag indicating matrix structure
1008fee21e36SBarry Smith 
100962fef451SLois Curfman McInnes    Notes:
101062fef451SLois Curfman McInnes    Most users should not need to explicitly call this routine, as it
101162fef451SLois Curfman McInnes    is used internally within the nonlinear solvers.
101262fef451SLois Curfman McInnes 
1013dc5a77f8SLois Curfman McInnes    See SLESSetOperators() for important information about setting the
1014dc5a77f8SLois Curfman McInnes    flag parameter.
101562fef451SLois Curfman McInnes 
101662fef451SLois Curfman McInnes    SNESComputeHessian() is valid only for
101762fef451SLois Curfman McInnes    SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for
101862fef451SLois Curfman McInnes    SNES_NONLINEAR_EQUATIONS methods is SNESComputeJacobian().
101962fef451SLois Curfman McInnes 
102036851e7fSLois Curfman McInnes    SNESComputeHessian() is typically used within minimization
102136851e7fSLois Curfman McInnes    implementations, so most users would not generally call this routine
102236851e7fSLois Curfman McInnes    themselves.
102336851e7fSLois Curfman McInnes 
102436851e7fSLois Curfman McInnes    Level: developer
102536851e7fSLois Curfman McInnes 
102662fef451SLois Curfman McInnes .keywords: SNES, compute, Hessian, matrix
102762fef451SLois Curfman McInnes 
1028a86d99e1SLois Curfman McInnes .seealso:  SNESSetHessian(), SLESSetOperators(), SNESComputeGradient(),
1029a86d99e1SLois Curfman McInnes            SNESComputeMinimizationFunction()
103062fef451SLois Curfman McInnes @*/
103162fef451SLois Curfman McInnes int SNESComputeHessian(SNES snes,Vec x,Mat *A,Mat *B,MatStructure *flag)
10329b94acceSBarry Smith {
10339b94acceSBarry Smith   int    ierr;
10343a40ed3dSBarry Smith 
10353a40ed3dSBarry Smith   PetscFunctionBegin;
1036184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1037184914b5SBarry Smith   PetscValidHeaderSpecific(x,VEC_COOKIE);
1038184914b5SBarry Smith   PetscCheckSameComm(snes,x);
10393a40ed3dSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
104029bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only");
10413a40ed3dSBarry Smith   }
10423a40ed3dSBarry Smith   if (!snes->computejacobian) PetscFunctionReturn(0);
1043b0a32e0cSBarry Smith   ierr = PetscLogEventBegin(SNES_HessianEval,snes,x,*A,*B);CHKERRQ(ierr);
10440f4a323eSLois Curfman McInnes   *flag = DIFFERENT_NONZERO_PATTERN;
1045d64ed03dSBarry Smith   PetscStackPush("SNES user Hessian function");
104662fef451SLois Curfman McInnes   ierr = (*snes->computejacobian)(snes,x,A,B,flag,snes->jacP);CHKERRQ(ierr);
1047d64ed03dSBarry Smith   PetscStackPop;
1048b0a32e0cSBarry Smith   ierr = PetscLogEventEnd(SNES_HessianEval,snes,x,*A,*B);CHKERRQ(ierr);
10490f4a323eSLois Curfman McInnes   /* make sure user returned a correct Jacobian and preconditioner */
105077c4ece6SBarry Smith   PetscValidHeaderSpecific(*A,MAT_COOKIE);
105177c4ece6SBarry Smith   PetscValidHeaderSpecific(*B,MAT_COOKIE);
10523a40ed3dSBarry Smith   PetscFunctionReturn(0);
10539b94acceSBarry Smith }
10549b94acceSBarry Smith 
10554a2ae208SSatish Balay #undef __FUNCT__
10564a2ae208SSatish Balay #define __FUNCT__ "SNESSetJacobian"
10579b94acceSBarry Smith /*@C
10589b94acceSBarry Smith    SNESSetJacobian - Sets the function to compute Jacobian as well as the
1059044dda88SLois Curfman McInnes    location to store the matrix.
10609b94acceSBarry Smith 
1061c7afd0dbSLois Curfman McInnes    Collective on SNES and Mat
1062c7afd0dbSLois Curfman McInnes 
10639b94acceSBarry Smith    Input Parameters:
1064c7afd0dbSLois Curfman McInnes +  snes - the SNES context
10659b94acceSBarry Smith .  A - Jacobian matrix
10669b94acceSBarry Smith .  B - preconditioner matrix (usually same as the Jacobian)
10679b94acceSBarry Smith .  func - Jacobian evaluation routine
1068c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined context for private data for the
10692cd2dfdcSLois Curfman McInnes          Jacobian evaluation routine (may be PETSC_NULL)
10709b94acceSBarry Smith 
10719b94acceSBarry Smith    Calling sequence of func:
10728d76a1e5SLois Curfman McInnes $     func (SNES snes,Vec x,Mat *A,Mat *B,int *flag,void *ctx);
10739b94acceSBarry Smith 
1074c7afd0dbSLois Curfman McInnes +  x - input vector
10759b94acceSBarry Smith .  A - Jacobian matrix
10769b94acceSBarry Smith .  B - preconditioner matrix, usually the same as A
1077ac21db08SLois Curfman McInnes .  flag - flag indicating information about the preconditioner matrix
1078ac21db08SLois Curfman McInnes    structure (same as flag in SLESSetOperators())
1079c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined Jacobian context
10809b94acceSBarry Smith 
10819b94acceSBarry Smith    Notes:
1082dc5a77f8SLois Curfman McInnes    See SLESSetOperators() for important information about setting the flag
10832cd2dfdcSLois Curfman McInnes    output parameter in the routine func().  Be sure to read this information!
1084ac21db08SLois Curfman McInnes 
1085ac21db08SLois Curfman McInnes    The routine func() takes Mat * as the matrix arguments rather than Mat.
10869b94acceSBarry Smith    This allows the Jacobian evaluation routine to replace A and/or B with a
10879b94acceSBarry Smith    completely new new matrix structure (not just different matrix elements)
10889b94acceSBarry Smith    when appropriate, for instance, if the nonzero structure is changing
10899b94acceSBarry Smith    throughout the global iterations.
10909b94acceSBarry Smith 
109136851e7fSLois Curfman McInnes    Level: beginner
109236851e7fSLois Curfman McInnes 
10939b94acceSBarry Smith .keywords: SNES, nonlinear, set, Jacobian, matrix
10949b94acceSBarry Smith 
1095ac21db08SLois Curfman McInnes .seealso: SLESSetOperators(), SNESSetFunction()
10969b94acceSBarry Smith @*/
1097454a90a3SBarry Smith int SNESSetJacobian(SNES snes,Mat A,Mat B,int (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx)
10989b94acceSBarry Smith {
1099*3a7fca6bSBarry Smith   int ierr;
1100*3a7fca6bSBarry Smith 
11013a40ed3dSBarry Smith   PetscFunctionBegin;
110277c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
110300036973SBarry Smith   if (A) PetscValidHeaderSpecific(A,MAT_COOKIE);
110400036973SBarry Smith   if (B) PetscValidHeaderSpecific(B,MAT_COOKIE);
110500036973SBarry Smith   if (A) PetscCheckSameComm(snes,A);
110600036973SBarry Smith   if (B) PetscCheckSameComm(snes,B);
1107a8c6a408SBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
110829bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only");
1109a8c6a408SBarry Smith   }
1110184914b5SBarry Smith 
1111*3a7fca6bSBarry Smith   if (func) snes->computejacobian = func;
1112*3a7fca6bSBarry Smith   if (ctx)  snes->jacP            = ctx;
1113*3a7fca6bSBarry Smith   if (A) {
1114*3a7fca6bSBarry Smith     if (snes->jacobian) {ierr = MatDestroy(snes->jacobian);CHKERRQ(ierr);}
11159b94acceSBarry Smith     snes->jacobian = A;
1116*3a7fca6bSBarry Smith     ierr           = PetscObjectReference((PetscObject)A);CHKERRQ(ierr);
1117*3a7fca6bSBarry Smith   }
1118*3a7fca6bSBarry Smith   if (B) {
1119*3a7fca6bSBarry Smith     if (snes->jacobian_pre) {ierr = MatDestroy(snes->jacobian_pre);CHKERRQ(ierr);}
11209b94acceSBarry Smith     snes->jacobian_pre = B;
1121*3a7fca6bSBarry Smith     ierr               = PetscObjectReference((PetscObject)B);CHKERRQ(ierr);
1122*3a7fca6bSBarry Smith   }
11233a40ed3dSBarry Smith   PetscFunctionReturn(0);
11249b94acceSBarry Smith }
112562fef451SLois Curfman McInnes 
11264a2ae208SSatish Balay #undef __FUNCT__
11274a2ae208SSatish Balay #define __FUNCT__ "SNESGetJacobian"
1128c2aafc4cSSatish Balay /*@C
1129b4fd4287SBarry Smith    SNESGetJacobian - Returns the Jacobian matrix and optionally the user
1130b4fd4287SBarry Smith    provided context for evaluating the Jacobian.
1131b4fd4287SBarry Smith 
1132c7afd0dbSLois Curfman McInnes    Not Collective, but Mat object will be parallel if SNES object is
1133c7afd0dbSLois Curfman McInnes 
1134b4fd4287SBarry Smith    Input Parameter:
1135b4fd4287SBarry Smith .  snes - the nonlinear solver context
1136b4fd4287SBarry Smith 
1137b4fd4287SBarry Smith    Output Parameters:
1138c7afd0dbSLois Curfman McInnes +  A - location to stash Jacobian matrix (or PETSC_NULL)
1139b4fd4287SBarry Smith .  B - location to stash preconditioner matrix (or PETSC_NULL)
114000036973SBarry Smith .  ctx - location to stash Jacobian ctx (or PETSC_NULL)
114100036973SBarry Smith -  func - location to put Jacobian function (or PETSC_NULL)
1142fee21e36SBarry Smith 
114336851e7fSLois Curfman McInnes    Level: advanced
114436851e7fSLois Curfman McInnes 
1145b4fd4287SBarry Smith .seealso: SNESSetJacobian(), SNESComputeJacobian()
1146b4fd4287SBarry Smith @*/
114700036973SBarry Smith int SNESGetJacobian(SNES snes,Mat *A,Mat *B,void **ctx,int (**func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*))
1148b4fd4287SBarry Smith {
11493a40ed3dSBarry Smith   PetscFunctionBegin;
1150184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
11513a40ed3dSBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
115229bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only");
11533a40ed3dSBarry Smith   }
1154b4fd4287SBarry Smith   if (A)    *A    = snes->jacobian;
1155b4fd4287SBarry Smith   if (B)    *B    = snes->jacobian_pre;
1156b4fd4287SBarry Smith   if (ctx)  *ctx  = snes->jacP;
115700036973SBarry Smith   if (func) *func = snes->computejacobian;
11583a40ed3dSBarry Smith   PetscFunctionReturn(0);
1159b4fd4287SBarry Smith }
1160b4fd4287SBarry Smith 
11614a2ae208SSatish Balay #undef __FUNCT__
11624a2ae208SSatish Balay #define __FUNCT__ "SNESSetHessian"
11639b94acceSBarry Smith /*@C
11649b94acceSBarry Smith    SNESSetHessian - Sets the function to compute Hessian as well as the
1165044dda88SLois Curfman McInnes    location to store the matrix.
11669b94acceSBarry Smith 
1167c7afd0dbSLois Curfman McInnes    Collective on SNES and Mat
1168c7afd0dbSLois Curfman McInnes 
11699b94acceSBarry Smith    Input Parameters:
1170c7afd0dbSLois Curfman McInnes +  snes - the SNES context
11719b94acceSBarry Smith .  A - Hessian matrix
11729b94acceSBarry Smith .  B - preconditioner matrix (usually same as the Hessian)
11739b94acceSBarry Smith .  func - Jacobian evaluation routine
1174c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined context for private data for the
1175313e4042SLois Curfman McInnes          Hessian evaluation routine (may be PETSC_NULL)
11769b94acceSBarry Smith 
11779b94acceSBarry Smith    Calling sequence of func:
11788d76a1e5SLois Curfman McInnes $    func (SNES snes,Vec x,Mat *A,Mat *B,int *flag,void *ctx);
11799b94acceSBarry Smith 
1180c7afd0dbSLois Curfman McInnes +  x - input vector
11819b94acceSBarry Smith .  A - Hessian matrix
11829b94acceSBarry Smith .  B - preconditioner matrix, usually the same as A
1183ac21db08SLois Curfman McInnes .  flag - flag indicating information about the preconditioner matrix
1184ac21db08SLois Curfman McInnes    structure (same as flag in SLESSetOperators())
1185c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined Hessian context
11869b94acceSBarry Smith 
11879b94acceSBarry Smith    Notes:
1188dc5a77f8SLois Curfman McInnes    See SLESSetOperators() for important information about setting the flag
11892cd2dfdcSLois Curfman McInnes    output parameter in the routine func().  Be sure to read this information!
1190ac21db08SLois Curfman McInnes 
11919b94acceSBarry Smith    The function func() takes Mat * as the matrix arguments rather than Mat.
11929b94acceSBarry Smith    This allows the Hessian evaluation routine to replace A and/or B with a
11939b94acceSBarry Smith    completely new new matrix structure (not just different matrix elements)
11949b94acceSBarry Smith    when appropriate, for instance, if the nonzero structure is changing
11959b94acceSBarry Smith    throughout the global iterations.
11969b94acceSBarry Smith 
119736851e7fSLois Curfman McInnes    Level: beginner
119836851e7fSLois Curfman McInnes 
11999b94acceSBarry Smith .keywords: SNES, nonlinear, set, Hessian, matrix
12009b94acceSBarry Smith 
1201ac21db08SLois Curfman McInnes .seealso: SNESSetMinimizationFunction(), SNESSetGradient(), SLESSetOperators()
12029b94acceSBarry Smith @*/
1203454a90a3SBarry Smith int SNESSetHessian(SNES snes,Mat A,Mat B,int (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx)
12049b94acceSBarry Smith {
1205*3a7fca6bSBarry Smith   int ierr;
1206*3a7fca6bSBarry Smith 
12073a40ed3dSBarry Smith   PetscFunctionBegin;
120877c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1209184914b5SBarry Smith   PetscValidHeaderSpecific(A,MAT_COOKIE);
1210184914b5SBarry Smith   PetscValidHeaderSpecific(B,MAT_COOKIE);
1211184914b5SBarry Smith   PetscCheckSameComm(snes,A);
1212184914b5SBarry Smith   PetscCheckSameComm(snes,B);
1213d4bb536fSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
121429bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only");
1215d4bb536fSBarry Smith   }
1216*3a7fca6bSBarry Smith   if (func) snes->computejacobian = func;
1217*3a7fca6bSBarry Smith   if (ctx)  snes->jacP            = ctx;
1218*3a7fca6bSBarry Smith   if (A) {
1219*3a7fca6bSBarry Smith     if (snes->jacobian) {ierr = MatDestroy(snes->jacobian);CHKERRQ(ierr);}
12209b94acceSBarry Smith     snes->jacobian = A;
1221*3a7fca6bSBarry Smith     ierr           = PetscObjectReference((PetscObject)A);CHKERRQ(ierr);
1222*3a7fca6bSBarry Smith   }
1223*3a7fca6bSBarry Smith   if (B) {
1224*3a7fca6bSBarry Smith     if (snes->jacobian_pre) {ierr = MatDestroy(snes->jacobian_pre);CHKERRQ(ierr);}
12259b94acceSBarry Smith     snes->jacobian_pre = B;
1226*3a7fca6bSBarry Smith     ierr               = PetscObjectReference((PetscObject)B);CHKERRQ(ierr);
1227*3a7fca6bSBarry Smith   }
12283a40ed3dSBarry Smith   PetscFunctionReturn(0);
12299b94acceSBarry Smith }
12309b94acceSBarry Smith 
12314a2ae208SSatish Balay #undef __FUNCT__
12324a2ae208SSatish Balay #define __FUNCT__ "SNESGetHessian"
123362fef451SLois Curfman McInnes /*@
123462fef451SLois Curfman McInnes    SNESGetHessian - Returns the Hessian matrix and optionally the user
123562fef451SLois Curfman McInnes    provided context for evaluating the Hessian.
123662fef451SLois Curfman McInnes 
1237c7afd0dbSLois Curfman McInnes    Not Collective, but Mat object is parallel if SNES object is parallel
1238c7afd0dbSLois Curfman McInnes 
123962fef451SLois Curfman McInnes    Input Parameter:
124062fef451SLois Curfman McInnes .  snes - the nonlinear solver context
124162fef451SLois Curfman McInnes 
124262fef451SLois Curfman McInnes    Output Parameters:
1243c7afd0dbSLois Curfman McInnes +  A - location to stash Hessian matrix (or PETSC_NULL)
124462fef451SLois Curfman McInnes .  B - location to stash preconditioner matrix (or PETSC_NULL)
1245c7afd0dbSLois Curfman McInnes -  ctx - location to stash Hessian ctx (or PETSC_NULL)
1246fee21e36SBarry Smith 
124736851e7fSLois Curfman McInnes    Level: advanced
124836851e7fSLois Curfman McInnes 
124962fef451SLois Curfman McInnes .seealso: SNESSetHessian(), SNESComputeHessian()
1250c7afd0dbSLois Curfman McInnes 
1251c7afd0dbSLois Curfman McInnes .keywords: SNES, get, Hessian
125262fef451SLois Curfman McInnes @*/
125362fef451SLois Curfman McInnes int SNESGetHessian(SNES snes,Mat *A,Mat *B,void **ctx)
125462fef451SLois Curfman McInnes {
12553a40ed3dSBarry Smith   PetscFunctionBegin;
1256184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
12573a40ed3dSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION){
125829bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only");
12593a40ed3dSBarry Smith   }
126062fef451SLois Curfman McInnes   if (A)   *A = snes->jacobian;
126162fef451SLois Curfman McInnes   if (B)   *B = snes->jacobian_pre;
126262fef451SLois Curfman McInnes   if (ctx) *ctx = snes->jacP;
12633a40ed3dSBarry Smith   PetscFunctionReturn(0);
126462fef451SLois Curfman McInnes }
126562fef451SLois Curfman McInnes 
12669b94acceSBarry Smith /* ----- Routines to initialize and destroy a nonlinear solver ---- */
12679b94acceSBarry Smith 
12684a2ae208SSatish Balay #undef __FUNCT__
12694a2ae208SSatish Balay #define __FUNCT__ "SNESSetUp"
12709b94acceSBarry Smith /*@
12719b94acceSBarry Smith    SNESSetUp - Sets up the internal data structures for the later use
1272272ac6f2SLois Curfman McInnes    of a nonlinear solver.
12739b94acceSBarry Smith 
1274fee21e36SBarry Smith    Collective on SNES
1275fee21e36SBarry Smith 
1276c7afd0dbSLois Curfman McInnes    Input Parameters:
1277c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1278c7afd0dbSLois Curfman McInnes -  x - the solution vector
1279c7afd0dbSLois Curfman McInnes 
1280272ac6f2SLois Curfman McInnes    Notes:
1281272ac6f2SLois Curfman McInnes    For basic use of the SNES solvers the user need not explicitly call
1282272ac6f2SLois Curfman McInnes    SNESSetUp(), since these actions will automatically occur during
1283272ac6f2SLois Curfman McInnes    the call to SNESSolve().  However, if one wishes to control this
1284272ac6f2SLois Curfman McInnes    phase separately, SNESSetUp() should be called after SNESCreate()
1285272ac6f2SLois Curfman McInnes    and optional routines of the form SNESSetXXX(), but before SNESSolve().
1286272ac6f2SLois Curfman McInnes 
128736851e7fSLois Curfman McInnes    Level: advanced
128836851e7fSLois Curfman McInnes 
12899b94acceSBarry Smith .keywords: SNES, nonlinear, setup
12909b94acceSBarry Smith 
12919b94acceSBarry Smith .seealso: SNESCreate(), SNESSolve(), SNESDestroy()
12929b94acceSBarry Smith @*/
12938ddd3da0SLois Curfman McInnes int SNESSetUp(SNES snes,Vec x)
12949b94acceSBarry Smith {
1295f1af5d2fSBarry Smith   int        ierr;
1296f1af5d2fSBarry Smith   PetscTruth flg;
12973a40ed3dSBarry Smith 
12983a40ed3dSBarry Smith   PetscFunctionBegin;
129977c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
130077c4ece6SBarry Smith   PetscValidHeaderSpecific(x,VEC_COOKIE);
1301184914b5SBarry Smith   PetscCheckSameComm(snes,x);
13028ddd3da0SLois Curfman McInnes   snes->vec_sol = snes->vec_sol_always = x;
13039b94acceSBarry Smith 
1304b0a32e0cSBarry Smith   ierr = PetscOptionsHasName(snes->prefix,"-snes_mf_operator",&flg);CHKERRQ(ierr);
1305c1f60f51SBarry Smith   /*
1306c1f60f51SBarry Smith       This version replaces the user provided Jacobian matrix with a
1307dfa02198SLois Curfman McInnes       matrix-free version but still employs the user-provided preconditioner matrix
1308c1f60f51SBarry Smith   */
1309c1f60f51SBarry Smith   if (flg) {
1310c1f60f51SBarry Smith     Mat J;
13115a655dc6SBarry Smith     ierr = MatCreateSNESMF(snes,snes->vec_sol,&J);CHKERRQ(ierr);
13125a655dc6SBarry Smith     ierr = MatSNESMFSetFromOptions(J);CHKERRQ(ierr);
1313*3a7fca6bSBarry Smith     PetscLogInfo(snes,"SNESSetUp: Setting default matrix-free operator routines\n");
1314*3a7fca6bSBarry Smith     ierr = SNESSetJacobian(snes,J,0,0,0);CHKERRQ(ierr);
1315*3a7fca6bSBarry Smith     ierr = MatDestroy(J);CHKERRQ(ierr);
1316c1f60f51SBarry Smith   }
1317b0a32e0cSBarry Smith   ierr = PetscOptionsHasName(snes->prefix,"-snes_mf",&flg);CHKERRQ(ierr);
1318c1f60f51SBarry Smith   /*
1319dfa02198SLois Curfman McInnes       This version replaces both the user-provided Jacobian and the user-
1320c1f60f51SBarry Smith       provided preconditioner matrix with the default matrix free version.
1321c1f60f51SBarry Smith    */
132231615d04SLois Curfman McInnes   if (flg) {
1323272ac6f2SLois Curfman McInnes     Mat  J;
1324f3ef73ceSBarry Smith     SLES sles;
1325f3ef73ceSBarry Smith     PC   pc;
1326f3ef73ceSBarry Smith 
13275a655dc6SBarry Smith     ierr = MatCreateSNESMF(snes,snes->vec_sol,&J);CHKERRQ(ierr);
1328*3a7fca6bSBarry Smith     ierr = MatSNESMFSetFromOptions(J);CHKERRQ(ierr);
132993b98531SBarry Smith     PetscLogInfo(snes,"SNESSetUp: Setting default matrix-free operator and preconditioner routines\n");
133083e56afdSLois Curfman McInnes     if (snes->method_class == SNES_NONLINEAR_EQUATIONS) {
1331*3a7fca6bSBarry Smith       ierr = SNESSetJacobian(snes,J,J,MatSNESMFComputeJacobian,snes->funP);CHKERRQ(ierr);
1332d64ed03dSBarry Smith     } else if (snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) {
1333*3a7fca6bSBarry Smith       ierr = SNESSetHessian(snes,J,J,MatSNESMFComputeJacobian,snes->funP);CHKERRQ(ierr);
1334d4bb536fSBarry Smith     } else {
133529bbc08cSBarry Smith       SETERRQ(PETSC_ERR_SUP,"Method class doesn't support matrix-free option");
1336d4bb536fSBarry Smith     }
1337*3a7fca6bSBarry Smith     ierr = MatDestroy(J);CHKERRQ(ierr);
1338*3a7fca6bSBarry Smith 
1339f3ef73ceSBarry Smith     /* force no preconditioner */
1340f3ef73ceSBarry Smith     ierr = SNESGetSLES(snes,&sles);CHKERRQ(ierr);
1341f3ef73ceSBarry Smith     ierr = SLESGetPC(sles,&pc);CHKERRQ(ierr);
1342f3ef73ceSBarry Smith     ierr = PCSetType(pc,PCNONE);CHKERRQ(ierr);
1343272ac6f2SLois Curfman McInnes   }
1344f3ef73ceSBarry Smith 
13459b94acceSBarry Smith   if ((snes->method_class == SNES_NONLINEAR_EQUATIONS)) {
13466831982aSBarry Smith     PetscTruth iseqtr;
13476831982aSBarry Smith 
134829bbc08cSBarry Smith     if (!snes->vec_func) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetFunction() first");
134929bbc08cSBarry Smith     if (!snes->computefunction) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetFunction() first");
135029bbc08cSBarry Smith     if (!snes->jacobian) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetJacobian() first \n or use -snes_mf option");
1351a8c6a408SBarry Smith     if (snes->vec_func == snes->vec_sol) {
135229bbc08cSBarry Smith       SETERRQ(PETSC_ERR_ARG_IDN,"Solution vector cannot be function vector");
1353a8c6a408SBarry Smith     }
1354a703fe33SLois Curfman McInnes 
1355a703fe33SLois Curfman McInnes     /* Set the KSP stopping criterion to use the Eisenstat-Walker method */
13566831982aSBarry Smith     ierr = PetscTypeCompare((PetscObject)snes,SNESEQTR,&iseqtr);CHKERRQ(ierr);
13576831982aSBarry Smith     if (snes->ksp_ewconv && !iseqtr) {
1358a703fe33SLois Curfman McInnes       SLES sles; KSP ksp;
1359a703fe33SLois Curfman McInnes       ierr = SNESGetSLES(snes,&sles);CHKERRQ(ierr);
1360a703fe33SLois Curfman McInnes       ierr = SLESGetKSP(sles,&ksp);CHKERRQ(ierr);
1361186905e3SBarry Smith       ierr = KSPSetConvergenceTest(ksp,SNES_KSP_EW_Converged_Private,snes);CHKERRQ(ierr);
1362a703fe33SLois Curfman McInnes     }
13639b94acceSBarry Smith   } else if ((snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION)) {
136429bbc08cSBarry Smith     if (!snes->vec_func) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetGradient() first");
136529bbc08cSBarry Smith     if (!snes->computefunction) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetGradient() first");
1366a8c6a408SBarry Smith     if (!snes->computeumfunction) {
136729bbc08cSBarry Smith       SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetMinimizationFunction() first");
1368a8c6a408SBarry Smith     }
136929bbc08cSBarry Smith     if (!snes->jacobian) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetHessian()");
1370d4bb536fSBarry Smith   } else {
137129bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Unknown method class");
1372d4bb536fSBarry Smith   }
1373a703fe33SLois Curfman McInnes   if (snes->setup) {ierr = (*snes->setup)(snes);CHKERRQ(ierr);}
137482bf6240SBarry Smith   snes->setupcalled = 1;
13753a40ed3dSBarry Smith   PetscFunctionReturn(0);
13769b94acceSBarry Smith }
13779b94acceSBarry Smith 
13784a2ae208SSatish Balay #undef __FUNCT__
13794a2ae208SSatish Balay #define __FUNCT__ "SNESDestroy"
13809b94acceSBarry Smith /*@C
13819b94acceSBarry Smith    SNESDestroy - Destroys the nonlinear solver context that was created
13829b94acceSBarry Smith    with SNESCreate().
13839b94acceSBarry Smith 
1384c7afd0dbSLois Curfman McInnes    Collective on SNES
1385c7afd0dbSLois Curfman McInnes 
13869b94acceSBarry Smith    Input Parameter:
13879b94acceSBarry Smith .  snes - the SNES context
13889b94acceSBarry Smith 
138936851e7fSLois Curfman McInnes    Level: beginner
139036851e7fSLois Curfman McInnes 
13919b94acceSBarry Smith .keywords: SNES, nonlinear, destroy
13929b94acceSBarry Smith 
139363a78c88SLois Curfman McInnes .seealso: SNESCreate(), SNESSolve()
13949b94acceSBarry Smith @*/
13959b94acceSBarry Smith int SNESDestroy(SNES snes)
13969b94acceSBarry Smith {
1397b8a78c4aSBarry Smith   int i,ierr;
13983a40ed3dSBarry Smith 
13993a40ed3dSBarry Smith   PetscFunctionBegin;
140077c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
14013a40ed3dSBarry Smith   if (--snes->refct > 0) PetscFunctionReturn(0);
1402d4bb536fSBarry Smith 
1403be0abb6dSBarry Smith   /* if memory was published with AMS then destroy it */
14040f5bd95cSBarry Smith   ierr = PetscObjectDepublish(snes);CHKERRQ(ierr);
1405be0abb6dSBarry Smith 
1406e1311b90SBarry Smith   if (snes->destroy) {ierr = (*(snes)->destroy)(snes);CHKERRQ(ierr);}
1407606d414cSSatish Balay   if (snes->kspconvctx) {ierr = PetscFree(snes->kspconvctx);CHKERRQ(ierr);}
1408*3a7fca6bSBarry Smith   if (snes->jacobian) {ierr = MatDestroy(snes->jacobian);CHKERRQ(ierr);}
1409*3a7fca6bSBarry Smith   if (snes->jacobian_pre) {ierr = MatDestroy(snes->jacobian_pre);CHKERRQ(ierr);}
14109b94acceSBarry Smith   ierr = SLESDestroy(snes->sles);CHKERRQ(ierr);
1411522c5e43SBarry Smith   if (snes->vwork) {ierr = VecDestroyVecs(snes->vwork,snes->nvwork);CHKERRQ(ierr);}
1412b8a78c4aSBarry Smith   for (i=0; i<snes->numbermonitors; i++) {
1413b8a78c4aSBarry Smith     if (snes->monitordestroy[i]) {
1414b8a78c4aSBarry Smith       ierr = (*snes->monitordestroy[i])(snes->monitorcontext[i]);CHKERRQ(ierr);
1415b8a78c4aSBarry Smith     }
1416b8a78c4aSBarry Smith   }
1417b0a32e0cSBarry Smith   PetscLogObjectDestroy((PetscObject)snes);
14180452661fSBarry Smith   PetscHeaderDestroy((PetscObject)snes);
14193a40ed3dSBarry Smith   PetscFunctionReturn(0);
14209b94acceSBarry Smith }
14219b94acceSBarry Smith 
14229b94acceSBarry Smith /* ----------- Routines to set solver parameters ---------- */
14239b94acceSBarry Smith 
14244a2ae208SSatish Balay #undef __FUNCT__
14254a2ae208SSatish Balay #define __FUNCT__ "SNESSetTolerances"
14269b94acceSBarry Smith /*@
1427d7a720efSLois Curfman McInnes    SNESSetTolerances - Sets various parameters used in convergence tests.
14289b94acceSBarry Smith 
1429c7afd0dbSLois Curfman McInnes    Collective on SNES
1430c7afd0dbSLois Curfman McInnes 
14319b94acceSBarry Smith    Input Parameters:
1432c7afd0dbSLois Curfman McInnes +  snes - the SNES context
143333174efeSLois Curfman McInnes .  atol - absolute convergence tolerance
143433174efeSLois Curfman McInnes .  rtol - relative convergence tolerance
143533174efeSLois Curfman McInnes .  stol -  convergence tolerance in terms of the norm
143633174efeSLois Curfman McInnes            of the change in the solution between steps
143733174efeSLois Curfman McInnes .  maxit - maximum number of iterations
1438c7afd0dbSLois Curfman McInnes -  maxf - maximum number of function evaluations
1439fee21e36SBarry Smith 
144033174efeSLois Curfman McInnes    Options Database Keys:
1441c7afd0dbSLois Curfman McInnes +    -snes_atol <atol> - Sets atol
1442c7afd0dbSLois Curfman McInnes .    -snes_rtol <rtol> - Sets rtol
1443c7afd0dbSLois Curfman McInnes .    -snes_stol <stol> - Sets stol
1444c7afd0dbSLois Curfman McInnes .    -snes_max_it <maxit> - Sets maxit
1445c7afd0dbSLois Curfman McInnes -    -snes_max_funcs <maxf> - Sets maxf
14469b94acceSBarry Smith 
1447d7a720efSLois Curfman McInnes    Notes:
14489b94acceSBarry Smith    The default maximum number of iterations is 50.
14499b94acceSBarry Smith    The default maximum number of function evaluations is 1000.
14509b94acceSBarry Smith 
145136851e7fSLois Curfman McInnes    Level: intermediate
145236851e7fSLois Curfman McInnes 
145333174efeSLois Curfman McInnes .keywords: SNES, nonlinear, set, convergence, tolerances
14549b94acceSBarry Smith 
1455d7a720efSLois Curfman McInnes .seealso: SNESSetTrustRegionTolerance(), SNESSetMinimizationFunctionTolerance()
14569b94acceSBarry Smith @*/
1457329f5518SBarry Smith int SNESSetTolerances(SNES snes,PetscReal atol,PetscReal rtol,PetscReal stol,int maxit,int maxf)
14589b94acceSBarry Smith {
14593a40ed3dSBarry Smith   PetscFunctionBegin;
146077c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1461d7a720efSLois Curfman McInnes   if (atol != PETSC_DEFAULT)  snes->atol      = atol;
1462d7a720efSLois Curfman McInnes   if (rtol != PETSC_DEFAULT)  snes->rtol      = rtol;
1463d7a720efSLois Curfman McInnes   if (stol != PETSC_DEFAULT)  snes->xtol      = stol;
1464d7a720efSLois Curfman McInnes   if (maxit != PETSC_DEFAULT) snes->max_its   = maxit;
1465d7a720efSLois Curfman McInnes   if (maxf != PETSC_DEFAULT)  snes->max_funcs = maxf;
14663a40ed3dSBarry Smith   PetscFunctionReturn(0);
14679b94acceSBarry Smith }
14689b94acceSBarry Smith 
14694a2ae208SSatish Balay #undef __FUNCT__
14704a2ae208SSatish Balay #define __FUNCT__ "SNESGetTolerances"
14719b94acceSBarry Smith /*@
147233174efeSLois Curfman McInnes    SNESGetTolerances - Gets various parameters used in convergence tests.
147333174efeSLois Curfman McInnes 
1474c7afd0dbSLois Curfman McInnes    Not Collective
1475c7afd0dbSLois Curfman McInnes 
147633174efeSLois Curfman McInnes    Input Parameters:
1477c7afd0dbSLois Curfman McInnes +  snes - the SNES context
147833174efeSLois Curfman McInnes .  atol - absolute convergence tolerance
147933174efeSLois Curfman McInnes .  rtol - relative convergence tolerance
148033174efeSLois Curfman McInnes .  stol -  convergence tolerance in terms of the norm
148133174efeSLois Curfman McInnes            of the change in the solution between steps
148233174efeSLois Curfman McInnes .  maxit - maximum number of iterations
1483c7afd0dbSLois Curfman McInnes -  maxf - maximum number of function evaluations
1484fee21e36SBarry Smith 
148533174efeSLois Curfman McInnes    Notes:
148633174efeSLois Curfman McInnes    The user can specify PETSC_NULL for any parameter that is not needed.
148733174efeSLois Curfman McInnes 
148836851e7fSLois Curfman McInnes    Level: intermediate
148936851e7fSLois Curfman McInnes 
149033174efeSLois Curfman McInnes .keywords: SNES, nonlinear, get, convergence, tolerances
149133174efeSLois Curfman McInnes 
149233174efeSLois Curfman McInnes .seealso: SNESSetTolerances()
149333174efeSLois Curfman McInnes @*/
1494329f5518SBarry Smith int SNESGetTolerances(SNES snes,PetscReal *atol,PetscReal *rtol,PetscReal *stol,int *maxit,int *maxf)
149533174efeSLois Curfman McInnes {
14963a40ed3dSBarry Smith   PetscFunctionBegin;
149733174efeSLois Curfman McInnes   PetscValidHeaderSpecific(snes,SNES_COOKIE);
149833174efeSLois Curfman McInnes   if (atol)  *atol  = snes->atol;
149933174efeSLois Curfman McInnes   if (rtol)  *rtol  = snes->rtol;
150033174efeSLois Curfman McInnes   if (stol)  *stol  = snes->xtol;
150133174efeSLois Curfman McInnes   if (maxit) *maxit = snes->max_its;
150233174efeSLois Curfman McInnes   if (maxf)  *maxf  = snes->max_funcs;
15033a40ed3dSBarry Smith   PetscFunctionReturn(0);
150433174efeSLois Curfman McInnes }
150533174efeSLois Curfman McInnes 
15064a2ae208SSatish Balay #undef __FUNCT__
15074a2ae208SSatish Balay #define __FUNCT__ "SNESSetTrustRegionTolerance"
150833174efeSLois Curfman McInnes /*@
15099b94acceSBarry Smith    SNESSetTrustRegionTolerance - Sets the trust region parameter tolerance.
15109b94acceSBarry Smith 
1511fee21e36SBarry Smith    Collective on SNES
1512fee21e36SBarry Smith 
1513c7afd0dbSLois Curfman McInnes    Input Parameters:
1514c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1515c7afd0dbSLois Curfman McInnes -  tol - tolerance
1516c7afd0dbSLois Curfman McInnes 
15179b94acceSBarry Smith    Options Database Key:
1518c7afd0dbSLois Curfman McInnes .  -snes_trtol <tol> - Sets tol
15199b94acceSBarry Smith 
152036851e7fSLois Curfman McInnes    Level: intermediate
152136851e7fSLois Curfman McInnes 
15229b94acceSBarry Smith .keywords: SNES, nonlinear, set, trust region, tolerance
15239b94acceSBarry Smith 
1524d7a720efSLois Curfman McInnes .seealso: SNESSetTolerances(), SNESSetMinimizationFunctionTolerance()
15259b94acceSBarry Smith @*/
1526329f5518SBarry Smith int SNESSetTrustRegionTolerance(SNES snes,PetscReal tol)
15279b94acceSBarry Smith {
15283a40ed3dSBarry Smith   PetscFunctionBegin;
152977c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
15309b94acceSBarry Smith   snes->deltatol = tol;
15313a40ed3dSBarry Smith   PetscFunctionReturn(0);
15329b94acceSBarry Smith }
15339b94acceSBarry Smith 
15344a2ae208SSatish Balay #undef __FUNCT__
15354a2ae208SSatish Balay #define __FUNCT__ "SNESSetMinimizationFunctionTolerance"
15369b94acceSBarry Smith /*@
153777c4ece6SBarry Smith    SNESSetMinimizationFunctionTolerance - Sets the minimum allowable function tolerance
15389b94acceSBarry Smith    for unconstrained minimization solvers.
15399b94acceSBarry Smith 
1540fee21e36SBarry Smith    Collective on SNES
1541fee21e36SBarry Smith 
1542c7afd0dbSLois Curfman McInnes    Input Parameters:
1543c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1544c7afd0dbSLois Curfman McInnes -  ftol - minimum function tolerance
1545c7afd0dbSLois Curfman McInnes 
15469b94acceSBarry Smith    Options Database Key:
1547c7afd0dbSLois Curfman McInnes .  -snes_fmin <ftol> - Sets ftol
15489b94acceSBarry Smith 
15499b94acceSBarry Smith    Note:
155077c4ece6SBarry Smith    SNESSetMinimizationFunctionTolerance() is valid for SNES_UNCONSTRAINED_MINIMIZATION
15519b94acceSBarry Smith    methods only.
15529b94acceSBarry Smith 
155336851e7fSLois Curfman McInnes    Level: intermediate
155436851e7fSLois Curfman McInnes 
15559b94acceSBarry Smith .keywords: SNES, nonlinear, set, minimum, convergence, function, tolerance
15569b94acceSBarry Smith 
1557d7a720efSLois Curfman McInnes .seealso: SNESSetTolerances(), SNESSetTrustRegionTolerance()
15589b94acceSBarry Smith @*/
1559329f5518SBarry Smith int SNESSetMinimizationFunctionTolerance(SNES snes,PetscReal ftol)
15609b94acceSBarry Smith {
15613a40ed3dSBarry Smith   PetscFunctionBegin;
156277c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
15639b94acceSBarry Smith   snes->fmin = ftol;
15643a40ed3dSBarry Smith   PetscFunctionReturn(0);
15659b94acceSBarry Smith }
1566df9fa365SBarry Smith /*
1567df9fa365SBarry Smith    Duplicate the lg monitors for SNES from KSP; for some reason with
1568df9fa365SBarry Smith    dynamic libraries things don't work under Sun4 if we just use
1569df9fa365SBarry Smith    macros instead of functions
1570df9fa365SBarry Smith */
15714a2ae208SSatish Balay #undef __FUNCT__
15724a2ae208SSatish Balay #define __FUNCT__ "SNESLGMonitor"
1573329f5518SBarry Smith int SNESLGMonitor(SNES snes,int it,PetscReal norm,void *ctx)
1574ce1608b8SBarry Smith {
1575ce1608b8SBarry Smith   int ierr;
1576ce1608b8SBarry Smith 
1577ce1608b8SBarry Smith   PetscFunctionBegin;
1578184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1579ce1608b8SBarry Smith   ierr = KSPLGMonitor((KSP)snes,it,norm,ctx);CHKERRQ(ierr);
1580ce1608b8SBarry Smith   PetscFunctionReturn(0);
1581ce1608b8SBarry Smith }
1582ce1608b8SBarry Smith 
15834a2ae208SSatish Balay #undef __FUNCT__
15844a2ae208SSatish Balay #define __FUNCT__ "SNESLGMonitorCreate"
1585b0a32e0cSBarry Smith int SNESLGMonitorCreate(char *host,char *label,int x,int y,int m,int n,PetscDrawLG *draw)
1586df9fa365SBarry Smith {
1587df9fa365SBarry Smith   int ierr;
1588df9fa365SBarry Smith 
1589df9fa365SBarry Smith   PetscFunctionBegin;
1590df9fa365SBarry Smith   ierr = KSPLGMonitorCreate(host,label,x,y,m,n,draw);CHKERRQ(ierr);
1591df9fa365SBarry Smith   PetscFunctionReturn(0);
1592df9fa365SBarry Smith }
1593df9fa365SBarry Smith 
15944a2ae208SSatish Balay #undef __FUNCT__
15954a2ae208SSatish Balay #define __FUNCT__ "SNESLGMonitorDestroy"
1596b0a32e0cSBarry Smith int SNESLGMonitorDestroy(PetscDrawLG draw)
1597df9fa365SBarry Smith {
1598df9fa365SBarry Smith   int ierr;
1599df9fa365SBarry Smith 
1600df9fa365SBarry Smith   PetscFunctionBegin;
1601df9fa365SBarry Smith   ierr = KSPLGMonitorDestroy(draw);CHKERRQ(ierr);
1602df9fa365SBarry Smith   PetscFunctionReturn(0);
1603df9fa365SBarry Smith }
1604df9fa365SBarry Smith 
16059b94acceSBarry Smith /* ------------ Routines to set performance monitoring options ----------- */
16069b94acceSBarry Smith 
16074a2ae208SSatish Balay #undef __FUNCT__
16084a2ae208SSatish Balay #define __FUNCT__ "SNESSetMonitor"
16099b94acceSBarry Smith /*@C
16105cd90555SBarry Smith    SNESSetMonitor - Sets an ADDITIONAL function that is to be used at every
16119b94acceSBarry Smith    iteration of the nonlinear solver to display the iteration's
16129b94acceSBarry Smith    progress.
16139b94acceSBarry Smith 
1614fee21e36SBarry Smith    Collective on SNES
1615fee21e36SBarry Smith 
1616c7afd0dbSLois Curfman McInnes    Input Parameters:
1617c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1618c7afd0dbSLois Curfman McInnes .  func - monitoring routine
1619b8a78c4aSBarry Smith .  mctx - [optional] user-defined context for private data for the
1620b3006f0bSLois Curfman McInnes           monitor routine (use PETSC_NULL if no context is desitre)
1621b3006f0bSLois Curfman McInnes -  monitordestroy - [optional] routine that frees monitor context
1622b3006f0bSLois Curfman McInnes           (may be PETSC_NULL)
16239b94acceSBarry Smith 
1624c7afd0dbSLois Curfman McInnes    Calling sequence of func:
1625329f5518SBarry Smith $     int func(SNES snes,int its, PetscReal norm,void *mctx)
1626c7afd0dbSLois Curfman McInnes 
1627c7afd0dbSLois Curfman McInnes +    snes - the SNES context
1628c7afd0dbSLois Curfman McInnes .    its - iteration number
1629c7afd0dbSLois Curfman McInnes .    norm - 2-norm function value (may be estimated)
1630c7afd0dbSLois Curfman McInnes             for SNES_NONLINEAR_EQUATIONS methods
163140a0c1c6SLois Curfman McInnes .    norm - 2-norm gradient value (may be estimated)
1632c7afd0dbSLois Curfman McInnes             for SNES_UNCONSTRAINED_MINIMIZATION methods
163340a0c1c6SLois Curfman McInnes -    mctx - [optional] monitoring context
16349b94acceSBarry Smith 
16359665c990SLois Curfman McInnes    Options Database Keys:
1636c7afd0dbSLois Curfman McInnes +    -snes_monitor        - sets SNESDefaultMonitor()
1637c7afd0dbSLois Curfman McInnes .    -snes_xmonitor       - sets line graph monitor,
1638c7afd0dbSLois Curfman McInnes                             uses SNESLGMonitorCreate()
1639c7afd0dbSLois Curfman McInnes _    -snes_cancelmonitors - cancels all monitors that have
1640c7afd0dbSLois Curfman McInnes                             been hardwired into a code by
1641c7afd0dbSLois Curfman McInnes                             calls to SNESSetMonitor(), but
1642c7afd0dbSLois Curfman McInnes                             does not cancel those set via
1643c7afd0dbSLois Curfman McInnes                             the options database.
16449665c990SLois Curfman McInnes 
1645639f9d9dSBarry Smith    Notes:
16466bc08f3fSLois Curfman McInnes    Several different monitoring routines may be set by calling
16476bc08f3fSLois Curfman McInnes    SNESSetMonitor() multiple times; all will be called in the
16486bc08f3fSLois Curfman McInnes    order in which they were set.
1649639f9d9dSBarry Smith 
165036851e7fSLois Curfman McInnes    Level: intermediate
165136851e7fSLois Curfman McInnes 
16529b94acceSBarry Smith .keywords: SNES, nonlinear, set, monitor
16539b94acceSBarry Smith 
16545cd90555SBarry Smith .seealso: SNESDefaultMonitor(), SNESClearMonitor()
16559b94acceSBarry Smith @*/
1656329f5518SBarry Smith int SNESSetMonitor(SNES snes,int (*func)(SNES,int,PetscReal,void*),void *mctx,int (*monitordestroy)(void *))
16579b94acceSBarry Smith {
16583a40ed3dSBarry Smith   PetscFunctionBegin;
1659184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1660639f9d9dSBarry Smith   if (snes->numbermonitors >= MAXSNESMONITORS) {
166129bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Too many monitors set");
1662639f9d9dSBarry Smith   }
1663639f9d9dSBarry Smith 
1664639f9d9dSBarry Smith   snes->monitor[snes->numbermonitors]           = func;
1665b8a78c4aSBarry Smith   snes->monitordestroy[snes->numbermonitors]    = monitordestroy;
1666639f9d9dSBarry Smith   snes->monitorcontext[snes->numbermonitors++]  = (void*)mctx;
16673a40ed3dSBarry Smith   PetscFunctionReturn(0);
16689b94acceSBarry Smith }
16699b94acceSBarry Smith 
16704a2ae208SSatish Balay #undef __FUNCT__
16714a2ae208SSatish Balay #define __FUNCT__ "SNESClearMonitor"
16725cd90555SBarry Smith /*@C
16735cd90555SBarry Smith    SNESClearMonitor - Clears all the monitor functions for a SNES object.
16745cd90555SBarry Smith 
1675c7afd0dbSLois Curfman McInnes    Collective on SNES
1676c7afd0dbSLois Curfman McInnes 
16775cd90555SBarry Smith    Input Parameters:
16785cd90555SBarry Smith .  snes - the SNES context
16795cd90555SBarry Smith 
16805cd90555SBarry Smith    Options Database:
1681c7afd0dbSLois Curfman McInnes .  -snes_cancelmonitors - cancels all monitors that have been hardwired
1682c7afd0dbSLois Curfman McInnes     into a code by calls to SNESSetMonitor(), but does not cancel those
1683c7afd0dbSLois Curfman McInnes     set via the options database
16845cd90555SBarry Smith 
16855cd90555SBarry Smith    Notes:
16865cd90555SBarry Smith    There is no way to clear one specific monitor from a SNES object.
16875cd90555SBarry Smith 
168836851e7fSLois Curfman McInnes    Level: intermediate
168936851e7fSLois Curfman McInnes 
16905cd90555SBarry Smith .keywords: SNES, nonlinear, set, monitor
16915cd90555SBarry Smith 
16925cd90555SBarry Smith .seealso: SNESDefaultMonitor(), SNESSetMonitor()
16935cd90555SBarry Smith @*/
16945cd90555SBarry Smith int SNESClearMonitor(SNES snes)
16955cd90555SBarry Smith {
16965cd90555SBarry Smith   PetscFunctionBegin;
1697184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
16985cd90555SBarry Smith   snes->numbermonitors = 0;
16995cd90555SBarry Smith   PetscFunctionReturn(0);
17005cd90555SBarry Smith }
17015cd90555SBarry Smith 
17024a2ae208SSatish Balay #undef __FUNCT__
17034a2ae208SSatish Balay #define __FUNCT__ "SNESSetConvergenceTest"
17049b94acceSBarry Smith /*@C
17059b94acceSBarry Smith    SNESSetConvergenceTest - Sets the function that is to be used
17069b94acceSBarry Smith    to test for convergence of the nonlinear iterative solution.
17079b94acceSBarry Smith 
1708fee21e36SBarry Smith    Collective on SNES
1709fee21e36SBarry Smith 
1710c7afd0dbSLois Curfman McInnes    Input Parameters:
1711c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1712c7afd0dbSLois Curfman McInnes .  func - routine to test for convergence
1713c7afd0dbSLois Curfman McInnes -  cctx - [optional] context for private data for the convergence routine
1714c7afd0dbSLois Curfman McInnes           (may be PETSC_NULL)
17159b94acceSBarry Smith 
1716c7afd0dbSLois Curfman McInnes    Calling sequence of func:
1717329f5518SBarry Smith $     int func (SNES snes,PetscReal xnorm,PetscReal gnorm,PetscReal f,SNESConvergedReason *reason,void *cctx)
1718c7afd0dbSLois Curfman McInnes 
1719c7afd0dbSLois Curfman McInnes +    snes - the SNES context
1720c7afd0dbSLois Curfman McInnes .    cctx - [optional] convergence context
1721184914b5SBarry Smith .    reason - reason for convergence/divergence
1722c7afd0dbSLois Curfman McInnes .    xnorm - 2-norm of current iterate
1723c7afd0dbSLois Curfman McInnes .    gnorm - 2-norm of current step (SNES_NONLINEAR_EQUATIONS methods)
1724c7afd0dbSLois Curfman McInnes .    f - 2-norm of function (SNES_NONLINEAR_EQUATIONS methods)
1725c7afd0dbSLois Curfman McInnes .    gnorm - 2-norm of current gradient (SNES_UNCONSTRAINED_MINIMIZATION methods)
1726c7afd0dbSLois Curfman McInnes -    f - function value (SNES_UNCONSTRAINED_MINIMIZATION methods)
17279b94acceSBarry Smith 
172836851e7fSLois Curfman McInnes    Level: advanced
172936851e7fSLois Curfman McInnes 
17309b94acceSBarry Smith .keywords: SNES, nonlinear, set, convergence, test
17319b94acceSBarry Smith 
173240191667SLois Curfman McInnes .seealso: SNESConverged_EQ_LS(), SNESConverged_EQ_TR(),
173340191667SLois Curfman McInnes           SNESConverged_UM_LS(), SNESConverged_UM_TR()
17349b94acceSBarry Smith @*/
1735329f5518SBarry Smith int SNESSetConvergenceTest(SNES snes,int (*func)(SNES,PetscReal,PetscReal,PetscReal,SNESConvergedReason*,void*),void *cctx)
17369b94acceSBarry Smith {
17373a40ed3dSBarry Smith   PetscFunctionBegin;
1738184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
17399b94acceSBarry Smith   (snes)->converged = func;
17409b94acceSBarry Smith   (snes)->cnvP      = cctx;
17413a40ed3dSBarry Smith   PetscFunctionReturn(0);
17429b94acceSBarry Smith }
17439b94acceSBarry Smith 
17444a2ae208SSatish Balay #undef __FUNCT__
17454a2ae208SSatish Balay #define __FUNCT__ "SNESGetConvergedReason"
1746184914b5SBarry Smith /*@C
1747184914b5SBarry Smith    SNESGetConvergedReason - Gets the reason the SNES iteration was stopped.
1748184914b5SBarry Smith 
1749184914b5SBarry Smith    Not Collective
1750184914b5SBarry Smith 
1751184914b5SBarry Smith    Input Parameter:
1752184914b5SBarry Smith .  snes - the SNES context
1753184914b5SBarry Smith 
1754184914b5SBarry Smith    Output Parameter:
1755e090d566SSatish Balay .  reason - negative value indicates diverged, positive value converged, see petscsnes.h or the
1756184914b5SBarry Smith             manual pages for the individual convergence tests for complete lists
1757184914b5SBarry Smith 
1758184914b5SBarry Smith    Level: intermediate
1759184914b5SBarry Smith 
1760184914b5SBarry Smith    Notes: Can only be called after the call the SNESSolve() is complete.
1761184914b5SBarry Smith 
1762184914b5SBarry Smith .keywords: SNES, nonlinear, set, convergence, test
1763184914b5SBarry Smith 
1764184914b5SBarry Smith .seealso: SNESSetConvergenceTest(), SNESConverged_EQ_LS(), SNESConverged_EQ_TR(),
1765435da068SBarry Smith           SNESConverged_UM_LS(), SNESConverged_UM_TR(), SNESConvergedReason
1766184914b5SBarry Smith @*/
1767184914b5SBarry Smith int SNESGetConvergedReason(SNES snes,SNESConvergedReason *reason)
1768184914b5SBarry Smith {
1769184914b5SBarry Smith   PetscFunctionBegin;
1770184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1771184914b5SBarry Smith   *reason = snes->reason;
1772184914b5SBarry Smith   PetscFunctionReturn(0);
1773184914b5SBarry Smith }
1774184914b5SBarry Smith 
17754a2ae208SSatish Balay #undef __FUNCT__
17764a2ae208SSatish Balay #define __FUNCT__ "SNESSetConvergenceHistory"
1777c9005455SLois Curfman McInnes /*@
1778c9005455SLois Curfman McInnes    SNESSetConvergenceHistory - Sets the array used to hold the convergence history.
1779c9005455SLois Curfman McInnes 
1780fee21e36SBarry Smith    Collective on SNES
1781fee21e36SBarry Smith 
1782c7afd0dbSLois Curfman McInnes    Input Parameters:
1783c7afd0dbSLois Curfman McInnes +  snes - iterative context obtained from SNESCreate()
1784c7afd0dbSLois Curfman McInnes .  a   - array to hold history
1785cd5578b5SBarry Smith .  its - integer array holds the number of linear iterations for each solve.
1786758f92a0SBarry Smith .  na  - size of a and its
178764731454SLois Curfman McInnes -  reset - PETSC_TRUE indicates each new nonlinear solve resets the history counter to zero,
1788758f92a0SBarry Smith            else it continues storing new values for new nonlinear solves after the old ones
1789c7afd0dbSLois Curfman McInnes 
1790c9005455SLois Curfman McInnes    Notes:
1791c9005455SLois Curfman McInnes    If set, this array will contain the function norms (for
1792c9005455SLois Curfman McInnes    SNES_NONLINEAR_EQUATIONS methods) or gradient norms
1793c9005455SLois Curfman McInnes    (for SNES_UNCONSTRAINED_MINIMIZATION methods) computed
1794c9005455SLois Curfman McInnes    at each step.
1795c9005455SLois Curfman McInnes 
1796c9005455SLois Curfman McInnes    This routine is useful, e.g., when running a code for purposes
1797c9005455SLois Curfman McInnes    of accurate performance monitoring, when no I/O should be done
1798c9005455SLois Curfman McInnes    during the section of code that is being timed.
1799c9005455SLois Curfman McInnes 
180036851e7fSLois Curfman McInnes    Level: intermediate
180136851e7fSLois Curfman McInnes 
1802c9005455SLois Curfman McInnes .keywords: SNES, set, convergence, history
1803758f92a0SBarry Smith 
180408405cd6SLois Curfman McInnes .seealso: SNESGetConvergenceHistory()
1805758f92a0SBarry Smith 
1806c9005455SLois Curfman McInnes @*/
1807329f5518SBarry Smith int SNESSetConvergenceHistory(SNES snes,PetscReal *a,int *its,int na,PetscTruth reset)
1808c9005455SLois Curfman McInnes {
18093a40ed3dSBarry Smith   PetscFunctionBegin;
1810c9005455SLois Curfman McInnes   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1811c9005455SLois Curfman McInnes   if (na) PetscValidScalarPointer(a);
1812c9005455SLois Curfman McInnes   snes->conv_hist       = a;
1813758f92a0SBarry Smith   snes->conv_hist_its   = its;
1814758f92a0SBarry Smith   snes->conv_hist_max   = na;
1815758f92a0SBarry Smith   snes->conv_hist_reset = reset;
1816758f92a0SBarry Smith   PetscFunctionReturn(0);
1817758f92a0SBarry Smith }
1818758f92a0SBarry Smith 
18194a2ae208SSatish Balay #undef __FUNCT__
18204a2ae208SSatish Balay #define __FUNCT__ "SNESGetConvergenceHistory"
18210c4c9dddSBarry Smith /*@C
1822758f92a0SBarry Smith    SNESGetConvergenceHistory - Gets the array used to hold the convergence history.
1823758f92a0SBarry Smith 
1824758f92a0SBarry Smith    Collective on SNES
1825758f92a0SBarry Smith 
1826758f92a0SBarry Smith    Input Parameter:
1827758f92a0SBarry Smith .  snes - iterative context obtained from SNESCreate()
1828758f92a0SBarry Smith 
1829758f92a0SBarry Smith    Output Parameters:
1830758f92a0SBarry Smith .  a   - array to hold history
1831758f92a0SBarry Smith .  its - integer array holds the number of linear iterations (or
1832758f92a0SBarry Smith          negative if not converged) for each solve.
1833758f92a0SBarry Smith -  na  - size of a and its
1834758f92a0SBarry Smith 
1835758f92a0SBarry Smith    Notes:
1836758f92a0SBarry Smith     The calling sequence for this routine in Fortran is
1837758f92a0SBarry Smith $   call SNESGetConvergenceHistory(SNES snes, integer na, integer ierr)
1838758f92a0SBarry Smith 
1839758f92a0SBarry Smith    This routine is useful, e.g., when running a code for purposes
1840758f92a0SBarry Smith    of accurate performance monitoring, when no I/O should be done
1841758f92a0SBarry Smith    during the section of code that is being timed.
1842758f92a0SBarry Smith 
1843758f92a0SBarry Smith    Level: intermediate
1844758f92a0SBarry Smith 
1845758f92a0SBarry Smith .keywords: SNES, get, convergence, history
1846758f92a0SBarry Smith 
1847758f92a0SBarry Smith .seealso: SNESSetConvergencHistory()
1848758f92a0SBarry Smith 
1849758f92a0SBarry Smith @*/
1850329f5518SBarry Smith int SNESGetConvergenceHistory(SNES snes,PetscReal **a,int **its,int *na)
1851758f92a0SBarry Smith {
1852758f92a0SBarry Smith   PetscFunctionBegin;
1853758f92a0SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1854758f92a0SBarry Smith   if (a)   *a   = snes->conv_hist;
1855758f92a0SBarry Smith   if (its) *its = snes->conv_hist_its;
1856758f92a0SBarry Smith   if (na) *na   = snes->conv_hist_len;
18573a40ed3dSBarry Smith   PetscFunctionReturn(0);
1858c9005455SLois Curfman McInnes }
1859c9005455SLois Curfman McInnes 
18604a2ae208SSatish Balay #undef __FUNCT__
18614a2ae208SSatish Balay #define __FUNCT__ "SNESScaleStep_Private"
18629b94acceSBarry Smith /*
18639b94acceSBarry Smith    SNESScaleStep_Private - Scales a step so that its length is less than the
18649b94acceSBarry Smith    positive parameter delta.
18659b94acceSBarry Smith 
18669b94acceSBarry Smith     Input Parameters:
1867c7afd0dbSLois Curfman McInnes +   snes - the SNES context
18689b94acceSBarry Smith .   y - approximate solution of linear system
18699b94acceSBarry Smith .   fnorm - 2-norm of current function
1870c7afd0dbSLois Curfman McInnes -   delta - trust region size
18719b94acceSBarry Smith 
18729b94acceSBarry Smith     Output Parameters:
1873c7afd0dbSLois Curfman McInnes +   gpnorm - predicted function norm at the new point, assuming local
18749b94acceSBarry Smith     linearization.  The value is zero if the step lies within the trust
18759b94acceSBarry Smith     region, and exceeds zero otherwise.
1876c7afd0dbSLois Curfman McInnes -   ynorm - 2-norm of the step
18779b94acceSBarry Smith 
18789b94acceSBarry Smith     Note:
18796831982aSBarry Smith     For non-trust region methods such as SNESEQLS, the parameter delta
18809b94acceSBarry Smith     is set to be the maximum allowable step size.
18819b94acceSBarry Smith 
18829b94acceSBarry Smith .keywords: SNES, nonlinear, scale, step
18839b94acceSBarry Smith */
1884329f5518SBarry Smith int SNESScaleStep_Private(SNES snes,Vec y,PetscReal *fnorm,PetscReal *delta,
1885329f5518SBarry Smith                           PetscReal *gpnorm,PetscReal *ynorm)
18869b94acceSBarry Smith {
1887329f5518SBarry Smith   PetscReal norm;
18889b94acceSBarry Smith   Scalar cnorm;
18893a40ed3dSBarry Smith   int    ierr;
18903a40ed3dSBarry Smith 
18913a40ed3dSBarry Smith   PetscFunctionBegin;
1892184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1893184914b5SBarry Smith   PetscValidHeaderSpecific(y,VEC_COOKIE);
1894184914b5SBarry Smith   PetscCheckSameComm(snes,y);
1895184914b5SBarry Smith 
18963a40ed3dSBarry Smith   ierr = VecNorm(y,NORM_2,&norm);CHKERRQ(ierr);
18979b94acceSBarry Smith   if (norm > *delta) {
18989b94acceSBarry Smith      norm = *delta/norm;
18999b94acceSBarry Smith      *gpnorm = (1.0 - norm)*(*fnorm);
19009b94acceSBarry Smith      cnorm = norm;
1901329f5518SBarry Smith      ierr = VecScale(&cnorm,y);CHKERRQ(ierr);
19029b94acceSBarry Smith      *ynorm = *delta;
19039b94acceSBarry Smith   } else {
19049b94acceSBarry Smith      *gpnorm = 0.0;
19059b94acceSBarry Smith      *ynorm = norm;
19069b94acceSBarry Smith   }
19073a40ed3dSBarry Smith   PetscFunctionReturn(0);
19089b94acceSBarry Smith }
19099b94acceSBarry Smith 
19104a2ae208SSatish Balay #undef __FUNCT__
19114a2ae208SSatish Balay #define __FUNCT__ "SNESSolve"
19129b94acceSBarry Smith /*@
19139b94acceSBarry Smith    SNESSolve - Solves a nonlinear system.  Call SNESSolve after calling
191463a78c88SLois Curfman McInnes    SNESCreate() and optional routines of the form SNESSetXXX().
19159b94acceSBarry Smith 
1916c7afd0dbSLois Curfman McInnes    Collective on SNES
1917c7afd0dbSLois Curfman McInnes 
1918b2002411SLois Curfman McInnes    Input Parameters:
1919c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1920c7afd0dbSLois Curfman McInnes -  x - the solution vector
19219b94acceSBarry Smith 
19229b94acceSBarry Smith    Output Parameter:
1923b2002411SLois Curfman McInnes .  its - number of iterations until termination
19249b94acceSBarry Smith 
1925b2002411SLois Curfman McInnes    Notes:
19268ddd3da0SLois Curfman McInnes    The user should initialize the vector,x, with the initial guess
19278ddd3da0SLois Curfman McInnes    for the nonlinear solve prior to calling SNESSolve.  In particular,
19288ddd3da0SLois Curfman McInnes    to employ an initial guess of zero, the user should explicitly set
19298ddd3da0SLois Curfman McInnes    this vector to zero by calling VecSet().
19308ddd3da0SLois Curfman McInnes 
193136851e7fSLois Curfman McInnes    Level: beginner
193236851e7fSLois Curfman McInnes 
19339b94acceSBarry Smith .keywords: SNES, nonlinear, solve
19349b94acceSBarry Smith 
193563a78c88SLois Curfman McInnes .seealso: SNESCreate(), SNESDestroy()
19369b94acceSBarry Smith @*/
19378ddd3da0SLois Curfman McInnes int SNESSolve(SNES snes,Vec x,int *its)
19389b94acceSBarry Smith {
1939f1af5d2fSBarry Smith   int        ierr;
1940f1af5d2fSBarry Smith   PetscTruth flg;
1941052efed2SBarry Smith 
19423a40ed3dSBarry Smith   PetscFunctionBegin;
194377c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1944184914b5SBarry Smith   PetscValidHeaderSpecific(x,VEC_COOKIE);
1945184914b5SBarry Smith   PetscCheckSameComm(snes,x);
194674679c65SBarry Smith   PetscValidIntPointer(its);
194729bbc08cSBarry Smith   if (!snes->solve) SETERRQ(1,"SNESSetType() or SNESSetFromOptions() must be called before SNESSolve()");
194874637425SBarry Smith 
194982bf6240SBarry Smith   if (!snes->setupcalled) {ierr = SNESSetUp(snes,x);CHKERRQ(ierr);}
1950c4fc05e7SBarry Smith   else {snes->vec_sol = snes->vec_sol_always = x;}
1951758f92a0SBarry Smith   if (snes->conv_hist_reset == PETSC_TRUE) snes->conv_hist_len = 0;
1952b0a32e0cSBarry Smith   ierr = PetscLogEventBegin(SNES_Solve,snes,0,0,0);CHKERRQ(ierr);
1953c96a6f78SLois Curfman McInnes   snes->nfuncs = 0; snes->linear_its = 0; snes->nfailures = 0;
19549b94acceSBarry Smith   ierr = (*(snes)->solve)(snes,its);CHKERRQ(ierr);
1955b0a32e0cSBarry Smith   ierr = PetscLogEventEnd(SNES_Solve,snes,0,0,0);CHKERRQ(ierr);
1956b0a32e0cSBarry Smith   ierr = PetscOptionsHasName(snes->prefix,"-snes_view",&flg);CHKERRQ(ierr);
195793b98531SBarry Smith   if (flg && !PetscPreLoadingOn) { ierr = SNESView(snes,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); }
19583a40ed3dSBarry Smith   PetscFunctionReturn(0);
19599b94acceSBarry Smith }
19609b94acceSBarry Smith 
19619b94acceSBarry Smith /* --------- Internal routines for SNES Package --------- */
19629b94acceSBarry Smith 
19634a2ae208SSatish Balay #undef __FUNCT__
19644a2ae208SSatish Balay #define __FUNCT__ "SNESSetType"
196582bf6240SBarry Smith /*@C
19664b0e389bSBarry Smith    SNESSetType - Sets the method for the nonlinear solver.
19679b94acceSBarry Smith 
1968fee21e36SBarry Smith    Collective on SNES
1969fee21e36SBarry Smith 
1970c7afd0dbSLois Curfman McInnes    Input Parameters:
1971c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1972454a90a3SBarry Smith -  type - a known method
1973c7afd0dbSLois Curfman McInnes 
1974c7afd0dbSLois Curfman McInnes    Options Database Key:
1975454a90a3SBarry Smith .  -snes_type <type> - Sets the method; use -help for a list
1976c7afd0dbSLois Curfman McInnes    of available methods (for instance, ls or tr)
1977ae12b187SLois Curfman McInnes 
19789b94acceSBarry Smith    Notes:
1979e090d566SSatish Balay    See "petsc/include/petscsnes.h" for available methods (for instance)
19806831982aSBarry Smith +    SNESEQLS - Newton's method with line search
1981c7afd0dbSLois Curfman McInnes      (systems of nonlinear equations)
19826831982aSBarry Smith .    SNESEQTR - Newton's method with trust region
1983c7afd0dbSLois Curfman McInnes      (systems of nonlinear equations)
19846831982aSBarry Smith .    SNESUMTR - Newton's method with trust region
1985c7afd0dbSLois Curfman McInnes      (unconstrained minimization)
19866831982aSBarry Smith -    SNESUMLS - Newton's method with line search
1987c7afd0dbSLois Curfman McInnes      (unconstrained minimization)
19889b94acceSBarry Smith 
1989ae12b187SLois Curfman McInnes   Normally, it is best to use the SNESSetFromOptions() command and then
1990ae12b187SLois Curfman McInnes   set the SNES solver type from the options database rather than by using
1991ae12b187SLois Curfman McInnes   this routine.  Using the options database provides the user with
1992ae12b187SLois Curfman McInnes   maximum flexibility in evaluating the many nonlinear solvers.
1993ae12b187SLois Curfman McInnes   The SNESSetType() routine is provided for those situations where it
1994ae12b187SLois Curfman McInnes   is necessary to set the nonlinear solver independently of the command
1995ae12b187SLois Curfman McInnes   line or options database.  This might be the case, for example, when
1996ae12b187SLois Curfman McInnes   the choice of solver changes during the execution of the program,
1997ae12b187SLois Curfman McInnes   and the user's application is taking responsibility for choosing the
1998b0a32e0cSBarry Smith   appropriate method.
199936851e7fSLois Curfman McInnes 
200036851e7fSLois Curfman McInnes   Level: intermediate
2001a703fe33SLois Curfman McInnes 
2002454a90a3SBarry Smith .keywords: SNES, set, type
2003435da068SBarry Smith 
2004435da068SBarry Smith .seealso: SNESType, SNESCreate()
2005435da068SBarry Smith 
20069b94acceSBarry Smith @*/
2007454a90a3SBarry Smith int SNESSetType(SNES snes,SNESType type)
20089b94acceSBarry Smith {
20090f5bd95cSBarry Smith   int        ierr,(*r)(SNES);
20106831982aSBarry Smith   PetscTruth match;
20113a40ed3dSBarry Smith 
20123a40ed3dSBarry Smith   PetscFunctionBegin;
201377c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
20140f5bd95cSBarry Smith   PetscValidCharPointer(type);
201582bf6240SBarry Smith 
20166831982aSBarry Smith   ierr = PetscTypeCompare((PetscObject)snes,type,&match);CHKERRQ(ierr);
20170f5bd95cSBarry Smith   if (match) PetscFunctionReturn(0);
201882bf6240SBarry Smith 
201982bf6240SBarry Smith   if (snes->setupcalled) {
2020e1311b90SBarry Smith     ierr       = (*(snes)->destroy)(snes);CHKERRQ(ierr);
202182bf6240SBarry Smith     snes->data = 0;
202282bf6240SBarry Smith   }
20237d1a2b2bSBarry Smith 
20249b94acceSBarry Smith   /* Get the function pointers for the iterative method requested */
202582bf6240SBarry Smith   if (!SNESRegisterAllCalled) {ierr = SNESRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
202682bf6240SBarry Smith 
2027b9617806SBarry Smith   ierr =  PetscFListFind(snes->comm,SNESList,type,(void (**)(void)) &r);CHKERRQ(ierr);
202882bf6240SBarry Smith 
202929bbc08cSBarry Smith   if (!r) SETERRQ1(1,"Unable to find requested SNES type %s",type);
20301548b14aSBarry Smith 
2031606d414cSSatish Balay   if (snes->data) {ierr = PetscFree(snes->data);CHKERRQ(ierr);}
203282bf6240SBarry Smith   snes->data = 0;
20333a40ed3dSBarry Smith   ierr = (*r)(snes);CHKERRQ(ierr);
203482bf6240SBarry Smith 
2035454a90a3SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)snes,type);CHKERRQ(ierr);
203682bf6240SBarry Smith   snes->set_method_called = 1;
203782bf6240SBarry Smith 
20383a40ed3dSBarry Smith   PetscFunctionReturn(0);
20399b94acceSBarry Smith }
20409b94acceSBarry Smith 
2041a847f771SSatish Balay 
20429b94acceSBarry Smith /* --------------------------------------------------------------------- */
20434a2ae208SSatish Balay #undef __FUNCT__
20444a2ae208SSatish Balay #define __FUNCT__ "SNESRegisterDestroy"
20459b94acceSBarry Smith /*@C
20469b94acceSBarry Smith    SNESRegisterDestroy - Frees the list of nonlinear solvers that were
2047f1af5d2fSBarry Smith    registered by SNESRegisterDynamic().
20489b94acceSBarry Smith 
2049fee21e36SBarry Smith    Not Collective
2050fee21e36SBarry Smith 
205136851e7fSLois Curfman McInnes    Level: advanced
205236851e7fSLois Curfman McInnes 
20539b94acceSBarry Smith .keywords: SNES, nonlinear, register, destroy
20549b94acceSBarry Smith 
20559b94acceSBarry Smith .seealso: SNESRegisterAll(), SNESRegisterAll()
20569b94acceSBarry Smith @*/
2057cf256101SBarry Smith int SNESRegisterDestroy(void)
20589b94acceSBarry Smith {
205982bf6240SBarry Smith   int ierr;
206082bf6240SBarry Smith 
20613a40ed3dSBarry Smith   PetscFunctionBegin;
206282bf6240SBarry Smith   if (SNESList) {
2063b0a32e0cSBarry Smith     ierr = PetscFListDestroy(&SNESList);CHKERRQ(ierr);
206482bf6240SBarry Smith     SNESList = 0;
20659b94acceSBarry Smith   }
20664c49b128SBarry Smith   SNESRegisterAllCalled = PETSC_FALSE;
20673a40ed3dSBarry Smith   PetscFunctionReturn(0);
20689b94acceSBarry Smith }
20699b94acceSBarry Smith 
20704a2ae208SSatish Balay #undef __FUNCT__
20714a2ae208SSatish Balay #define __FUNCT__ "SNESGetType"
20729b94acceSBarry Smith /*@C
20739a28b0a6SLois Curfman McInnes    SNESGetType - Gets the SNES method type and name (as a string).
20749b94acceSBarry Smith 
2075c7afd0dbSLois Curfman McInnes    Not Collective
2076c7afd0dbSLois Curfman McInnes 
20779b94acceSBarry Smith    Input Parameter:
20784b0e389bSBarry Smith .  snes - nonlinear solver context
20799b94acceSBarry Smith 
20809b94acceSBarry Smith    Output Parameter:
2081*3a7fca6bSBarry Smith .  type - SNES method (a character string)
20829b94acceSBarry Smith 
208336851e7fSLois Curfman McInnes    Level: intermediate
208436851e7fSLois Curfman McInnes 
2085454a90a3SBarry Smith .keywords: SNES, nonlinear, get, type, name
20869b94acceSBarry Smith @*/
2087454a90a3SBarry Smith int SNESGetType(SNES snes,SNESType *type)
20889b94acceSBarry Smith {
20893a40ed3dSBarry Smith   PetscFunctionBegin;
2090184914b5SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2091454a90a3SBarry Smith   *type = snes->type_name;
20923a40ed3dSBarry Smith   PetscFunctionReturn(0);
20939b94acceSBarry Smith }
20949b94acceSBarry Smith 
20954a2ae208SSatish Balay #undef __FUNCT__
20964a2ae208SSatish Balay #define __FUNCT__ "SNESGetSolution"
20979b94acceSBarry Smith /*@C
20989b94acceSBarry Smith    SNESGetSolution - Returns the vector where the approximate solution is
20999b94acceSBarry Smith    stored.
21009b94acceSBarry Smith 
2101c7afd0dbSLois Curfman McInnes    Not Collective, but Vec is parallel if SNES is parallel
2102c7afd0dbSLois Curfman McInnes 
21039b94acceSBarry Smith    Input Parameter:
21049b94acceSBarry Smith .  snes - the SNES context
21059b94acceSBarry Smith 
21069b94acceSBarry Smith    Output Parameter:
21079b94acceSBarry Smith .  x - the solution
21089b94acceSBarry Smith 
210936851e7fSLois Curfman McInnes    Level: advanced
211036851e7fSLois Curfman McInnes 
21119b94acceSBarry Smith .keywords: SNES, nonlinear, get, solution
21129b94acceSBarry Smith 
2113a86d99e1SLois Curfman McInnes .seealso: SNESGetFunction(), SNESGetGradient(), SNESGetSolutionUpdate()
21149b94acceSBarry Smith @*/
21159b94acceSBarry Smith int SNESGetSolution(SNES snes,Vec *x)
21169b94acceSBarry Smith {
21173a40ed3dSBarry Smith   PetscFunctionBegin;
211877c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
21199b94acceSBarry Smith   *x = snes->vec_sol_always;
21203a40ed3dSBarry Smith   PetscFunctionReturn(0);
21219b94acceSBarry Smith }
21229b94acceSBarry Smith 
21234a2ae208SSatish Balay #undef __FUNCT__
21244a2ae208SSatish Balay #define __FUNCT__ "SNESGetSolutionUpdate"
21259b94acceSBarry Smith /*@C
21269b94acceSBarry Smith    SNESGetSolutionUpdate - Returns the vector where the solution update 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 update
21369b94acceSBarry Smith 
213736851e7fSLois Curfman McInnes    Level: advanced
213836851e7fSLois Curfman McInnes 
21399b94acceSBarry Smith .keywords: SNES, nonlinear, get, solution, update
21409b94acceSBarry Smith 
21419b94acceSBarry Smith .seealso: SNESGetSolution(), SNESGetFunction
21429b94acceSBarry Smith @*/
21439b94acceSBarry Smith int SNESGetSolutionUpdate(SNES snes,Vec *x)
21449b94acceSBarry Smith {
21453a40ed3dSBarry Smith   PetscFunctionBegin;
214677c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
21479b94acceSBarry Smith   *x = snes->vec_sol_update_always;
21483a40ed3dSBarry Smith   PetscFunctionReturn(0);
21499b94acceSBarry Smith }
21509b94acceSBarry Smith 
21514a2ae208SSatish Balay #undef __FUNCT__
21524a2ae208SSatish Balay #define __FUNCT__ "SNESGetFunction"
21539b94acceSBarry Smith /*@C
21543638b69dSLois Curfman McInnes    SNESGetFunction - Returns the vector where the function is stored.
21559b94acceSBarry Smith 
2156c7afd0dbSLois Curfman McInnes    Not Collective, but Vec is parallel if SNES is parallel
2157c7afd0dbSLois Curfman McInnes 
21589b94acceSBarry Smith    Input Parameter:
21599b94acceSBarry Smith .  snes - the SNES context
21609b94acceSBarry Smith 
21619b94acceSBarry Smith    Output Parameter:
21627bf4e008SBarry Smith +  r - the function (or PETSC_NULL)
216300036973SBarry Smith .  ctx - the function context (or PETSC_NULL)
216400036973SBarry Smith -  func - the function (or PETSC_NULL)
21659b94acceSBarry Smith 
21669b94acceSBarry Smith    Notes:
21679b94acceSBarry Smith    SNESGetFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only
21689b94acceSBarry Smith    Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are
21699b94acceSBarry Smith    SNESGetMinimizationFunction() and SNESGetGradient();
21709b94acceSBarry Smith 
217136851e7fSLois Curfman McInnes    Level: advanced
217236851e7fSLois Curfman McInnes 
2173a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, get, function
21749b94acceSBarry Smith 
217531615d04SLois Curfman McInnes .seealso: SNESSetFunction(), SNESGetSolution(), SNESGetMinimizationFunction(),
217631615d04SLois Curfman McInnes           SNESGetGradient()
21777bf4e008SBarry Smith 
21789b94acceSBarry Smith @*/
217900036973SBarry Smith int SNESGetFunction(SNES snes,Vec *r,void **ctx,int (**func)(SNES,Vec,Vec,void*))
21809b94acceSBarry Smith {
21813a40ed3dSBarry Smith   PetscFunctionBegin;
218277c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2183a8c6a408SBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
218429bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only");
2185a8c6a408SBarry Smith   }
21867bf4e008SBarry Smith   if (r)    *r    = snes->vec_func_always;
21877bf4e008SBarry Smith   if (ctx)  *ctx  = snes->funP;
218800036973SBarry Smith   if (func) *func = snes->computefunction;
21893a40ed3dSBarry Smith   PetscFunctionReturn(0);
21909b94acceSBarry Smith }
21919b94acceSBarry Smith 
21924a2ae208SSatish Balay #undef __FUNCT__
21934a2ae208SSatish Balay #define __FUNCT__ "SNESGetGradient"
21949b94acceSBarry Smith /*@C
21953638b69dSLois Curfman McInnes    SNESGetGradient - Returns the vector where the gradient is stored.
21969b94acceSBarry Smith 
2197c7afd0dbSLois Curfman McInnes    Not Collective, but Vec is parallel if SNES is parallel
2198c7afd0dbSLois Curfman McInnes 
21999b94acceSBarry Smith    Input Parameter:
22009b94acceSBarry Smith .  snes - the SNES context
22019b94acceSBarry Smith 
22029b94acceSBarry Smith    Output Parameter:
22037bf4e008SBarry Smith +  r - the gradient (or PETSC_NULL)
22047bf4e008SBarry Smith -  ctx - the gradient context (or PETSC_NULL)
22059b94acceSBarry Smith 
22069b94acceSBarry Smith    Notes:
22079b94acceSBarry Smith    SNESGetGradient() is valid for SNES_UNCONSTRAINED_MINIMIZATION methods
22089b94acceSBarry Smith    only.  An analogous routine for SNES_NONLINEAR_EQUATIONS methods is
22099b94acceSBarry Smith    SNESGetFunction().
22109b94acceSBarry Smith 
221136851e7fSLois Curfman McInnes    Level: advanced
221236851e7fSLois Curfman McInnes 
22139b94acceSBarry Smith .keywords: SNES, nonlinear, get, gradient
22149b94acceSBarry Smith 
22157bf4e008SBarry Smith .seealso: SNESGetMinimizationFunction(), SNESGetSolution(), SNESGetFunction(),
22167bf4e008SBarry Smith           SNESSetGradient(), SNESSetFunction()
22177bf4e008SBarry Smith 
22189b94acceSBarry Smith @*/
22197bf4e008SBarry Smith int SNESGetGradient(SNES snes,Vec *r,void **ctx)
22209b94acceSBarry Smith {
22213a40ed3dSBarry Smith   PetscFunctionBegin;
222277c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
22233a40ed3dSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
222429bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only");
22253a40ed3dSBarry Smith   }
22267bf4e008SBarry Smith   if (r)   *r = snes->vec_func_always;
22277bf4e008SBarry Smith   if (ctx) *ctx = snes->funP;
22283a40ed3dSBarry Smith   PetscFunctionReturn(0);
22299b94acceSBarry Smith }
22309b94acceSBarry Smith 
22314a2ae208SSatish Balay #undef __FUNCT__
22324a2ae208SSatish Balay #define __FUNCT__ "SNESGetMinimizationFunction"
22337bf4e008SBarry Smith /*@C
22349b94acceSBarry Smith    SNESGetMinimizationFunction - Returns the scalar function value for
22359b94acceSBarry Smith    unconstrained minimization problems.
22369b94acceSBarry Smith 
2237c7afd0dbSLois Curfman McInnes    Not Collective
2238c7afd0dbSLois Curfman McInnes 
22399b94acceSBarry Smith    Input Parameter:
22409b94acceSBarry Smith .  snes - the SNES context
22419b94acceSBarry Smith 
22429b94acceSBarry Smith    Output Parameter:
22437bf4e008SBarry Smith +  r - the function (or PETSC_NULL)
22447bf4e008SBarry Smith -  ctx - the function context (or PETSC_NULL)
22459b94acceSBarry Smith 
22469b94acceSBarry Smith    Notes:
22479b94acceSBarry Smith    SNESGetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION
22489b94acceSBarry Smith    methods only.  An analogous routine for SNES_NONLINEAR_EQUATIONS methods is
22499b94acceSBarry Smith    SNESGetFunction().
22509b94acceSBarry Smith 
225136851e7fSLois Curfman McInnes    Level: advanced
225236851e7fSLois Curfman McInnes 
22539b94acceSBarry Smith .keywords: SNES, nonlinear, get, function
22549b94acceSBarry Smith 
22557bf4e008SBarry Smith .seealso: SNESGetGradient(), SNESGetSolution(), SNESGetFunction(), SNESSetFunction()
22567bf4e008SBarry Smith 
22579b94acceSBarry Smith @*/
2258329f5518SBarry Smith int SNESGetMinimizationFunction(SNES snes,PetscReal *r,void **ctx)
22599b94acceSBarry Smith {
22603a40ed3dSBarry Smith   PetscFunctionBegin;
226177c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
226274679c65SBarry Smith   PetscValidScalarPointer(r);
22633a40ed3dSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
226429bbc08cSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only");
22653a40ed3dSBarry Smith   }
22667bf4e008SBarry Smith   if (r)   *r = snes->fc;
22677bf4e008SBarry Smith   if (ctx) *ctx = snes->umfunP;
22683a40ed3dSBarry Smith   PetscFunctionReturn(0);
22699b94acceSBarry Smith }
22709b94acceSBarry Smith 
22714a2ae208SSatish Balay #undef __FUNCT__
22724a2ae208SSatish Balay #define __FUNCT__ "SNESSetOptionsPrefix"
22733c7409f5SSatish Balay /*@C
22743c7409f5SSatish Balay    SNESSetOptionsPrefix - Sets the prefix used for searching for all
2275d850072dSLois Curfman McInnes    SNES options in the database.
22763c7409f5SSatish Balay 
2277fee21e36SBarry Smith    Collective on SNES
2278fee21e36SBarry Smith 
2279c7afd0dbSLois Curfman McInnes    Input Parameter:
2280c7afd0dbSLois Curfman McInnes +  snes - the SNES context
2281c7afd0dbSLois Curfman McInnes -  prefix - the prefix to prepend to all option names
2282c7afd0dbSLois Curfman McInnes 
2283d850072dSLois Curfman McInnes    Notes:
2284a83b1b31SSatish Balay    A hyphen (-) must NOT be given at the beginning of the prefix name.
2285c7afd0dbSLois Curfman McInnes    The first character of all runtime options is AUTOMATICALLY the hyphen.
2286d850072dSLois Curfman McInnes 
228736851e7fSLois Curfman McInnes    Level: advanced
228836851e7fSLois Curfman McInnes 
22893c7409f5SSatish Balay .keywords: SNES, set, options, prefix, database
2290a86d99e1SLois Curfman McInnes 
2291a86d99e1SLois Curfman McInnes .seealso: SNESSetFromOptions()
22923c7409f5SSatish Balay @*/
22933c7409f5SSatish Balay int SNESSetOptionsPrefix(SNES snes,char *prefix)
22943c7409f5SSatish Balay {
22953c7409f5SSatish Balay   int ierr;
22963c7409f5SSatish Balay 
22973a40ed3dSBarry Smith   PetscFunctionBegin;
229877c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2299639f9d9dSBarry Smith   ierr = PetscObjectSetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr);
23003c7409f5SSatish Balay   ierr = SLESSetOptionsPrefix(snes->sles,prefix);CHKERRQ(ierr);
23013a40ed3dSBarry Smith   PetscFunctionReturn(0);
23023c7409f5SSatish Balay }
23033c7409f5SSatish Balay 
23044a2ae208SSatish Balay #undef __FUNCT__
23054a2ae208SSatish Balay #define __FUNCT__ "SNESAppendOptionsPrefix"
23063c7409f5SSatish Balay /*@C
2307f525115eSLois Curfman McInnes    SNESAppendOptionsPrefix - Appends to the prefix used for searching for all
2308d850072dSLois Curfman McInnes    SNES options in the database.
23093c7409f5SSatish Balay 
2310fee21e36SBarry Smith    Collective on SNES
2311fee21e36SBarry Smith 
2312c7afd0dbSLois Curfman McInnes    Input Parameters:
2313c7afd0dbSLois Curfman McInnes +  snes - the SNES context
2314c7afd0dbSLois Curfman McInnes -  prefix - the prefix to prepend to all option names
2315c7afd0dbSLois Curfman McInnes 
2316d850072dSLois Curfman McInnes    Notes:
2317a83b1b31SSatish Balay    A hyphen (-) must NOT be given at the beginning of the prefix name.
2318c7afd0dbSLois Curfman McInnes    The first character of all runtime options is AUTOMATICALLY the hyphen.
2319d850072dSLois Curfman McInnes 
232036851e7fSLois Curfman McInnes    Level: advanced
232136851e7fSLois Curfman McInnes 
23223c7409f5SSatish Balay .keywords: SNES, append, options, prefix, database
2323a86d99e1SLois Curfman McInnes 
2324a86d99e1SLois Curfman McInnes .seealso: SNESGetOptionsPrefix()
23253c7409f5SSatish Balay @*/
23263c7409f5SSatish Balay int SNESAppendOptionsPrefix(SNES snes,char *prefix)
23273c7409f5SSatish Balay {
23283c7409f5SSatish Balay   int ierr;
23293c7409f5SSatish Balay 
23303a40ed3dSBarry Smith   PetscFunctionBegin;
233177c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2332639f9d9dSBarry Smith   ierr = PetscObjectAppendOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr);
23333c7409f5SSatish Balay   ierr = SLESAppendOptionsPrefix(snes->sles,prefix);CHKERRQ(ierr);
23343a40ed3dSBarry Smith   PetscFunctionReturn(0);
23353c7409f5SSatish Balay }
23363c7409f5SSatish Balay 
23374a2ae208SSatish Balay #undef __FUNCT__
23384a2ae208SSatish Balay #define __FUNCT__ "SNESGetOptionsPrefix"
23399ab63eb5SSatish Balay /*@C
23403c7409f5SSatish Balay    SNESGetOptionsPrefix - Sets the prefix used for searching for all
23413c7409f5SSatish Balay    SNES options in the database.
23423c7409f5SSatish Balay 
2343c7afd0dbSLois Curfman McInnes    Not Collective
2344c7afd0dbSLois Curfman McInnes 
23453c7409f5SSatish Balay    Input Parameter:
23463c7409f5SSatish Balay .  snes - the SNES context
23473c7409f5SSatish Balay 
23483c7409f5SSatish Balay    Output Parameter:
23493c7409f5SSatish Balay .  prefix - pointer to the prefix string used
23503c7409f5SSatish Balay 
23519ab63eb5SSatish Balay    Notes: On the fortran side, the user should pass in a string 'prifix' of
23529ab63eb5SSatish Balay    sufficient length to hold the prefix.
23539ab63eb5SSatish Balay 
235436851e7fSLois Curfman McInnes    Level: advanced
235536851e7fSLois Curfman McInnes 
23563c7409f5SSatish Balay .keywords: SNES, get, options, prefix, database
2357a86d99e1SLois Curfman McInnes 
2358a86d99e1SLois Curfman McInnes .seealso: SNESAppendOptionsPrefix()
23593c7409f5SSatish Balay @*/
23603c7409f5SSatish Balay int SNESGetOptionsPrefix(SNES snes,char **prefix)
23613c7409f5SSatish Balay {
23623c7409f5SSatish Balay   int ierr;
23633c7409f5SSatish Balay 
23643a40ed3dSBarry Smith   PetscFunctionBegin;
236577c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2366639f9d9dSBarry Smith   ierr = PetscObjectGetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr);
23673a40ed3dSBarry Smith   PetscFunctionReturn(0);
23683c7409f5SSatish Balay }
23693c7409f5SSatish Balay 
2370acb85ae6SSatish Balay /*MC
2371f1af5d2fSBarry Smith    SNESRegisterDynamic - Adds a method to the nonlinear solver package.
23729b94acceSBarry Smith 
2373b2002411SLois Curfman McInnes    Synopsis:
2374*3a7fca6bSBarry Smith    int SNESRegisterDynamic(char *name_solver,char *path,char *name_create,int (*routine_create)(SNES))
23759b94acceSBarry Smith 
23768d76a1e5SLois Curfman McInnes    Not collective
23778d76a1e5SLois Curfman McInnes 
2378b2002411SLois Curfman McInnes    Input Parameters:
2379c7afd0dbSLois Curfman McInnes +  name_solver - name of a new user-defined solver
2380b2002411SLois Curfman McInnes .  path - path (either absolute or relative) the library containing this solver
2381b2002411SLois Curfman McInnes .  name_create - name of routine to create method context
2382c7afd0dbSLois Curfman McInnes -  routine_create - routine to create method context
23839b94acceSBarry Smith 
2384b2002411SLois Curfman McInnes    Notes:
2385f1af5d2fSBarry Smith    SNESRegisterDynamic() may be called multiple times to add several user-defined solvers.
23863a40ed3dSBarry Smith 
2387b2002411SLois Curfman McInnes    If dynamic libraries are used, then the fourth input argument (routine_create)
2388b2002411SLois Curfman McInnes    is ignored.
2389b2002411SLois Curfman McInnes 
2390b9617806SBarry Smith    Environmental variables such as ${PETSC_ARCH}, ${PETSC_DIR}, ${PETSC_LIB_DIR}, ${BOPT},
23915ba88a07SLois Curfman McInnes    and others of the form ${any_environmental_variable} occuring in pathname will be
23925ba88a07SLois Curfman McInnes    replaced with appropriate values.
23935ba88a07SLois Curfman McInnes 
2394b2002411SLois Curfman McInnes    Sample usage:
239569225d78SLois Curfman McInnes .vb
2396f1af5d2fSBarry Smith    SNESRegisterDynamic("my_solver",/home/username/my_lib/lib/libg/solaris/mylib.a,
2397b2002411SLois Curfman McInnes                 "MySolverCreate",MySolverCreate);
239869225d78SLois Curfman McInnes .ve
2399b2002411SLois Curfman McInnes 
2400b2002411SLois Curfman McInnes    Then, your solver can be chosen with the procedural interface via
2401b2002411SLois Curfman McInnes $     SNESSetType(snes,"my_solver")
2402b2002411SLois Curfman McInnes    or at runtime via the option
2403b2002411SLois Curfman McInnes $     -snes_type my_solver
2404b2002411SLois Curfman McInnes 
240536851e7fSLois Curfman McInnes    Level: advanced
240636851e7fSLois Curfman McInnes 
2407b2002411SLois Curfman McInnes .keywords: SNES, nonlinear, register
2408b2002411SLois Curfman McInnes 
2409b2002411SLois Curfman McInnes .seealso: SNESRegisterAll(), SNESRegisterDestroy()
2410b2002411SLois Curfman McInnes M*/
2411b2002411SLois Curfman McInnes 
24124a2ae208SSatish Balay #undef __FUNCT__
24134a2ae208SSatish Balay #define __FUNCT__ "SNESRegister"
2414f1af5d2fSBarry Smith int SNESRegister(char *sname,char *path,char *name,int (*function)(SNES))
2415b2002411SLois Curfman McInnes {
2416b2002411SLois Curfman McInnes   char fullname[256];
2417b2002411SLois Curfman McInnes   int  ierr;
2418b2002411SLois Curfman McInnes 
2419b2002411SLois Curfman McInnes   PetscFunctionBegin;
2420b0a32e0cSBarry Smith   ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr);
2421b9617806SBarry Smith   ierr = PetscFListAdd(&SNESList,sname,fullname,(void (*)())function);CHKERRQ(ierr);
2422b2002411SLois Curfman McInnes   PetscFunctionReturn(0);
2423b2002411SLois Curfman McInnes }
2424