xref: /petsc/src/snes/interface/snes.c (revision 1184f6bfc0267870dcbedb6aa2d30e108ed61be2)
1a5eb4965SSatish Balay #ifdef PETSC_RCS_HEADER
2*1184f6bfSBarry Smith static char vcid[] = "$Id: snes.c,v 1.174 1999/03/14 22:14:56 curfman Exp bsmith $";
39b94acceSBarry Smith #endif
49b94acceSBarry Smith 
570f55243SBarry Smith #include "src/snes/snesimpl.h"      /*I "snes.h"  I*/
6f5eb4b81SSatish Balay #include "src/sys/nreg.h"
79b94acceSBarry Smith 
884cb2905SBarry Smith int SNESRegisterAllCalled = 0;
9488ecbafSBarry Smith FList SNESList = 0;
1082bf6240SBarry Smith 
115615d1e5SSatish Balay #undef __FUNC__
12d4bb536fSBarry Smith #define __FUNC__ "SNESView"
139b94acceSBarry Smith /*@
149b94acceSBarry Smith    SNESView - Prints the SNES data structure.
159b94acceSBarry Smith 
16fee21e36SBarry Smith    Collective on SNES, unless Viewer is VIEWER_STDOUT_SELF
17fee21e36SBarry Smith 
18c7afd0dbSLois Curfman McInnes    Input Parameters:
19c7afd0dbSLois Curfman McInnes +  SNES - the SNES context
20c7afd0dbSLois Curfman McInnes -  viewer - visualization context
21c7afd0dbSLois Curfman McInnes 
229b94acceSBarry Smith    Options Database Key:
23c8a8ba5cSLois Curfman McInnes .  -snes_view - Calls SNESView() at end of SNESSolve()
249b94acceSBarry Smith 
259b94acceSBarry Smith    Notes:
269b94acceSBarry Smith    The available visualization contexts include
27c7afd0dbSLois Curfman McInnes +     VIEWER_STDOUT_SELF - standard output (default)
28c7afd0dbSLois Curfman McInnes -     VIEWER_STDOUT_WORLD - synchronized standard
29c8a8ba5cSLois Curfman McInnes          output where only the first processor opens
30c8a8ba5cSLois Curfman McInnes          the file.  All other processors send their
31c8a8ba5cSLois Curfman McInnes          data to the first processor to print.
329b94acceSBarry Smith 
333e081fefSLois Curfman McInnes    The user can open an alternative visualization context with
3477ed5343SBarry Smith    ViewerASCIIOpen() - output to a specified file.
359b94acceSBarry Smith 
3636851e7fSLois Curfman McInnes    Level: beginner
3736851e7fSLois Curfman McInnes 
389b94acceSBarry Smith .keywords: SNES, view
399b94acceSBarry Smith 
4077ed5343SBarry Smith .seealso: ViewerASCIIOpen()
419b94acceSBarry Smith @*/
429b94acceSBarry Smith int SNESView(SNES snes,Viewer viewer)
439b94acceSBarry Smith {
449b94acceSBarry Smith   SNES_KSP_EW_ConvCtx *kctx;
459b94acceSBarry Smith   int                 ierr;
469b94acceSBarry Smith   SLES                sles;
479b94acceSBarry Smith   char                *method;
4819bcc07fSBarry Smith   ViewerType          vtype;
499b94acceSBarry Smith 
503a40ed3dSBarry Smith   PetscFunctionBegin;
5174679c65SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
5274679c65SBarry Smith   if (viewer) {PetscValidHeader(viewer);}
5374679c65SBarry Smith   else { viewer = VIEWER_STDOUT_SELF; }
5474679c65SBarry Smith 
5519bcc07fSBarry Smith   ierr = ViewerGetType(viewer,&vtype); CHKERRQ(ierr);
563f1db9ecSBarry Smith   if (PetscTypeCompare(vtype,ASCII_VIEWER)) {
570ef38995SBarry Smith     ViewerASCIIPrintf(viewer,"SNES Object:\n");
5882bf6240SBarry Smith     SNESGetType(snes,&method);
590ef38995SBarry Smith     ViewerASCIIPrintf(viewer,"  method: %s\n",method);
600ef38995SBarry Smith     if (snes->view) {
610ef38995SBarry Smith       ierr = ViewerASCIIPushTab(viewer);CHKERRQ(ierr);
620ef38995SBarry Smith       ierr = (*snes->view)(snes,viewer);CHKERRQ(ierr);
630ef38995SBarry Smith       ierr = ViewerASCIIPopTab(viewer);CHKERRQ(ierr);
640ef38995SBarry Smith     }
650ef38995SBarry Smith     ViewerASCIIPrintf(viewer,"  maximum iterations=%d, maximum function evaluations=%d\n",snes->max_its,snes->max_funcs);
660ef38995SBarry Smith     ViewerASCIIPrintf(viewer,"  tolerances: relative=%g, absolute=%g, truncation=%g, solution=%g\n",
679b94acceSBarry Smith                  snes->rtol, snes->atol, snes->trunctol, snes->xtol);
680ef38995SBarry Smith     ViewerASCIIPrintf(viewer,"  total number of linear solver iterations=%d\n",snes->linear_its);
690ef38995SBarry Smith     ViewerASCIIPrintf(viewer,"  total number of function evaluations=%d\n",snes->nfuncs);
700ef38995SBarry Smith     if (snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) {
710ef38995SBarry Smith       ViewerASCIIPrintf(viewer,"  min function tolerance=%g\n",snes->fmin);
720ef38995SBarry Smith     }
739b94acceSBarry Smith     if (snes->ksp_ewconv) {
749b94acceSBarry Smith       kctx = (SNES_KSP_EW_ConvCtx *)snes->kspconvctx;
759b94acceSBarry Smith       if (kctx) {
760ef38995SBarry Smith         ViewerASCIIPrintf(viewer,"  Eisenstat-Walker computation of KSP relative tolerance (version %d)\n",kctx->version);
770ef38995SBarry Smith         ViewerASCIIPrintf(viewer,"    rtol_0=%g, rtol_max=%g, threshold=%g\n",kctx->rtol_0,kctx->rtol_max,kctx->threshold);
780ef38995SBarry Smith         ViewerASCIIPrintf(viewer,"    gamma=%g, alpha=%g, alpha2=%g\n",kctx->gamma,kctx->alpha,kctx->alpha2);
799b94acceSBarry Smith       }
809b94acceSBarry Smith     }
813f1db9ecSBarry Smith   } else if (PetscTypeCompare(vtype,STRING_VIEWER)) {
820ef38995SBarry Smith     ierr = SNESGetType(snes,&method);CHKERRQ(ierr);
830ef38995SBarry Smith     ierr = ViewerStringSPrintf(viewer," %-3.3s",method);CHKERRQ(ierr);
8419bcc07fSBarry Smith   }
8577ed5343SBarry Smith   ierr = SNESGetSLES(snes,&sles);CHKERRQ(ierr);
860ef38995SBarry Smith   ierr = ViewerASCIIPushTab(viewer);CHKERRQ(ierr);
879b94acceSBarry Smith   ierr = SLESView(sles,viewer); CHKERRQ(ierr);
880ef38995SBarry Smith   ierr = ViewerASCIIPopTab(viewer);CHKERRQ(ierr);
893a40ed3dSBarry Smith   PetscFunctionReturn(0);
909b94acceSBarry Smith }
919b94acceSBarry Smith 
92639f9d9dSBarry Smith /*
93639f9d9dSBarry Smith        We retain a list of functions that also take SNES command
94639f9d9dSBarry Smith     line options. These are called at the end SNESSetFromOptions()
95639f9d9dSBarry Smith */
96639f9d9dSBarry Smith #define MAXSETFROMOPTIONS 5
97639f9d9dSBarry Smith static int numberofsetfromoptions;
98639f9d9dSBarry Smith static int (*othersetfromoptions[MAXSETFROMOPTIONS])(SNES);
99639f9d9dSBarry Smith 
1005615d1e5SSatish Balay #undef __FUNC__
101d4bb536fSBarry Smith #define __FUNC__ "SNESAddOptionsChecker"
102639f9d9dSBarry Smith /*@
103639f9d9dSBarry Smith     SNESAddOptionsChecker - Adds an additional function to check for SNES options.
104639f9d9dSBarry Smith 
105c7afd0dbSLois Curfman McInnes     Not Collective
106c7afd0dbSLois Curfman McInnes 
107639f9d9dSBarry Smith     Input Parameter:
108639f9d9dSBarry Smith .   snescheck - function that checks for options
109639f9d9dSBarry Smith 
11036851e7fSLois Curfman McInnes     Level: developer
11136851e7fSLois Curfman McInnes 
112639f9d9dSBarry Smith .seealso: SNESSetFromOptions()
113639f9d9dSBarry Smith @*/
114639f9d9dSBarry Smith int SNESAddOptionsChecker(int (*snescheck)(SNES) )
115639f9d9dSBarry Smith {
1163a40ed3dSBarry Smith   PetscFunctionBegin;
117639f9d9dSBarry Smith   if (numberofsetfromoptions >= MAXSETFROMOPTIONS) {
118a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,0,"Too many options checkers, only 5 allowed");
119639f9d9dSBarry Smith   }
120639f9d9dSBarry Smith 
121639f9d9dSBarry Smith   othersetfromoptions[numberofsetfromoptions++] = snescheck;
1223a40ed3dSBarry Smith   PetscFunctionReturn(0);
123639f9d9dSBarry Smith }
124639f9d9dSBarry Smith 
1255615d1e5SSatish Balay #undef __FUNC__
1265615d1e5SSatish Balay #define __FUNC__ "SNESSetFromOptions"
1279b94acceSBarry Smith /*@
128682d7d0cSBarry Smith    SNESSetFromOptions - Sets various SNES and SLES parameters from user options.
1299b94acceSBarry Smith 
130c7afd0dbSLois Curfman McInnes    Collective on SNES
131c7afd0dbSLois Curfman McInnes 
1329b94acceSBarry Smith    Input Parameter:
1339b94acceSBarry Smith .  snes - the SNES context
1349b94acceSBarry Smith 
13536851e7fSLois Curfman McInnes    Options Database Keys:
136b39c3a46SLois Curfman McInnes +  -snes_type <type> - SNES_EQ_LS, SNES_EQ_TR, SNES_UM_TR, SNES_UM_LS etc
13782738288SBarry Smith .  -snes_stol - convergence tolerance in terms of the norm
13882738288SBarry Smith                 of the change in the solution between steps
139b39c3a46SLois Curfman McInnes .  -snes_atol <atol> - absolute tolerance of residual norm
140b39c3a46SLois Curfman McInnes .  -snes_rtol <rtol> - relative decrease in tolerance norm from initial
141b39c3a46SLois Curfman McInnes .  -snes_max_it <max_it> - maximum number of iterations
142b39c3a46SLois Curfman McInnes .  -snes_max_funcs <max_funcs> - maximum number of function evaluations
143b39c3a46SLois Curfman McInnes .  -snes_trtol <trtol> - trust region tolerance
14482738288SBarry Smith .  -snes_no_convergence_test - skip convergence test in nonlinear or minimization
14582738288SBarry Smith                                solver; hence iterations will continue until max_it
14682738288SBarry Smith                                or some other criteria is reached. Saves expense
14782738288SBarry Smith                                of convergence test
14882738288SBarry Smith .  -snes_monitor - prints residual norm at each iteration
14982738288SBarry Smith .  -snes_xmonitor - plots residual norm at each iteration
150e24b481bSBarry Smith .  -snes_fd - use finite differences to compute Jacobian; very slow, only for testing
15136851e7fSLois Curfman McInnes -  -snes_mf_ksp_monitor - if using matrix-free multiply then print h at each KSP iteration
15282738288SBarry Smith 
15382738288SBarry Smith     Options Database for Eisenstat-Walker method:
15482738288SBarry Smith +  -snes_ksp_eq_conv - use Eisenstat-Walker method for determining linear system convergence
15582738288SBarry Smith .  -snes_ksp_eq_version ver - version of  Eisenstat-Walker method
15636851e7fSLois Curfman McInnes .  -snes_ksp_ew_rtol0 <rtol0> - Sets rtol0
15736851e7fSLois Curfman McInnes .  -snes_ksp_ew_rtolmax <rtolmax> - Sets rtolmax
15836851e7fSLois Curfman McInnes .  -snes_ksp_ew_gamma <gamma> - Sets gamma
15936851e7fSLois Curfman McInnes .  -snes_ksp_ew_alpha <alpha> - Sets alpha
16036851e7fSLois Curfman McInnes .  -snes_ksp_ew_alpha2 <alpha2> - Sets alpha2
16136851e7fSLois Curfman McInnes -  -snes_ksp_ew_threshold <threshold> - Sets threshold
16282738288SBarry Smith 
16311ca99fdSLois Curfman McInnes    Notes:
16411ca99fdSLois Curfman McInnes    To see all options, run your program with the -help option or consult
16511ca99fdSLois Curfman McInnes    the users manual.
16683e2fdc7SBarry Smith 
16736851e7fSLois Curfman McInnes    Level: beginner
16836851e7fSLois Curfman McInnes 
1699b94acceSBarry Smith .keywords: SNES, nonlinear, set, options, database
1709b94acceSBarry Smith 
171a86d99e1SLois Curfman McInnes .seealso: SNESPrintHelp(), SNESSetOptionsPrefix()
1729b94acceSBarry Smith @*/
1739b94acceSBarry Smith int SNESSetFromOptions(SNES snes)
1749b94acceSBarry Smith {
17582bf6240SBarry Smith   char     method[256];
1769b94acceSBarry Smith   double   tmp;
1779b94acceSBarry Smith   SLES     sles;
17881f57ec7SBarry Smith   int      ierr, flg,i,loc[4],nmax = 4;
1793c7409f5SSatish Balay   int      version   = PETSC_DEFAULT;
1809b94acceSBarry Smith   double   rtol_0    = PETSC_DEFAULT;
1819b94acceSBarry Smith   double   rtol_max  = PETSC_DEFAULT;
1829b94acceSBarry Smith   double   gamma2    = PETSC_DEFAULT;
1839b94acceSBarry Smith   double   alpha     = PETSC_DEFAULT;
1849b94acceSBarry Smith   double   alpha2    = PETSC_DEFAULT;
1859b94acceSBarry Smith   double   threshold = PETSC_DEFAULT;
1869b94acceSBarry Smith 
1873a40ed3dSBarry Smith   PetscFunctionBegin;
18881f57ec7SBarry Smith   loc[0] = PETSC_DECIDE; loc[1] = PETSC_DECIDE; loc[2] = 300; loc[3] = 300;
18981f57ec7SBarry Smith 
19077c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
191596552b5SBarry Smith   if (snes->setupcalled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call prior to SNESSetUp()");
192ca161407SBarry Smith 
19382bf6240SBarry Smith   if (!SNESRegisterAllCalled) {ierr = SNESRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
19482bf6240SBarry Smith   ierr = OptionsGetString(snes->prefix,"-snes_type",method,256,&flg);
195052efed2SBarry Smith   if (flg) {
19682bf6240SBarry Smith     ierr = SNESSetType(snes,(SNESType) method); CHKERRQ(ierr);
1975334005bSBarry Smith   }
198*1184f6bfSBarry Smith   /*
199*1184f6bfSBarry Smith       If SNES type has not yet been set, set it now
200*1184f6bfSBarry Smith   */
201*1184f6bfSBarry Smith   if (!snes->type_name) {
202*1184f6bfSBarry Smith     if (snes->method_class == SNES_NONLINEAR_EQUATIONS) {
203*1184f6bfSBarry Smith       ierr = SNESSetType(snes,SNES_EQ_LS); CHKERRQ(ierr);
204*1184f6bfSBarry Smith     } else {
205*1184f6bfSBarry Smith       ierr = SNESSetType(snes,SNES_UM_TR); CHKERRQ(ierr);
206*1184f6bfSBarry Smith     }
207*1184f6bfSBarry Smith   }
208*1184f6bfSBarry Smith 
2093c7409f5SSatish Balay   ierr = OptionsGetDouble(snes->prefix,"-snes_stol",&tmp, &flg); CHKERRQ(ierr);
210d64ed03dSBarry Smith   if (flg) {
211d64ed03dSBarry Smith     ierr = SNESSetTolerances(snes,PETSC_DEFAULT,PETSC_DEFAULT,tmp,PETSC_DEFAULT,PETSC_DEFAULT);CHKERRQ(ierr);
212d64ed03dSBarry Smith   }
2133c7409f5SSatish Balay   ierr = OptionsGetDouble(snes->prefix,"-snes_atol",&tmp, &flg); CHKERRQ(ierr);
214d64ed03dSBarry Smith   if (flg) {
215d64ed03dSBarry Smith     ierr = SNESSetTolerances(snes,tmp,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_DEFAULT);CHKERRQ(ierr);
216d64ed03dSBarry Smith   }
2173c7409f5SSatish Balay   ierr = OptionsGetDouble(snes->prefix,"-snes_rtol",&tmp, &flg);  CHKERRQ(ierr);
218d64ed03dSBarry Smith   if (flg) {
219d64ed03dSBarry Smith     ierr = SNESSetTolerances(snes,PETSC_DEFAULT,tmp,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_DEFAULT);CHKERRQ(ierr);
220d64ed03dSBarry Smith   }
2213c7409f5SSatish Balay   ierr = OptionsGetInt(snes->prefix,"-snes_max_it",&snes->max_its, &flg); CHKERRQ(ierr);
2223c7409f5SSatish Balay   ierr = OptionsGetInt(snes->prefix,"-snes_max_funcs",&snes->max_funcs, &flg);CHKERRQ(ierr);
223d7a720efSLois Curfman McInnes   ierr = OptionsGetDouble(snes->prefix,"-snes_trtol",&tmp, &flg); CHKERRQ(ierr);
224d64ed03dSBarry Smith   if (flg) { ierr = SNESSetTrustRegionTolerance(snes,tmp); CHKERRQ(ierr); }
225d7a720efSLois Curfman McInnes   ierr = OptionsGetDouble(snes->prefix,"-snes_fmin",&tmp, &flg); CHKERRQ(ierr);
226d64ed03dSBarry Smith   if (flg) { ierr = SNESSetMinimizationFunctionTolerance(snes,tmp);  CHKERRQ(ierr);}
2273c7409f5SSatish Balay   ierr = OptionsHasName(snes->prefix,"-snes_ksp_ew_conv", &flg); CHKERRQ(ierr);
2283c7409f5SSatish Balay   if (flg) { snes->ksp_ewconv = 1; }
229b18e04deSLois Curfman McInnes   ierr = OptionsGetInt(snes->prefix,"-snes_ksp_ew_version",&version,&flg); CHKERRQ(ierr);
230b18e04deSLois Curfman McInnes   ierr = OptionsGetDouble(snes->prefix,"-snes_ksp_ew_rtol0",&rtol_0,&flg); CHKERRQ(ierr);
231b18e04deSLois Curfman McInnes   ierr = OptionsGetDouble(snes->prefix,"-snes_ksp_ew_rtolmax",&rtol_max,&flg);CHKERRQ(ierr);
232b18e04deSLois Curfman McInnes   ierr = OptionsGetDouble(snes->prefix,"-snes_ksp_ew_gamma",&gamma2,&flg); CHKERRQ(ierr);
233b18e04deSLois Curfman McInnes   ierr = OptionsGetDouble(snes->prefix,"-snes_ksp_ew_alpha",&alpha,&flg); CHKERRQ(ierr);
234b18e04deSLois Curfman McInnes   ierr = OptionsGetDouble(snes->prefix,"-snes_ksp_ew_alpha2",&alpha2,&flg); CHKERRQ(ierr);
235b18e04deSLois Curfman McInnes   ierr = OptionsGetDouble(snes->prefix,"-snes_ksp_ew_threshold",&threshold,&flg);CHKERRQ(ierr);
23693c39befSBarry Smith 
23793c39befSBarry Smith   ierr = OptionsHasName(snes->prefix,"-snes_no_convergence_test",&flg); CHKERRQ(ierr);
23893c39befSBarry Smith   if (flg) {snes->converged = 0;}
23993c39befSBarry Smith 
2409b94acceSBarry Smith   ierr = SNES_KSP_SetParametersEW(snes,version,rtol_0,rtol_max,gamma2,alpha,
2419b94acceSBarry Smith                                   alpha2,threshold); CHKERRQ(ierr);
2425bbad29bSBarry Smith   ierr = OptionsHasName(snes->prefix,"-snes_cancelmonitors",&flg); CHKERRQ(ierr);
2435cd90555SBarry Smith   if (flg) {ierr = SNESClearMonitor(snes);CHKERRQ(ierr);}
2443c7409f5SSatish Balay   ierr = OptionsHasName(snes->prefix,"-snes_monitor",&flg); CHKERRQ(ierr);
245639f9d9dSBarry Smith   if (flg) {ierr = SNESSetMonitor(snes,SNESDefaultMonitor,0);CHKERRQ(ierr);}
2463c7409f5SSatish Balay   ierr = OptionsHasName(snes->prefix,"-snes_smonitor",&flg); CHKERRQ(ierr);
2473f1db9ecSBarry Smith   if (flg) {ierr = SNESSetMonitor(snes,SNESDefaultSMonitor,0);  CHKERRQ(ierr);}
2483f1db9ecSBarry Smith   ierr = OptionsHasName(snes->prefix,"-snes_vecmonitor",&flg); CHKERRQ(ierr);
2493f1db9ecSBarry Smith   if (flg) {ierr = SNESSetMonitor(snes,SNESVecViewMonitor,0);  CHKERRQ(ierr);}
25081f57ec7SBarry Smith   ierr = OptionsGetIntArray(snes->prefix,"-snes_xmonitor",loc,&nmax,&flg);CHKERRQ(ierr);
2513c7409f5SSatish Balay   if (flg) {
25217699dbbSLois Curfman McInnes     int    rank = 0;
253d7e8b826SBarry Smith     DrawLG lg;
25417699dbbSLois Curfman McInnes     MPI_Initialized(&rank);
25517699dbbSLois Curfman McInnes     if (rank) MPI_Comm_rank(snes->comm,&rank);
25617699dbbSLois Curfman McInnes     if (!rank) {
25781f57ec7SBarry Smith       ierr = SNESLGMonitorCreate(0,0,loc[0],loc[1],loc[2],loc[3],&lg); CHKERRQ(ierr);
2589b94acceSBarry Smith       ierr = SNESSetMonitor(snes,SNESLGMonitor,(void *)lg); CHKERRQ(ierr);
259f8c826e1SBarry Smith       snes->xmonitor = lg;
2609b94acceSBarry Smith       PLogObjectParent(snes,lg);
2619b94acceSBarry Smith     }
2629b94acceSBarry Smith   }
263e24b481bSBarry Smith 
2643c7409f5SSatish Balay   ierr = OptionsHasName(snes->prefix,"-snes_fd", &flg);  CHKERRQ(ierr);
2653c7409f5SSatish Balay   if (flg && snes->method_class == SNES_NONLINEAR_EQUATIONS) {
2669b94acceSBarry Smith     ierr = SNESSetJacobian(snes,snes->jacobian,snes->jacobian_pre,
2679b94acceSBarry Smith                  SNESDefaultComputeJacobian,snes->funP); CHKERRQ(ierr);
268981c4779SBarry Smith     PLogInfo(snes,"SNESSetFromOptions: Setting default finite difference Jacobian matrix\n");
269981c4779SBarry Smith   } else if (flg && snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) {
27031615d04SLois Curfman McInnes     ierr = SNESSetHessian(snes,snes->jacobian,snes->jacobian_pre,
27131615d04SLois Curfman McInnes                  SNESDefaultComputeHessian,snes->funP); CHKERRQ(ierr);
272d64ed03dSBarry Smith     PLogInfo(snes,"SNESSetFromOptions: Setting default finite difference Hessian matrix\n");
2739b94acceSBarry Smith   }
274639f9d9dSBarry Smith 
275639f9d9dSBarry Smith   for ( i=0; i<numberofsetfromoptions; i++ ) {
276639f9d9dSBarry Smith     ierr = (*othersetfromoptions[i])(snes); CHKERRQ(ierr);
277639f9d9dSBarry Smith   }
278639f9d9dSBarry Smith 
2799b94acceSBarry Smith   ierr = SNESGetSLES(snes,&sles); CHKERRQ(ierr);
2809b94acceSBarry Smith   ierr = SLESSetFromOptions(sles); CHKERRQ(ierr);
28193993e2dSLois Curfman McInnes 
282e24b481bSBarry Smith   /* set the special KSP monitor for matrix-free application */
283e24b481bSBarry Smith   ierr = OptionsHasName(snes->prefix,"-snes_mf_ksp_monitor",&flg); CHKERRQ(ierr);
284e24b481bSBarry Smith   if (flg) {
285e24b481bSBarry Smith     KSP ksp;
286e24b481bSBarry Smith     ierr = SLESGetKSP(sles,&ksp);CHKERRQ(ierr);
287e24b481bSBarry Smith     ierr = KSPSetMonitor(ksp,MatSNESFDMFKSPMonitor,PETSC_NULL);CHKERRQ(ierr);
288e24b481bSBarry Smith   }
289e24b481bSBarry Smith 
29082bf6240SBarry Smith   ierr = OptionsHasName(PETSC_NULL,"-help", &flg); CHKERRQ(ierr);
29182bf6240SBarry Smith   if (flg) { ierr = SNESPrintHelp(snes); CHKERRQ(ierr);}
29282bf6240SBarry Smith 
2933a40ed3dSBarry Smith   if (snes->setfromoptions) {
2943a40ed3dSBarry Smith     ierr = (*snes->setfromoptions)(snes);CHKERRQ(ierr);
2953a40ed3dSBarry Smith   }
2963a40ed3dSBarry Smith   PetscFunctionReturn(0);
2979b94acceSBarry Smith }
2989b94acceSBarry Smith 
299a847f771SSatish Balay 
3005615d1e5SSatish Balay #undef __FUNC__
301d4bb536fSBarry Smith #define __FUNC__ "SNESSetApplicationContext"
3029b94acceSBarry Smith /*@
3039b94acceSBarry Smith    SNESSetApplicationContext - Sets the optional user-defined context for
3049b94acceSBarry Smith    the nonlinear solvers.
3059b94acceSBarry Smith 
306fee21e36SBarry Smith    Collective on SNES
307fee21e36SBarry Smith 
308c7afd0dbSLois Curfman McInnes    Input Parameters:
309c7afd0dbSLois Curfman McInnes +  snes - the SNES context
310c7afd0dbSLois Curfman McInnes -  usrP - optional user context
311c7afd0dbSLois Curfman McInnes 
31236851e7fSLois Curfman McInnes    Level: intermediate
31336851e7fSLois Curfman McInnes 
3149b94acceSBarry Smith .keywords: SNES, nonlinear, set, application, context
3159b94acceSBarry Smith 
3169b94acceSBarry Smith .seealso: SNESGetApplicationContext()
3179b94acceSBarry Smith @*/
3189b94acceSBarry Smith int SNESSetApplicationContext(SNES snes,void *usrP)
3199b94acceSBarry Smith {
3203a40ed3dSBarry Smith   PetscFunctionBegin;
32177c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
3229b94acceSBarry Smith   snes->user		= usrP;
3233a40ed3dSBarry Smith   PetscFunctionReturn(0);
3249b94acceSBarry Smith }
32574679c65SBarry Smith 
3265615d1e5SSatish Balay #undef __FUNC__
327d4bb536fSBarry Smith #define __FUNC__ "SNESGetApplicationContext"
3289b94acceSBarry Smith /*@C
3299b94acceSBarry Smith    SNESGetApplicationContext - Gets the user-defined context for the
3309b94acceSBarry Smith    nonlinear solvers.
3319b94acceSBarry Smith 
332c7afd0dbSLois Curfman McInnes    Not Collective
333c7afd0dbSLois Curfman McInnes 
3349b94acceSBarry Smith    Input Parameter:
3359b94acceSBarry Smith .  snes - SNES context
3369b94acceSBarry Smith 
3379b94acceSBarry Smith    Output Parameter:
3389b94acceSBarry Smith .  usrP - user context
3399b94acceSBarry Smith 
34036851e7fSLois Curfman McInnes    Level: intermediate
34136851e7fSLois Curfman McInnes 
3429b94acceSBarry Smith .keywords: SNES, nonlinear, get, application, context
3439b94acceSBarry Smith 
3449b94acceSBarry Smith .seealso: SNESSetApplicationContext()
3459b94acceSBarry Smith @*/
3469b94acceSBarry Smith int SNESGetApplicationContext( SNES snes,  void **usrP )
3479b94acceSBarry Smith {
3483a40ed3dSBarry Smith   PetscFunctionBegin;
34977c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
3509b94acceSBarry Smith   *usrP = snes->user;
3513a40ed3dSBarry Smith   PetscFunctionReturn(0);
3529b94acceSBarry Smith }
35374679c65SBarry Smith 
3545615d1e5SSatish Balay #undef __FUNC__
355d4bb536fSBarry Smith #define __FUNC__ "SNESGetIterationNumber"
3569b94acceSBarry Smith /*@
357c8228a4eSBarry Smith    SNESGetIterationNumber - Gets the number of nonlinear iterations completed
358c8228a4eSBarry Smith    at this time.
3599b94acceSBarry Smith 
360c7afd0dbSLois Curfman McInnes    Not Collective
361c7afd0dbSLois Curfman McInnes 
3629b94acceSBarry Smith    Input Parameter:
3639b94acceSBarry Smith .  snes - SNES context
3649b94acceSBarry Smith 
3659b94acceSBarry Smith    Output Parameter:
3669b94acceSBarry Smith .  iter - iteration number
3679b94acceSBarry Smith 
368c8228a4eSBarry Smith    Notes:
369c8228a4eSBarry Smith    For example, during the computation of iteration 2 this would return 1.
370c8228a4eSBarry Smith 
371c8228a4eSBarry Smith    This is useful for using lagged Jacobians (where one does not recompute the
37208405cd6SLois Curfman McInnes    Jacobian at each SNES iteration). For example, the code
37308405cd6SLois Curfman McInnes .vb
37408405cd6SLois Curfman McInnes       ierr = SNESGetIterationNumber(snes,&it);
37508405cd6SLois Curfman McInnes       if (!(it % 2)) {
37608405cd6SLois Curfman McInnes         [compute Jacobian here]
37708405cd6SLois Curfman McInnes       }
37808405cd6SLois Curfman McInnes .ve
379c8228a4eSBarry Smith    can be used in your ComputeJacobian() function to cause the Jacobian to be
38008405cd6SLois Curfman McInnes    recomputed every second SNES iteration.
381c8228a4eSBarry Smith 
38236851e7fSLois Curfman McInnes    Level: intermediate
38336851e7fSLois Curfman McInnes 
3849b94acceSBarry Smith .keywords: SNES, nonlinear, get, iteration, number
3859b94acceSBarry Smith @*/
3869b94acceSBarry Smith int SNESGetIterationNumber(SNES snes,int* iter)
3879b94acceSBarry Smith {
3883a40ed3dSBarry Smith   PetscFunctionBegin;
38977c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
39074679c65SBarry Smith   PetscValidIntPointer(iter);
3919b94acceSBarry Smith   *iter = snes->iter;
3923a40ed3dSBarry Smith   PetscFunctionReturn(0);
3939b94acceSBarry Smith }
39474679c65SBarry Smith 
3955615d1e5SSatish Balay #undef __FUNC__
3965615d1e5SSatish Balay #define __FUNC__ "SNESGetFunctionNorm"
3979b94acceSBarry Smith /*@
3989b94acceSBarry Smith    SNESGetFunctionNorm - Gets the norm of the current function that was set
3999b94acceSBarry Smith    with SNESSSetFunction().
4009b94acceSBarry Smith 
401c7afd0dbSLois Curfman McInnes    Collective on SNES
402c7afd0dbSLois Curfman McInnes 
4039b94acceSBarry Smith    Input Parameter:
4049b94acceSBarry Smith .  snes - SNES context
4059b94acceSBarry Smith 
4069b94acceSBarry Smith    Output Parameter:
4079b94acceSBarry Smith .  fnorm - 2-norm of function
4089b94acceSBarry Smith 
4099b94acceSBarry Smith    Note:
4109b94acceSBarry Smith    SNESGetFunctionNorm() is valid for SNES_NONLINEAR_EQUATIONS methods only.
411a86d99e1SLois Curfman McInnes    A related routine for SNES_UNCONSTRAINED_MINIMIZATION methods is
412a86d99e1SLois Curfman McInnes    SNESGetGradientNorm().
4139b94acceSBarry Smith 
41436851e7fSLois Curfman McInnes    Level: intermediate
41536851e7fSLois Curfman McInnes 
4169b94acceSBarry Smith .keywords: SNES, nonlinear, get, function, norm
417a86d99e1SLois Curfman McInnes 
41808405cd6SLois Curfman McInnes .seealso: SNESGetFunction()
4199b94acceSBarry Smith @*/
4209b94acceSBarry Smith int SNESGetFunctionNorm(SNES snes,Scalar *fnorm)
4219b94acceSBarry Smith {
4223a40ed3dSBarry Smith   PetscFunctionBegin;
42377c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
42474679c65SBarry Smith   PetscValidScalarPointer(fnorm);
42574679c65SBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
426d252947aSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"For SNES_NONLINEAR_EQUATIONS only");
42774679c65SBarry Smith   }
4289b94acceSBarry Smith   *fnorm = snes->norm;
4293a40ed3dSBarry Smith   PetscFunctionReturn(0);
4309b94acceSBarry Smith }
43174679c65SBarry Smith 
4325615d1e5SSatish Balay #undef __FUNC__
4335615d1e5SSatish Balay #define __FUNC__ "SNESGetGradientNorm"
4349b94acceSBarry Smith /*@
4359b94acceSBarry Smith    SNESGetGradientNorm - Gets the norm of the current gradient that was set
4369b94acceSBarry Smith    with SNESSSetGradient().
4379b94acceSBarry Smith 
438c7afd0dbSLois Curfman McInnes    Collective on SNES
439c7afd0dbSLois Curfman McInnes 
4409b94acceSBarry Smith    Input Parameter:
4419b94acceSBarry Smith .  snes - SNES context
4429b94acceSBarry Smith 
4439b94acceSBarry Smith    Output Parameter:
4449b94acceSBarry Smith .  fnorm - 2-norm of gradient
4459b94acceSBarry Smith 
4469b94acceSBarry Smith    Note:
4479b94acceSBarry Smith    SNESGetGradientNorm() is valid for SNES_UNCONSTRAINED_MINIMIZATION
448a86d99e1SLois Curfman McInnes    methods only.  A related routine for SNES_NONLINEAR_EQUATIONS methods
449a86d99e1SLois Curfman McInnes    is SNESGetFunctionNorm().
4509b94acceSBarry Smith 
45136851e7fSLois Curfman McInnes    Level: intermediate
45236851e7fSLois Curfman McInnes 
4539b94acceSBarry Smith .keywords: SNES, nonlinear, get, gradient, norm
454a86d99e1SLois Curfman McInnes 
455a86d99e1SLois Curfman McInnes .seelso: SNESSetGradient()
4569b94acceSBarry Smith @*/
4579b94acceSBarry Smith int SNESGetGradientNorm(SNES snes,Scalar *gnorm)
4589b94acceSBarry Smith {
4593a40ed3dSBarry Smith   PetscFunctionBegin;
46077c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
46174679c65SBarry Smith   PetscValidScalarPointer(gnorm);
46274679c65SBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
463d252947aSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"For SNES_UNCONSTRAINED_MINIMIZATION only");
46474679c65SBarry Smith   }
4659b94acceSBarry Smith   *gnorm = snes->norm;
4663a40ed3dSBarry Smith   PetscFunctionReturn(0);
4679b94acceSBarry Smith }
46874679c65SBarry Smith 
4695615d1e5SSatish Balay #undef __FUNC__
470d4bb536fSBarry Smith #define __FUNC__ "SNESGetNumberUnsuccessfulSteps"
4719b94acceSBarry Smith /*@
4729b94acceSBarry Smith    SNESGetNumberUnsuccessfulSteps - Gets the number of unsuccessful steps
4739b94acceSBarry Smith    attempted by the nonlinear solver.
4749b94acceSBarry Smith 
475c7afd0dbSLois Curfman McInnes    Not Collective
476c7afd0dbSLois Curfman McInnes 
4779b94acceSBarry Smith    Input Parameter:
4789b94acceSBarry Smith .  snes - SNES context
4799b94acceSBarry Smith 
4809b94acceSBarry Smith    Output Parameter:
4819b94acceSBarry Smith .  nfails - number of unsuccessful steps attempted
4829b94acceSBarry Smith 
483c96a6f78SLois Curfman McInnes    Notes:
484c96a6f78SLois Curfman McInnes    This counter is reset to zero for each successive call to SNESSolve().
485c96a6f78SLois Curfman McInnes 
48636851e7fSLois Curfman McInnes    Level: intermediate
48736851e7fSLois Curfman McInnes 
4889b94acceSBarry Smith .keywords: SNES, nonlinear, get, number, unsuccessful, steps
4899b94acceSBarry Smith @*/
4909b94acceSBarry Smith int SNESGetNumberUnsuccessfulSteps(SNES snes,int* nfails)
4919b94acceSBarry Smith {
4923a40ed3dSBarry Smith   PetscFunctionBegin;
49377c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
49474679c65SBarry Smith   PetscValidIntPointer(nfails);
4959b94acceSBarry Smith   *nfails = snes->nfailures;
4963a40ed3dSBarry Smith   PetscFunctionReturn(0);
4979b94acceSBarry Smith }
498a847f771SSatish Balay 
4995615d1e5SSatish Balay #undef __FUNC__
500d4bb536fSBarry Smith #define __FUNC__ "SNESGetNumberLinearIterations"
501c96a6f78SLois Curfman McInnes /*@
502c96a6f78SLois Curfman McInnes    SNESGetNumberLinearIterations - Gets the total number of linear iterations
503c96a6f78SLois Curfman McInnes    used by the nonlinear solver.
504c96a6f78SLois Curfman McInnes 
505c7afd0dbSLois Curfman McInnes    Not Collective
506c7afd0dbSLois Curfman McInnes 
507c96a6f78SLois Curfman McInnes    Input Parameter:
508c96a6f78SLois Curfman McInnes .  snes - SNES context
509c96a6f78SLois Curfman McInnes 
510c96a6f78SLois Curfman McInnes    Output Parameter:
511c96a6f78SLois Curfman McInnes .  lits - number of linear iterations
512c96a6f78SLois Curfman McInnes 
513c96a6f78SLois Curfman McInnes    Notes:
514c96a6f78SLois Curfman McInnes    This counter is reset to zero for each successive call to SNESSolve().
515c96a6f78SLois Curfman McInnes 
51636851e7fSLois Curfman McInnes    Level: intermediate
51736851e7fSLois Curfman McInnes 
518c96a6f78SLois Curfman McInnes .keywords: SNES, nonlinear, get, number, linear, iterations
519c96a6f78SLois Curfman McInnes @*/
52086bddb7dSBarry Smith int SNESGetNumberLinearIterations(SNES snes,int* lits)
521c96a6f78SLois Curfman McInnes {
5223a40ed3dSBarry Smith   PetscFunctionBegin;
523c96a6f78SLois Curfman McInnes   PetscValidHeaderSpecific(snes,SNES_COOKIE);
524c96a6f78SLois Curfman McInnes   PetscValidIntPointer(lits);
525c96a6f78SLois Curfman McInnes   *lits = snes->linear_its;
5263a40ed3dSBarry Smith   PetscFunctionReturn(0);
527c96a6f78SLois Curfman McInnes }
528c96a6f78SLois Curfman McInnes 
529c96a6f78SLois Curfman McInnes #undef __FUNC__
530d4bb536fSBarry Smith #define __FUNC__ "SNESGetSLES"
5319b94acceSBarry Smith /*@C
5329b94acceSBarry Smith    SNESGetSLES - Returns the SLES context for a SNES solver.
5339b94acceSBarry Smith 
534c7afd0dbSLois Curfman McInnes    Not Collective, but if SNES object is parallel, then SLES object is parallel
535c7afd0dbSLois Curfman McInnes 
5369b94acceSBarry Smith    Input Parameter:
5379b94acceSBarry Smith .  snes - the SNES context
5389b94acceSBarry Smith 
5399b94acceSBarry Smith    Output Parameter:
5409b94acceSBarry Smith .  sles - the SLES context
5419b94acceSBarry Smith 
5429b94acceSBarry Smith    Notes:
5439b94acceSBarry Smith    The user can then directly manipulate the SLES context to set various
5449b94acceSBarry Smith    options, etc.  Likewise, the user can then extract and manipulate the
5459b94acceSBarry Smith    KSP and PC contexts as well.
5469b94acceSBarry Smith 
54736851e7fSLois Curfman McInnes    Level: beginner
54836851e7fSLois Curfman McInnes 
5499b94acceSBarry Smith .keywords: SNES, nonlinear, get, SLES, context
5509b94acceSBarry Smith 
5519b94acceSBarry Smith .seealso: SLESGetPC(), SLESGetKSP()
5529b94acceSBarry Smith @*/
5539b94acceSBarry Smith int SNESGetSLES(SNES snes,SLES *sles)
5549b94acceSBarry Smith {
5553a40ed3dSBarry Smith   PetscFunctionBegin;
55677c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
5579b94acceSBarry Smith   *sles = snes->sles;
5583a40ed3dSBarry Smith   PetscFunctionReturn(0);
5599b94acceSBarry Smith }
56082bf6240SBarry Smith 
561e24b481bSBarry Smith #undef __FUNC__
562e24b481bSBarry Smith #define __FUNC__ "SNESPublish_Petsc"
563e24b481bSBarry Smith static int SNESPublish_Petsc(PetscObject object)
564e24b481bSBarry Smith {
565e24b481bSBarry Smith #if defined(HAVE_AMS)
566e24b481bSBarry Smith   SNES          v = (SNES) object;
567e24b481bSBarry Smith   int          ierr;
568e24b481bSBarry Smith 
569e24b481bSBarry Smith   PetscFunctionBegin;
570e24b481bSBarry Smith 
571e24b481bSBarry Smith   /* if it is already published then return */
572e24b481bSBarry Smith   if (v->amem >=0 ) PetscFunctionReturn(0);
573e24b481bSBarry Smith 
5743f1db9ecSBarry Smith   ierr = PetscObjectPublishBaseBegin(object);CHKERRQ(ierr);
575e24b481bSBarry Smith   ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Iteration",&v->iter,1,AMS_INT,AMS_READ,
576e24b481bSBarry Smith                                 AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
577e24b481bSBarry Smith   ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Residual",&v->norm,1,AMS_DOUBLE,AMS_READ,
578e24b481bSBarry Smith                                 AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
579e24b481bSBarry Smith   ierr = PetscObjectPublishBaseEnd(object);CHKERRQ(ierr);
580e24b481bSBarry Smith #else
581e24b481bSBarry Smith   PetscFunctionBegin;
582e24b481bSBarry Smith #endif
583e24b481bSBarry Smith   PetscFunctionReturn(0);
584e24b481bSBarry Smith }
585e24b481bSBarry Smith 
5869b94acceSBarry Smith /* -----------------------------------------------------------*/
5875615d1e5SSatish Balay #undef __FUNC__
5885615d1e5SSatish Balay #define __FUNC__ "SNESCreate"
5899b94acceSBarry Smith /*@C
5909b94acceSBarry Smith    SNESCreate - Creates a nonlinear solver context.
5919b94acceSBarry Smith 
592c7afd0dbSLois Curfman McInnes    Collective on MPI_Comm
593c7afd0dbSLois Curfman McInnes 
594c7afd0dbSLois Curfman McInnes    Input Parameters:
595c7afd0dbSLois Curfman McInnes +  comm - MPI communicator
596c7afd0dbSLois Curfman McInnes -  type - type of method, either
597c7afd0dbSLois Curfman McInnes    SNES_NONLINEAR_EQUATIONS (for systems of nonlinear equations)
598c7afd0dbSLois Curfman McInnes    or SNES_UNCONSTRAINED_MINIMIZATION (for unconstrained minimization)
5999b94acceSBarry Smith 
6009b94acceSBarry Smith    Output Parameter:
6019b94acceSBarry Smith .  outsnes - the new SNES context
6029b94acceSBarry Smith 
603c7afd0dbSLois Curfman McInnes    Options Database Keys:
604c7afd0dbSLois Curfman McInnes +   -snes_mf - Activates default matrix-free Jacobian-vector products,
605c7afd0dbSLois Curfman McInnes                and no preconditioning matrix
606c7afd0dbSLois Curfman McInnes .   -snes_mf_operator - Activates default matrix-free Jacobian-vector
607c7afd0dbSLois Curfman McInnes                products, and a user-provided preconditioning matrix
608c7afd0dbSLois Curfman McInnes                as set by SNESSetJacobian()
609c7afd0dbSLois Curfman McInnes -   -snes_fd - Uses (slow!) finite differences to compute Jacobian
610c1f60f51SBarry Smith 
61136851e7fSLois Curfman McInnes    Level: beginner
61236851e7fSLois Curfman McInnes 
6139b94acceSBarry Smith .keywords: SNES, nonlinear, create, context
6149b94acceSBarry Smith 
61563a78c88SLois Curfman McInnes .seealso: SNESSolve(), SNESDestroy()
6169b94acceSBarry Smith @*/
6174b0e389bSBarry Smith int SNESCreate(MPI_Comm comm,SNESProblemType type,SNES *outsnes)
6189b94acceSBarry Smith {
6199b94acceSBarry Smith   int                 ierr;
6209b94acceSBarry Smith   SNES                snes;
6219b94acceSBarry Smith   SNES_KSP_EW_ConvCtx *kctx;
62237fcc0dbSBarry Smith 
6233a40ed3dSBarry Smith   PetscFunctionBegin;
6249b94acceSBarry Smith   *outsnes = 0;
625d64ed03dSBarry Smith   if (type != SNES_UNCONSTRAINED_MINIMIZATION && type != SNES_NONLINEAR_EQUATIONS){
626d252947aSBarry Smith     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,0,"incorrect method type");
627d64ed03dSBarry Smith   }
6283f1db9ecSBarry Smith   PetscHeaderCreate(snes,_p_SNES,int,SNES_COOKIE,0,"SNES",comm,SNESDestroy,SNESView);
6299b94acceSBarry Smith   PLogObjectCreate(snes);
630e24b481bSBarry Smith   snes->bops->publish     = SNESPublish_Petsc;
6319b94acceSBarry Smith   snes->max_its           = 50;
6329750a799SBarry Smith   snes->max_funcs	  = 10000;
6339b94acceSBarry Smith   snes->norm		  = 0.0;
6345a2d0531SBarry Smith   if (type == SNES_UNCONSTRAINED_MINIMIZATION) {
635b18e04deSLois Curfman McInnes     snes->rtol		  = 1.e-8;
636b18e04deSLois Curfman McInnes     snes->ttol            = 0.0;
6379b94acceSBarry Smith     snes->atol		  = 1.e-10;
638d64ed03dSBarry Smith   } else {
639b4874afaSBarry Smith     snes->rtol		  = 1.e-8;
640b4874afaSBarry Smith     snes->ttol            = 0.0;
641b4874afaSBarry Smith     snes->atol		  = 1.e-50;
642b4874afaSBarry Smith   }
6439b94acceSBarry Smith   snes->xtol		  = 1.e-8;
644b18e04deSLois Curfman McInnes   snes->trunctol	  = 1.e-12; /* no longer used */
6459b94acceSBarry Smith   snes->nfuncs            = 0;
6469b94acceSBarry Smith   snes->nfailures         = 0;
6477a00f4a9SLois Curfman McInnes   snes->linear_its        = 0;
648639f9d9dSBarry Smith   snes->numbermonitors    = 0;
6499b94acceSBarry Smith   snes->data              = 0;
6509b94acceSBarry Smith   snes->view              = 0;
6519b94acceSBarry Smith   snes->computeumfunction = 0;
6529b94acceSBarry Smith   snes->umfunP            = 0;
6539b94acceSBarry Smith   snes->fc                = 0;
6549b94acceSBarry Smith   snes->deltatol          = 1.e-12;
6559b94acceSBarry Smith   snes->fmin              = -1.e30;
6569b94acceSBarry Smith   snes->method_class      = type;
6579b94acceSBarry Smith   snes->set_method_called = 0;
65882bf6240SBarry Smith   snes->setupcalled      = 0;
6599b94acceSBarry Smith   snes->ksp_ewconv        = 0;
6606f24a144SLois Curfman McInnes   snes->xmonitor          = 0;
6616f24a144SLois Curfman McInnes   snes->vwork             = 0;
6626f24a144SLois Curfman McInnes   snes->nwork             = 0;
663758f92a0SBarry Smith   snes->conv_hist_len     = 0;
664758f92a0SBarry Smith   snes->conv_hist_max     = 0;
665758f92a0SBarry Smith   snes->conv_hist         = PETSC_NULL;
666758f92a0SBarry Smith   snes->conv_hist_its     = PETSC_NULL;
667758f92a0SBarry Smith   snes->conv_hist_reset   = PETSC_TRUE;
6689b94acceSBarry Smith 
6699b94acceSBarry Smith   /* Create context to compute Eisenstat-Walker relative tolerance for KSP */
6700452661fSBarry Smith   kctx = PetscNew(SNES_KSP_EW_ConvCtx); CHKPTRQ(kctx);
671eed86810SBarry Smith   PLogObjectMemory(snes,sizeof(SNES_KSP_EW_ConvCtx));
6729b94acceSBarry Smith   snes->kspconvctx  = (void*)kctx;
6739b94acceSBarry Smith   kctx->version     = 2;
6749b94acceSBarry Smith   kctx->rtol_0      = .3; /* Eisenstat and Walker suggest rtol_0=.5, but
6759b94acceSBarry Smith                              this was too large for some test cases */
6769b94acceSBarry Smith   kctx->rtol_last   = 0;
6779b94acceSBarry Smith   kctx->rtol_max    = .9;
6789b94acceSBarry Smith   kctx->gamma       = 1.0;
6799b94acceSBarry Smith   kctx->alpha2      = .5*(1.0 + sqrt(5.0));
6809b94acceSBarry Smith   kctx->alpha       = kctx->alpha2;
6819b94acceSBarry Smith   kctx->threshold   = .1;
6829b94acceSBarry Smith   kctx->lresid_last = 0;
6839b94acceSBarry Smith   kctx->norm_last   = 0;
6849b94acceSBarry Smith 
6859b94acceSBarry Smith   ierr = SLESCreate(comm,&snes->sles); CHKERRQ(ierr);
6869b94acceSBarry Smith   PLogObjectParent(snes,snes->sles)
6875334005bSBarry Smith 
6889b94acceSBarry Smith   *outsnes = snes;
689e24b481bSBarry Smith   PetscPublishAll(snes);
6903a40ed3dSBarry Smith   PetscFunctionReturn(0);
6919b94acceSBarry Smith }
6929b94acceSBarry Smith 
6939b94acceSBarry Smith /* --------------------------------------------------------------- */
6945615d1e5SSatish Balay #undef __FUNC__
695d4bb536fSBarry Smith #define __FUNC__ "SNESSetFunction"
6969b94acceSBarry Smith /*@C
6979b94acceSBarry Smith    SNESSetFunction - Sets the function evaluation routine and function
6989b94acceSBarry Smith    vector for use by the SNES routines in solving systems of nonlinear
6999b94acceSBarry Smith    equations.
7009b94acceSBarry Smith 
701fee21e36SBarry Smith    Collective on SNES
702fee21e36SBarry Smith 
703c7afd0dbSLois Curfman McInnes    Input Parameters:
704c7afd0dbSLois Curfman McInnes +  snes - the SNES context
705c7afd0dbSLois Curfman McInnes .  func - function evaluation routine
706c7afd0dbSLois Curfman McInnes .  r - vector to store function value
707c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined context for private data for the
708c7afd0dbSLois Curfman McInnes          function evaluation routine (may be PETSC_NULL)
7099b94acceSBarry Smith 
710c7afd0dbSLois Curfman McInnes    Calling sequence of func:
7118d76a1e5SLois Curfman McInnes $    func (SNES snes,Vec x,Vec f,void *ctx);
712c7afd0dbSLois Curfman McInnes 
713313e4042SLois Curfman McInnes .  f - function vector
714c7afd0dbSLois Curfman McInnes -  ctx - optional user-defined function context
7159b94acceSBarry Smith 
7169b94acceSBarry Smith    Notes:
7179b94acceSBarry Smith    The Newton-like methods typically solve linear systems of the form
7189b94acceSBarry Smith $      f'(x) x = -f(x),
719c7afd0dbSLois Curfman McInnes    where f'(x) denotes the Jacobian matrix and f(x) is the function.
7209b94acceSBarry Smith 
7219b94acceSBarry Smith    SNESSetFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only.
7229b94acceSBarry Smith    Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are
7239b94acceSBarry Smith    SNESSetMinimizationFunction() and SNESSetGradient();
7249b94acceSBarry Smith 
72536851e7fSLois Curfman McInnes    Level: beginner
72636851e7fSLois Curfman McInnes 
7279b94acceSBarry Smith .keywords: SNES, nonlinear, set, function
7289b94acceSBarry Smith 
729a86d99e1SLois Curfman McInnes .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian()
7309b94acceSBarry Smith @*/
7315334005bSBarry Smith int SNESSetFunction( SNES snes, Vec r, int (*func)(SNES,Vec,Vec,void*),void *ctx)
7329b94acceSBarry Smith {
7333a40ed3dSBarry Smith   PetscFunctionBegin;
73477c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
735a8c6a408SBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
736a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_NONLINEAR_EQUATIONS only");
737a8c6a408SBarry Smith   }
7389b94acceSBarry Smith   snes->computefunction     = func;
7399b94acceSBarry Smith   snes->vec_func            = snes->vec_func_always = r;
7409b94acceSBarry Smith   snes->funP                = ctx;
7413a40ed3dSBarry Smith   PetscFunctionReturn(0);
7429b94acceSBarry Smith }
7439b94acceSBarry Smith 
7445615d1e5SSatish Balay #undef __FUNC__
7455615d1e5SSatish Balay #define __FUNC__ "SNESComputeFunction"
7469b94acceSBarry Smith /*@
74736851e7fSLois Curfman McInnes    SNESComputeFunction - Calls the function that has been set with
7489b94acceSBarry Smith    SNESSetFunction().
7499b94acceSBarry Smith 
750c7afd0dbSLois Curfman McInnes    Collective on SNES
751c7afd0dbSLois Curfman McInnes 
7529b94acceSBarry Smith    Input Parameters:
753c7afd0dbSLois Curfman McInnes +  snes - the SNES context
754c7afd0dbSLois Curfman McInnes -  x - input vector
7559b94acceSBarry Smith 
7569b94acceSBarry Smith    Output Parameter:
7573638b69dSLois Curfman McInnes .  y - function vector, as set by SNESSetFunction()
7589b94acceSBarry Smith 
7591bffabb2SLois Curfman McInnes    Notes:
7609b94acceSBarry Smith    SNESComputeFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only.
7619b94acceSBarry Smith    Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are
7629b94acceSBarry Smith    SNESComputeMinimizationFunction() and SNESComputeGradient();
7639b94acceSBarry Smith 
76436851e7fSLois Curfman McInnes    SNESComputeFunction() is typically used within nonlinear solvers
76536851e7fSLois Curfman McInnes    implementations, so most users would not generally call this routine
76636851e7fSLois Curfman McInnes    themselves.
76736851e7fSLois Curfman McInnes 
76836851e7fSLois Curfman McInnes    Level: developer
76936851e7fSLois Curfman McInnes 
7709b94acceSBarry Smith .keywords: SNES, nonlinear, compute, function
7719b94acceSBarry Smith 
772a86d99e1SLois Curfman McInnes .seealso: SNESSetFunction(), SNESGetFunction()
7739b94acceSBarry Smith @*/
7749b94acceSBarry Smith int SNESComputeFunction(SNES snes,Vec x, Vec y)
7759b94acceSBarry Smith {
7769b94acceSBarry Smith   int    ierr;
7779b94acceSBarry Smith 
7783a40ed3dSBarry Smith   PetscFunctionBegin;
779d4bb536fSBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
780a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_NONLINEAR_EQUATIONS only");
781d4bb536fSBarry Smith   }
7829b94acceSBarry Smith   PLogEventBegin(SNES_FunctionEval,snes,x,y,0);
783d64ed03dSBarry Smith   PetscStackPush("SNES user function");
7849b94acceSBarry Smith   ierr = (*snes->computefunction)(snes,x,y,snes->funP); CHKERRQ(ierr);
785d64ed03dSBarry Smith   PetscStackPop;
786ae3c334cSLois Curfman McInnes   snes->nfuncs++;
7879b94acceSBarry Smith   PLogEventEnd(SNES_FunctionEval,snes,x,y,0);
7883a40ed3dSBarry Smith   PetscFunctionReturn(0);
7899b94acceSBarry Smith }
7909b94acceSBarry Smith 
7915615d1e5SSatish Balay #undef __FUNC__
792d4bb536fSBarry Smith #define __FUNC__ "SNESSetMinimizationFunction"
7939b94acceSBarry Smith /*@C
7949b94acceSBarry Smith    SNESSetMinimizationFunction - Sets the function evaluation routine for
7959b94acceSBarry Smith    unconstrained minimization.
7969b94acceSBarry Smith 
797fee21e36SBarry Smith    Collective on SNES
798fee21e36SBarry Smith 
799c7afd0dbSLois Curfman McInnes    Input Parameters:
800c7afd0dbSLois Curfman McInnes +  snes - the SNES context
801c7afd0dbSLois Curfman McInnes .  func - function evaluation routine
802c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined context for private data for the
803c7afd0dbSLois Curfman McInnes          function evaluation routine (may be PETSC_NULL)
8049b94acceSBarry Smith 
805c7afd0dbSLois Curfman McInnes    Calling sequence of func:
8068d76a1e5SLois Curfman McInnes $     func (SNES snes,Vec x,double *f,void *ctx);
807c7afd0dbSLois Curfman McInnes 
808c7afd0dbSLois Curfman McInnes +  x - input vector
8099b94acceSBarry Smith .  f - function
810c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined function context
8119b94acceSBarry Smith 
81236851e7fSLois Curfman McInnes    Level: beginner
81336851e7fSLois Curfman McInnes 
8149b94acceSBarry Smith    Notes:
8159b94acceSBarry Smith    SNESSetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION
8169b94acceSBarry Smith    methods only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is
8179b94acceSBarry Smith    SNESSetFunction().
8189b94acceSBarry Smith 
8199b94acceSBarry Smith .keywords: SNES, nonlinear, set, minimization, function
8209b94acceSBarry Smith 
821a86d99e1SLois Curfman McInnes .seealso:  SNESGetMinimizationFunction(), SNESComputeMinimizationFunction(),
822a86d99e1SLois Curfman McInnes            SNESSetHessian(), SNESSetGradient()
8239b94acceSBarry Smith @*/
8249b94acceSBarry Smith int SNESSetMinimizationFunction(SNES snes,int (*func)(SNES,Vec,double*,void*),
8259b94acceSBarry Smith                       void *ctx)
8269b94acceSBarry Smith {
8273a40ed3dSBarry Smith   PetscFunctionBegin;
82877c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
829a8c6a408SBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
830a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"Only for SNES_UNCONSTRAINED_MINIMIZATION");
831a8c6a408SBarry Smith   }
8329b94acceSBarry Smith   snes->computeumfunction   = func;
8339b94acceSBarry Smith   snes->umfunP              = ctx;
8343a40ed3dSBarry Smith   PetscFunctionReturn(0);
8359b94acceSBarry Smith }
8369b94acceSBarry Smith 
8375615d1e5SSatish Balay #undef __FUNC__
8385615d1e5SSatish Balay #define __FUNC__ "SNESComputeMinimizationFunction"
8399b94acceSBarry Smith /*@
8409b94acceSBarry Smith    SNESComputeMinimizationFunction - Computes the function that has been
8419b94acceSBarry Smith    set with SNESSetMinimizationFunction().
8429b94acceSBarry Smith 
843c7afd0dbSLois Curfman McInnes    Collective on SNES
844c7afd0dbSLois Curfman McInnes 
8459b94acceSBarry Smith    Input Parameters:
846c7afd0dbSLois Curfman McInnes +  snes - the SNES context
847c7afd0dbSLois Curfman McInnes -  x - input vector
8489b94acceSBarry Smith 
8499b94acceSBarry Smith    Output Parameter:
8509b94acceSBarry Smith .  y - function value
8519b94acceSBarry Smith 
8529b94acceSBarry Smith    Notes:
8539b94acceSBarry Smith    SNESComputeMinimizationFunction() is valid only for
8549b94acceSBarry Smith    SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for
8559b94acceSBarry Smith    SNES_NONLINEAR_EQUATIONS methods is SNESComputeFunction().
856a86d99e1SLois Curfman McInnes 
85736851e7fSLois Curfman McInnes    SNESComputeMinimizationFunction() is typically used within minimization
85836851e7fSLois Curfman McInnes    implementations, so most users would not generally call this routine
85936851e7fSLois Curfman McInnes    themselves.
86036851e7fSLois Curfman McInnes 
86136851e7fSLois Curfman McInnes    Level: developer
86236851e7fSLois Curfman McInnes 
863a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, compute, minimization, function
864a86d99e1SLois Curfman McInnes 
865a86d99e1SLois Curfman McInnes .seealso: SNESSetMinimizationFunction(), SNESGetMinimizationFunction(),
866a86d99e1SLois Curfman McInnes           SNESComputeGradient(), SNESComputeHessian()
8679b94acceSBarry Smith @*/
8689b94acceSBarry Smith int SNESComputeMinimizationFunction(SNES snes,Vec x,double *y)
8699b94acceSBarry Smith {
8709b94acceSBarry Smith   int    ierr;
8713a40ed3dSBarry Smith 
8723a40ed3dSBarry Smith   PetscFunctionBegin;
873a8c6a408SBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
874a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"Only for SNES_UNCONSTRAINED_MINIMIZATION");
875a8c6a408SBarry Smith   }
8769b94acceSBarry Smith   PLogEventBegin(SNES_MinimizationFunctionEval,snes,x,y,0);
877d64ed03dSBarry Smith   PetscStackPush("SNES user minimzation function");
8789b94acceSBarry Smith   ierr = (*snes->computeumfunction)(snes,x,y,snes->umfunP); CHKERRQ(ierr);
879d64ed03dSBarry Smith   PetscStackPop;
880ae3c334cSLois Curfman McInnes   snes->nfuncs++;
8819b94acceSBarry Smith   PLogEventEnd(SNES_MinimizationFunctionEval,snes,x,y,0);
8823a40ed3dSBarry Smith   PetscFunctionReturn(0);
8839b94acceSBarry Smith }
8849b94acceSBarry Smith 
8855615d1e5SSatish Balay #undef __FUNC__
886d4bb536fSBarry Smith #define __FUNC__ "SNESSetGradient"
8879b94acceSBarry Smith /*@C
8889b94acceSBarry Smith    SNESSetGradient - Sets the gradient evaluation routine and gradient
8899b94acceSBarry Smith    vector for use by the SNES routines.
8909b94acceSBarry Smith 
891c7afd0dbSLois Curfman McInnes    Collective on SNES
892c7afd0dbSLois Curfman McInnes 
8939b94acceSBarry Smith    Input Parameters:
894c7afd0dbSLois Curfman McInnes +  snes - the SNES context
8959b94acceSBarry Smith .  func - function evaluation routine
896044dda88SLois Curfman McInnes .  ctx - optional user-defined context for private data for the
897044dda88SLois Curfman McInnes          gradient evaluation routine (may be PETSC_NULL)
898c7afd0dbSLois Curfman McInnes -  r - vector to store gradient value
899fee21e36SBarry Smith 
9009b94acceSBarry Smith    Calling sequence of func:
9018d76a1e5SLois Curfman McInnes $     func (SNES, Vec x, Vec g, void *ctx);
9029b94acceSBarry Smith 
903c7afd0dbSLois Curfman McInnes +  x - input vector
9049b94acceSBarry Smith .  g - gradient vector
905c7afd0dbSLois Curfman McInnes -  ctx - optional user-defined gradient context
9069b94acceSBarry Smith 
9079b94acceSBarry Smith    Notes:
9089b94acceSBarry Smith    SNESSetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION
9099b94acceSBarry Smith    methods only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is
9109b94acceSBarry Smith    SNESSetFunction().
9119b94acceSBarry Smith 
91236851e7fSLois Curfman McInnes    Level: beginner
91336851e7fSLois Curfman McInnes 
9149b94acceSBarry Smith .keywords: SNES, nonlinear, set, function
9159b94acceSBarry Smith 
916a86d99e1SLois Curfman McInnes .seealso: SNESGetGradient(), SNESComputeGradient(), SNESSetHessian(),
917a86d99e1SLois Curfman McInnes           SNESSetMinimizationFunction(),
9189b94acceSBarry Smith @*/
91974679c65SBarry Smith int SNESSetGradient(SNES snes,Vec r,int (*func)(SNES,Vec,Vec,void*),void *ctx)
9209b94acceSBarry Smith {
9213a40ed3dSBarry Smith   PetscFunctionBegin;
92277c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
923a8c6a408SBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
924a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_UNCONSTRAINED_MINIMIZATION only");
925a8c6a408SBarry Smith   }
9269b94acceSBarry Smith   snes->computefunction     = func;
9279b94acceSBarry Smith   snes->vec_func            = snes->vec_func_always = r;
9289b94acceSBarry Smith   snes->funP                = ctx;
9293a40ed3dSBarry Smith   PetscFunctionReturn(0);
9309b94acceSBarry Smith }
9319b94acceSBarry Smith 
9325615d1e5SSatish Balay #undef __FUNC__
9335615d1e5SSatish Balay #define __FUNC__ "SNESComputeGradient"
9349b94acceSBarry Smith /*@
935a86d99e1SLois Curfman McInnes    SNESComputeGradient - Computes the gradient that has been set with
936a86d99e1SLois Curfman McInnes    SNESSetGradient().
9379b94acceSBarry Smith 
938c7afd0dbSLois Curfman McInnes    Collective on SNES
939c7afd0dbSLois Curfman McInnes 
9409b94acceSBarry Smith    Input Parameters:
941c7afd0dbSLois Curfman McInnes +  snes - the SNES context
942c7afd0dbSLois Curfman McInnes -  x - input vector
9439b94acceSBarry Smith 
9449b94acceSBarry Smith    Output Parameter:
9459b94acceSBarry Smith .  y - gradient vector
9469b94acceSBarry Smith 
9479b94acceSBarry Smith    Notes:
9489b94acceSBarry Smith    SNESComputeGradient() is valid only for
9499b94acceSBarry Smith    SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for
9509b94acceSBarry Smith    SNES_NONLINEAR_EQUATIONS methods is SNESComputeFunction().
951a86d99e1SLois Curfman McInnes 
95236851e7fSLois Curfman McInnes    SNESComputeGradient() is typically used within minimization
95336851e7fSLois Curfman McInnes    implementations, so most users would not generally call this routine
95436851e7fSLois Curfman McInnes    themselves.
95536851e7fSLois Curfman McInnes 
95636851e7fSLois Curfman McInnes    Level: developer
95736851e7fSLois Curfman McInnes 
958a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, compute, gradient
959a86d99e1SLois Curfman McInnes 
960a86d99e1SLois Curfman McInnes .seealso:  SNESSetGradient(), SNESGetGradient(),
961a86d99e1SLois Curfman McInnes            SNESComputeMinimizationFunction(), SNESComputeHessian()
9629b94acceSBarry Smith @*/
9639b94acceSBarry Smith int SNESComputeGradient(SNES snes,Vec x, Vec y)
9649b94acceSBarry Smith {
9659b94acceSBarry Smith   int    ierr;
9663a40ed3dSBarry Smith 
9673a40ed3dSBarry Smith   PetscFunctionBegin;
9683a40ed3dSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
969a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_UNCONSTRAINED_MINIMIZATION only");
9703a40ed3dSBarry Smith   }
9719b94acceSBarry Smith   PLogEventBegin(SNES_GradientEval,snes,x,y,0);
972d64ed03dSBarry Smith   PetscStackPush("SNES user gradient function");
9739b94acceSBarry Smith   ierr = (*snes->computefunction)(snes,x,y,snes->funP); CHKERRQ(ierr);
974d64ed03dSBarry Smith   PetscStackPop;
9759b94acceSBarry Smith   PLogEventEnd(SNES_GradientEval,snes,x,y,0);
9763a40ed3dSBarry Smith   PetscFunctionReturn(0);
9779b94acceSBarry Smith }
9789b94acceSBarry Smith 
9795615d1e5SSatish Balay #undef __FUNC__
9805615d1e5SSatish Balay #define __FUNC__ "SNESComputeJacobian"
98162fef451SLois Curfman McInnes /*@
98262fef451SLois Curfman McInnes    SNESComputeJacobian - Computes the Jacobian matrix that has been
98362fef451SLois Curfman McInnes    set with SNESSetJacobian().
98462fef451SLois Curfman McInnes 
985c7afd0dbSLois Curfman McInnes    Collective on SNES and Mat
986c7afd0dbSLois Curfman McInnes 
98762fef451SLois Curfman McInnes    Input Parameters:
988c7afd0dbSLois Curfman McInnes +  snes - the SNES context
989c7afd0dbSLois Curfman McInnes -  x - input vector
99062fef451SLois Curfman McInnes 
99162fef451SLois Curfman McInnes    Output Parameters:
992c7afd0dbSLois Curfman McInnes +  A - Jacobian matrix
99362fef451SLois Curfman McInnes .  B - optional preconditioning matrix
994c7afd0dbSLois Curfman McInnes -  flag - flag indicating matrix structure
995fee21e36SBarry Smith 
99662fef451SLois Curfman McInnes    Notes:
99762fef451SLois Curfman McInnes    Most users should not need to explicitly call this routine, as it
99862fef451SLois Curfman McInnes    is used internally within the nonlinear solvers.
99962fef451SLois Curfman McInnes 
1000dc5a77f8SLois Curfman McInnes    See SLESSetOperators() for important information about setting the
1001dc5a77f8SLois Curfman McInnes    flag parameter.
100262fef451SLois Curfman McInnes 
100362fef451SLois Curfman McInnes    SNESComputeJacobian() is valid only for SNES_NONLINEAR_EQUATIONS
100462fef451SLois Curfman McInnes    methods. An analogous routine for SNES_UNCONSTRAINED_MINIMIZATION
1005005c665bSBarry Smith    methods is SNESComputeHessian().
100662fef451SLois Curfman McInnes 
100736851e7fSLois Curfman McInnes    SNESComputeJacobian() is typically used within nonlinear solver
100836851e7fSLois Curfman McInnes    implementations, so most users would not generally call this routine
100936851e7fSLois Curfman McInnes    themselves.
101036851e7fSLois Curfman McInnes 
101136851e7fSLois Curfman McInnes    Level: developer
101236851e7fSLois Curfman McInnes 
101362fef451SLois Curfman McInnes .keywords: SNES, compute, Jacobian, matrix
101462fef451SLois Curfman McInnes 
101562fef451SLois Curfman McInnes .seealso:  SNESSetJacobian(), SLESSetOperators()
101662fef451SLois Curfman McInnes @*/
10179b94acceSBarry Smith int SNESComputeJacobian(SNES snes,Vec X,Mat *A,Mat *B,MatStructure *flg)
10189b94acceSBarry Smith {
10199b94acceSBarry Smith   int    ierr;
10203a40ed3dSBarry Smith 
10213a40ed3dSBarry Smith   PetscFunctionBegin;
10223a40ed3dSBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
1023a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_NONLINEAR_EQUATIONS only");
10243a40ed3dSBarry Smith   }
10253a40ed3dSBarry Smith   if (!snes->computejacobian) PetscFunctionReturn(0);
10269b94acceSBarry Smith   PLogEventBegin(SNES_JacobianEval,snes,X,*A,*B);
1027c4fc05e7SBarry Smith   *flg = DIFFERENT_NONZERO_PATTERN;
1028d64ed03dSBarry Smith   PetscStackPush("SNES user Jacobian function");
10299b94acceSBarry Smith   ierr = (*snes->computejacobian)(snes,X,A,B,flg,snes->jacP); CHKERRQ(ierr);
1030d64ed03dSBarry Smith   PetscStackPop;
10319b94acceSBarry Smith   PLogEventEnd(SNES_JacobianEval,snes,X,*A,*B);
10326d84be18SBarry Smith   /* make sure user returned a correct Jacobian and preconditioner */
103377c4ece6SBarry Smith   PetscValidHeaderSpecific(*A,MAT_COOKIE);
103477c4ece6SBarry Smith   PetscValidHeaderSpecific(*B,MAT_COOKIE);
10353a40ed3dSBarry Smith   PetscFunctionReturn(0);
10369b94acceSBarry Smith }
10379b94acceSBarry Smith 
10385615d1e5SSatish Balay #undef __FUNC__
10395615d1e5SSatish Balay #define __FUNC__ "SNESComputeHessian"
104062fef451SLois Curfman McInnes /*@
104162fef451SLois Curfman McInnes    SNESComputeHessian - Computes the Hessian matrix that has been
104262fef451SLois Curfman McInnes    set with SNESSetHessian().
104362fef451SLois Curfman McInnes 
1044c7afd0dbSLois Curfman McInnes    Collective on SNES and Mat
1045c7afd0dbSLois Curfman McInnes 
104662fef451SLois Curfman McInnes    Input Parameters:
1047c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1048c7afd0dbSLois Curfman McInnes -  x - input vector
104962fef451SLois Curfman McInnes 
105062fef451SLois Curfman McInnes    Output Parameters:
1051c7afd0dbSLois Curfman McInnes +  A - Hessian matrix
105262fef451SLois Curfman McInnes .  B - optional preconditioning matrix
1053c7afd0dbSLois Curfman McInnes -  flag - flag indicating matrix structure
1054fee21e36SBarry Smith 
105562fef451SLois Curfman McInnes    Notes:
105662fef451SLois Curfman McInnes    Most users should not need to explicitly call this routine, as it
105762fef451SLois Curfman McInnes    is used internally within the nonlinear solvers.
105862fef451SLois Curfman McInnes 
1059dc5a77f8SLois Curfman McInnes    See SLESSetOperators() for important information about setting the
1060dc5a77f8SLois Curfman McInnes    flag parameter.
106162fef451SLois Curfman McInnes 
106262fef451SLois Curfman McInnes    SNESComputeHessian() is valid only for
106362fef451SLois Curfman McInnes    SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for
106462fef451SLois Curfman McInnes    SNES_NONLINEAR_EQUATIONS methods is SNESComputeJacobian().
106562fef451SLois Curfman McInnes 
106636851e7fSLois Curfman McInnes    SNESComputeHessian() is typically used within minimization
106736851e7fSLois Curfman McInnes    implementations, so most users would not generally call this routine
106836851e7fSLois Curfman McInnes    themselves.
106936851e7fSLois Curfman McInnes 
107036851e7fSLois Curfman McInnes    Level: developer
107136851e7fSLois Curfman McInnes 
107262fef451SLois Curfman McInnes .keywords: SNES, compute, Hessian, matrix
107362fef451SLois Curfman McInnes 
1074a86d99e1SLois Curfman McInnes .seealso:  SNESSetHessian(), SLESSetOperators(), SNESComputeGradient(),
1075a86d99e1SLois Curfman McInnes            SNESComputeMinimizationFunction()
107662fef451SLois Curfman McInnes @*/
107762fef451SLois Curfman McInnes int SNESComputeHessian(SNES snes,Vec x,Mat *A,Mat *B,MatStructure *flag)
10789b94acceSBarry Smith {
10799b94acceSBarry Smith   int    ierr;
10803a40ed3dSBarry Smith 
10813a40ed3dSBarry Smith   PetscFunctionBegin;
10823a40ed3dSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
1083a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_UNCONSTRAINED_MINIMIZATION only");
10843a40ed3dSBarry Smith   }
10853a40ed3dSBarry Smith   if (!snes->computejacobian) PetscFunctionReturn(0);
108662fef451SLois Curfman McInnes   PLogEventBegin(SNES_HessianEval,snes,x,*A,*B);
10870f4a323eSLois Curfman McInnes   *flag = DIFFERENT_NONZERO_PATTERN;
1088d64ed03dSBarry Smith   PetscStackPush("SNES user Hessian function");
108962fef451SLois Curfman McInnes   ierr = (*snes->computejacobian)(snes,x,A,B,flag,snes->jacP); CHKERRQ(ierr);
1090d64ed03dSBarry Smith   PetscStackPop;
109162fef451SLois Curfman McInnes   PLogEventEnd(SNES_HessianEval,snes,x,*A,*B);
10920f4a323eSLois Curfman McInnes   /* make sure user returned a correct Jacobian and preconditioner */
109377c4ece6SBarry Smith   PetscValidHeaderSpecific(*A,MAT_COOKIE);
109477c4ece6SBarry Smith   PetscValidHeaderSpecific(*B,MAT_COOKIE);
10953a40ed3dSBarry Smith   PetscFunctionReturn(0);
10969b94acceSBarry Smith }
10979b94acceSBarry Smith 
10985615d1e5SSatish Balay #undef __FUNC__
1099d4bb536fSBarry Smith #define __FUNC__ "SNESSetJacobian"
11009b94acceSBarry Smith /*@C
11019b94acceSBarry Smith    SNESSetJacobian - Sets the function to compute Jacobian as well as the
1102044dda88SLois Curfman McInnes    location to store the matrix.
11039b94acceSBarry Smith 
1104c7afd0dbSLois Curfman McInnes    Collective on SNES and Mat
1105c7afd0dbSLois Curfman McInnes 
11069b94acceSBarry Smith    Input Parameters:
1107c7afd0dbSLois Curfman McInnes +  snes - the SNES context
11089b94acceSBarry Smith .  A - Jacobian matrix
11099b94acceSBarry Smith .  B - preconditioner matrix (usually same as the Jacobian)
11109b94acceSBarry Smith .  func - Jacobian evaluation routine
1111c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined context for private data for the
11122cd2dfdcSLois Curfman McInnes          Jacobian evaluation routine (may be PETSC_NULL)
11139b94acceSBarry Smith 
11149b94acceSBarry Smith    Calling sequence of func:
11158d76a1e5SLois Curfman McInnes $     func (SNES snes,Vec x,Mat *A,Mat *B,int *flag,void *ctx);
11169b94acceSBarry Smith 
1117c7afd0dbSLois Curfman McInnes +  x - input vector
11189b94acceSBarry Smith .  A - Jacobian matrix
11199b94acceSBarry Smith .  B - preconditioner matrix, usually the same as A
1120ac21db08SLois Curfman McInnes .  flag - flag indicating information about the preconditioner matrix
1121ac21db08SLois Curfman McInnes    structure (same as flag in SLESSetOperators())
1122c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined Jacobian context
11239b94acceSBarry Smith 
11249b94acceSBarry Smith    Notes:
1125dc5a77f8SLois Curfman McInnes    See SLESSetOperators() for important information about setting the flag
11262cd2dfdcSLois Curfman McInnes    output parameter in the routine func().  Be sure to read this information!
1127ac21db08SLois Curfman McInnes 
1128ac21db08SLois Curfman McInnes    The routine func() takes Mat * as the matrix arguments rather than Mat.
11299b94acceSBarry Smith    This allows the Jacobian evaluation routine to replace A and/or B with a
11309b94acceSBarry Smith    completely new new matrix structure (not just different matrix elements)
11319b94acceSBarry Smith    when appropriate, for instance, if the nonzero structure is changing
11329b94acceSBarry Smith    throughout the global iterations.
11339b94acceSBarry Smith 
113436851e7fSLois Curfman McInnes    Level: beginner
113536851e7fSLois Curfman McInnes 
11369b94acceSBarry Smith .keywords: SNES, nonlinear, set, Jacobian, matrix
11379b94acceSBarry Smith 
1138ac21db08SLois Curfman McInnes .seealso: SLESSetOperators(), SNESSetFunction()
11399b94acceSBarry Smith @*/
11409b94acceSBarry Smith int SNESSetJacobian(SNES snes,Mat A,Mat B,int (*func)(SNES,Vec,Mat*,Mat*,
11419b94acceSBarry Smith                     MatStructure*,void*),void *ctx)
11429b94acceSBarry Smith {
11433a40ed3dSBarry Smith   PetscFunctionBegin;
114477c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1145a8c6a408SBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
1146a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_NONLINEAR_EQUATIONS only");
1147a8c6a408SBarry Smith   }
11489b94acceSBarry Smith   snes->computejacobian = func;
11499b94acceSBarry Smith   snes->jacP            = ctx;
11509b94acceSBarry Smith   snes->jacobian        = A;
11519b94acceSBarry Smith   snes->jacobian_pre    = B;
11523a40ed3dSBarry Smith   PetscFunctionReturn(0);
11539b94acceSBarry Smith }
115462fef451SLois Curfman McInnes 
11555615d1e5SSatish Balay #undef __FUNC__
1156d4bb536fSBarry Smith #define __FUNC__ "SNESGetJacobian"
1157b4fd4287SBarry Smith /*@
1158b4fd4287SBarry Smith    SNESGetJacobian - Returns the Jacobian matrix and optionally the user
1159b4fd4287SBarry Smith    provided context for evaluating the Jacobian.
1160b4fd4287SBarry Smith 
1161c7afd0dbSLois Curfman McInnes    Not Collective, but Mat object will be parallel if SNES object is
1162c7afd0dbSLois Curfman McInnes 
1163b4fd4287SBarry Smith    Input Parameter:
1164b4fd4287SBarry Smith .  snes - the nonlinear solver context
1165b4fd4287SBarry Smith 
1166b4fd4287SBarry Smith    Output Parameters:
1167c7afd0dbSLois Curfman McInnes +  A - location to stash Jacobian matrix (or PETSC_NULL)
1168b4fd4287SBarry Smith .  B - location to stash preconditioner matrix (or PETSC_NULL)
1169c7afd0dbSLois Curfman McInnes -  ctx - location to stash Jacobian ctx (or PETSC_NULL)
1170fee21e36SBarry Smith 
117136851e7fSLois Curfman McInnes    Level: advanced
117236851e7fSLois Curfman McInnes 
1173b4fd4287SBarry Smith .seealso: SNESSetJacobian(), SNESComputeJacobian()
1174b4fd4287SBarry Smith @*/
1175b4fd4287SBarry Smith int SNESGetJacobian(SNES snes,Mat *A,Mat *B, void **ctx)
1176b4fd4287SBarry Smith {
11773a40ed3dSBarry Smith   PetscFunctionBegin;
11783a40ed3dSBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
1179a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_NONLINEAR_EQUATIONS only");
11803a40ed3dSBarry Smith   }
1181b4fd4287SBarry Smith   if (A)   *A = snes->jacobian;
1182b4fd4287SBarry Smith   if (B)   *B = snes->jacobian_pre;
1183b4fd4287SBarry Smith   if (ctx) *ctx = snes->jacP;
11843a40ed3dSBarry Smith   PetscFunctionReturn(0);
1185b4fd4287SBarry Smith }
1186b4fd4287SBarry Smith 
11875615d1e5SSatish Balay #undef __FUNC__
1188d4bb536fSBarry Smith #define __FUNC__ "SNESSetHessian"
11899b94acceSBarry Smith /*@C
11909b94acceSBarry Smith    SNESSetHessian - Sets the function to compute Hessian as well as the
1191044dda88SLois Curfman McInnes    location to store the matrix.
11929b94acceSBarry Smith 
1193c7afd0dbSLois Curfman McInnes    Collective on SNES and Mat
1194c7afd0dbSLois Curfman McInnes 
11959b94acceSBarry Smith    Input Parameters:
1196c7afd0dbSLois Curfman McInnes +  snes - the SNES context
11979b94acceSBarry Smith .  A - Hessian matrix
11989b94acceSBarry Smith .  B - preconditioner matrix (usually same as the Hessian)
11999b94acceSBarry Smith .  func - Jacobian evaluation routine
1200c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined context for private data for the
1201313e4042SLois Curfman McInnes          Hessian evaluation routine (may be PETSC_NULL)
12029b94acceSBarry Smith 
12039b94acceSBarry Smith    Calling sequence of func:
12048d76a1e5SLois Curfman McInnes $    func (SNES snes,Vec x,Mat *A,Mat *B,int *flag,void *ctx);
12059b94acceSBarry Smith 
1206c7afd0dbSLois Curfman McInnes +  x - input vector
12079b94acceSBarry Smith .  A - Hessian matrix
12089b94acceSBarry Smith .  B - preconditioner matrix, usually the same as A
1209ac21db08SLois Curfman McInnes .  flag - flag indicating information about the preconditioner matrix
1210ac21db08SLois Curfman McInnes    structure (same as flag in SLESSetOperators())
1211c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined Hessian context
12129b94acceSBarry Smith 
12139b94acceSBarry Smith    Notes:
1214dc5a77f8SLois Curfman McInnes    See SLESSetOperators() for important information about setting the flag
12152cd2dfdcSLois Curfman McInnes    output parameter in the routine func().  Be sure to read this information!
1216ac21db08SLois Curfman McInnes 
12179b94acceSBarry Smith    The function func() takes Mat * as the matrix arguments rather than Mat.
12189b94acceSBarry Smith    This allows the Hessian evaluation routine to replace A and/or B with a
12199b94acceSBarry Smith    completely new new matrix structure (not just different matrix elements)
12209b94acceSBarry Smith    when appropriate, for instance, if the nonzero structure is changing
12219b94acceSBarry Smith    throughout the global iterations.
12229b94acceSBarry Smith 
122336851e7fSLois Curfman McInnes    Level: beginner
122436851e7fSLois Curfman McInnes 
12259b94acceSBarry Smith .keywords: SNES, nonlinear, set, Hessian, matrix
12269b94acceSBarry Smith 
1227ac21db08SLois Curfman McInnes .seealso: SNESSetMinimizationFunction(), SNESSetGradient(), SLESSetOperators()
12289b94acceSBarry Smith @*/
12299b94acceSBarry Smith int SNESSetHessian(SNES snes,Mat A,Mat B,int (*func)(SNES,Vec,Mat*,Mat*,
12309b94acceSBarry Smith                     MatStructure*,void*),void *ctx)
12319b94acceSBarry Smith {
12323a40ed3dSBarry Smith   PetscFunctionBegin;
123377c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1234d4bb536fSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
1235a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_UNCONSTRAINED_MINIMIZATION only");
1236d4bb536fSBarry Smith   }
12379b94acceSBarry Smith   snes->computejacobian = func;
12389b94acceSBarry Smith   snes->jacP            = ctx;
12399b94acceSBarry Smith   snes->jacobian        = A;
12409b94acceSBarry Smith   snes->jacobian_pre    = B;
12413a40ed3dSBarry Smith   PetscFunctionReturn(0);
12429b94acceSBarry Smith }
12439b94acceSBarry Smith 
12445615d1e5SSatish Balay #undef __FUNC__
1245d4bb536fSBarry Smith #define __FUNC__ "SNESGetHessian"
124662fef451SLois Curfman McInnes /*@
124762fef451SLois Curfman McInnes    SNESGetHessian - Returns the Hessian matrix and optionally the user
124862fef451SLois Curfman McInnes    provided context for evaluating the Hessian.
124962fef451SLois Curfman McInnes 
1250c7afd0dbSLois Curfman McInnes    Not Collective, but Mat object is parallel if SNES object is parallel
1251c7afd0dbSLois Curfman McInnes 
125262fef451SLois Curfman McInnes    Input Parameter:
125362fef451SLois Curfman McInnes .  snes - the nonlinear solver context
125462fef451SLois Curfman McInnes 
125562fef451SLois Curfman McInnes    Output Parameters:
1256c7afd0dbSLois Curfman McInnes +  A - location to stash Hessian matrix (or PETSC_NULL)
125762fef451SLois Curfman McInnes .  B - location to stash preconditioner matrix (or PETSC_NULL)
1258c7afd0dbSLois Curfman McInnes -  ctx - location to stash Hessian ctx (or PETSC_NULL)
1259fee21e36SBarry Smith 
126036851e7fSLois Curfman McInnes    Level: advanced
126136851e7fSLois Curfman McInnes 
126262fef451SLois Curfman McInnes .seealso: SNESSetHessian(), SNESComputeHessian()
1263c7afd0dbSLois Curfman McInnes 
1264c7afd0dbSLois Curfman McInnes .keywords: SNES, get, Hessian
126562fef451SLois Curfman McInnes @*/
126662fef451SLois Curfman McInnes int SNESGetHessian(SNES snes,Mat *A,Mat *B, void **ctx)
126762fef451SLois Curfman McInnes {
12683a40ed3dSBarry Smith   PetscFunctionBegin;
12693a40ed3dSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION){
1270a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_UNCONSTRAINED_MINIMIZATION only");
12713a40ed3dSBarry Smith   }
127262fef451SLois Curfman McInnes   if (A)   *A = snes->jacobian;
127362fef451SLois Curfman McInnes   if (B)   *B = snes->jacobian_pre;
127462fef451SLois Curfman McInnes   if (ctx) *ctx = snes->jacP;
12753a40ed3dSBarry Smith   PetscFunctionReturn(0);
127662fef451SLois Curfman McInnes }
127762fef451SLois Curfman McInnes 
12789b94acceSBarry Smith /* ----- Routines to initialize and destroy a nonlinear solver ---- */
12799b94acceSBarry Smith 
12805615d1e5SSatish Balay #undef __FUNC__
12815615d1e5SSatish Balay #define __FUNC__ "SNESSetUp"
12829b94acceSBarry Smith /*@
12839b94acceSBarry Smith    SNESSetUp - Sets up the internal data structures for the later use
1284272ac6f2SLois Curfman McInnes    of a nonlinear solver.
12859b94acceSBarry Smith 
1286fee21e36SBarry Smith    Collective on SNES
1287fee21e36SBarry Smith 
1288c7afd0dbSLois Curfman McInnes    Input Parameters:
1289c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1290c7afd0dbSLois Curfman McInnes -  x - the solution vector
1291c7afd0dbSLois Curfman McInnes 
1292272ac6f2SLois Curfman McInnes    Notes:
1293272ac6f2SLois Curfman McInnes    For basic use of the SNES solvers the user need not explicitly call
1294272ac6f2SLois Curfman McInnes    SNESSetUp(), since these actions will automatically occur during
1295272ac6f2SLois Curfman McInnes    the call to SNESSolve().  However, if one wishes to control this
1296272ac6f2SLois Curfman McInnes    phase separately, SNESSetUp() should be called after SNESCreate()
1297272ac6f2SLois Curfman McInnes    and optional routines of the form SNESSetXXX(), but before SNESSolve().
1298272ac6f2SLois Curfman McInnes 
129936851e7fSLois Curfman McInnes    Level: advanced
130036851e7fSLois Curfman McInnes 
13019b94acceSBarry Smith .keywords: SNES, nonlinear, setup
13029b94acceSBarry Smith 
13039b94acceSBarry Smith .seealso: SNESCreate(), SNESSolve(), SNESDestroy()
13049b94acceSBarry Smith @*/
13058ddd3da0SLois Curfman McInnes int SNESSetUp(SNES snes,Vec x)
13069b94acceSBarry Smith {
1307272ac6f2SLois Curfman McInnes   int ierr, flg;
13083a40ed3dSBarry Smith 
13093a40ed3dSBarry Smith   PetscFunctionBegin;
131077c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
131177c4ece6SBarry Smith   PetscValidHeaderSpecific(x,VEC_COOKIE);
13128ddd3da0SLois Curfman McInnes   snes->vec_sol = snes->vec_sol_always = x;
13139b94acceSBarry Smith 
1314c1f60f51SBarry Smith   ierr = OptionsHasName(snes->prefix,"-snes_mf_operator", &flg);  CHKERRQ(ierr);
1315c1f60f51SBarry Smith   /*
1316c1f60f51SBarry Smith       This version replaces the user provided Jacobian matrix with a
1317dfa02198SLois Curfman McInnes       matrix-free version but still employs the user-provided preconditioner matrix
1318c1f60f51SBarry Smith   */
1319c1f60f51SBarry Smith   if (flg) {
1320c1f60f51SBarry Smith     Mat J;
1321e24b481bSBarry Smith     ierr = MatCreateSNESFDMF(snes,snes->vec_sol,&J);CHKERRQ(ierr);
1322c1f60f51SBarry Smith     PLogObjectParent(snes,J);
1323c1f60f51SBarry Smith     snes->mfshell = J;
1324c1f60f51SBarry Smith     if (snes->method_class == SNES_NONLINEAR_EQUATIONS) {
1325c1f60f51SBarry Smith       snes->jacobian = J;
1326c1f60f51SBarry Smith       PLogInfo(snes,"SNESSetUp: Setting default matrix-free operator Jacobian routines\n");
1327d64ed03dSBarry Smith     } else if (snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) {
1328c1f60f51SBarry Smith       snes->jacobian = J;
1329c1f60f51SBarry Smith       PLogInfo(snes,"SNESSetUp: Setting default matrix-free operator Hessian routines\n");
1330d4bb536fSBarry Smith     } else {
1331a8c6a408SBarry Smith       SETERRQ(PETSC_ERR_SUP,0,"Method class doesn't support matrix-free operator option");
1332d4bb536fSBarry Smith     }
1333e24b481bSBarry Smith     ierr = MatSNESFDMFSetFromOptions(J);CHKERRQ(ierr);
1334c1f60f51SBarry Smith   }
1335272ac6f2SLois Curfman McInnes   ierr = OptionsHasName(snes->prefix,"-snes_mf", &flg);  CHKERRQ(ierr);
1336c1f60f51SBarry Smith   /*
1337dfa02198SLois Curfman McInnes       This version replaces both the user-provided Jacobian and the user-
1338c1f60f51SBarry Smith       provided preconditioner matrix with the default matrix free version.
1339c1f60f51SBarry Smith    */
134031615d04SLois Curfman McInnes   if (flg) {
1341272ac6f2SLois Curfman McInnes     Mat J;
1342e24b481bSBarry Smith     ierr = MatCreateSNESFDMF(snes,snes->vec_sol,&J);CHKERRQ(ierr);
1343272ac6f2SLois Curfman McInnes     PLogObjectParent(snes,J);
1344272ac6f2SLois Curfman McInnes     snes->mfshell = J;
134583e56afdSLois Curfman McInnes     if (snes->method_class == SNES_NONLINEAR_EQUATIONS) {
134683e56afdSLois Curfman McInnes       ierr = SNESSetJacobian(snes,J,J,0,snes->funP); CHKERRQ(ierr);
134794a424c1SBarry Smith       PLogInfo(snes,"SNESSetUp: Setting default matrix-free Jacobian routines\n");
1348d64ed03dSBarry Smith     } else if (snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) {
134983e56afdSLois Curfman McInnes       ierr = SNESSetHessian(snes,J,J,0,snes->funP); CHKERRQ(ierr);
135094a424c1SBarry Smith       PLogInfo(snes,"SNESSetUp: Setting default matrix-free Hessian routines\n");
1351d4bb536fSBarry Smith     } else {
1352a8c6a408SBarry Smith       SETERRQ(PETSC_ERR_SUP,0,"Method class doesn't support matrix-free option");
1353d4bb536fSBarry Smith     }
1354e24b481bSBarry Smith     ierr = MatSNESFDMFSetFromOptions(J);CHKERRQ(ierr);
1355272ac6f2SLois Curfman McInnes   }
13569b94acceSBarry Smith   if ((snes->method_class == SNES_NONLINEAR_EQUATIONS)) {
1357a8c6a408SBarry Smith     if (!snes->vec_func) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call SNESSetFunction() first");
1358a8c6a408SBarry Smith     if (!snes->computefunction) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call SNESSetFunction() first");
1359a8c6a408SBarry Smith     if (!snes->jacobian) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call SNESSetJacobian() first");
1360a8c6a408SBarry Smith     if (snes->vec_func == snes->vec_sol) {
1361a8c6a408SBarry Smith       SETERRQ(PETSC_ERR_ARG_IDN,0,"Solution vector cannot be function vector");
1362a8c6a408SBarry Smith     }
1363a703fe33SLois Curfman McInnes 
1364a703fe33SLois Curfman McInnes     /* Set the KSP stopping criterion to use the Eisenstat-Walker method */
136582bf6240SBarry Smith     if (snes->ksp_ewconv && PetscStrcmp(snes->type_name,SNES_EQ_TR)) {
1366a703fe33SLois Curfman McInnes       SLES sles; KSP ksp;
1367a703fe33SLois Curfman McInnes       ierr = SNESGetSLES(snes,&sles); CHKERRQ(ierr);
1368a703fe33SLois Curfman McInnes       ierr = SLESGetKSP(sles,&ksp); CHKERRQ(ierr);
1369a703fe33SLois Curfman McInnes       ierr = KSPSetConvergenceTest(ksp,SNES_KSP_EW_Converged_Private,
1370a703fe33SLois Curfman McInnes              (void *)snes); CHKERRQ(ierr);
1371a703fe33SLois Curfman McInnes     }
13729b94acceSBarry Smith   } else if ((snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION)) {
1373a8c6a408SBarry Smith     if (!snes->vec_func) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call SNESSetGradient() first");
1374a8c6a408SBarry Smith     if (!snes->computefunction) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call SNESSetGradient() first");
1375a8c6a408SBarry Smith     if (!snes->computeumfunction) {
1376a8c6a408SBarry Smith       SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call SNESSetMinimizationFunction() first");
1377a8c6a408SBarry Smith     }
1378a8c6a408SBarry Smith     if (!snes->jacobian) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call SNESSetHessian() first");
1379d4bb536fSBarry Smith   } else {
1380a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,0,"Unknown method class");
1381d4bb536fSBarry Smith   }
1382a703fe33SLois Curfman McInnes   if (snes->setup) {ierr = (*snes->setup)(snes); CHKERRQ(ierr);}
138382bf6240SBarry Smith   snes->setupcalled = 1;
13843a40ed3dSBarry Smith   PetscFunctionReturn(0);
13859b94acceSBarry Smith }
13869b94acceSBarry Smith 
13875615d1e5SSatish Balay #undef __FUNC__
1388d4bb536fSBarry Smith #define __FUNC__ "SNESDestroy"
13899b94acceSBarry Smith /*@C
13909b94acceSBarry Smith    SNESDestroy - Destroys the nonlinear solver context that was created
13919b94acceSBarry Smith    with SNESCreate().
13929b94acceSBarry Smith 
1393c7afd0dbSLois Curfman McInnes    Collective on SNES
1394c7afd0dbSLois Curfman McInnes 
13959b94acceSBarry Smith    Input Parameter:
13969b94acceSBarry Smith .  snes - the SNES context
13979b94acceSBarry Smith 
139836851e7fSLois Curfman McInnes    Level: beginner
139936851e7fSLois Curfman McInnes 
14009b94acceSBarry Smith .keywords: SNES, nonlinear, destroy
14019b94acceSBarry Smith 
140263a78c88SLois Curfman McInnes .seealso: SNESCreate(), SNESSolve()
14039b94acceSBarry Smith @*/
14049b94acceSBarry Smith int SNESDestroy(SNES snes)
14059b94acceSBarry Smith {
14069b94acceSBarry Smith   int ierr;
14073a40ed3dSBarry Smith 
14083a40ed3dSBarry Smith   PetscFunctionBegin;
140977c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
14103a40ed3dSBarry Smith   if (--snes->refct > 0) PetscFunctionReturn(0);
1411d4bb536fSBarry Smith 
1412e1311b90SBarry Smith   if (snes->destroy) {ierr = (*(snes)->destroy)(snes); CHKERRQ(ierr);}
14130452661fSBarry Smith   if (snes->kspconvctx) PetscFree(snes->kspconvctx);
1414522c5e43SBarry Smith   if (snes->mfshell) {ierr = MatDestroy(snes->mfshell);CHKERRQ(ierr);}
14159b94acceSBarry Smith   ierr = SLESDestroy(snes->sles); CHKERRQ(ierr);
1416522c5e43SBarry Smith   if (snes->xmonitor) {ierr = SNESLGMonitorDestroy(snes->xmonitor);CHKERRQ(ierr);}
1417522c5e43SBarry Smith   if (snes->vwork) {ierr = VecDestroyVecs(snes->vwork,snes->nvwork);CHKERRQ(ierr);}
14189b94acceSBarry Smith   PLogObjectDestroy((PetscObject)snes);
14190452661fSBarry Smith   PetscHeaderDestroy((PetscObject)snes);
14203a40ed3dSBarry Smith   PetscFunctionReturn(0);
14219b94acceSBarry Smith }
14229b94acceSBarry Smith 
14239b94acceSBarry Smith /* ----------- Routines to set solver parameters ---------- */
14249b94acceSBarry Smith 
14255615d1e5SSatish Balay #undef __FUNC__
14265615d1e5SSatish Balay #define __FUNC__ "SNESSetTolerances"
14279b94acceSBarry Smith /*@
1428d7a720efSLois Curfman McInnes    SNESSetTolerances - Sets various parameters used in convergence tests.
14299b94acceSBarry Smith 
1430c7afd0dbSLois Curfman McInnes    Collective on SNES
1431c7afd0dbSLois Curfman McInnes 
14329b94acceSBarry Smith    Input Parameters:
1433c7afd0dbSLois Curfman McInnes +  snes - the SNES context
143433174efeSLois Curfman McInnes .  atol - absolute convergence tolerance
143533174efeSLois Curfman McInnes .  rtol - relative convergence tolerance
143633174efeSLois Curfman McInnes .  stol -  convergence tolerance in terms of the norm
143733174efeSLois Curfman McInnes            of the change in the solution between steps
143833174efeSLois Curfman McInnes .  maxit - maximum number of iterations
1439c7afd0dbSLois Curfman McInnes -  maxf - maximum number of function evaluations
1440fee21e36SBarry Smith 
144133174efeSLois Curfman McInnes    Options Database Keys:
1442c7afd0dbSLois Curfman McInnes +    -snes_atol <atol> - Sets atol
1443c7afd0dbSLois Curfman McInnes .    -snes_rtol <rtol> - Sets rtol
1444c7afd0dbSLois Curfman McInnes .    -snes_stol <stol> - Sets stol
1445c7afd0dbSLois Curfman McInnes .    -snes_max_it <maxit> - Sets maxit
1446c7afd0dbSLois Curfman McInnes -    -snes_max_funcs <maxf> - Sets maxf
14479b94acceSBarry Smith 
1448d7a720efSLois Curfman McInnes    Notes:
14499b94acceSBarry Smith    The default maximum number of iterations is 50.
14509b94acceSBarry Smith    The default maximum number of function evaluations is 1000.
14519b94acceSBarry Smith 
145236851e7fSLois Curfman McInnes    Level: intermediate
145336851e7fSLois Curfman McInnes 
145433174efeSLois Curfman McInnes .keywords: SNES, nonlinear, set, convergence, tolerances
14559b94acceSBarry Smith 
1456d7a720efSLois Curfman McInnes .seealso: SNESSetTrustRegionTolerance(), SNESSetMinimizationFunctionTolerance()
14579b94acceSBarry Smith @*/
1458d7a720efSLois Curfman McInnes int SNESSetTolerances(SNES snes,double atol,double rtol,double stol,int maxit,int maxf)
14599b94acceSBarry Smith {
14603a40ed3dSBarry Smith   PetscFunctionBegin;
146177c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1462d7a720efSLois Curfman McInnes   if (atol != PETSC_DEFAULT)  snes->atol      = atol;
1463d7a720efSLois Curfman McInnes   if (rtol != PETSC_DEFAULT)  snes->rtol      = rtol;
1464d7a720efSLois Curfman McInnes   if (stol != PETSC_DEFAULT)  snes->xtol      = stol;
1465d7a720efSLois Curfman McInnes   if (maxit != PETSC_DEFAULT) snes->max_its   = maxit;
1466d7a720efSLois Curfman McInnes   if (maxf != PETSC_DEFAULT)  snes->max_funcs = maxf;
14673a40ed3dSBarry Smith   PetscFunctionReturn(0);
14689b94acceSBarry Smith }
14699b94acceSBarry Smith 
14705615d1e5SSatish Balay #undef __FUNC__
14715615d1e5SSatish Balay #define __FUNC__ "SNESGetTolerances"
14729b94acceSBarry Smith /*@
147333174efeSLois Curfman McInnes    SNESGetTolerances - Gets various parameters used in convergence tests.
147433174efeSLois Curfman McInnes 
1475c7afd0dbSLois Curfman McInnes    Not Collective
1476c7afd0dbSLois Curfman McInnes 
147733174efeSLois Curfman McInnes    Input Parameters:
1478c7afd0dbSLois Curfman McInnes +  snes - the SNES context
147933174efeSLois Curfman McInnes .  atol - absolute convergence tolerance
148033174efeSLois Curfman McInnes .  rtol - relative convergence tolerance
148133174efeSLois Curfman McInnes .  stol -  convergence tolerance in terms of the norm
148233174efeSLois Curfman McInnes            of the change in the solution between steps
148333174efeSLois Curfman McInnes .  maxit - maximum number of iterations
1484c7afd0dbSLois Curfman McInnes -  maxf - maximum number of function evaluations
1485fee21e36SBarry Smith 
148633174efeSLois Curfman McInnes    Notes:
148733174efeSLois Curfman McInnes    The user can specify PETSC_NULL for any parameter that is not needed.
148833174efeSLois Curfman McInnes 
148936851e7fSLois Curfman McInnes    Level: intermediate
149036851e7fSLois Curfman McInnes 
149133174efeSLois Curfman McInnes .keywords: SNES, nonlinear, get, convergence, tolerances
149233174efeSLois Curfman McInnes 
149333174efeSLois Curfman McInnes .seealso: SNESSetTolerances()
149433174efeSLois Curfman McInnes @*/
149533174efeSLois Curfman McInnes int SNESGetTolerances(SNES snes,double *atol,double *rtol,double *stol,int *maxit,int *maxf)
149633174efeSLois Curfman McInnes {
14973a40ed3dSBarry Smith   PetscFunctionBegin;
149833174efeSLois Curfman McInnes   PetscValidHeaderSpecific(snes,SNES_COOKIE);
149933174efeSLois Curfman McInnes   if (atol)  *atol  = snes->atol;
150033174efeSLois Curfman McInnes   if (rtol)  *rtol  = snes->rtol;
150133174efeSLois Curfman McInnes   if (stol)  *stol  = snes->xtol;
150233174efeSLois Curfman McInnes   if (maxit) *maxit = snes->max_its;
150333174efeSLois Curfman McInnes   if (maxf)  *maxf  = snes->max_funcs;
15043a40ed3dSBarry Smith   PetscFunctionReturn(0);
150533174efeSLois Curfman McInnes }
150633174efeSLois Curfman McInnes 
15075615d1e5SSatish Balay #undef __FUNC__
15085615d1e5SSatish Balay #define __FUNC__ "SNESSetTrustRegionTolerance"
150933174efeSLois Curfman McInnes /*@
15109b94acceSBarry Smith    SNESSetTrustRegionTolerance - Sets the trust region parameter tolerance.
15119b94acceSBarry Smith 
1512fee21e36SBarry Smith    Collective on SNES
1513fee21e36SBarry Smith 
1514c7afd0dbSLois Curfman McInnes    Input Parameters:
1515c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1516c7afd0dbSLois Curfman McInnes -  tol - tolerance
1517c7afd0dbSLois Curfman McInnes 
15189b94acceSBarry Smith    Options Database Key:
1519c7afd0dbSLois Curfman McInnes .  -snes_trtol <tol> - Sets tol
15209b94acceSBarry Smith 
152136851e7fSLois Curfman McInnes    Level: intermediate
152236851e7fSLois Curfman McInnes 
15239b94acceSBarry Smith .keywords: SNES, nonlinear, set, trust region, tolerance
15249b94acceSBarry Smith 
1525d7a720efSLois Curfman McInnes .seealso: SNESSetTolerances(), SNESSetMinimizationFunctionTolerance()
15269b94acceSBarry Smith @*/
15279b94acceSBarry Smith int SNESSetTrustRegionTolerance(SNES snes,double tol)
15289b94acceSBarry Smith {
15293a40ed3dSBarry Smith   PetscFunctionBegin;
153077c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
15319b94acceSBarry Smith   snes->deltatol = tol;
15323a40ed3dSBarry Smith   PetscFunctionReturn(0);
15339b94acceSBarry Smith }
15349b94acceSBarry Smith 
15355615d1e5SSatish Balay #undef __FUNC__
15365615d1e5SSatish Balay #define __FUNC__ "SNESSetMinimizationFunctionTolerance"
15379b94acceSBarry Smith /*@
153877c4ece6SBarry Smith    SNESSetMinimizationFunctionTolerance - Sets the minimum allowable function tolerance
15399b94acceSBarry Smith    for unconstrained minimization solvers.
15409b94acceSBarry Smith 
1541fee21e36SBarry Smith    Collective on SNES
1542fee21e36SBarry Smith 
1543c7afd0dbSLois Curfman McInnes    Input Parameters:
1544c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1545c7afd0dbSLois Curfman McInnes -  ftol - minimum function tolerance
1546c7afd0dbSLois Curfman McInnes 
15479b94acceSBarry Smith    Options Database Key:
1548c7afd0dbSLois Curfman McInnes .  -snes_fmin <ftol> - Sets ftol
15499b94acceSBarry Smith 
15509b94acceSBarry Smith    Note:
155177c4ece6SBarry Smith    SNESSetMinimizationFunctionTolerance() is valid for SNES_UNCONSTRAINED_MINIMIZATION
15529b94acceSBarry Smith    methods only.
15539b94acceSBarry Smith 
155436851e7fSLois Curfman McInnes    Level: intermediate
155536851e7fSLois Curfman McInnes 
15569b94acceSBarry Smith .keywords: SNES, nonlinear, set, minimum, convergence, function, tolerance
15579b94acceSBarry Smith 
1558d7a720efSLois Curfman McInnes .seealso: SNESSetTolerances(), SNESSetTrustRegionTolerance()
15599b94acceSBarry Smith @*/
156077c4ece6SBarry Smith int SNESSetMinimizationFunctionTolerance(SNES snes,double ftol)
15619b94acceSBarry Smith {
15623a40ed3dSBarry Smith   PetscFunctionBegin;
156377c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
15649b94acceSBarry Smith   snes->fmin = ftol;
15653a40ed3dSBarry Smith   PetscFunctionReturn(0);
15669b94acceSBarry Smith }
15679b94acceSBarry Smith 
1568ce1608b8SBarry Smith #undef __FUNC__
1569ce1608b8SBarry Smith #define __FUNC__ "SNESLGMonitor"
1570ce1608b8SBarry Smith int SNESLGMonitor(SNES snes,int it,double norm,void *ctx)
1571ce1608b8SBarry Smith {
1572ce1608b8SBarry Smith   int ierr;
1573ce1608b8SBarry Smith 
1574ce1608b8SBarry Smith   PetscFunctionBegin;
1575ce1608b8SBarry Smith   ierr = KSPLGMonitor((KSP)snes,it,norm,ctx);CHKERRQ(ierr);
1576ce1608b8SBarry Smith   PetscFunctionReturn(0);
1577ce1608b8SBarry Smith }
1578ce1608b8SBarry Smith 
15799b94acceSBarry Smith /* ------------ Routines to set performance monitoring options ----------- */
15809b94acceSBarry Smith 
15815615d1e5SSatish Balay #undef __FUNC__
1582d4bb536fSBarry Smith #define __FUNC__ "SNESSetMonitor"
15839b94acceSBarry Smith /*@C
15845cd90555SBarry Smith    SNESSetMonitor - Sets an ADDITIONAL function that is to be used at every
15859b94acceSBarry Smith    iteration of the nonlinear solver to display the iteration's
15869b94acceSBarry Smith    progress.
15879b94acceSBarry Smith 
1588fee21e36SBarry Smith    Collective on SNES
1589fee21e36SBarry Smith 
1590c7afd0dbSLois Curfman McInnes    Input Parameters:
1591c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1592c7afd0dbSLois Curfman McInnes .  func - monitoring routine
1593c7afd0dbSLois Curfman McInnes -  mctx - [optional] user-defined context for private data for the
1594c7afd0dbSLois Curfman McInnes           monitor routine (may be PETSC_NULL)
15959b94acceSBarry Smith 
1596c7afd0dbSLois Curfman McInnes    Calling sequence of func:
159740a0c1c6SLois Curfman McInnes $     int func(SNES snes,int its, double norm,void *mctx)
1598c7afd0dbSLois Curfman McInnes 
1599c7afd0dbSLois Curfman McInnes +    snes - the SNES context
1600c7afd0dbSLois Curfman McInnes .    its - iteration number
1601c7afd0dbSLois Curfman McInnes .    norm - 2-norm function value (may be estimated)
1602c7afd0dbSLois Curfman McInnes             for SNES_NONLINEAR_EQUATIONS methods
160340a0c1c6SLois Curfman McInnes .    norm - 2-norm gradient value (may be estimated)
1604c7afd0dbSLois Curfman McInnes             for SNES_UNCONSTRAINED_MINIMIZATION methods
160540a0c1c6SLois Curfman McInnes -    mctx - [optional] monitoring context
16069b94acceSBarry Smith 
16079665c990SLois Curfman McInnes    Options Database Keys:
1608c7afd0dbSLois Curfman McInnes +    -snes_monitor        - sets SNESDefaultMonitor()
1609c7afd0dbSLois Curfman McInnes .    -snes_xmonitor       - sets line graph monitor,
1610c7afd0dbSLois Curfman McInnes                             uses SNESLGMonitorCreate()
1611c7afd0dbSLois Curfman McInnes _    -snes_cancelmonitors - cancels all monitors that have
1612c7afd0dbSLois Curfman McInnes                             been hardwired into a code by
1613c7afd0dbSLois Curfman McInnes                             calls to SNESSetMonitor(), but
1614c7afd0dbSLois Curfman McInnes                             does not cancel those set via
1615c7afd0dbSLois Curfman McInnes                             the options database.
16169665c990SLois Curfman McInnes 
1617639f9d9dSBarry Smith    Notes:
16186bc08f3fSLois Curfman McInnes    Several different monitoring routines may be set by calling
16196bc08f3fSLois Curfman McInnes    SNESSetMonitor() multiple times; all will be called in the
16206bc08f3fSLois Curfman McInnes    order in which they were set.
1621639f9d9dSBarry Smith 
162236851e7fSLois Curfman McInnes    Level: intermediate
162336851e7fSLois Curfman McInnes 
16249b94acceSBarry Smith .keywords: SNES, nonlinear, set, monitor
16259b94acceSBarry Smith 
16265cd90555SBarry Smith .seealso: SNESDefaultMonitor(), SNESClearMonitor()
16279b94acceSBarry Smith @*/
162874679c65SBarry Smith int SNESSetMonitor( SNES snes, int (*func)(SNES,int,double,void*),void *mctx )
16299b94acceSBarry Smith {
16303a40ed3dSBarry Smith   PetscFunctionBegin;
1631639f9d9dSBarry Smith   if (snes->numbermonitors >= MAXSNESMONITORS) {
1632a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,0,"Too many monitors set");
1633639f9d9dSBarry Smith   }
1634639f9d9dSBarry Smith 
1635639f9d9dSBarry Smith   snes->monitor[snes->numbermonitors]           = func;
1636639f9d9dSBarry Smith   snes->monitorcontext[snes->numbermonitors++]  = (void*)mctx;
16373a40ed3dSBarry Smith   PetscFunctionReturn(0);
16389b94acceSBarry Smith }
16399b94acceSBarry Smith 
16405615d1e5SSatish Balay #undef __FUNC__
16415cd90555SBarry Smith #define __FUNC__ "SNESClearMonitor"
16425cd90555SBarry Smith /*@C
16435cd90555SBarry Smith    SNESClearMonitor - Clears all the monitor functions for a SNES object.
16445cd90555SBarry Smith 
1645c7afd0dbSLois Curfman McInnes    Collective on SNES
1646c7afd0dbSLois Curfman McInnes 
16475cd90555SBarry Smith    Input Parameters:
16485cd90555SBarry Smith .  snes - the SNES context
16495cd90555SBarry Smith 
16505cd90555SBarry Smith    Options Database:
1651c7afd0dbSLois Curfman McInnes .  -snes_cancelmonitors - cancels all monitors that have been hardwired
1652c7afd0dbSLois Curfman McInnes     into a code by calls to SNESSetMonitor(), but does not cancel those
1653c7afd0dbSLois Curfman McInnes     set via the options database
16545cd90555SBarry Smith 
16555cd90555SBarry Smith    Notes:
16565cd90555SBarry Smith    There is no way to clear one specific monitor from a SNES object.
16575cd90555SBarry Smith 
165836851e7fSLois Curfman McInnes    Level: intermediate
165936851e7fSLois Curfman McInnes 
16605cd90555SBarry Smith .keywords: SNES, nonlinear, set, monitor
16615cd90555SBarry Smith 
16625cd90555SBarry Smith .seealso: SNESDefaultMonitor(), SNESSetMonitor()
16635cd90555SBarry Smith @*/
16645cd90555SBarry Smith int SNESClearMonitor( SNES snes )
16655cd90555SBarry Smith {
16665cd90555SBarry Smith   PetscFunctionBegin;
16675cd90555SBarry Smith   snes->numbermonitors = 0;
16685cd90555SBarry Smith   PetscFunctionReturn(0);
16695cd90555SBarry Smith }
16705cd90555SBarry Smith 
16715cd90555SBarry Smith #undef __FUNC__
1672d4bb536fSBarry Smith #define __FUNC__ "SNESSetConvergenceTest"
16739b94acceSBarry Smith /*@C
16749b94acceSBarry Smith    SNESSetConvergenceTest - Sets the function that is to be used
16759b94acceSBarry Smith    to test for convergence of the nonlinear iterative solution.
16769b94acceSBarry Smith 
1677fee21e36SBarry Smith    Collective on SNES
1678fee21e36SBarry Smith 
1679c7afd0dbSLois Curfman McInnes    Input Parameters:
1680c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1681c7afd0dbSLois Curfman McInnes .  func - routine to test for convergence
1682c7afd0dbSLois Curfman McInnes -  cctx - [optional] context for private data for the convergence routine
1683c7afd0dbSLois Curfman McInnes           (may be PETSC_NULL)
16849b94acceSBarry Smith 
1685c7afd0dbSLois Curfman McInnes    Calling sequence of func:
16868d76a1e5SLois Curfman McInnes $     int func (SNES snes,double xnorm,double gnorm,double f,void *cctx)
1687c7afd0dbSLois Curfman McInnes 
1688c7afd0dbSLois Curfman McInnes +    snes - the SNES context
1689c7afd0dbSLois Curfman McInnes .    cctx - [optional] convergence context
1690c7afd0dbSLois Curfman McInnes .    xnorm - 2-norm of current iterate
1691c7afd0dbSLois Curfman McInnes .    gnorm - 2-norm of current step (SNES_NONLINEAR_EQUATIONS methods)
1692c7afd0dbSLois Curfman McInnes .    f - 2-norm of function (SNES_NONLINEAR_EQUATIONS methods)
1693c7afd0dbSLois Curfman McInnes .    gnorm - 2-norm of current gradient (SNES_UNCONSTRAINED_MINIMIZATION methods)
1694c7afd0dbSLois Curfman McInnes -    f - function value (SNES_UNCONSTRAINED_MINIMIZATION methods)
16959b94acceSBarry Smith 
169636851e7fSLois Curfman McInnes    Level: advanced
169736851e7fSLois Curfman McInnes 
16989b94acceSBarry Smith .keywords: SNES, nonlinear, set, convergence, test
16999b94acceSBarry Smith 
170040191667SLois Curfman McInnes .seealso: SNESConverged_EQ_LS(), SNESConverged_EQ_TR(),
170140191667SLois Curfman McInnes           SNESConverged_UM_LS(), SNESConverged_UM_TR()
17029b94acceSBarry Smith @*/
170374679c65SBarry Smith int SNESSetConvergenceTest(SNES snes,int (*func)(SNES,double,double,double,void*),void *cctx)
17049b94acceSBarry Smith {
17053a40ed3dSBarry Smith   PetscFunctionBegin;
17069b94acceSBarry Smith   (snes)->converged = func;
17079b94acceSBarry Smith   (snes)->cnvP      = cctx;
17083a40ed3dSBarry Smith   PetscFunctionReturn(0);
17099b94acceSBarry Smith }
17109b94acceSBarry Smith 
17115615d1e5SSatish Balay #undef __FUNC__
1712d4bb536fSBarry Smith #define __FUNC__ "SNESSetConvergenceHistory"
1713c9005455SLois Curfman McInnes /*@
1714c9005455SLois Curfman McInnes    SNESSetConvergenceHistory - Sets the array used to hold the convergence history.
1715c9005455SLois Curfman McInnes 
1716fee21e36SBarry Smith    Collective on SNES
1717fee21e36SBarry Smith 
1718c7afd0dbSLois Curfman McInnes    Input Parameters:
1719c7afd0dbSLois Curfman McInnes +  snes - iterative context obtained from SNESCreate()
1720c7afd0dbSLois Curfman McInnes .  a   - array to hold history
1721758f92a0SBarry Smith .  its - integer array holds the number of linear iterations (or
1722758f92a0SBarry Smith          negative if not converged) for each solve.
1723758f92a0SBarry Smith .  na  - size of a and its
1724758f92a0SBarry Smith -  reset - PETSC_TRUTH indicates each new nonlinear solve resets the history counter to zero,
1725758f92a0SBarry Smith            else it continues storing new values for new nonlinear solves after the old ones
1726c7afd0dbSLois Curfman McInnes 
1727c9005455SLois Curfman McInnes    Notes:
1728c9005455SLois Curfman McInnes    If set, this array will contain the function norms (for
1729c9005455SLois Curfman McInnes    SNES_NONLINEAR_EQUATIONS methods) or gradient norms
1730c9005455SLois Curfman McInnes    (for SNES_UNCONSTRAINED_MINIMIZATION methods) computed
1731c9005455SLois Curfman McInnes    at each step.
1732c9005455SLois Curfman McInnes 
1733c9005455SLois Curfman McInnes    This routine is useful, e.g., when running a code for purposes
1734c9005455SLois Curfman McInnes    of accurate performance monitoring, when no I/O should be done
1735c9005455SLois Curfman McInnes    during the section of code that is being timed.
1736c9005455SLois Curfman McInnes 
173736851e7fSLois Curfman McInnes    Level: intermediate
173836851e7fSLois Curfman McInnes 
1739c9005455SLois Curfman McInnes .keywords: SNES, set, convergence, history
1740758f92a0SBarry Smith 
174108405cd6SLois Curfman McInnes .seealso: SNESGetConvergenceHistory()
1742758f92a0SBarry Smith 
1743c9005455SLois Curfman McInnes @*/
1744758f92a0SBarry Smith int SNESSetConvergenceHistory(SNES snes, double *a, int *its,int na,PetscTruth reset)
1745c9005455SLois Curfman McInnes {
17463a40ed3dSBarry Smith   PetscFunctionBegin;
1747c9005455SLois Curfman McInnes   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1748c9005455SLois Curfman McInnes   if (na) PetscValidScalarPointer(a);
1749c9005455SLois Curfman McInnes   snes->conv_hist       = a;
1750758f92a0SBarry Smith   snes->conv_hist_its   = its;
1751758f92a0SBarry Smith   snes->conv_hist_max   = na;
1752758f92a0SBarry Smith   snes->conv_hist_reset = reset;
1753758f92a0SBarry Smith   PetscFunctionReturn(0);
1754758f92a0SBarry Smith }
1755758f92a0SBarry Smith 
1756758f92a0SBarry Smith #undef __FUNC__
1757758f92a0SBarry Smith #define __FUNC__ "SNESGetConvergenceHistory"
17580c4c9dddSBarry Smith /*@C
1759758f92a0SBarry Smith    SNESGetConvergenceHistory - Gets the array used to hold the convergence history.
1760758f92a0SBarry Smith 
1761758f92a0SBarry Smith    Collective on SNES
1762758f92a0SBarry Smith 
1763758f92a0SBarry Smith    Input Parameter:
1764758f92a0SBarry Smith .  snes - iterative context obtained from SNESCreate()
1765758f92a0SBarry Smith 
1766758f92a0SBarry Smith    Output Parameters:
1767758f92a0SBarry Smith .  a   - array to hold history
1768758f92a0SBarry Smith .  its - integer array holds the number of linear iterations (or
1769758f92a0SBarry Smith          negative if not converged) for each solve.
1770758f92a0SBarry Smith -  na  - size of a and its
1771758f92a0SBarry Smith 
1772758f92a0SBarry Smith    Notes:
1773758f92a0SBarry Smith     The calling sequence for this routine in Fortran is
1774758f92a0SBarry Smith $   call SNESGetConvergenceHistory(SNES snes, integer na, integer ierr)
1775758f92a0SBarry Smith 
1776758f92a0SBarry Smith    This routine is useful, e.g., when running a code for purposes
1777758f92a0SBarry Smith    of accurate performance monitoring, when no I/O should be done
1778758f92a0SBarry Smith    during the section of code that is being timed.
1779758f92a0SBarry Smith 
1780758f92a0SBarry Smith    Level: intermediate
1781758f92a0SBarry Smith 
1782758f92a0SBarry Smith .keywords: SNES, get, convergence, history
1783758f92a0SBarry Smith 
1784758f92a0SBarry Smith .seealso: SNESSetConvergencHistory()
1785758f92a0SBarry Smith 
1786758f92a0SBarry Smith @*/
1787758f92a0SBarry Smith int SNESGetConvergenceHistory(SNES snes, double **a, int **its,int *na)
1788758f92a0SBarry Smith {
1789758f92a0SBarry Smith   PetscFunctionBegin;
1790758f92a0SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1791758f92a0SBarry Smith   if (a)   *a   = snes->conv_hist;
1792758f92a0SBarry Smith   if (its) *its = snes->conv_hist_its;
1793758f92a0SBarry Smith   if (na) *na   = snes->conv_hist_len;
17943a40ed3dSBarry Smith   PetscFunctionReturn(0);
1795c9005455SLois Curfman McInnes }
1796c9005455SLois Curfman McInnes 
1797c9005455SLois Curfman McInnes #undef __FUNC__
17985615d1e5SSatish Balay #define __FUNC__ "SNESScaleStep_Private"
17999b94acceSBarry Smith /*
18009b94acceSBarry Smith    SNESScaleStep_Private - Scales a step so that its length is less than the
18019b94acceSBarry Smith    positive parameter delta.
18029b94acceSBarry Smith 
18039b94acceSBarry Smith     Input Parameters:
1804c7afd0dbSLois Curfman McInnes +   snes - the SNES context
18059b94acceSBarry Smith .   y - approximate solution of linear system
18069b94acceSBarry Smith .   fnorm - 2-norm of current function
1807c7afd0dbSLois Curfman McInnes -   delta - trust region size
18089b94acceSBarry Smith 
18099b94acceSBarry Smith     Output Parameters:
1810c7afd0dbSLois Curfman McInnes +   gpnorm - predicted function norm at the new point, assuming local
18119b94acceSBarry Smith     linearization.  The value is zero if the step lies within the trust
18129b94acceSBarry Smith     region, and exceeds zero otherwise.
1813c7afd0dbSLois Curfman McInnes -   ynorm - 2-norm of the step
18149b94acceSBarry Smith 
18159b94acceSBarry Smith     Note:
181640191667SLois Curfman McInnes     For non-trust region methods such as SNES_EQ_LS, the parameter delta
18179b94acceSBarry Smith     is set to be the maximum allowable step size.
18189b94acceSBarry Smith 
18199b94acceSBarry Smith .keywords: SNES, nonlinear, scale, step
18209b94acceSBarry Smith */
18219b94acceSBarry Smith int SNESScaleStep_Private(SNES snes,Vec y,double *fnorm,double *delta,
18229b94acceSBarry Smith                           double *gpnorm,double *ynorm)
18239b94acceSBarry Smith {
18249b94acceSBarry Smith   double norm;
18259b94acceSBarry Smith   Scalar cnorm;
18263a40ed3dSBarry Smith   int    ierr;
18273a40ed3dSBarry Smith 
18283a40ed3dSBarry Smith   PetscFunctionBegin;
18293a40ed3dSBarry Smith   ierr = VecNorm(y,NORM_2, &norm );CHKERRQ(ierr);
18309b94acceSBarry Smith   if (norm > *delta) {
18319b94acceSBarry Smith      norm = *delta/norm;
18329b94acceSBarry Smith      *gpnorm = (1.0 - norm)*(*fnorm);
18339b94acceSBarry Smith      cnorm = norm;
18349b94acceSBarry Smith      VecScale( &cnorm, y );
18359b94acceSBarry Smith      *ynorm = *delta;
18369b94acceSBarry Smith   } else {
18379b94acceSBarry Smith      *gpnorm = 0.0;
18389b94acceSBarry Smith      *ynorm = norm;
18399b94acceSBarry Smith   }
18403a40ed3dSBarry Smith   PetscFunctionReturn(0);
18419b94acceSBarry Smith }
18429b94acceSBarry Smith 
18435615d1e5SSatish Balay #undef __FUNC__
18445615d1e5SSatish Balay #define __FUNC__ "SNESSolve"
18459b94acceSBarry Smith /*@
18469b94acceSBarry Smith    SNESSolve - Solves a nonlinear system.  Call SNESSolve after calling
184763a78c88SLois Curfman McInnes    SNESCreate() and optional routines of the form SNESSetXXX().
18489b94acceSBarry Smith 
1849c7afd0dbSLois Curfman McInnes    Collective on SNES
1850c7afd0dbSLois Curfman McInnes 
1851b2002411SLois Curfman McInnes    Input Parameters:
1852c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1853c7afd0dbSLois Curfman McInnes -  x - the solution vector
18549b94acceSBarry Smith 
18559b94acceSBarry Smith    Output Parameter:
1856b2002411SLois Curfman McInnes .  its - number of iterations until termination
18579b94acceSBarry Smith 
1858b2002411SLois Curfman McInnes    Notes:
18598ddd3da0SLois Curfman McInnes    The user should initialize the vector, x, with the initial guess
18608ddd3da0SLois Curfman McInnes    for the nonlinear solve prior to calling SNESSolve.  In particular,
18618ddd3da0SLois Curfman McInnes    to employ an initial guess of zero, the user should explicitly set
18628ddd3da0SLois Curfman McInnes    this vector to zero by calling VecSet().
18638ddd3da0SLois Curfman McInnes 
186436851e7fSLois Curfman McInnes    Level: beginner
186536851e7fSLois Curfman McInnes 
18669b94acceSBarry Smith .keywords: SNES, nonlinear, solve
18679b94acceSBarry Smith 
186863a78c88SLois Curfman McInnes .seealso: SNESCreate(), SNESDestroy()
18699b94acceSBarry Smith @*/
18708ddd3da0SLois Curfman McInnes int SNESSolve(SNES snes,Vec x,int *its)
18719b94acceSBarry Smith {
18723c7409f5SSatish Balay   int ierr, flg;
1873052efed2SBarry Smith 
18743a40ed3dSBarry Smith   PetscFunctionBegin;
187577c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
187674679c65SBarry Smith   PetscValidIntPointer(its);
187782bf6240SBarry Smith   if (!snes->setupcalled) {ierr = SNESSetUp(snes,x); CHKERRQ(ierr);}
1878c4fc05e7SBarry Smith   else {snes->vec_sol = snes->vec_sol_always = x;}
1879758f92a0SBarry Smith   if (snes->conv_hist_reset == PETSC_TRUE) snes->conv_hist_len = 0;
18809b94acceSBarry Smith   PLogEventBegin(SNES_Solve,snes,0,0,0);
1881c96a6f78SLois Curfman McInnes   snes->nfuncs = 0; snes->linear_its = 0; snes->nfailures = 0;
18829b94acceSBarry Smith   ierr = (*(snes)->solve)(snes,its); CHKERRQ(ierr);
18839b94acceSBarry Smith   PLogEventEnd(SNES_Solve,snes,0,0,0);
18843c7409f5SSatish Balay   ierr = OptionsHasName(PETSC_NULL,"-snes_view", &flg); CHKERRQ(ierr);
18856d4a8577SBarry Smith   if (flg) { ierr = SNESView(snes,VIEWER_STDOUT_WORLD); CHKERRQ(ierr); }
18863a40ed3dSBarry Smith   PetscFunctionReturn(0);
18879b94acceSBarry Smith }
18889b94acceSBarry Smith 
18899b94acceSBarry Smith /* --------- Internal routines for SNES Package --------- */
18909b94acceSBarry Smith 
18915615d1e5SSatish Balay #undef __FUNC__
18925615d1e5SSatish Balay #define __FUNC__ "SNESSetType"
189382bf6240SBarry Smith /*@C
18944b0e389bSBarry Smith    SNESSetType - Sets the method for the nonlinear solver.
18959b94acceSBarry Smith 
1896fee21e36SBarry Smith    Collective on SNES
1897fee21e36SBarry Smith 
1898c7afd0dbSLois Curfman McInnes    Input Parameters:
1899c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1900c7afd0dbSLois Curfman McInnes -  method - a known method
1901c7afd0dbSLois Curfman McInnes 
1902c7afd0dbSLois Curfman McInnes    Options Database Key:
1903c7afd0dbSLois Curfman McInnes .  -snes_type <method> - Sets the method; use -help for a list
1904c7afd0dbSLois Curfman McInnes    of available methods (for instance, ls or tr)
1905ae12b187SLois Curfman McInnes 
19069b94acceSBarry Smith    Notes:
19079b94acceSBarry Smith    See "petsc/include/snes.h" for available methods (for instance)
190836851e7fSLois Curfman McInnes +    SNES_EQ_LS - Newton's method with line search
1909c7afd0dbSLois Curfman McInnes      (systems of nonlinear equations)
1910c7afd0dbSLois Curfman McInnes .    SNES_EQ_TR - Newton's method with trust region
1911c7afd0dbSLois Curfman McInnes      (systems of nonlinear equations)
1912c7afd0dbSLois Curfman McInnes .    SNES_UM_TR - Newton's method with trust region
1913c7afd0dbSLois Curfman McInnes      (unconstrained minimization)
191436851e7fSLois Curfman McInnes -    SNES_UM_LS - Newton's method with line search
1915c7afd0dbSLois Curfman McInnes      (unconstrained minimization)
19169b94acceSBarry Smith 
1917ae12b187SLois Curfman McInnes   Normally, it is best to use the SNESSetFromOptions() command and then
1918ae12b187SLois Curfman McInnes   set the SNES solver type from the options database rather than by using
1919ae12b187SLois Curfman McInnes   this routine.  Using the options database provides the user with
1920ae12b187SLois Curfman McInnes   maximum flexibility in evaluating the many nonlinear solvers.
1921ae12b187SLois Curfman McInnes   The SNESSetType() routine is provided for those situations where it
1922ae12b187SLois Curfman McInnes   is necessary to set the nonlinear solver independently of the command
1923ae12b187SLois Curfman McInnes   line or options database.  This might be the case, for example, when
1924ae12b187SLois Curfman McInnes   the choice of solver changes during the execution of the program,
1925ae12b187SLois Curfman McInnes   and the user's application is taking responsibility for choosing the
192636851e7fSLois Curfman McInnes   appropriate method.  In other words, this routine is not for beginners.
192736851e7fSLois Curfman McInnes 
192836851e7fSLois Curfman McInnes   Level: intermediate
1929a703fe33SLois Curfman McInnes 
1930f536c699SSatish Balay .keywords: SNES, set, method
19319b94acceSBarry Smith @*/
19324b0e389bSBarry Smith int SNESSetType(SNES snes,SNESType method)
19339b94acceSBarry Smith {
193484cb2905SBarry Smith   int ierr;
19359b94acceSBarry Smith   int (*r)(SNES);
19363a40ed3dSBarry Smith 
19373a40ed3dSBarry Smith   PetscFunctionBegin;
193877c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
193982bf6240SBarry Smith 
19403f1db9ecSBarry Smith   if (PetscTypeCompare(snes->type_name,method)) PetscFunctionReturn(0);
194182bf6240SBarry Smith 
194282bf6240SBarry Smith   if (snes->setupcalled) {
1943e1311b90SBarry Smith     ierr       = (*(snes)->destroy)(snes);CHKERRQ(ierr);
194482bf6240SBarry Smith     snes->data = 0;
194582bf6240SBarry Smith   }
19467d1a2b2bSBarry Smith 
19479b94acceSBarry Smith   /* Get the function pointers for the iterative method requested */
194882bf6240SBarry Smith   if (!SNESRegisterAllCalled) {ierr = SNESRegisterAll(PETSC_NULL); CHKERRQ(ierr);}
194982bf6240SBarry Smith 
1950488ecbafSBarry Smith   ierr =  FListFind(snes->comm, SNESList, method,(int (**)(void *)) &r );CHKERRQ(ierr);
195182bf6240SBarry Smith 
1952596552b5SBarry Smith   if (!r) SETERRQ1(1,1,"Unable to find requested SNES type %s",method);
19531548b14aSBarry Smith 
19540452661fSBarry Smith   if (snes->data) PetscFree(snes->data);
195582bf6240SBarry Smith   snes->data = 0;
19563a40ed3dSBarry Smith   ierr = (*r)(snes); CHKERRQ(ierr);
195782bf6240SBarry Smith 
195882bf6240SBarry Smith   if (snes->type_name) PetscFree(snes->type_name);
195982bf6240SBarry Smith   snes->type_name = (char *) PetscMalloc((PetscStrlen(method)+1)*sizeof(char));CHKPTRQ(snes->type_name);
196082bf6240SBarry Smith   PetscStrcpy(snes->type_name,method);
196182bf6240SBarry Smith   snes->set_method_called = 1;
196282bf6240SBarry Smith 
19633a40ed3dSBarry Smith   PetscFunctionReturn(0);
19649b94acceSBarry Smith }
19659b94acceSBarry Smith 
1966a847f771SSatish Balay 
19679b94acceSBarry Smith /* --------------------------------------------------------------------- */
19685615d1e5SSatish Balay #undef __FUNC__
1969d4bb536fSBarry Smith #define __FUNC__ "SNESRegisterDestroy"
19709b94acceSBarry Smith /*@C
19719b94acceSBarry Smith    SNESRegisterDestroy - Frees the list of nonlinear solvers that were
19729b94acceSBarry Smith    registered by SNESRegister().
19739b94acceSBarry Smith 
1974fee21e36SBarry Smith    Not Collective
1975fee21e36SBarry Smith 
197636851e7fSLois Curfman McInnes    Level: advanced
197736851e7fSLois Curfman McInnes 
19789b94acceSBarry Smith .keywords: SNES, nonlinear, register, destroy
19799b94acceSBarry Smith 
19809b94acceSBarry Smith .seealso: SNESRegisterAll(), SNESRegisterAll()
19819b94acceSBarry Smith @*/
1982cf256101SBarry Smith int SNESRegisterDestroy(void)
19839b94acceSBarry Smith {
198482bf6240SBarry Smith   int ierr;
198582bf6240SBarry Smith 
19863a40ed3dSBarry Smith   PetscFunctionBegin;
198782bf6240SBarry Smith   if (SNESList) {
1988488ecbafSBarry Smith     ierr = FListDestroy( SNESList );CHKERRQ(ierr);
198982bf6240SBarry Smith     SNESList = 0;
19909b94acceSBarry Smith   }
199184cb2905SBarry Smith   SNESRegisterAllCalled = 0;
19923a40ed3dSBarry Smith   PetscFunctionReturn(0);
19939b94acceSBarry Smith }
19949b94acceSBarry Smith 
19955615d1e5SSatish Balay #undef __FUNC__
1996d4bb536fSBarry Smith #define __FUNC__ "SNESGetType"
19979b94acceSBarry Smith /*@C
19989a28b0a6SLois Curfman McInnes    SNESGetType - Gets the SNES method type and name (as a string).
19999b94acceSBarry Smith 
2000c7afd0dbSLois Curfman McInnes    Not Collective
2001c7afd0dbSLois Curfman McInnes 
20029b94acceSBarry Smith    Input Parameter:
20034b0e389bSBarry Smith .  snes - nonlinear solver context
20049b94acceSBarry Smith 
20059b94acceSBarry Smith    Output Parameter:
200682bf6240SBarry Smith .  method - SNES method (a charactor string)
20079b94acceSBarry Smith 
200836851e7fSLois Curfman McInnes    Level: intermediate
200936851e7fSLois Curfman McInnes 
20109b94acceSBarry Smith .keywords: SNES, nonlinear, get, method, name
20119b94acceSBarry Smith @*/
201282bf6240SBarry Smith int SNESGetType(SNES snes, SNESType *method)
20139b94acceSBarry Smith {
20143a40ed3dSBarry Smith   PetscFunctionBegin;
201582bf6240SBarry Smith   *method = snes->type_name;
20163a40ed3dSBarry Smith   PetscFunctionReturn(0);
20179b94acceSBarry Smith }
20189b94acceSBarry Smith 
20195615d1e5SSatish Balay #undef __FUNC__
2020d4bb536fSBarry Smith #define __FUNC__ "SNESGetSolution"
20219b94acceSBarry Smith /*@C
20229b94acceSBarry Smith    SNESGetSolution - Returns the vector where the approximate solution is
20239b94acceSBarry Smith    stored.
20249b94acceSBarry Smith 
2025c7afd0dbSLois Curfman McInnes    Not Collective, but Vec is parallel if SNES is parallel
2026c7afd0dbSLois Curfman McInnes 
20279b94acceSBarry Smith    Input Parameter:
20289b94acceSBarry Smith .  snes - the SNES context
20299b94acceSBarry Smith 
20309b94acceSBarry Smith    Output Parameter:
20319b94acceSBarry Smith .  x - the solution
20329b94acceSBarry Smith 
203336851e7fSLois Curfman McInnes    Level: advanced
203436851e7fSLois Curfman McInnes 
20359b94acceSBarry Smith .keywords: SNES, nonlinear, get, solution
20369b94acceSBarry Smith 
2037a86d99e1SLois Curfman McInnes .seealso: SNESGetFunction(), SNESGetGradient(), SNESGetSolutionUpdate()
20389b94acceSBarry Smith @*/
20399b94acceSBarry Smith int SNESGetSolution(SNES snes,Vec *x)
20409b94acceSBarry Smith {
20413a40ed3dSBarry Smith   PetscFunctionBegin;
204277c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
20439b94acceSBarry Smith   *x = snes->vec_sol_always;
20443a40ed3dSBarry Smith   PetscFunctionReturn(0);
20459b94acceSBarry Smith }
20469b94acceSBarry Smith 
20475615d1e5SSatish Balay #undef __FUNC__
2048d4bb536fSBarry Smith #define __FUNC__ "SNESGetSolutionUpdate"
20499b94acceSBarry Smith /*@C
20509b94acceSBarry Smith    SNESGetSolutionUpdate - Returns the vector where the solution update is
20519b94acceSBarry Smith    stored.
20529b94acceSBarry Smith 
2053c7afd0dbSLois Curfman McInnes    Not Collective, but Vec is parallel if SNES is parallel
2054c7afd0dbSLois Curfman McInnes 
20559b94acceSBarry Smith    Input Parameter:
20569b94acceSBarry Smith .  snes - the SNES context
20579b94acceSBarry Smith 
20589b94acceSBarry Smith    Output Parameter:
20599b94acceSBarry Smith .  x - the solution update
20609b94acceSBarry Smith 
206136851e7fSLois Curfman McInnes    Level: advanced
206236851e7fSLois Curfman McInnes 
20639b94acceSBarry Smith .keywords: SNES, nonlinear, get, solution, update
20649b94acceSBarry Smith 
20659b94acceSBarry Smith .seealso: SNESGetSolution(), SNESGetFunction
20669b94acceSBarry Smith @*/
20679b94acceSBarry Smith int SNESGetSolutionUpdate(SNES snes,Vec *x)
20689b94acceSBarry Smith {
20693a40ed3dSBarry Smith   PetscFunctionBegin;
207077c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
20719b94acceSBarry Smith   *x = snes->vec_sol_update_always;
20723a40ed3dSBarry Smith   PetscFunctionReturn(0);
20739b94acceSBarry Smith }
20749b94acceSBarry Smith 
20755615d1e5SSatish Balay #undef __FUNC__
2076d4bb536fSBarry Smith #define __FUNC__ "SNESGetFunction"
20779b94acceSBarry Smith /*@C
20783638b69dSLois Curfman McInnes    SNESGetFunction - Returns the vector where the function is stored.
20799b94acceSBarry Smith 
2080c7afd0dbSLois Curfman McInnes    Not Collective, but Vec is parallel if SNES is parallel
2081c7afd0dbSLois Curfman McInnes 
20829b94acceSBarry Smith    Input Parameter:
20839b94acceSBarry Smith .  snes - the SNES context
20849b94acceSBarry Smith 
20859b94acceSBarry Smith    Output Parameter:
20863638b69dSLois Curfman McInnes .  r - the function
20879b94acceSBarry Smith 
20889b94acceSBarry Smith    Notes:
20899b94acceSBarry Smith    SNESGetFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only
20909b94acceSBarry Smith    Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are
20919b94acceSBarry Smith    SNESGetMinimizationFunction() and SNESGetGradient();
20929b94acceSBarry Smith 
209336851e7fSLois Curfman McInnes    Level: advanced
209436851e7fSLois Curfman McInnes 
2095a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, get, function
20969b94acceSBarry Smith 
209731615d04SLois Curfman McInnes .seealso: SNESSetFunction(), SNESGetSolution(), SNESGetMinimizationFunction(),
209831615d04SLois Curfman McInnes           SNESGetGradient()
20999b94acceSBarry Smith @*/
21009b94acceSBarry Smith int SNESGetFunction(SNES snes,Vec *r)
21019b94acceSBarry Smith {
21023a40ed3dSBarry Smith   PetscFunctionBegin;
210377c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2104a8c6a408SBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
2105a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_NONLINEAR_EQUATIONS only");
2106a8c6a408SBarry Smith   }
21079b94acceSBarry Smith   *r = snes->vec_func_always;
21083a40ed3dSBarry Smith   PetscFunctionReturn(0);
21099b94acceSBarry Smith }
21109b94acceSBarry Smith 
21115615d1e5SSatish Balay #undef __FUNC__
2112d4bb536fSBarry Smith #define __FUNC__ "SNESGetGradient"
21139b94acceSBarry Smith /*@C
21143638b69dSLois Curfman McInnes    SNESGetGradient - Returns the vector where the gradient is stored.
21159b94acceSBarry Smith 
2116c7afd0dbSLois Curfman McInnes    Not Collective, but Vec is parallel if SNES is parallel
2117c7afd0dbSLois Curfman McInnes 
21189b94acceSBarry Smith    Input Parameter:
21199b94acceSBarry Smith .  snes - the SNES context
21209b94acceSBarry Smith 
21219b94acceSBarry Smith    Output Parameter:
21229b94acceSBarry Smith .  r - the gradient
21239b94acceSBarry Smith 
21249b94acceSBarry Smith    Notes:
21259b94acceSBarry Smith    SNESGetGradient() is valid for SNES_UNCONSTRAINED_MINIMIZATION methods
21269b94acceSBarry Smith    only.  An analogous routine for SNES_NONLINEAR_EQUATIONS methods is
21279b94acceSBarry Smith    SNESGetFunction().
21289b94acceSBarry Smith 
212936851e7fSLois Curfman McInnes    Level: advanced
213036851e7fSLois Curfman McInnes 
21319b94acceSBarry Smith .keywords: SNES, nonlinear, get, gradient
21329b94acceSBarry Smith 
213331615d04SLois Curfman McInnes .seealso: SNESGetMinimizationFunction(), SNESGetSolution(), SNESGetFunction()
21349b94acceSBarry Smith @*/
21359b94acceSBarry Smith int SNESGetGradient(SNES snes,Vec *r)
21369b94acceSBarry Smith {
21373a40ed3dSBarry Smith   PetscFunctionBegin;
213877c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
21393a40ed3dSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
2140a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_UNCONSTRAINED_MINIMIZATION only");
21413a40ed3dSBarry Smith   }
21429b94acceSBarry Smith   *r = snes->vec_func_always;
21433a40ed3dSBarry Smith   PetscFunctionReturn(0);
21449b94acceSBarry Smith }
21459b94acceSBarry Smith 
21465615d1e5SSatish Balay #undef __FUNC__
2147d4bb536fSBarry Smith #define __FUNC__ "SNESGetMinimizationFunction"
21489b94acceSBarry Smith /*@
21499b94acceSBarry Smith    SNESGetMinimizationFunction - Returns the scalar function value for
21509b94acceSBarry Smith    unconstrained minimization problems.
21519b94acceSBarry Smith 
2152c7afd0dbSLois Curfman McInnes    Not Collective
2153c7afd0dbSLois Curfman McInnes 
21549b94acceSBarry Smith    Input Parameter:
21559b94acceSBarry Smith .  snes - the SNES context
21569b94acceSBarry Smith 
21579b94acceSBarry Smith    Output Parameter:
21589b94acceSBarry Smith .  r - the function
21599b94acceSBarry Smith 
21609b94acceSBarry Smith    Notes:
21619b94acceSBarry Smith    SNESGetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION
21629b94acceSBarry Smith    methods only.  An analogous routine for SNES_NONLINEAR_EQUATIONS methods is
21639b94acceSBarry Smith    SNESGetFunction().
21649b94acceSBarry Smith 
216536851e7fSLois Curfman McInnes    Level: advanced
216636851e7fSLois Curfman McInnes 
21679b94acceSBarry Smith .keywords: SNES, nonlinear, get, function
21689b94acceSBarry Smith 
216931615d04SLois Curfman McInnes .seealso: SNESGetGradient(), SNESGetSolution(), SNESGetFunction()
21709b94acceSBarry Smith @*/
21719b94acceSBarry Smith int SNESGetMinimizationFunction(SNES snes,double *r)
21729b94acceSBarry Smith {
21733a40ed3dSBarry Smith   PetscFunctionBegin;
217477c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
217574679c65SBarry Smith   PetscValidScalarPointer(r);
21763a40ed3dSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
2177a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_UNCONSTRAINED_MINIMIZATION only");
21783a40ed3dSBarry Smith   }
21799b94acceSBarry Smith   *r = snes->fc;
21803a40ed3dSBarry Smith   PetscFunctionReturn(0);
21819b94acceSBarry Smith }
21829b94acceSBarry Smith 
21835615d1e5SSatish Balay #undef __FUNC__
2184d4bb536fSBarry Smith #define __FUNC__ "SNESSetOptionsPrefix"
21853c7409f5SSatish Balay /*@C
21863c7409f5SSatish Balay    SNESSetOptionsPrefix - Sets the prefix used for searching for all
2187d850072dSLois Curfman McInnes    SNES options in the database.
21883c7409f5SSatish Balay 
2189fee21e36SBarry Smith    Collective on SNES
2190fee21e36SBarry Smith 
2191c7afd0dbSLois Curfman McInnes    Input Parameter:
2192c7afd0dbSLois Curfman McInnes +  snes - the SNES context
2193c7afd0dbSLois Curfman McInnes -  prefix - the prefix to prepend to all option names
2194c7afd0dbSLois Curfman McInnes 
2195d850072dSLois Curfman McInnes    Notes:
2196a83b1b31SSatish Balay    A hyphen (-) must NOT be given at the beginning of the prefix name.
2197c7afd0dbSLois Curfman McInnes    The first character of all runtime options is AUTOMATICALLY the hyphen.
2198d850072dSLois Curfman McInnes 
219936851e7fSLois Curfman McInnes    Level: advanced
220036851e7fSLois Curfman McInnes 
22013c7409f5SSatish Balay .keywords: SNES, set, options, prefix, database
2202a86d99e1SLois Curfman McInnes 
2203a86d99e1SLois Curfman McInnes .seealso: SNESSetFromOptions()
22043c7409f5SSatish Balay @*/
22053c7409f5SSatish Balay int SNESSetOptionsPrefix(SNES snes,char *prefix)
22063c7409f5SSatish Balay {
22073c7409f5SSatish Balay   int ierr;
22083c7409f5SSatish Balay 
22093a40ed3dSBarry Smith   PetscFunctionBegin;
221077c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2211639f9d9dSBarry Smith   ierr = PetscObjectSetOptionsPrefix((PetscObject)snes, prefix); CHKERRQ(ierr);
22123c7409f5SSatish Balay   ierr = SLESSetOptionsPrefix(snes->sles,prefix);CHKERRQ(ierr);
22133a40ed3dSBarry Smith   PetscFunctionReturn(0);
22143c7409f5SSatish Balay }
22153c7409f5SSatish Balay 
22165615d1e5SSatish Balay #undef __FUNC__
2217d4bb536fSBarry Smith #define __FUNC__ "SNESAppendOptionsPrefix"
22183c7409f5SSatish Balay /*@C
2219f525115eSLois Curfman McInnes    SNESAppendOptionsPrefix - Appends to the prefix used for searching for all
2220d850072dSLois Curfman McInnes    SNES options in the database.
22213c7409f5SSatish Balay 
2222fee21e36SBarry Smith    Collective on SNES
2223fee21e36SBarry Smith 
2224c7afd0dbSLois Curfman McInnes    Input Parameters:
2225c7afd0dbSLois Curfman McInnes +  snes - the SNES context
2226c7afd0dbSLois Curfman McInnes -  prefix - the prefix to prepend to all option names
2227c7afd0dbSLois Curfman McInnes 
2228d850072dSLois Curfman McInnes    Notes:
2229a83b1b31SSatish Balay    A hyphen (-) must NOT be given at the beginning of the prefix name.
2230c7afd0dbSLois Curfman McInnes    The first character of all runtime options is AUTOMATICALLY the hyphen.
2231d850072dSLois Curfman McInnes 
223236851e7fSLois Curfman McInnes    Level: advanced
223336851e7fSLois Curfman McInnes 
22343c7409f5SSatish Balay .keywords: SNES, append, options, prefix, database
2235a86d99e1SLois Curfman McInnes 
2236a86d99e1SLois Curfman McInnes .seealso: SNESGetOptionsPrefix()
22373c7409f5SSatish Balay @*/
22383c7409f5SSatish Balay int SNESAppendOptionsPrefix(SNES snes,char *prefix)
22393c7409f5SSatish Balay {
22403c7409f5SSatish Balay   int ierr;
22413c7409f5SSatish Balay 
22423a40ed3dSBarry Smith   PetscFunctionBegin;
224377c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2244639f9d9dSBarry Smith   ierr = PetscObjectAppendOptionsPrefix((PetscObject)snes, prefix); CHKERRQ(ierr);
22453c7409f5SSatish Balay   ierr = SLESAppendOptionsPrefix(snes->sles,prefix);CHKERRQ(ierr);
22463a40ed3dSBarry Smith   PetscFunctionReturn(0);
22473c7409f5SSatish Balay }
22483c7409f5SSatish Balay 
22495615d1e5SSatish Balay #undef __FUNC__
2250d4bb536fSBarry Smith #define __FUNC__ "SNESGetOptionsPrefix"
2251c83590e2SSatish Balay /*@
22523c7409f5SSatish Balay    SNESGetOptionsPrefix - Sets the prefix used for searching for all
22533c7409f5SSatish Balay    SNES options in the database.
22543c7409f5SSatish Balay 
2255c7afd0dbSLois Curfman McInnes    Not Collective
2256c7afd0dbSLois Curfman McInnes 
22573c7409f5SSatish Balay    Input Parameter:
22583c7409f5SSatish Balay .  snes - the SNES context
22593c7409f5SSatish Balay 
22603c7409f5SSatish Balay    Output Parameter:
22613c7409f5SSatish Balay .  prefix - pointer to the prefix string used
22623c7409f5SSatish Balay 
226336851e7fSLois Curfman McInnes    Level: advanced
226436851e7fSLois Curfman McInnes 
22653c7409f5SSatish Balay .keywords: SNES, get, options, prefix, database
2266a86d99e1SLois Curfman McInnes 
2267a86d99e1SLois Curfman McInnes .seealso: SNESAppendOptionsPrefix()
22683c7409f5SSatish Balay @*/
22693c7409f5SSatish Balay int SNESGetOptionsPrefix(SNES snes,char **prefix)
22703c7409f5SSatish Balay {
22713c7409f5SSatish Balay   int ierr;
22723c7409f5SSatish Balay 
22733a40ed3dSBarry Smith   PetscFunctionBegin;
227477c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2275639f9d9dSBarry Smith   ierr = PetscObjectGetOptionsPrefix((PetscObject)snes, prefix); CHKERRQ(ierr);
22763a40ed3dSBarry Smith   PetscFunctionReturn(0);
22773c7409f5SSatish Balay }
22783c7409f5SSatish Balay 
2279ca161407SBarry Smith #undef __FUNC__
2280ca161407SBarry Smith #define __FUNC__ "SNESPrintHelp"
2281ca161407SBarry Smith /*@
2282ca161407SBarry Smith    SNESPrintHelp - Prints all options for the SNES component.
2283ca161407SBarry Smith 
2284c7afd0dbSLois Curfman McInnes    Collective on SNES
2285c7afd0dbSLois Curfman McInnes 
2286ca161407SBarry Smith    Input Parameter:
2287ca161407SBarry Smith .  snes - the SNES context
2288ca161407SBarry Smith 
2289ca161407SBarry Smith    Options Database Keys:
2290c7afd0dbSLois Curfman McInnes +  -help - Prints SNES options
2291c7afd0dbSLois Curfman McInnes -  -h - Prints SNES options
2292ca161407SBarry Smith 
229336851e7fSLois Curfman McInnes    Level: beginner
229436851e7fSLois Curfman McInnes 
2295ca161407SBarry Smith .keywords: SNES, nonlinear, help
2296ca161407SBarry Smith 
2297ca161407SBarry Smith .seealso: SNESSetFromOptions()
2298ca161407SBarry Smith @*/
2299ca161407SBarry Smith int SNESPrintHelp(SNES snes)
2300ca161407SBarry Smith {
2301ca161407SBarry Smith   char                p[64];
2302ca161407SBarry Smith   SNES_KSP_EW_ConvCtx *kctx;
2303ca161407SBarry Smith   int                 ierr;
2304ca161407SBarry Smith 
2305ca161407SBarry Smith   PetscFunctionBegin;
2306ca161407SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2307ca161407SBarry Smith 
2308ca161407SBarry Smith   PetscStrcpy(p,"-");
2309ca161407SBarry Smith   if (snes->prefix) PetscStrcat(p, snes->prefix);
2310ca161407SBarry Smith 
2311ca161407SBarry Smith   kctx = (SNES_KSP_EW_ConvCtx *)snes->kspconvctx;
2312ca161407SBarry Smith 
231376be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm,"SNES options ------------------------------------------------\n");
2314488ecbafSBarry Smith   ierr = FListPrintTypes(snes->comm,stdout,snes->prefix,"snes_type",SNESList);CHKERRQ(ierr);
231576be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm," %ssnes_view: view SNES info after each nonlinear solve\n",p);
231676be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm," %ssnes_max_it <its>: max iterations (default %d)\n",p,snes->max_its);
231776be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm," %ssnes_max_funcs <maxf>: max function evals (default %d)\n",p,snes->max_funcs);
231876be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm," %ssnes_stol <stol>: successive step tolerance (default %g)\n",p,snes->xtol);
231976be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm," %ssnes_atol <atol>: absolute tolerance (default %g)\n",p,snes->atol);
232076be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm," %ssnes_rtol <rtol>: relative tolerance (default %g)\n",p,snes->rtol);
232176be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm," %ssnes_trtol <trtol>: trust region parameter tolerance (default %g)\n",p,snes->deltatol);
232276be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm," SNES Monitoring Options: Choose any of the following\n");
232376be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm,"   %ssnes_cancelmonitors: cancels all monitors hardwired in code\n",p);
232476be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm,"   %ssnes_monitor: use default SNES convergence monitor, prints\n\
2325ca161407SBarry Smith     residual norm at each iteration.\n",p);
232676be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm,"   %ssnes_smonitor: same as the above, but prints fewer digits of the\n\
2327ca161407SBarry Smith     residual norm for small residual norms. This is useful to conceal\n\
2328ca161407SBarry Smith     meaningless digits that may be different on different machines.\n",p);
232976be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm,"   %ssnes_xmonitor [x,y,w,h]: use X graphics convergence monitor\n",p);
2330ca161407SBarry Smith   if (snes->type == SNES_NONLINEAR_EQUATIONS) {
233176be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,
2332ca161407SBarry Smith      " Options for solving systems of nonlinear equations only:\n");
233376be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,"   %ssnes_fd: use finite differences for Jacobian\n",p);
233476be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,"   %ssnes_mf: use matrix-free Jacobian\n",p);
233576be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,"   %ssnes_mf_operator:use matrix-free Jacobian and user-provided preconditioning matrix\n",p);
2336e24b481bSBarry Smith     (*PetscHelpPrintf)(snes->comm,"   %ssnes_mf_ksp_monitor - if using matrix-free multiply then prints h at each KSP iteration\n",p);
233776be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,"   %ssnes_no_convergence_test: Do not test for convergence, always run to SNES max its\n",p);
233876be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,"   %ssnes_ksp_ew_conv: use Eisenstat-Walker computation of KSP rtol. Params are:\n",p);
233976be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,
2340ca161407SBarry Smith      "     %ssnes_ksp_ew_version <version> (1 or 2, default is %d)\n",p,kctx->version);
234176be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,
2342ca161407SBarry Smith      "     %ssnes_ksp_ew_rtol0 <rtol0> (0 <= rtol0 < 1, default %g)\n",p,kctx->rtol_0);
234376be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,
2344ca161407SBarry Smith      "     %ssnes_ksp_ew_rtolmax <rtolmax> (0 <= rtolmax < 1, default %g)\n",p,kctx->rtol_max);
234576be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,
2346ca161407SBarry Smith      "     %ssnes_ksp_ew_gamma <gamma> (0 <= gamma <= 1, default %g)\n",p,kctx->gamma);
234776be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,
2348ca161407SBarry Smith      "     %ssnes_ksp_ew_alpha <alpha> (1 < alpha <= 2, default %g)\n",p,kctx->alpha);
234976be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,
2350ca161407SBarry Smith      "     %ssnes_ksp_ew_alpha2 <alpha2> (default %g)\n",p,kctx->alpha2);
235176be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,
2352ca161407SBarry Smith      "     %ssnes_ksp_ew_threshold <threshold> (0 < threshold < 1, default %g)\n",p,kctx->threshold);
2353ca161407SBarry Smith   } else if (snes->type == SNES_UNCONSTRAINED_MINIMIZATION) {
235476be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,
2355ca161407SBarry Smith      " Options for solving unconstrained minimization problems only:\n");
235676be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,"   %ssnes_fmin <ftol>: minimum function tolerance (default %g)\n",p,snes->fmin);
235776be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,"   %ssnes_fd: use finite differences for Hessian\n",p);
235876be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,"   %ssnes_mf: use matrix-free Hessian\n",p);
2359ca161407SBarry Smith   }
236076be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm," Run program with -help %ssnes_type <method> for help on ",p);
236176be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm,"a particular method\n");
2362ca161407SBarry Smith   if (snes->printhelp) {
2363ca161407SBarry Smith     ierr = (*snes->printhelp)(snes,p);CHKERRQ(ierr);
2364ca161407SBarry Smith   }
2365ca161407SBarry Smith   PetscFunctionReturn(0);
2366ca161407SBarry Smith }
23673c7409f5SSatish Balay 
2368acb85ae6SSatish Balay /*MC
2369b2002411SLois Curfman McInnes    SNESRegister - Adds a method to the nonlinear solver package.
23709b94acceSBarry Smith 
2371b2002411SLois Curfman McInnes    Synopsis:
2372b2002411SLois Curfman McInnes    SNESRegister(char *name_solver,char *path,char *name_create,int (*routine_create)(SNES))
23739b94acceSBarry Smith 
23748d76a1e5SLois Curfman McInnes    Not collective
23758d76a1e5SLois Curfman McInnes 
2376b2002411SLois Curfman McInnes    Input Parameters:
2377c7afd0dbSLois Curfman McInnes +  name_solver - name of a new user-defined solver
2378b2002411SLois Curfman McInnes .  path - path (either absolute or relative) the library containing this solver
2379b2002411SLois Curfman McInnes .  name_create - name of routine to create method context
2380c7afd0dbSLois Curfman McInnes -  routine_create - routine to create method context
23819b94acceSBarry Smith 
2382b2002411SLois Curfman McInnes    Notes:
2383b2002411SLois Curfman McInnes    SNESRegister() may be called multiple times to add several user-defined solvers.
23843a40ed3dSBarry Smith 
2385b2002411SLois Curfman McInnes    If dynamic libraries are used, then the fourth input argument (routine_create)
2386b2002411SLois Curfman McInnes    is ignored.
2387b2002411SLois Curfman McInnes 
2388b2002411SLois Curfman McInnes    Sample usage:
238969225d78SLois Curfman McInnes .vb
2390b2002411SLois Curfman McInnes    SNESRegister("my_solver",/home/username/my_lib/lib/libg/solaris/mylib.a,
2391b2002411SLois Curfman McInnes                 "MySolverCreate",MySolverCreate);
239269225d78SLois Curfman McInnes .ve
2393b2002411SLois Curfman McInnes 
2394b2002411SLois Curfman McInnes    Then, your solver can be chosen with the procedural interface via
2395b2002411SLois Curfman McInnes $     SNESSetType(snes,"my_solver")
2396b2002411SLois Curfman McInnes    or at runtime via the option
2397b2002411SLois Curfman McInnes $     -snes_type my_solver
2398b2002411SLois Curfman McInnes 
239936851e7fSLois Curfman McInnes    Level: advanced
240036851e7fSLois Curfman McInnes 
2401b2002411SLois Curfman McInnes .keywords: SNES, nonlinear, register
2402b2002411SLois Curfman McInnes 
2403b2002411SLois Curfman McInnes .seealso: SNESRegisterAll(), SNESRegisterDestroy()
2404b2002411SLois Curfman McInnes M*/
2405b2002411SLois Curfman McInnes 
2406b2002411SLois Curfman McInnes #undef __FUNC__
2407b2002411SLois Curfman McInnes #define __FUNC__ "SNESRegister_Private"
2408b2002411SLois Curfman McInnes int SNESRegister_Private(char *sname,char *path,char *name,int (*function)(SNES))
2409b2002411SLois Curfman McInnes {
2410b2002411SLois Curfman McInnes   char fullname[256];
2411b2002411SLois Curfman McInnes   int  ierr;
2412b2002411SLois Curfman McInnes 
2413b2002411SLois Curfman McInnes   PetscFunctionBegin;
2414b2002411SLois Curfman McInnes   PetscStrcpy(fullname,path); PetscStrcat(fullname,":");PetscStrcat(fullname,name);
2415488ecbafSBarry Smith   ierr = FListAdd_Private(&SNESList,sname,fullname, (int (*)(void*))function);CHKERRQ(ierr);
2416b2002411SLois Curfman McInnes   PetscFunctionReturn(0);
2417b2002411SLois Curfman McInnes }
2418