xref: /petsc/src/snes/interface/snes.c (revision c8228a4ee40ced0a2875be1f1aed405bcffaeec1)
1a5eb4965SSatish Balay #ifdef PETSC_RCS_HEADER
2*c8228a4eSBarry Smith static char vcid[] = "$Id: snes.c,v 1.170 1999/02/16 22:28:36 bsmith 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   }
1983c7409f5SSatish Balay   ierr = OptionsGetDouble(snes->prefix,"-snes_stol",&tmp, &flg); CHKERRQ(ierr);
199d64ed03dSBarry Smith   if (flg) {
200d64ed03dSBarry Smith     ierr = SNESSetTolerances(snes,PETSC_DEFAULT,PETSC_DEFAULT,tmp,PETSC_DEFAULT,PETSC_DEFAULT);CHKERRQ(ierr);
201d64ed03dSBarry Smith   }
2023c7409f5SSatish Balay   ierr = OptionsGetDouble(snes->prefix,"-snes_atol",&tmp, &flg); CHKERRQ(ierr);
203d64ed03dSBarry Smith   if (flg) {
204d64ed03dSBarry Smith     ierr = SNESSetTolerances(snes,tmp,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_DEFAULT);CHKERRQ(ierr);
205d64ed03dSBarry Smith   }
2063c7409f5SSatish Balay   ierr = OptionsGetDouble(snes->prefix,"-snes_rtol",&tmp, &flg);  CHKERRQ(ierr);
207d64ed03dSBarry Smith   if (flg) {
208d64ed03dSBarry Smith     ierr = SNESSetTolerances(snes,PETSC_DEFAULT,tmp,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_DEFAULT);CHKERRQ(ierr);
209d64ed03dSBarry Smith   }
2103c7409f5SSatish Balay   ierr = OptionsGetInt(snes->prefix,"-snes_max_it",&snes->max_its, &flg); CHKERRQ(ierr);
2113c7409f5SSatish Balay   ierr = OptionsGetInt(snes->prefix,"-snes_max_funcs",&snes->max_funcs, &flg);CHKERRQ(ierr);
212d7a720efSLois Curfman McInnes   ierr = OptionsGetDouble(snes->prefix,"-snes_trtol",&tmp, &flg); CHKERRQ(ierr);
213d64ed03dSBarry Smith   if (flg) { ierr = SNESSetTrustRegionTolerance(snes,tmp); CHKERRQ(ierr); }
214d7a720efSLois Curfman McInnes   ierr = OptionsGetDouble(snes->prefix,"-snes_fmin",&tmp, &flg); CHKERRQ(ierr);
215d64ed03dSBarry Smith   if (flg) { ierr = SNESSetMinimizationFunctionTolerance(snes,tmp);  CHKERRQ(ierr);}
2163c7409f5SSatish Balay   ierr = OptionsHasName(snes->prefix,"-snes_ksp_ew_conv", &flg); CHKERRQ(ierr);
2173c7409f5SSatish Balay   if (flg) { snes->ksp_ewconv = 1; }
218b18e04deSLois Curfman McInnes   ierr = OptionsGetInt(snes->prefix,"-snes_ksp_ew_version",&version,&flg); CHKERRQ(ierr);
219b18e04deSLois Curfman McInnes   ierr = OptionsGetDouble(snes->prefix,"-snes_ksp_ew_rtol0",&rtol_0,&flg); CHKERRQ(ierr);
220b18e04deSLois Curfman McInnes   ierr = OptionsGetDouble(snes->prefix,"-snes_ksp_ew_rtolmax",&rtol_max,&flg);CHKERRQ(ierr);
221b18e04deSLois Curfman McInnes   ierr = OptionsGetDouble(snes->prefix,"-snes_ksp_ew_gamma",&gamma2,&flg); CHKERRQ(ierr);
222b18e04deSLois Curfman McInnes   ierr = OptionsGetDouble(snes->prefix,"-snes_ksp_ew_alpha",&alpha,&flg); CHKERRQ(ierr);
223b18e04deSLois Curfman McInnes   ierr = OptionsGetDouble(snes->prefix,"-snes_ksp_ew_alpha2",&alpha2,&flg); CHKERRQ(ierr);
224b18e04deSLois Curfman McInnes   ierr = OptionsGetDouble(snes->prefix,"-snes_ksp_ew_threshold",&threshold,&flg);CHKERRQ(ierr);
22593c39befSBarry Smith 
22693c39befSBarry Smith   ierr = OptionsHasName(snes->prefix,"-snes_no_convergence_test",&flg); CHKERRQ(ierr);
22793c39befSBarry Smith   if (flg) {snes->converged = 0;}
22893c39befSBarry Smith 
2299b94acceSBarry Smith   ierr = SNES_KSP_SetParametersEW(snes,version,rtol_0,rtol_max,gamma2,alpha,
2309b94acceSBarry Smith                                   alpha2,threshold); CHKERRQ(ierr);
2315bbad29bSBarry Smith   ierr = OptionsHasName(snes->prefix,"-snes_cancelmonitors",&flg); CHKERRQ(ierr);
2325cd90555SBarry Smith   if (flg) {ierr = SNESClearMonitor(snes);CHKERRQ(ierr);}
2333c7409f5SSatish Balay   ierr = OptionsHasName(snes->prefix,"-snes_monitor",&flg); CHKERRQ(ierr);
234639f9d9dSBarry Smith   if (flg) {ierr = SNESSetMonitor(snes,SNESDefaultMonitor,0);CHKERRQ(ierr);}
2353c7409f5SSatish Balay   ierr = OptionsHasName(snes->prefix,"-snes_smonitor",&flg); CHKERRQ(ierr);
2363f1db9ecSBarry Smith   if (flg) {ierr = SNESSetMonitor(snes,SNESDefaultSMonitor,0);  CHKERRQ(ierr);}
2373f1db9ecSBarry Smith   ierr = OptionsHasName(snes->prefix,"-snes_vecmonitor",&flg); CHKERRQ(ierr);
2383f1db9ecSBarry Smith   if (flg) {ierr = SNESSetMonitor(snes,SNESVecViewMonitor,0);  CHKERRQ(ierr);}
23981f57ec7SBarry Smith   ierr = OptionsGetIntArray(snes->prefix,"-snes_xmonitor",loc,&nmax,&flg);CHKERRQ(ierr);
2403c7409f5SSatish Balay   if (flg) {
24117699dbbSLois Curfman McInnes     int    rank = 0;
242d7e8b826SBarry Smith     DrawLG lg;
24317699dbbSLois Curfman McInnes     MPI_Initialized(&rank);
24417699dbbSLois Curfman McInnes     if (rank) MPI_Comm_rank(snes->comm,&rank);
24517699dbbSLois Curfman McInnes     if (!rank) {
24681f57ec7SBarry Smith       ierr = SNESLGMonitorCreate(0,0,loc[0],loc[1],loc[2],loc[3],&lg); CHKERRQ(ierr);
2479b94acceSBarry Smith       ierr = SNESSetMonitor(snes,SNESLGMonitor,(void *)lg); CHKERRQ(ierr);
248f8c826e1SBarry Smith       snes->xmonitor = lg;
2499b94acceSBarry Smith       PLogObjectParent(snes,lg);
2509b94acceSBarry Smith     }
2519b94acceSBarry Smith   }
252e24b481bSBarry Smith 
2533c7409f5SSatish Balay   ierr = OptionsHasName(snes->prefix,"-snes_fd", &flg);  CHKERRQ(ierr);
2543c7409f5SSatish Balay   if (flg && snes->method_class == SNES_NONLINEAR_EQUATIONS) {
2559b94acceSBarry Smith     ierr = SNESSetJacobian(snes,snes->jacobian,snes->jacobian_pre,
2569b94acceSBarry Smith                  SNESDefaultComputeJacobian,snes->funP); CHKERRQ(ierr);
257981c4779SBarry Smith     PLogInfo(snes,"SNESSetFromOptions: Setting default finite difference Jacobian matrix\n");
258981c4779SBarry Smith   } else if (flg && snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) {
25931615d04SLois Curfman McInnes     ierr = SNESSetHessian(snes,snes->jacobian,snes->jacobian_pre,
26031615d04SLois Curfman McInnes                  SNESDefaultComputeHessian,snes->funP); CHKERRQ(ierr);
261d64ed03dSBarry Smith     PLogInfo(snes,"SNESSetFromOptions: Setting default finite difference Hessian matrix\n");
2629b94acceSBarry Smith   }
263639f9d9dSBarry Smith 
264639f9d9dSBarry Smith   for ( i=0; i<numberofsetfromoptions; i++ ) {
265639f9d9dSBarry Smith     ierr = (*othersetfromoptions[i])(snes); CHKERRQ(ierr);
266639f9d9dSBarry Smith   }
267639f9d9dSBarry Smith 
2689b94acceSBarry Smith   ierr = SNESGetSLES(snes,&sles); CHKERRQ(ierr);
2699b94acceSBarry Smith   ierr = SLESSetFromOptions(sles); CHKERRQ(ierr);
27093993e2dSLois Curfman McInnes 
271e24b481bSBarry Smith   /* set the special KSP monitor for matrix-free application */
272e24b481bSBarry Smith   ierr = OptionsHasName(snes->prefix,"-snes_mf_ksp_monitor",&flg); CHKERRQ(ierr);
273e24b481bSBarry Smith   if (flg) {
274e24b481bSBarry Smith     KSP ksp;
275e24b481bSBarry Smith     ierr = SLESGetKSP(sles,&ksp);CHKERRQ(ierr);
276e24b481bSBarry Smith     ierr = KSPSetMonitor(ksp,MatSNESFDMFKSPMonitor,PETSC_NULL);CHKERRQ(ierr);
277e24b481bSBarry Smith   }
278e24b481bSBarry Smith 
27982bf6240SBarry Smith   /*
28093993e2dSLois Curfman McInnes       Since the private setfromoptions requires the type to have
28193993e2dSLois Curfman McInnes       been set already, we make sure a type is set by this time.
28282bf6240SBarry Smith   */
28382bf6240SBarry Smith   if (!snes->type_name) {
28482bf6240SBarry Smith     if (snes->method_class == SNES_NONLINEAR_EQUATIONS) {
28582bf6240SBarry Smith       ierr = SNESSetType(snes,SNES_EQ_LS); CHKERRQ(ierr);
28682bf6240SBarry Smith     } else {
28782bf6240SBarry Smith       ierr = SNESSetType(snes,SNES_UM_TR); CHKERRQ(ierr);
28882bf6240SBarry Smith     }
28982bf6240SBarry Smith   }
29082bf6240SBarry Smith 
29182bf6240SBarry Smith   ierr = OptionsHasName(PETSC_NULL,"-help", &flg); CHKERRQ(ierr);
29282bf6240SBarry Smith   if (flg) { ierr = SNESPrintHelp(snes); CHKERRQ(ierr);}
29382bf6240SBarry Smith 
2943a40ed3dSBarry Smith   if (snes->setfromoptions) {
2953a40ed3dSBarry Smith     ierr = (*snes->setfromoptions)(snes);CHKERRQ(ierr);
2963a40ed3dSBarry Smith   }
2973a40ed3dSBarry Smith   PetscFunctionReturn(0);
2989b94acceSBarry Smith }
2999b94acceSBarry Smith 
300a847f771SSatish Balay 
3015615d1e5SSatish Balay #undef __FUNC__
302d4bb536fSBarry Smith #define __FUNC__ "SNESSetApplicationContext"
3039b94acceSBarry Smith /*@
3049b94acceSBarry Smith    SNESSetApplicationContext - Sets the optional user-defined context for
3059b94acceSBarry Smith    the nonlinear solvers.
3069b94acceSBarry Smith 
307fee21e36SBarry Smith    Collective on SNES
308fee21e36SBarry Smith 
309c7afd0dbSLois Curfman McInnes    Input Parameters:
310c7afd0dbSLois Curfman McInnes +  snes - the SNES context
311c7afd0dbSLois Curfman McInnes -  usrP - optional user context
312c7afd0dbSLois Curfman McInnes 
31336851e7fSLois Curfman McInnes    Level: intermediate
31436851e7fSLois Curfman McInnes 
3159b94acceSBarry Smith .keywords: SNES, nonlinear, set, application, context
3169b94acceSBarry Smith 
3179b94acceSBarry Smith .seealso: SNESGetApplicationContext()
3189b94acceSBarry Smith @*/
3199b94acceSBarry Smith int SNESSetApplicationContext(SNES snes,void *usrP)
3209b94acceSBarry Smith {
3213a40ed3dSBarry Smith   PetscFunctionBegin;
32277c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
3239b94acceSBarry Smith   snes->user		= usrP;
3243a40ed3dSBarry Smith   PetscFunctionReturn(0);
3259b94acceSBarry Smith }
32674679c65SBarry Smith 
3275615d1e5SSatish Balay #undef __FUNC__
328d4bb536fSBarry Smith #define __FUNC__ "SNESGetApplicationContext"
3299b94acceSBarry Smith /*@C
3309b94acceSBarry Smith    SNESGetApplicationContext - Gets the user-defined context for the
3319b94acceSBarry Smith    nonlinear solvers.
3329b94acceSBarry Smith 
333c7afd0dbSLois Curfman McInnes    Not Collective
334c7afd0dbSLois Curfman McInnes 
3359b94acceSBarry Smith    Input Parameter:
3369b94acceSBarry Smith .  snes - SNES context
3379b94acceSBarry Smith 
3389b94acceSBarry Smith    Output Parameter:
3399b94acceSBarry Smith .  usrP - user context
3409b94acceSBarry Smith 
34136851e7fSLois Curfman McInnes    Level: intermediate
34236851e7fSLois Curfman McInnes 
3439b94acceSBarry Smith .keywords: SNES, nonlinear, get, application, context
3449b94acceSBarry Smith 
3459b94acceSBarry Smith .seealso: SNESSetApplicationContext()
3469b94acceSBarry Smith @*/
3479b94acceSBarry Smith int SNESGetApplicationContext( SNES snes,  void **usrP )
3489b94acceSBarry Smith {
3493a40ed3dSBarry Smith   PetscFunctionBegin;
35077c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
3519b94acceSBarry Smith   *usrP = snes->user;
3523a40ed3dSBarry Smith   PetscFunctionReturn(0);
3539b94acceSBarry Smith }
35474679c65SBarry Smith 
3555615d1e5SSatish Balay #undef __FUNC__
356d4bb536fSBarry Smith #define __FUNC__ "SNESGetIterationNumber"
3579b94acceSBarry Smith /*@
358*c8228a4eSBarry Smith    SNESGetIterationNumber - Gets the number of nonlinear iterations completed
359*c8228a4eSBarry Smith        at this time.
3609b94acceSBarry Smith 
361c7afd0dbSLois Curfman McInnes    Not Collective
362c7afd0dbSLois Curfman McInnes 
3639b94acceSBarry Smith    Input Parameter:
3649b94acceSBarry Smith .  snes - SNES context
3659b94acceSBarry Smith 
3669b94acceSBarry Smith    Output Parameter:
3679b94acceSBarry Smith .  iter - iteration number
3689b94acceSBarry Smith 
369*c8228a4eSBarry Smith    Notes:
370*c8228a4eSBarry Smith      For example, during the computation of iteration 2 this would return 1.
371*c8228a4eSBarry Smith 
372*c8228a4eSBarry Smith      This is useful for using lagged Jacobians (where one does not recompute the
373*c8228a4eSBarry Smith     Jacobian at each SNES iteration). For example the code
374*c8228a4eSBarry Smith $    ierr = SNESGetIterationNumber(snes,&it);
375*c8228a4eSBarry Smith $    if (!(it % 2)) {
376*c8228a4eSBarry Smith $      compute Jacobian
377*c8228a4eSBarry Smith $    }
378*c8228a4eSBarry Smith      can be used in your ComputeJacobian() function to cause the Jacobian to be
379*c8228a4eSBarry Smith      recomputed every second SNES iteration
380*c8228a4eSBarry Smith 
38136851e7fSLois Curfman McInnes    Level: intermediate
38236851e7fSLois Curfman McInnes 
3839b94acceSBarry Smith .keywords: SNES, nonlinear, get, iteration, number
3849b94acceSBarry Smith @*/
3859b94acceSBarry Smith int SNESGetIterationNumber(SNES snes,int* iter)
3869b94acceSBarry Smith {
3873a40ed3dSBarry Smith   PetscFunctionBegin;
38877c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
38974679c65SBarry Smith   PetscValidIntPointer(iter);
3909b94acceSBarry Smith   *iter = snes->iter;
3913a40ed3dSBarry Smith   PetscFunctionReturn(0);
3929b94acceSBarry Smith }
39374679c65SBarry Smith 
3945615d1e5SSatish Balay #undef __FUNC__
3955615d1e5SSatish Balay #define __FUNC__ "SNESGetFunctionNorm"
3969b94acceSBarry Smith /*@
3979b94acceSBarry Smith    SNESGetFunctionNorm - Gets the norm of the current function that was set
3989b94acceSBarry Smith    with SNESSSetFunction().
3999b94acceSBarry Smith 
400c7afd0dbSLois Curfman McInnes    Collective on SNES
401c7afd0dbSLois Curfman McInnes 
4029b94acceSBarry Smith    Input Parameter:
4039b94acceSBarry Smith .  snes - SNES context
4049b94acceSBarry Smith 
4059b94acceSBarry Smith    Output Parameter:
4069b94acceSBarry Smith .  fnorm - 2-norm of function
4079b94acceSBarry Smith 
4089b94acceSBarry Smith    Note:
4099b94acceSBarry Smith    SNESGetFunctionNorm() is valid for SNES_NONLINEAR_EQUATIONS methods only.
410a86d99e1SLois Curfman McInnes    A related routine for SNES_UNCONSTRAINED_MINIMIZATION methods is
411a86d99e1SLois Curfman McInnes    SNESGetGradientNorm().
4129b94acceSBarry Smith 
41336851e7fSLois Curfman McInnes    Level: intermediate
41436851e7fSLois Curfman McInnes 
4159b94acceSBarry Smith .keywords: SNES, nonlinear, get, function, norm
416a86d99e1SLois Curfman McInnes 
417a86d99e1SLois Curfman McInnes .seealso: SNESSetFunction()
4189b94acceSBarry Smith @*/
4199b94acceSBarry Smith int SNESGetFunctionNorm(SNES snes,Scalar *fnorm)
4209b94acceSBarry Smith {
4213a40ed3dSBarry Smith   PetscFunctionBegin;
42277c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
42374679c65SBarry Smith   PetscValidScalarPointer(fnorm);
42474679c65SBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
425d252947aSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"For SNES_NONLINEAR_EQUATIONS only");
42674679c65SBarry Smith   }
4279b94acceSBarry Smith   *fnorm = snes->norm;
4283a40ed3dSBarry Smith   PetscFunctionReturn(0);
4299b94acceSBarry Smith }
43074679c65SBarry Smith 
4315615d1e5SSatish Balay #undef __FUNC__
4325615d1e5SSatish Balay #define __FUNC__ "SNESGetGradientNorm"
4339b94acceSBarry Smith /*@
4349b94acceSBarry Smith    SNESGetGradientNorm - Gets the norm of the current gradient that was set
4359b94acceSBarry Smith    with SNESSSetGradient().
4369b94acceSBarry Smith 
437c7afd0dbSLois Curfman McInnes    Collective on SNES
438c7afd0dbSLois Curfman McInnes 
4399b94acceSBarry Smith    Input Parameter:
4409b94acceSBarry Smith .  snes - SNES context
4419b94acceSBarry Smith 
4429b94acceSBarry Smith    Output Parameter:
4439b94acceSBarry Smith .  fnorm - 2-norm of gradient
4449b94acceSBarry Smith 
4459b94acceSBarry Smith    Note:
4469b94acceSBarry Smith    SNESGetGradientNorm() is valid for SNES_UNCONSTRAINED_MINIMIZATION
447a86d99e1SLois Curfman McInnes    methods only.  A related routine for SNES_NONLINEAR_EQUATIONS methods
448a86d99e1SLois Curfman McInnes    is SNESGetFunctionNorm().
4499b94acceSBarry Smith 
45036851e7fSLois Curfman McInnes    Level: intermediate
45136851e7fSLois Curfman McInnes 
4529b94acceSBarry Smith .keywords: SNES, nonlinear, get, gradient, norm
453a86d99e1SLois Curfman McInnes 
454a86d99e1SLois Curfman McInnes .seelso: SNESSetGradient()
4559b94acceSBarry Smith @*/
4569b94acceSBarry Smith int SNESGetGradientNorm(SNES snes,Scalar *gnorm)
4579b94acceSBarry Smith {
4583a40ed3dSBarry Smith   PetscFunctionBegin;
45977c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
46074679c65SBarry Smith   PetscValidScalarPointer(gnorm);
46174679c65SBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
462d252947aSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"For SNES_UNCONSTRAINED_MINIMIZATION only");
46374679c65SBarry Smith   }
4649b94acceSBarry Smith   *gnorm = snes->norm;
4653a40ed3dSBarry Smith   PetscFunctionReturn(0);
4669b94acceSBarry Smith }
46774679c65SBarry Smith 
4685615d1e5SSatish Balay #undef __FUNC__
469d4bb536fSBarry Smith #define __FUNC__ "SNESGetNumberUnsuccessfulSteps"
4709b94acceSBarry Smith /*@
4719b94acceSBarry Smith    SNESGetNumberUnsuccessfulSteps - Gets the number of unsuccessful steps
4729b94acceSBarry Smith    attempted by the nonlinear solver.
4739b94acceSBarry Smith 
474c7afd0dbSLois Curfman McInnes    Not Collective
475c7afd0dbSLois Curfman McInnes 
4769b94acceSBarry Smith    Input Parameter:
4779b94acceSBarry Smith .  snes - SNES context
4789b94acceSBarry Smith 
4799b94acceSBarry Smith    Output Parameter:
4809b94acceSBarry Smith .  nfails - number of unsuccessful steps attempted
4819b94acceSBarry Smith 
482c96a6f78SLois Curfman McInnes    Notes:
483c96a6f78SLois Curfman McInnes    This counter is reset to zero for each successive call to SNESSolve().
484c96a6f78SLois Curfman McInnes 
48536851e7fSLois Curfman McInnes    Level: intermediate
48636851e7fSLois Curfman McInnes 
4879b94acceSBarry Smith .keywords: SNES, nonlinear, get, number, unsuccessful, steps
4889b94acceSBarry Smith @*/
4899b94acceSBarry Smith int SNESGetNumberUnsuccessfulSteps(SNES snes,int* nfails)
4909b94acceSBarry Smith {
4913a40ed3dSBarry Smith   PetscFunctionBegin;
49277c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
49374679c65SBarry Smith   PetscValidIntPointer(nfails);
4949b94acceSBarry Smith   *nfails = snes->nfailures;
4953a40ed3dSBarry Smith   PetscFunctionReturn(0);
4969b94acceSBarry Smith }
497a847f771SSatish Balay 
4985615d1e5SSatish Balay #undef __FUNC__
499d4bb536fSBarry Smith #define __FUNC__ "SNESGetNumberLinearIterations"
500c96a6f78SLois Curfman McInnes /*@
501c96a6f78SLois Curfman McInnes    SNESGetNumberLinearIterations - Gets the total number of linear iterations
502c96a6f78SLois Curfman McInnes    used by the nonlinear solver.
503c96a6f78SLois Curfman McInnes 
504c7afd0dbSLois Curfman McInnes    Not Collective
505c7afd0dbSLois Curfman McInnes 
506c96a6f78SLois Curfman McInnes    Input Parameter:
507c96a6f78SLois Curfman McInnes .  snes - SNES context
508c96a6f78SLois Curfman McInnes 
509c96a6f78SLois Curfman McInnes    Output Parameter:
510c96a6f78SLois Curfman McInnes .  lits - number of linear iterations
511c96a6f78SLois Curfman McInnes 
512c96a6f78SLois Curfman McInnes    Notes:
513c96a6f78SLois Curfman McInnes    This counter is reset to zero for each successive call to SNESSolve().
514c96a6f78SLois Curfman McInnes 
51536851e7fSLois Curfman McInnes    Level: intermediate
51636851e7fSLois Curfman McInnes 
517c96a6f78SLois Curfman McInnes .keywords: SNES, nonlinear, get, number, linear, iterations
518c96a6f78SLois Curfman McInnes @*/
51986bddb7dSBarry Smith int SNESGetNumberLinearIterations(SNES snes,int* lits)
520c96a6f78SLois Curfman McInnes {
5213a40ed3dSBarry Smith   PetscFunctionBegin;
522c96a6f78SLois Curfman McInnes   PetscValidHeaderSpecific(snes,SNES_COOKIE);
523c96a6f78SLois Curfman McInnes   PetscValidIntPointer(lits);
524c96a6f78SLois Curfman McInnes   *lits = snes->linear_its;
5253a40ed3dSBarry Smith   PetscFunctionReturn(0);
526c96a6f78SLois Curfman McInnes }
527c96a6f78SLois Curfman McInnes 
528c96a6f78SLois Curfman McInnes #undef __FUNC__
529d4bb536fSBarry Smith #define __FUNC__ "SNESGetSLES"
5309b94acceSBarry Smith /*@C
5319b94acceSBarry Smith    SNESGetSLES - Returns the SLES context for a SNES solver.
5329b94acceSBarry Smith 
533c7afd0dbSLois Curfman McInnes    Not Collective, but if SNES object is parallel, then SLES object is parallel
534c7afd0dbSLois Curfman McInnes 
5359b94acceSBarry Smith    Input Parameter:
5369b94acceSBarry Smith .  snes - the SNES context
5379b94acceSBarry Smith 
5389b94acceSBarry Smith    Output Parameter:
5399b94acceSBarry Smith .  sles - the SLES context
5409b94acceSBarry Smith 
5419b94acceSBarry Smith    Notes:
5429b94acceSBarry Smith    The user can then directly manipulate the SLES context to set various
5439b94acceSBarry Smith    options, etc.  Likewise, the user can then extract and manipulate the
5449b94acceSBarry Smith    KSP and PC contexts as well.
5459b94acceSBarry Smith 
54636851e7fSLois Curfman McInnes    Level: beginner
54736851e7fSLois Curfman McInnes 
5489b94acceSBarry Smith .keywords: SNES, nonlinear, get, SLES, context
5499b94acceSBarry Smith 
5509b94acceSBarry Smith .seealso: SLESGetPC(), SLESGetKSP()
5519b94acceSBarry Smith @*/
5529b94acceSBarry Smith int SNESGetSLES(SNES snes,SLES *sles)
5539b94acceSBarry Smith {
5543a40ed3dSBarry Smith   PetscFunctionBegin;
55577c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
5569b94acceSBarry Smith   *sles = snes->sles;
5573a40ed3dSBarry Smith   PetscFunctionReturn(0);
5589b94acceSBarry Smith }
55982bf6240SBarry Smith 
560e24b481bSBarry Smith #undef __FUNC__
561e24b481bSBarry Smith #define __FUNC__ "SNESPublish_Petsc"
562e24b481bSBarry Smith static int SNESPublish_Petsc(PetscObject object)
563e24b481bSBarry Smith {
564e24b481bSBarry Smith #if defined(HAVE_AMS)
565e24b481bSBarry Smith   SNES          v = (SNES) object;
566e24b481bSBarry Smith   int          ierr;
567e24b481bSBarry Smith 
568e24b481bSBarry Smith   PetscFunctionBegin;
569e24b481bSBarry Smith 
570e24b481bSBarry Smith   /* if it is already published then return */
571e24b481bSBarry Smith   if (v->amem >=0 ) PetscFunctionReturn(0);
572e24b481bSBarry Smith 
5733f1db9ecSBarry Smith   ierr = PetscObjectPublishBaseBegin(object);CHKERRQ(ierr);
574e24b481bSBarry Smith   ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Iteration",&v->iter,1,AMS_INT,AMS_READ,
575e24b481bSBarry Smith                                 AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
576e24b481bSBarry Smith   ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Residual",&v->norm,1,AMS_DOUBLE,AMS_READ,
577e24b481bSBarry Smith                                 AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
578e24b481bSBarry Smith   ierr = PetscObjectPublishBaseEnd(object);CHKERRQ(ierr);
579e24b481bSBarry Smith #else
580e24b481bSBarry Smith   PetscFunctionBegin;
581e24b481bSBarry Smith #endif
582e24b481bSBarry Smith   PetscFunctionReturn(0);
583e24b481bSBarry Smith }
584e24b481bSBarry Smith 
5859b94acceSBarry Smith /* -----------------------------------------------------------*/
5865615d1e5SSatish Balay #undef __FUNC__
5875615d1e5SSatish Balay #define __FUNC__ "SNESCreate"
5889b94acceSBarry Smith /*@C
5899b94acceSBarry Smith    SNESCreate - Creates a nonlinear solver context.
5909b94acceSBarry Smith 
591c7afd0dbSLois Curfman McInnes    Collective on MPI_Comm
592c7afd0dbSLois Curfman McInnes 
593c7afd0dbSLois Curfman McInnes    Input Parameters:
594c7afd0dbSLois Curfman McInnes +  comm - MPI communicator
595c7afd0dbSLois Curfman McInnes -  type - type of method, either
596c7afd0dbSLois Curfman McInnes    SNES_NONLINEAR_EQUATIONS (for systems of nonlinear equations)
597c7afd0dbSLois Curfman McInnes    or SNES_UNCONSTRAINED_MINIMIZATION (for unconstrained minimization)
5989b94acceSBarry Smith 
5999b94acceSBarry Smith    Output Parameter:
6009b94acceSBarry Smith .  outsnes - the new SNES context
6019b94acceSBarry Smith 
602c7afd0dbSLois Curfman McInnes    Options Database Keys:
603c7afd0dbSLois Curfman McInnes +   -snes_mf - Activates default matrix-free Jacobian-vector products,
604c7afd0dbSLois Curfman McInnes                and no preconditioning matrix
605c7afd0dbSLois Curfman McInnes .   -snes_mf_operator - Activates default matrix-free Jacobian-vector
606c7afd0dbSLois Curfman McInnes                products, and a user-provided preconditioning matrix
607c7afd0dbSLois Curfman McInnes                as set by SNESSetJacobian()
608c7afd0dbSLois Curfman McInnes -   -snes_fd - Uses (slow!) finite differences to compute Jacobian
609c1f60f51SBarry Smith 
61036851e7fSLois Curfman McInnes    Level: beginner
61136851e7fSLois Curfman McInnes 
6129b94acceSBarry Smith .keywords: SNES, nonlinear, create, context
6139b94acceSBarry Smith 
61463a78c88SLois Curfman McInnes .seealso: SNESSolve(), SNESDestroy()
6159b94acceSBarry Smith @*/
6164b0e389bSBarry Smith int SNESCreate(MPI_Comm comm,SNESProblemType type,SNES *outsnes)
6179b94acceSBarry Smith {
6189b94acceSBarry Smith   int                 ierr;
6199b94acceSBarry Smith   SNES                snes;
6209b94acceSBarry Smith   SNES_KSP_EW_ConvCtx *kctx;
62137fcc0dbSBarry Smith 
6223a40ed3dSBarry Smith   PetscFunctionBegin;
6239b94acceSBarry Smith   *outsnes = 0;
624d64ed03dSBarry Smith   if (type != SNES_UNCONSTRAINED_MINIMIZATION && type != SNES_NONLINEAR_EQUATIONS){
625d252947aSBarry Smith     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,0,"incorrect method type");
626d64ed03dSBarry Smith   }
6273f1db9ecSBarry Smith   PetscHeaderCreate(snes,_p_SNES,int,SNES_COOKIE,0,"SNES",comm,SNESDestroy,SNESView);
6289b94acceSBarry Smith   PLogObjectCreate(snes);
629e24b481bSBarry Smith   snes->bops->publish     = SNESPublish_Petsc;
6309b94acceSBarry Smith   snes->max_its           = 50;
6319750a799SBarry Smith   snes->max_funcs	  = 10000;
6329b94acceSBarry Smith   snes->norm		  = 0.0;
6335a2d0531SBarry Smith   if (type == SNES_UNCONSTRAINED_MINIMIZATION) {
634b18e04deSLois Curfman McInnes     snes->rtol		  = 1.e-8;
635b18e04deSLois Curfman McInnes     snes->ttol            = 0.0;
6369b94acceSBarry Smith     snes->atol		  = 1.e-10;
637d64ed03dSBarry Smith   } else {
638b4874afaSBarry Smith     snes->rtol		  = 1.e-8;
639b4874afaSBarry Smith     snes->ttol            = 0.0;
640b4874afaSBarry Smith     snes->atol		  = 1.e-50;
641b4874afaSBarry Smith   }
6429b94acceSBarry Smith   snes->xtol		  = 1.e-8;
643b18e04deSLois Curfman McInnes   snes->trunctol	  = 1.e-12; /* no longer used */
6449b94acceSBarry Smith   snes->nfuncs            = 0;
6459b94acceSBarry Smith   snes->nfailures         = 0;
6467a00f4a9SLois Curfman McInnes   snes->linear_its        = 0;
647639f9d9dSBarry Smith   snes->numbermonitors    = 0;
6489b94acceSBarry Smith   snes->data              = 0;
6499b94acceSBarry Smith   snes->view              = 0;
6509b94acceSBarry Smith   snes->computeumfunction = 0;
6519b94acceSBarry Smith   snes->umfunP            = 0;
6529b94acceSBarry Smith   snes->fc                = 0;
6539b94acceSBarry Smith   snes->deltatol          = 1.e-12;
6549b94acceSBarry Smith   snes->fmin              = -1.e30;
6559b94acceSBarry Smith   snes->method_class      = type;
6569b94acceSBarry Smith   snes->set_method_called = 0;
65782bf6240SBarry Smith   snes->setupcalled      = 0;
6589b94acceSBarry Smith   snes->ksp_ewconv        = 0;
6596f24a144SLois Curfman McInnes   snes->xmonitor          = 0;
6606f24a144SLois Curfman McInnes   snes->vwork             = 0;
6616f24a144SLois Curfman McInnes   snes->nwork             = 0;
662c9005455SLois Curfman McInnes   snes->conv_hist_size    = 0;
663c9005455SLois Curfman McInnes   snes->conv_act_size     = 0;
664c9005455SLois Curfman McInnes   snes->conv_hist         = 0;
6659b94acceSBarry Smith 
6669b94acceSBarry Smith   /* Create context to compute Eisenstat-Walker relative tolerance for KSP */
6670452661fSBarry Smith   kctx = PetscNew(SNES_KSP_EW_ConvCtx); CHKPTRQ(kctx);
668eed86810SBarry Smith   PLogObjectMemory(snes,sizeof(SNES_KSP_EW_ConvCtx));
6699b94acceSBarry Smith   snes->kspconvctx  = (void*)kctx;
6709b94acceSBarry Smith   kctx->version     = 2;
6719b94acceSBarry Smith   kctx->rtol_0      = .3; /* Eisenstat and Walker suggest rtol_0=.5, but
6729b94acceSBarry Smith                              this was too large for some test cases */
6739b94acceSBarry Smith   kctx->rtol_last   = 0;
6749b94acceSBarry Smith   kctx->rtol_max    = .9;
6759b94acceSBarry Smith   kctx->gamma       = 1.0;
6769b94acceSBarry Smith   kctx->alpha2      = .5*(1.0 + sqrt(5.0));
6779b94acceSBarry Smith   kctx->alpha       = kctx->alpha2;
6789b94acceSBarry Smith   kctx->threshold   = .1;
6799b94acceSBarry Smith   kctx->lresid_last = 0;
6809b94acceSBarry Smith   kctx->norm_last   = 0;
6819b94acceSBarry Smith 
6829b94acceSBarry Smith   ierr = SLESCreate(comm,&snes->sles); CHKERRQ(ierr);
6839b94acceSBarry Smith   PLogObjectParent(snes,snes->sles)
6845334005bSBarry Smith 
6859b94acceSBarry Smith   *outsnes = snes;
686e24b481bSBarry Smith   PetscPublishAll(snes);
6873a40ed3dSBarry Smith   PetscFunctionReturn(0);
6889b94acceSBarry Smith }
6899b94acceSBarry Smith 
6909b94acceSBarry Smith /* --------------------------------------------------------------- */
6915615d1e5SSatish Balay #undef __FUNC__
692d4bb536fSBarry Smith #define __FUNC__ "SNESSetFunction"
6939b94acceSBarry Smith /*@C
6949b94acceSBarry Smith    SNESSetFunction - Sets the function evaluation routine and function
6959b94acceSBarry Smith    vector for use by the SNES routines in solving systems of nonlinear
6969b94acceSBarry Smith    equations.
6979b94acceSBarry Smith 
698fee21e36SBarry Smith    Collective on SNES
699fee21e36SBarry Smith 
700c7afd0dbSLois Curfman McInnes    Input Parameters:
701c7afd0dbSLois Curfman McInnes +  snes - the SNES context
702c7afd0dbSLois Curfman McInnes .  func - function evaluation routine
703c7afd0dbSLois Curfman McInnes .  r - vector to store function value
704c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined context for private data for the
705c7afd0dbSLois Curfman McInnes          function evaluation routine (may be PETSC_NULL)
7069b94acceSBarry Smith 
707c7afd0dbSLois Curfman McInnes    Calling sequence of func:
7088d76a1e5SLois Curfman McInnes $    func (SNES snes,Vec x,Vec f,void *ctx);
709c7afd0dbSLois Curfman McInnes 
710313e4042SLois Curfman McInnes .  f - function vector
711c7afd0dbSLois Curfman McInnes -  ctx - optional user-defined function context
7129b94acceSBarry Smith 
7139b94acceSBarry Smith    Notes:
7149b94acceSBarry Smith    The Newton-like methods typically solve linear systems of the form
7159b94acceSBarry Smith $      f'(x) x = -f(x),
716c7afd0dbSLois Curfman McInnes    where f'(x) denotes the Jacobian matrix and f(x) is the function.
7179b94acceSBarry Smith 
7189b94acceSBarry Smith    SNESSetFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only.
7199b94acceSBarry Smith    Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are
7209b94acceSBarry Smith    SNESSetMinimizationFunction() and SNESSetGradient();
7219b94acceSBarry Smith 
72236851e7fSLois Curfman McInnes    Level: beginner
72336851e7fSLois Curfman McInnes 
7249b94acceSBarry Smith .keywords: SNES, nonlinear, set, function
7259b94acceSBarry Smith 
726a86d99e1SLois Curfman McInnes .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian()
7279b94acceSBarry Smith @*/
7285334005bSBarry Smith int SNESSetFunction( SNES snes, Vec r, int (*func)(SNES,Vec,Vec,void*),void *ctx)
7299b94acceSBarry Smith {
7303a40ed3dSBarry Smith   PetscFunctionBegin;
73177c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
732a8c6a408SBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
733a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_NONLINEAR_EQUATIONS only");
734a8c6a408SBarry Smith   }
7359b94acceSBarry Smith   snes->computefunction     = func;
7369b94acceSBarry Smith   snes->vec_func            = snes->vec_func_always = r;
7379b94acceSBarry Smith   snes->funP                = ctx;
7383a40ed3dSBarry Smith   PetscFunctionReturn(0);
7399b94acceSBarry Smith }
7409b94acceSBarry Smith 
7415615d1e5SSatish Balay #undef __FUNC__
7425615d1e5SSatish Balay #define __FUNC__ "SNESComputeFunction"
7439b94acceSBarry Smith /*@
74436851e7fSLois Curfman McInnes    SNESComputeFunction - Calls the function that has been set with
7459b94acceSBarry Smith    SNESSetFunction().
7469b94acceSBarry Smith 
747c7afd0dbSLois Curfman McInnes    Collective on SNES
748c7afd0dbSLois Curfman McInnes 
7499b94acceSBarry Smith    Input Parameters:
750c7afd0dbSLois Curfman McInnes +  snes - the SNES context
751c7afd0dbSLois Curfman McInnes -  x - input vector
7529b94acceSBarry Smith 
7539b94acceSBarry Smith    Output Parameter:
7543638b69dSLois Curfman McInnes .  y - function vector, as set by SNESSetFunction()
7559b94acceSBarry Smith 
7561bffabb2SLois Curfman McInnes    Notes:
7579b94acceSBarry Smith    SNESComputeFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only.
7589b94acceSBarry Smith    Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are
7599b94acceSBarry Smith    SNESComputeMinimizationFunction() and SNESComputeGradient();
7609b94acceSBarry Smith 
76136851e7fSLois Curfman McInnes    SNESComputeFunction() is typically used within nonlinear solvers
76236851e7fSLois Curfman McInnes    implementations, so most users would not generally call this routine
76336851e7fSLois Curfman McInnes    themselves.
76436851e7fSLois Curfman McInnes 
76536851e7fSLois Curfman McInnes    Level: developer
76636851e7fSLois Curfman McInnes 
7679b94acceSBarry Smith .keywords: SNES, nonlinear, compute, function
7689b94acceSBarry Smith 
769a86d99e1SLois Curfman McInnes .seealso: SNESSetFunction(), SNESGetFunction()
7709b94acceSBarry Smith @*/
7719b94acceSBarry Smith int SNESComputeFunction(SNES snes,Vec x, Vec y)
7729b94acceSBarry Smith {
7739b94acceSBarry Smith   int    ierr;
7749b94acceSBarry Smith 
7753a40ed3dSBarry Smith   PetscFunctionBegin;
776d4bb536fSBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
777a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_NONLINEAR_EQUATIONS only");
778d4bb536fSBarry Smith   }
7799b94acceSBarry Smith   PLogEventBegin(SNES_FunctionEval,snes,x,y,0);
780d64ed03dSBarry Smith   PetscStackPush("SNES user function");
7819b94acceSBarry Smith   ierr = (*snes->computefunction)(snes,x,y,snes->funP); CHKERRQ(ierr);
782d64ed03dSBarry Smith   PetscStackPop;
783ae3c334cSLois Curfman McInnes   snes->nfuncs++;
7849b94acceSBarry Smith   PLogEventEnd(SNES_FunctionEval,snes,x,y,0);
7853a40ed3dSBarry Smith   PetscFunctionReturn(0);
7869b94acceSBarry Smith }
7879b94acceSBarry Smith 
7885615d1e5SSatish Balay #undef __FUNC__
789d4bb536fSBarry Smith #define __FUNC__ "SNESSetMinimizationFunction"
7909b94acceSBarry Smith /*@C
7919b94acceSBarry Smith    SNESSetMinimizationFunction - Sets the function evaluation routine for
7929b94acceSBarry Smith    unconstrained minimization.
7939b94acceSBarry Smith 
794fee21e36SBarry Smith    Collective on SNES
795fee21e36SBarry Smith 
796c7afd0dbSLois Curfman McInnes    Input Parameters:
797c7afd0dbSLois Curfman McInnes +  snes - the SNES context
798c7afd0dbSLois Curfman McInnes .  func - function evaluation routine
799c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined context for private data for the
800c7afd0dbSLois Curfman McInnes          function evaluation routine (may be PETSC_NULL)
8019b94acceSBarry Smith 
802c7afd0dbSLois Curfman McInnes    Calling sequence of func:
8038d76a1e5SLois Curfman McInnes $     func (SNES snes,Vec x,double *f,void *ctx);
804c7afd0dbSLois Curfman McInnes 
805c7afd0dbSLois Curfman McInnes +  x - input vector
8069b94acceSBarry Smith .  f - function
807c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined function context
8089b94acceSBarry Smith 
80936851e7fSLois Curfman McInnes    Level: beginner
81036851e7fSLois Curfman McInnes 
8119b94acceSBarry Smith    Notes:
8129b94acceSBarry Smith    SNESSetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION
8139b94acceSBarry Smith    methods only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is
8149b94acceSBarry Smith    SNESSetFunction().
8159b94acceSBarry Smith 
8169b94acceSBarry Smith .keywords: SNES, nonlinear, set, minimization, function
8179b94acceSBarry Smith 
818a86d99e1SLois Curfman McInnes .seealso:  SNESGetMinimizationFunction(), SNESComputeMinimizationFunction(),
819a86d99e1SLois Curfman McInnes            SNESSetHessian(), SNESSetGradient()
8209b94acceSBarry Smith @*/
8219b94acceSBarry Smith int SNESSetMinimizationFunction(SNES snes,int (*func)(SNES,Vec,double*,void*),
8229b94acceSBarry Smith                       void *ctx)
8239b94acceSBarry Smith {
8243a40ed3dSBarry Smith   PetscFunctionBegin;
82577c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
826a8c6a408SBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
827a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"Only for SNES_UNCONSTRAINED_MINIMIZATION");
828a8c6a408SBarry Smith   }
8299b94acceSBarry Smith   snes->computeumfunction   = func;
8309b94acceSBarry Smith   snes->umfunP              = ctx;
8313a40ed3dSBarry Smith   PetscFunctionReturn(0);
8329b94acceSBarry Smith }
8339b94acceSBarry Smith 
8345615d1e5SSatish Balay #undef __FUNC__
8355615d1e5SSatish Balay #define __FUNC__ "SNESComputeMinimizationFunction"
8369b94acceSBarry Smith /*@
8379b94acceSBarry Smith    SNESComputeMinimizationFunction - Computes the function that has been
8389b94acceSBarry Smith    set with SNESSetMinimizationFunction().
8399b94acceSBarry Smith 
840c7afd0dbSLois Curfman McInnes    Collective on SNES
841c7afd0dbSLois Curfman McInnes 
8429b94acceSBarry Smith    Input Parameters:
843c7afd0dbSLois Curfman McInnes +  snes - the SNES context
844c7afd0dbSLois Curfman McInnes -  x - input vector
8459b94acceSBarry Smith 
8469b94acceSBarry Smith    Output Parameter:
8479b94acceSBarry Smith .  y - function value
8489b94acceSBarry Smith 
8499b94acceSBarry Smith    Notes:
8509b94acceSBarry Smith    SNESComputeMinimizationFunction() is valid only for
8519b94acceSBarry Smith    SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for
8529b94acceSBarry Smith    SNES_NONLINEAR_EQUATIONS methods is SNESComputeFunction().
853a86d99e1SLois Curfman McInnes 
85436851e7fSLois Curfman McInnes    SNESComputeMinimizationFunction() is typically used within minimization
85536851e7fSLois Curfman McInnes    implementations, so most users would not generally call this routine
85636851e7fSLois Curfman McInnes    themselves.
85736851e7fSLois Curfman McInnes 
85836851e7fSLois Curfman McInnes    Level: developer
85936851e7fSLois Curfman McInnes 
860a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, compute, minimization, function
861a86d99e1SLois Curfman McInnes 
862a86d99e1SLois Curfman McInnes .seealso: SNESSetMinimizationFunction(), SNESGetMinimizationFunction(),
863a86d99e1SLois Curfman McInnes           SNESComputeGradient(), SNESComputeHessian()
8649b94acceSBarry Smith @*/
8659b94acceSBarry Smith int SNESComputeMinimizationFunction(SNES snes,Vec x,double *y)
8669b94acceSBarry Smith {
8679b94acceSBarry Smith   int    ierr;
8683a40ed3dSBarry Smith 
8693a40ed3dSBarry Smith   PetscFunctionBegin;
870a8c6a408SBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
871a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"Only for SNES_UNCONSTRAINED_MINIMIZATION");
872a8c6a408SBarry Smith   }
8739b94acceSBarry Smith   PLogEventBegin(SNES_MinimizationFunctionEval,snes,x,y,0);
874d64ed03dSBarry Smith   PetscStackPush("SNES user minimzation function");
8759b94acceSBarry Smith   ierr = (*snes->computeumfunction)(snes,x,y,snes->umfunP); CHKERRQ(ierr);
876d64ed03dSBarry Smith   PetscStackPop;
877ae3c334cSLois Curfman McInnes   snes->nfuncs++;
8789b94acceSBarry Smith   PLogEventEnd(SNES_MinimizationFunctionEval,snes,x,y,0);
8793a40ed3dSBarry Smith   PetscFunctionReturn(0);
8809b94acceSBarry Smith }
8819b94acceSBarry Smith 
8825615d1e5SSatish Balay #undef __FUNC__
883d4bb536fSBarry Smith #define __FUNC__ "SNESSetGradient"
8849b94acceSBarry Smith /*@C
8859b94acceSBarry Smith    SNESSetGradient - Sets the gradient evaluation routine and gradient
8869b94acceSBarry Smith    vector for use by the SNES routines.
8879b94acceSBarry Smith 
888c7afd0dbSLois Curfman McInnes    Collective on SNES
889c7afd0dbSLois Curfman McInnes 
8909b94acceSBarry Smith    Input Parameters:
891c7afd0dbSLois Curfman McInnes +  snes - the SNES context
8929b94acceSBarry Smith .  func - function evaluation routine
893044dda88SLois Curfman McInnes .  ctx - optional user-defined context for private data for the
894044dda88SLois Curfman McInnes          gradient evaluation routine (may be PETSC_NULL)
895c7afd0dbSLois Curfman McInnes -  r - vector to store gradient value
896fee21e36SBarry Smith 
8979b94acceSBarry Smith    Calling sequence of func:
8988d76a1e5SLois Curfman McInnes $     func (SNES, Vec x, Vec g, void *ctx);
8999b94acceSBarry Smith 
900c7afd0dbSLois Curfman McInnes +  x - input vector
9019b94acceSBarry Smith .  g - gradient vector
902c7afd0dbSLois Curfman McInnes -  ctx - optional user-defined gradient context
9039b94acceSBarry Smith 
9049b94acceSBarry Smith    Notes:
9059b94acceSBarry Smith    SNESSetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION
9069b94acceSBarry Smith    methods only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is
9079b94acceSBarry Smith    SNESSetFunction().
9089b94acceSBarry Smith 
90936851e7fSLois Curfman McInnes    Level: beginner
91036851e7fSLois Curfman McInnes 
9119b94acceSBarry Smith .keywords: SNES, nonlinear, set, function
9129b94acceSBarry Smith 
913a86d99e1SLois Curfman McInnes .seealso: SNESGetGradient(), SNESComputeGradient(), SNESSetHessian(),
914a86d99e1SLois Curfman McInnes           SNESSetMinimizationFunction(),
9159b94acceSBarry Smith @*/
91674679c65SBarry Smith int SNESSetGradient(SNES snes,Vec r,int (*func)(SNES,Vec,Vec,void*),void *ctx)
9179b94acceSBarry Smith {
9183a40ed3dSBarry Smith   PetscFunctionBegin;
91977c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
920a8c6a408SBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
921a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_UNCONSTRAINED_MINIMIZATION only");
922a8c6a408SBarry Smith   }
9239b94acceSBarry Smith   snes->computefunction     = func;
9249b94acceSBarry Smith   snes->vec_func            = snes->vec_func_always = r;
9259b94acceSBarry Smith   snes->funP                = ctx;
9263a40ed3dSBarry Smith   PetscFunctionReturn(0);
9279b94acceSBarry Smith }
9289b94acceSBarry Smith 
9295615d1e5SSatish Balay #undef __FUNC__
9305615d1e5SSatish Balay #define __FUNC__ "SNESComputeGradient"
9319b94acceSBarry Smith /*@
932a86d99e1SLois Curfman McInnes    SNESComputeGradient - Computes the gradient that has been set with
933a86d99e1SLois Curfman McInnes    SNESSetGradient().
9349b94acceSBarry Smith 
935c7afd0dbSLois Curfman McInnes    Collective on SNES
936c7afd0dbSLois Curfman McInnes 
9379b94acceSBarry Smith    Input Parameters:
938c7afd0dbSLois Curfman McInnes +  snes - the SNES context
939c7afd0dbSLois Curfman McInnes -  x - input vector
9409b94acceSBarry Smith 
9419b94acceSBarry Smith    Output Parameter:
9429b94acceSBarry Smith .  y - gradient vector
9439b94acceSBarry Smith 
9449b94acceSBarry Smith    Notes:
9459b94acceSBarry Smith    SNESComputeGradient() is valid only for
9469b94acceSBarry Smith    SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for
9479b94acceSBarry Smith    SNES_NONLINEAR_EQUATIONS methods is SNESComputeFunction().
948a86d99e1SLois Curfman McInnes 
94936851e7fSLois Curfman McInnes    SNESComputeGradient() is typically used within minimization
95036851e7fSLois Curfman McInnes    implementations, so most users would not generally call this routine
95136851e7fSLois Curfman McInnes    themselves.
95236851e7fSLois Curfman McInnes 
95336851e7fSLois Curfman McInnes    Level: developer
95436851e7fSLois Curfman McInnes 
955a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, compute, gradient
956a86d99e1SLois Curfman McInnes 
957a86d99e1SLois Curfman McInnes .seealso:  SNESSetGradient(), SNESGetGradient(),
958a86d99e1SLois Curfman McInnes            SNESComputeMinimizationFunction(), SNESComputeHessian()
9599b94acceSBarry Smith @*/
9609b94acceSBarry Smith int SNESComputeGradient(SNES snes,Vec x, Vec y)
9619b94acceSBarry Smith {
9629b94acceSBarry Smith   int    ierr;
9633a40ed3dSBarry Smith 
9643a40ed3dSBarry Smith   PetscFunctionBegin;
9653a40ed3dSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
966a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_UNCONSTRAINED_MINIMIZATION only");
9673a40ed3dSBarry Smith   }
9689b94acceSBarry Smith   PLogEventBegin(SNES_GradientEval,snes,x,y,0);
969d64ed03dSBarry Smith   PetscStackPush("SNES user gradient function");
9709b94acceSBarry Smith   ierr = (*snes->computefunction)(snes,x,y,snes->funP); CHKERRQ(ierr);
971d64ed03dSBarry Smith   PetscStackPop;
9729b94acceSBarry Smith   PLogEventEnd(SNES_GradientEval,snes,x,y,0);
9733a40ed3dSBarry Smith   PetscFunctionReturn(0);
9749b94acceSBarry Smith }
9759b94acceSBarry Smith 
9765615d1e5SSatish Balay #undef __FUNC__
9775615d1e5SSatish Balay #define __FUNC__ "SNESComputeJacobian"
97862fef451SLois Curfman McInnes /*@
97962fef451SLois Curfman McInnes    SNESComputeJacobian - Computes the Jacobian matrix that has been
98062fef451SLois Curfman McInnes    set with SNESSetJacobian().
98162fef451SLois Curfman McInnes 
982c7afd0dbSLois Curfman McInnes    Collective on SNES and Mat
983c7afd0dbSLois Curfman McInnes 
98462fef451SLois Curfman McInnes    Input Parameters:
985c7afd0dbSLois Curfman McInnes +  snes - the SNES context
986c7afd0dbSLois Curfman McInnes -  x - input vector
98762fef451SLois Curfman McInnes 
98862fef451SLois Curfman McInnes    Output Parameters:
989c7afd0dbSLois Curfman McInnes +  A - Jacobian matrix
99062fef451SLois Curfman McInnes .  B - optional preconditioning matrix
991c7afd0dbSLois Curfman McInnes -  flag - flag indicating matrix structure
992fee21e36SBarry Smith 
99362fef451SLois Curfman McInnes    Notes:
99462fef451SLois Curfman McInnes    Most users should not need to explicitly call this routine, as it
99562fef451SLois Curfman McInnes    is used internally within the nonlinear solvers.
99662fef451SLois Curfman McInnes 
997dc5a77f8SLois Curfman McInnes    See SLESSetOperators() for important information about setting the
998dc5a77f8SLois Curfman McInnes    flag parameter.
99962fef451SLois Curfman McInnes 
100062fef451SLois Curfman McInnes    SNESComputeJacobian() is valid only for SNES_NONLINEAR_EQUATIONS
100162fef451SLois Curfman McInnes    methods. An analogous routine for SNES_UNCONSTRAINED_MINIMIZATION
1002005c665bSBarry Smith    methods is SNESComputeHessian().
100362fef451SLois Curfman McInnes 
100436851e7fSLois Curfman McInnes    SNESComputeJacobian() is typically used within nonlinear solver
100536851e7fSLois Curfman McInnes    implementations, so most users would not generally call this routine
100636851e7fSLois Curfman McInnes    themselves.
100736851e7fSLois Curfman McInnes 
100836851e7fSLois Curfman McInnes    Level: developer
100936851e7fSLois Curfman McInnes 
101062fef451SLois Curfman McInnes .keywords: SNES, compute, Jacobian, matrix
101162fef451SLois Curfman McInnes 
101262fef451SLois Curfman McInnes .seealso:  SNESSetJacobian(), SLESSetOperators()
101362fef451SLois Curfman McInnes @*/
10149b94acceSBarry Smith int SNESComputeJacobian(SNES snes,Vec X,Mat *A,Mat *B,MatStructure *flg)
10159b94acceSBarry Smith {
10169b94acceSBarry Smith   int    ierr;
10173a40ed3dSBarry Smith 
10183a40ed3dSBarry Smith   PetscFunctionBegin;
10193a40ed3dSBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
1020a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_NONLINEAR_EQUATIONS only");
10213a40ed3dSBarry Smith   }
10223a40ed3dSBarry Smith   if (!snes->computejacobian) PetscFunctionReturn(0);
10239b94acceSBarry Smith   PLogEventBegin(SNES_JacobianEval,snes,X,*A,*B);
1024c4fc05e7SBarry Smith   *flg = DIFFERENT_NONZERO_PATTERN;
1025d64ed03dSBarry Smith   PetscStackPush("SNES user Jacobian function");
10269b94acceSBarry Smith   ierr = (*snes->computejacobian)(snes,X,A,B,flg,snes->jacP); CHKERRQ(ierr);
1027d64ed03dSBarry Smith   PetscStackPop;
10289b94acceSBarry Smith   PLogEventEnd(SNES_JacobianEval,snes,X,*A,*B);
10296d84be18SBarry Smith   /* make sure user returned a correct Jacobian and preconditioner */
103077c4ece6SBarry Smith   PetscValidHeaderSpecific(*A,MAT_COOKIE);
103177c4ece6SBarry Smith   PetscValidHeaderSpecific(*B,MAT_COOKIE);
10323a40ed3dSBarry Smith   PetscFunctionReturn(0);
10339b94acceSBarry Smith }
10349b94acceSBarry Smith 
10355615d1e5SSatish Balay #undef __FUNC__
10365615d1e5SSatish Balay #define __FUNC__ "SNESComputeHessian"
103762fef451SLois Curfman McInnes /*@
103862fef451SLois Curfman McInnes    SNESComputeHessian - Computes the Hessian matrix that has been
103962fef451SLois Curfman McInnes    set with SNESSetHessian().
104062fef451SLois Curfman McInnes 
1041c7afd0dbSLois Curfman McInnes    Collective on SNES and Mat
1042c7afd0dbSLois Curfman McInnes 
104362fef451SLois Curfman McInnes    Input Parameters:
1044c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1045c7afd0dbSLois Curfman McInnes -  x - input vector
104662fef451SLois Curfman McInnes 
104762fef451SLois Curfman McInnes    Output Parameters:
1048c7afd0dbSLois Curfman McInnes +  A - Hessian matrix
104962fef451SLois Curfman McInnes .  B - optional preconditioning matrix
1050c7afd0dbSLois Curfman McInnes -  flag - flag indicating matrix structure
1051fee21e36SBarry Smith 
105262fef451SLois Curfman McInnes    Notes:
105362fef451SLois Curfman McInnes    Most users should not need to explicitly call this routine, as it
105462fef451SLois Curfman McInnes    is used internally within the nonlinear solvers.
105562fef451SLois Curfman McInnes 
1056dc5a77f8SLois Curfman McInnes    See SLESSetOperators() for important information about setting the
1057dc5a77f8SLois Curfman McInnes    flag parameter.
105862fef451SLois Curfman McInnes 
105962fef451SLois Curfman McInnes    SNESComputeHessian() is valid only for
106062fef451SLois Curfman McInnes    SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for
106162fef451SLois Curfman McInnes    SNES_NONLINEAR_EQUATIONS methods is SNESComputeJacobian().
106262fef451SLois Curfman McInnes 
106336851e7fSLois Curfman McInnes    SNESComputeHessian() is typically used within minimization
106436851e7fSLois Curfman McInnes    implementations, so most users would not generally call this routine
106536851e7fSLois Curfman McInnes    themselves.
106636851e7fSLois Curfman McInnes 
106736851e7fSLois Curfman McInnes    Level: developer
106836851e7fSLois Curfman McInnes 
106962fef451SLois Curfman McInnes .keywords: SNES, compute, Hessian, matrix
107062fef451SLois Curfman McInnes 
1071a86d99e1SLois Curfman McInnes .seealso:  SNESSetHessian(), SLESSetOperators(), SNESComputeGradient(),
1072a86d99e1SLois Curfman McInnes            SNESComputeMinimizationFunction()
107362fef451SLois Curfman McInnes @*/
107462fef451SLois Curfman McInnes int SNESComputeHessian(SNES snes,Vec x,Mat *A,Mat *B,MatStructure *flag)
10759b94acceSBarry Smith {
10769b94acceSBarry Smith   int    ierr;
10773a40ed3dSBarry Smith 
10783a40ed3dSBarry Smith   PetscFunctionBegin;
10793a40ed3dSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
1080a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_UNCONSTRAINED_MINIMIZATION only");
10813a40ed3dSBarry Smith   }
10823a40ed3dSBarry Smith   if (!snes->computejacobian) PetscFunctionReturn(0);
108362fef451SLois Curfman McInnes   PLogEventBegin(SNES_HessianEval,snes,x,*A,*B);
10840f4a323eSLois Curfman McInnes   *flag = DIFFERENT_NONZERO_PATTERN;
1085d64ed03dSBarry Smith   PetscStackPush("SNES user Hessian function");
108662fef451SLois Curfman McInnes   ierr = (*snes->computejacobian)(snes,x,A,B,flag,snes->jacP); CHKERRQ(ierr);
1087d64ed03dSBarry Smith   PetscStackPop;
108862fef451SLois Curfman McInnes   PLogEventEnd(SNES_HessianEval,snes,x,*A,*B);
10890f4a323eSLois Curfman McInnes   /* make sure user returned a correct Jacobian and preconditioner */
109077c4ece6SBarry Smith   PetscValidHeaderSpecific(*A,MAT_COOKIE);
109177c4ece6SBarry Smith   PetscValidHeaderSpecific(*B,MAT_COOKIE);
10923a40ed3dSBarry Smith   PetscFunctionReturn(0);
10939b94acceSBarry Smith }
10949b94acceSBarry Smith 
10955615d1e5SSatish Balay #undef __FUNC__
1096d4bb536fSBarry Smith #define __FUNC__ "SNESSetJacobian"
10979b94acceSBarry Smith /*@C
10989b94acceSBarry Smith    SNESSetJacobian - Sets the function to compute Jacobian as well as the
1099044dda88SLois Curfman McInnes    location to store the matrix.
11009b94acceSBarry Smith 
1101c7afd0dbSLois Curfman McInnes    Collective on SNES and Mat
1102c7afd0dbSLois Curfman McInnes 
11039b94acceSBarry Smith    Input Parameters:
1104c7afd0dbSLois Curfman McInnes +  snes - the SNES context
11059b94acceSBarry Smith .  A - Jacobian matrix
11069b94acceSBarry Smith .  B - preconditioner matrix (usually same as the Jacobian)
11079b94acceSBarry Smith .  func - Jacobian evaluation routine
1108c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined context for private data for the
11092cd2dfdcSLois Curfman McInnes          Jacobian evaluation routine (may be PETSC_NULL)
11109b94acceSBarry Smith 
11119b94acceSBarry Smith    Calling sequence of func:
11128d76a1e5SLois Curfman McInnes $     func (SNES snes,Vec x,Mat *A,Mat *B,int *flag,void *ctx);
11139b94acceSBarry Smith 
1114c7afd0dbSLois Curfman McInnes +  x - input vector
11159b94acceSBarry Smith .  A - Jacobian matrix
11169b94acceSBarry Smith .  B - preconditioner matrix, usually the same as A
1117ac21db08SLois Curfman McInnes .  flag - flag indicating information about the preconditioner matrix
1118ac21db08SLois Curfman McInnes    structure (same as flag in SLESSetOperators())
1119c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined Jacobian context
11209b94acceSBarry Smith 
11219b94acceSBarry Smith    Notes:
1122dc5a77f8SLois Curfman McInnes    See SLESSetOperators() for important information about setting the flag
11232cd2dfdcSLois Curfman McInnes    output parameter in the routine func().  Be sure to read this information!
1124ac21db08SLois Curfman McInnes 
1125ac21db08SLois Curfman McInnes    The routine func() takes Mat * as the matrix arguments rather than Mat.
11269b94acceSBarry Smith    This allows the Jacobian evaluation routine to replace A and/or B with a
11279b94acceSBarry Smith    completely new new matrix structure (not just different matrix elements)
11289b94acceSBarry Smith    when appropriate, for instance, if the nonzero structure is changing
11299b94acceSBarry Smith    throughout the global iterations.
11309b94acceSBarry Smith 
113136851e7fSLois Curfman McInnes    Level: beginner
113236851e7fSLois Curfman McInnes 
11339b94acceSBarry Smith .keywords: SNES, nonlinear, set, Jacobian, matrix
11349b94acceSBarry Smith 
1135ac21db08SLois Curfman McInnes .seealso: SLESSetOperators(), SNESSetFunction()
11369b94acceSBarry Smith @*/
11379b94acceSBarry Smith int SNESSetJacobian(SNES snes,Mat A,Mat B,int (*func)(SNES,Vec,Mat*,Mat*,
11389b94acceSBarry Smith                     MatStructure*,void*),void *ctx)
11399b94acceSBarry Smith {
11403a40ed3dSBarry Smith   PetscFunctionBegin;
114177c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1142a8c6a408SBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
1143a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_NONLINEAR_EQUATIONS only");
1144a8c6a408SBarry Smith   }
11459b94acceSBarry Smith   snes->computejacobian = func;
11469b94acceSBarry Smith   snes->jacP            = ctx;
11479b94acceSBarry Smith   snes->jacobian        = A;
11489b94acceSBarry Smith   snes->jacobian_pre    = B;
11493a40ed3dSBarry Smith   PetscFunctionReturn(0);
11509b94acceSBarry Smith }
115162fef451SLois Curfman McInnes 
11525615d1e5SSatish Balay #undef __FUNC__
1153d4bb536fSBarry Smith #define __FUNC__ "SNESGetJacobian"
1154b4fd4287SBarry Smith /*@
1155b4fd4287SBarry Smith    SNESGetJacobian - Returns the Jacobian matrix and optionally the user
1156b4fd4287SBarry Smith    provided context for evaluating the Jacobian.
1157b4fd4287SBarry Smith 
1158c7afd0dbSLois Curfman McInnes    Not Collective, but Mat object will be parallel if SNES object is
1159c7afd0dbSLois Curfman McInnes 
1160b4fd4287SBarry Smith    Input Parameter:
1161b4fd4287SBarry Smith .  snes - the nonlinear solver context
1162b4fd4287SBarry Smith 
1163b4fd4287SBarry Smith    Output Parameters:
1164c7afd0dbSLois Curfman McInnes +  A - location to stash Jacobian matrix (or PETSC_NULL)
1165b4fd4287SBarry Smith .  B - location to stash preconditioner matrix (or PETSC_NULL)
1166c7afd0dbSLois Curfman McInnes -  ctx - location to stash Jacobian ctx (or PETSC_NULL)
1167fee21e36SBarry Smith 
116836851e7fSLois Curfman McInnes    Level: advanced
116936851e7fSLois Curfman McInnes 
1170b4fd4287SBarry Smith .seealso: SNESSetJacobian(), SNESComputeJacobian()
1171b4fd4287SBarry Smith @*/
1172b4fd4287SBarry Smith int SNESGetJacobian(SNES snes,Mat *A,Mat *B, void **ctx)
1173b4fd4287SBarry Smith {
11743a40ed3dSBarry Smith   PetscFunctionBegin;
11753a40ed3dSBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
1176a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_NONLINEAR_EQUATIONS only");
11773a40ed3dSBarry Smith   }
1178b4fd4287SBarry Smith   if (A)   *A = snes->jacobian;
1179b4fd4287SBarry Smith   if (B)   *B = snes->jacobian_pre;
1180b4fd4287SBarry Smith   if (ctx) *ctx = snes->jacP;
11813a40ed3dSBarry Smith   PetscFunctionReturn(0);
1182b4fd4287SBarry Smith }
1183b4fd4287SBarry Smith 
11845615d1e5SSatish Balay #undef __FUNC__
1185d4bb536fSBarry Smith #define __FUNC__ "SNESSetHessian"
11869b94acceSBarry Smith /*@C
11879b94acceSBarry Smith    SNESSetHessian - Sets the function to compute Hessian as well as the
1188044dda88SLois Curfman McInnes    location to store the matrix.
11899b94acceSBarry Smith 
1190c7afd0dbSLois Curfman McInnes    Collective on SNES and Mat
1191c7afd0dbSLois Curfman McInnes 
11929b94acceSBarry Smith    Input Parameters:
1193c7afd0dbSLois Curfman McInnes +  snes - the SNES context
11949b94acceSBarry Smith .  A - Hessian matrix
11959b94acceSBarry Smith .  B - preconditioner matrix (usually same as the Hessian)
11969b94acceSBarry Smith .  func - Jacobian evaluation routine
1197c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined context for private data for the
1198313e4042SLois Curfman McInnes          Hessian evaluation routine (may be PETSC_NULL)
11999b94acceSBarry Smith 
12009b94acceSBarry Smith    Calling sequence of func:
12018d76a1e5SLois Curfman McInnes $    func (SNES snes,Vec x,Mat *A,Mat *B,int *flag,void *ctx);
12029b94acceSBarry Smith 
1203c7afd0dbSLois Curfman McInnes +  x - input vector
12049b94acceSBarry Smith .  A - Hessian matrix
12059b94acceSBarry Smith .  B - preconditioner matrix, usually the same as A
1206ac21db08SLois Curfman McInnes .  flag - flag indicating information about the preconditioner matrix
1207ac21db08SLois Curfman McInnes    structure (same as flag in SLESSetOperators())
1208c7afd0dbSLois Curfman McInnes -  ctx - [optional] user-defined Hessian context
12099b94acceSBarry Smith 
12109b94acceSBarry Smith    Notes:
1211dc5a77f8SLois Curfman McInnes    See SLESSetOperators() for important information about setting the flag
12122cd2dfdcSLois Curfman McInnes    output parameter in the routine func().  Be sure to read this information!
1213ac21db08SLois Curfman McInnes 
12149b94acceSBarry Smith    The function func() takes Mat * as the matrix arguments rather than Mat.
12159b94acceSBarry Smith    This allows the Hessian evaluation routine to replace A and/or B with a
12169b94acceSBarry Smith    completely new new matrix structure (not just different matrix elements)
12179b94acceSBarry Smith    when appropriate, for instance, if the nonzero structure is changing
12189b94acceSBarry Smith    throughout the global iterations.
12199b94acceSBarry Smith 
122036851e7fSLois Curfman McInnes    Level: beginner
122136851e7fSLois Curfman McInnes 
12229b94acceSBarry Smith .keywords: SNES, nonlinear, set, Hessian, matrix
12239b94acceSBarry Smith 
1224ac21db08SLois Curfman McInnes .seealso: SNESSetMinimizationFunction(), SNESSetGradient(), SLESSetOperators()
12259b94acceSBarry Smith @*/
12269b94acceSBarry Smith int SNESSetHessian(SNES snes,Mat A,Mat B,int (*func)(SNES,Vec,Mat*,Mat*,
12279b94acceSBarry Smith                     MatStructure*,void*),void *ctx)
12289b94acceSBarry Smith {
12293a40ed3dSBarry Smith   PetscFunctionBegin;
123077c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1231d4bb536fSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
1232a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_UNCONSTRAINED_MINIMIZATION only");
1233d4bb536fSBarry Smith   }
12349b94acceSBarry Smith   snes->computejacobian = func;
12359b94acceSBarry Smith   snes->jacP            = ctx;
12369b94acceSBarry Smith   snes->jacobian        = A;
12379b94acceSBarry Smith   snes->jacobian_pre    = B;
12383a40ed3dSBarry Smith   PetscFunctionReturn(0);
12399b94acceSBarry Smith }
12409b94acceSBarry Smith 
12415615d1e5SSatish Balay #undef __FUNC__
1242d4bb536fSBarry Smith #define __FUNC__ "SNESGetHessian"
124362fef451SLois Curfman McInnes /*@
124462fef451SLois Curfman McInnes    SNESGetHessian - Returns the Hessian matrix and optionally the user
124562fef451SLois Curfman McInnes    provided context for evaluating the Hessian.
124662fef451SLois Curfman McInnes 
1247c7afd0dbSLois Curfman McInnes    Not Collective, but Mat object is parallel if SNES object is parallel
1248c7afd0dbSLois Curfman McInnes 
124962fef451SLois Curfman McInnes    Input Parameter:
125062fef451SLois Curfman McInnes .  snes - the nonlinear solver context
125162fef451SLois Curfman McInnes 
125262fef451SLois Curfman McInnes    Output Parameters:
1253c7afd0dbSLois Curfman McInnes +  A - location to stash Hessian matrix (or PETSC_NULL)
125462fef451SLois Curfman McInnes .  B - location to stash preconditioner matrix (or PETSC_NULL)
1255c7afd0dbSLois Curfman McInnes -  ctx - location to stash Hessian ctx (or PETSC_NULL)
1256fee21e36SBarry Smith 
125736851e7fSLois Curfman McInnes    Level: advanced
125836851e7fSLois Curfman McInnes 
125962fef451SLois Curfman McInnes .seealso: SNESSetHessian(), SNESComputeHessian()
1260c7afd0dbSLois Curfman McInnes 
1261c7afd0dbSLois Curfman McInnes .keywords: SNES, get, Hessian
126262fef451SLois Curfman McInnes @*/
126362fef451SLois Curfman McInnes int SNESGetHessian(SNES snes,Mat *A,Mat *B, void **ctx)
126462fef451SLois Curfman McInnes {
12653a40ed3dSBarry Smith   PetscFunctionBegin;
12663a40ed3dSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION){
1267a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_UNCONSTRAINED_MINIMIZATION only");
12683a40ed3dSBarry Smith   }
126962fef451SLois Curfman McInnes   if (A)   *A = snes->jacobian;
127062fef451SLois Curfman McInnes   if (B)   *B = snes->jacobian_pre;
127162fef451SLois Curfman McInnes   if (ctx) *ctx = snes->jacP;
12723a40ed3dSBarry Smith   PetscFunctionReturn(0);
127362fef451SLois Curfman McInnes }
127462fef451SLois Curfman McInnes 
12759b94acceSBarry Smith /* ----- Routines to initialize and destroy a nonlinear solver ---- */
12769b94acceSBarry Smith 
12775615d1e5SSatish Balay #undef __FUNC__
12785615d1e5SSatish Balay #define __FUNC__ "SNESSetUp"
12799b94acceSBarry Smith /*@
12809b94acceSBarry Smith    SNESSetUp - Sets up the internal data structures for the later use
1281272ac6f2SLois Curfman McInnes    of a nonlinear solver.
12829b94acceSBarry Smith 
1283fee21e36SBarry Smith    Collective on SNES
1284fee21e36SBarry Smith 
1285c7afd0dbSLois Curfman McInnes    Input Parameters:
1286c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1287c7afd0dbSLois Curfman McInnes -  x - the solution vector
1288c7afd0dbSLois Curfman McInnes 
1289272ac6f2SLois Curfman McInnes    Notes:
1290272ac6f2SLois Curfman McInnes    For basic use of the SNES solvers the user need not explicitly call
1291272ac6f2SLois Curfman McInnes    SNESSetUp(), since these actions will automatically occur during
1292272ac6f2SLois Curfman McInnes    the call to SNESSolve().  However, if one wishes to control this
1293272ac6f2SLois Curfman McInnes    phase separately, SNESSetUp() should be called after SNESCreate()
1294272ac6f2SLois Curfman McInnes    and optional routines of the form SNESSetXXX(), but before SNESSolve().
1295272ac6f2SLois Curfman McInnes 
129636851e7fSLois Curfman McInnes    Level: advanced
129736851e7fSLois Curfman McInnes 
12989b94acceSBarry Smith .keywords: SNES, nonlinear, setup
12999b94acceSBarry Smith 
13009b94acceSBarry Smith .seealso: SNESCreate(), SNESSolve(), SNESDestroy()
13019b94acceSBarry Smith @*/
13028ddd3da0SLois Curfman McInnes int SNESSetUp(SNES snes,Vec x)
13039b94acceSBarry Smith {
1304272ac6f2SLois Curfman McInnes   int ierr, flg;
13053a40ed3dSBarry Smith 
13063a40ed3dSBarry Smith   PetscFunctionBegin;
130777c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
130877c4ece6SBarry Smith   PetscValidHeaderSpecific(x,VEC_COOKIE);
13098ddd3da0SLois Curfman McInnes   snes->vec_sol = snes->vec_sol_always = x;
13109b94acceSBarry Smith 
1311c1f60f51SBarry Smith   ierr = OptionsHasName(snes->prefix,"-snes_mf_operator", &flg);  CHKERRQ(ierr);
1312c1f60f51SBarry Smith   /*
1313c1f60f51SBarry Smith       This version replaces the user provided Jacobian matrix with a
1314dfa02198SLois Curfman McInnes       matrix-free version but still employs the user-provided preconditioner matrix
1315c1f60f51SBarry Smith   */
1316c1f60f51SBarry Smith   if (flg) {
1317c1f60f51SBarry Smith     Mat J;
1318e24b481bSBarry Smith     ierr = MatCreateSNESFDMF(snes,snes->vec_sol,&J);CHKERRQ(ierr);
1319c1f60f51SBarry Smith     PLogObjectParent(snes,J);
1320c1f60f51SBarry Smith     snes->mfshell = J;
1321c1f60f51SBarry Smith     if (snes->method_class == SNES_NONLINEAR_EQUATIONS) {
1322c1f60f51SBarry Smith       snes->jacobian = J;
1323c1f60f51SBarry Smith       PLogInfo(snes,"SNESSetUp: Setting default matrix-free operator Jacobian routines\n");
1324d64ed03dSBarry Smith     } else if (snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) {
1325c1f60f51SBarry Smith       snes->jacobian = J;
1326c1f60f51SBarry Smith       PLogInfo(snes,"SNESSetUp: Setting default matrix-free operator Hessian routines\n");
1327d4bb536fSBarry Smith     } else {
1328a8c6a408SBarry Smith       SETERRQ(PETSC_ERR_SUP,0,"Method class doesn't support matrix-free operator option");
1329d4bb536fSBarry Smith     }
1330e24b481bSBarry Smith     ierr = MatSNESFDMFSetFromOptions(J);CHKERRQ(ierr);
1331c1f60f51SBarry Smith   }
1332272ac6f2SLois Curfman McInnes   ierr = OptionsHasName(snes->prefix,"-snes_mf", &flg);  CHKERRQ(ierr);
1333c1f60f51SBarry Smith   /*
1334dfa02198SLois Curfman McInnes       This version replaces both the user-provided Jacobian and the user-
1335c1f60f51SBarry Smith       provided preconditioner matrix with the default matrix free version.
1336c1f60f51SBarry Smith    */
133731615d04SLois Curfman McInnes   if (flg) {
1338272ac6f2SLois Curfman McInnes     Mat J;
1339e24b481bSBarry Smith     ierr = MatCreateSNESFDMF(snes,snes->vec_sol,&J);CHKERRQ(ierr);
1340272ac6f2SLois Curfman McInnes     PLogObjectParent(snes,J);
1341272ac6f2SLois Curfman McInnes     snes->mfshell = J;
134283e56afdSLois Curfman McInnes     if (snes->method_class == SNES_NONLINEAR_EQUATIONS) {
134383e56afdSLois Curfman McInnes       ierr = SNESSetJacobian(snes,J,J,0,snes->funP); CHKERRQ(ierr);
134494a424c1SBarry Smith       PLogInfo(snes,"SNESSetUp: Setting default matrix-free Jacobian routines\n");
1345d64ed03dSBarry Smith     } else if (snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) {
134683e56afdSLois Curfman McInnes       ierr = SNESSetHessian(snes,J,J,0,snes->funP); CHKERRQ(ierr);
134794a424c1SBarry Smith       PLogInfo(snes,"SNESSetUp: Setting default matrix-free Hessian routines\n");
1348d4bb536fSBarry Smith     } else {
1349a8c6a408SBarry Smith       SETERRQ(PETSC_ERR_SUP,0,"Method class doesn't support matrix-free option");
1350d4bb536fSBarry Smith     }
1351e24b481bSBarry Smith     ierr = MatSNESFDMFSetFromOptions(J);CHKERRQ(ierr);
1352272ac6f2SLois Curfman McInnes   }
13539b94acceSBarry Smith   if ((snes->method_class == SNES_NONLINEAR_EQUATIONS)) {
1354a8c6a408SBarry Smith     if (!snes->vec_func) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call SNESSetFunction() first");
1355a8c6a408SBarry Smith     if (!snes->computefunction) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call SNESSetFunction() first");
1356a8c6a408SBarry Smith     if (!snes->jacobian) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call SNESSetJacobian() first");
1357a8c6a408SBarry Smith     if (snes->vec_func == snes->vec_sol) {
1358a8c6a408SBarry Smith       SETERRQ(PETSC_ERR_ARG_IDN,0,"Solution vector cannot be function vector");
1359a8c6a408SBarry Smith     }
1360a703fe33SLois Curfman McInnes 
1361a703fe33SLois Curfman McInnes     /* Set the KSP stopping criterion to use the Eisenstat-Walker method */
136282bf6240SBarry Smith     if (snes->ksp_ewconv && PetscStrcmp(snes->type_name,SNES_EQ_TR)) {
1363a703fe33SLois Curfman McInnes       SLES sles; KSP ksp;
1364a703fe33SLois Curfman McInnes       ierr = SNESGetSLES(snes,&sles); CHKERRQ(ierr);
1365a703fe33SLois Curfman McInnes       ierr = SLESGetKSP(sles,&ksp); CHKERRQ(ierr);
1366a703fe33SLois Curfman McInnes       ierr = KSPSetConvergenceTest(ksp,SNES_KSP_EW_Converged_Private,
1367a703fe33SLois Curfman McInnes              (void *)snes); CHKERRQ(ierr);
1368a703fe33SLois Curfman McInnes     }
13699b94acceSBarry Smith   } else if ((snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION)) {
1370a8c6a408SBarry Smith     if (!snes->vec_func) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call SNESSetGradient() first");
1371a8c6a408SBarry Smith     if (!snes->computefunction) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call SNESSetGradient() first");
1372a8c6a408SBarry Smith     if (!snes->computeumfunction) {
1373a8c6a408SBarry Smith       SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call SNESSetMinimizationFunction() first");
1374a8c6a408SBarry Smith     }
1375a8c6a408SBarry Smith     if (!snes->jacobian) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call SNESSetHessian() first");
1376d4bb536fSBarry Smith   } else {
1377a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,0,"Unknown method class");
1378d4bb536fSBarry Smith   }
1379a703fe33SLois Curfman McInnes   if (snes->setup) {ierr = (*snes->setup)(snes); CHKERRQ(ierr);}
138082bf6240SBarry Smith   snes->setupcalled = 1;
13813a40ed3dSBarry Smith   PetscFunctionReturn(0);
13829b94acceSBarry Smith }
13839b94acceSBarry Smith 
13845615d1e5SSatish Balay #undef __FUNC__
1385d4bb536fSBarry Smith #define __FUNC__ "SNESDestroy"
13869b94acceSBarry Smith /*@C
13879b94acceSBarry Smith    SNESDestroy - Destroys the nonlinear solver context that was created
13889b94acceSBarry Smith    with SNESCreate().
13899b94acceSBarry Smith 
1390c7afd0dbSLois Curfman McInnes    Collective on SNES
1391c7afd0dbSLois Curfman McInnes 
13929b94acceSBarry Smith    Input Parameter:
13939b94acceSBarry Smith .  snes - the SNES context
13949b94acceSBarry Smith 
139536851e7fSLois Curfman McInnes    Level: beginner
139636851e7fSLois Curfman McInnes 
13979b94acceSBarry Smith .keywords: SNES, nonlinear, destroy
13989b94acceSBarry Smith 
139963a78c88SLois Curfman McInnes .seealso: SNESCreate(), SNESSolve()
14009b94acceSBarry Smith @*/
14019b94acceSBarry Smith int SNESDestroy(SNES snes)
14029b94acceSBarry Smith {
14039b94acceSBarry Smith   int ierr;
14043a40ed3dSBarry Smith 
14053a40ed3dSBarry Smith   PetscFunctionBegin;
140677c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
14073a40ed3dSBarry Smith   if (--snes->refct > 0) PetscFunctionReturn(0);
1408d4bb536fSBarry Smith 
1409e1311b90SBarry Smith   if (snes->destroy) {ierr = (*(snes)->destroy)(snes); CHKERRQ(ierr);}
14100452661fSBarry Smith   if (snes->kspconvctx) PetscFree(snes->kspconvctx);
1411522c5e43SBarry Smith   if (snes->mfshell) {ierr = MatDestroy(snes->mfshell);CHKERRQ(ierr);}
14129b94acceSBarry Smith   ierr = SLESDestroy(snes->sles); CHKERRQ(ierr);
1413522c5e43SBarry Smith   if (snes->xmonitor) {ierr = SNESLGMonitorDestroy(snes->xmonitor);CHKERRQ(ierr);}
1414522c5e43SBarry Smith   if (snes->vwork) {ierr = VecDestroyVecs(snes->vwork,snes->nvwork);CHKERRQ(ierr);}
14159b94acceSBarry Smith   PLogObjectDestroy((PetscObject)snes);
14160452661fSBarry Smith   PetscHeaderDestroy((PetscObject)snes);
14173a40ed3dSBarry Smith   PetscFunctionReturn(0);
14189b94acceSBarry Smith }
14199b94acceSBarry Smith 
14209b94acceSBarry Smith /* ----------- Routines to set solver parameters ---------- */
14219b94acceSBarry Smith 
14225615d1e5SSatish Balay #undef __FUNC__
14235615d1e5SSatish Balay #define __FUNC__ "SNESSetTolerances"
14249b94acceSBarry Smith /*@
1425d7a720efSLois Curfman McInnes    SNESSetTolerances - Sets various parameters used in convergence tests.
14269b94acceSBarry Smith 
1427c7afd0dbSLois Curfman McInnes    Collective on SNES
1428c7afd0dbSLois Curfman McInnes 
14299b94acceSBarry Smith    Input Parameters:
1430c7afd0dbSLois Curfman McInnes +  snes - the SNES context
143133174efeSLois Curfman McInnes .  atol - absolute convergence tolerance
143233174efeSLois Curfman McInnes .  rtol - relative convergence tolerance
143333174efeSLois Curfman McInnes .  stol -  convergence tolerance in terms of the norm
143433174efeSLois Curfman McInnes            of the change in the solution between steps
143533174efeSLois Curfman McInnes .  maxit - maximum number of iterations
1436c7afd0dbSLois Curfman McInnes -  maxf - maximum number of function evaluations
1437fee21e36SBarry Smith 
143833174efeSLois Curfman McInnes    Options Database Keys:
1439c7afd0dbSLois Curfman McInnes +    -snes_atol <atol> - Sets atol
1440c7afd0dbSLois Curfman McInnes .    -snes_rtol <rtol> - Sets rtol
1441c7afd0dbSLois Curfman McInnes .    -snes_stol <stol> - Sets stol
1442c7afd0dbSLois Curfman McInnes .    -snes_max_it <maxit> - Sets maxit
1443c7afd0dbSLois Curfman McInnes -    -snes_max_funcs <maxf> - Sets maxf
14449b94acceSBarry Smith 
1445d7a720efSLois Curfman McInnes    Notes:
14469b94acceSBarry Smith    The default maximum number of iterations is 50.
14479b94acceSBarry Smith    The default maximum number of function evaluations is 1000.
14489b94acceSBarry Smith 
144936851e7fSLois Curfman McInnes    Level: intermediate
145036851e7fSLois Curfman McInnes 
145133174efeSLois Curfman McInnes .keywords: SNES, nonlinear, set, convergence, tolerances
14529b94acceSBarry Smith 
1453d7a720efSLois Curfman McInnes .seealso: SNESSetTrustRegionTolerance(), SNESSetMinimizationFunctionTolerance()
14549b94acceSBarry Smith @*/
1455d7a720efSLois Curfman McInnes int SNESSetTolerances(SNES snes,double atol,double rtol,double stol,int maxit,int maxf)
14569b94acceSBarry Smith {
14573a40ed3dSBarry Smith   PetscFunctionBegin;
145877c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1459d7a720efSLois Curfman McInnes   if (atol != PETSC_DEFAULT)  snes->atol      = atol;
1460d7a720efSLois Curfman McInnes   if (rtol != PETSC_DEFAULT)  snes->rtol      = rtol;
1461d7a720efSLois Curfman McInnes   if (stol != PETSC_DEFAULT)  snes->xtol      = stol;
1462d7a720efSLois Curfman McInnes   if (maxit != PETSC_DEFAULT) snes->max_its   = maxit;
1463d7a720efSLois Curfman McInnes   if (maxf != PETSC_DEFAULT)  snes->max_funcs = maxf;
14643a40ed3dSBarry Smith   PetscFunctionReturn(0);
14659b94acceSBarry Smith }
14669b94acceSBarry Smith 
14675615d1e5SSatish Balay #undef __FUNC__
14685615d1e5SSatish Balay #define __FUNC__ "SNESGetTolerances"
14699b94acceSBarry Smith /*@
147033174efeSLois Curfman McInnes    SNESGetTolerances - Gets various parameters used in convergence tests.
147133174efeSLois Curfman McInnes 
1472c7afd0dbSLois Curfman McInnes    Not Collective
1473c7afd0dbSLois Curfman McInnes 
147433174efeSLois Curfman McInnes    Input Parameters:
1475c7afd0dbSLois Curfman McInnes +  snes - the SNES context
147633174efeSLois Curfman McInnes .  atol - absolute convergence tolerance
147733174efeSLois Curfman McInnes .  rtol - relative convergence tolerance
147833174efeSLois Curfman McInnes .  stol -  convergence tolerance in terms of the norm
147933174efeSLois Curfman McInnes            of the change in the solution between steps
148033174efeSLois Curfman McInnes .  maxit - maximum number of iterations
1481c7afd0dbSLois Curfman McInnes -  maxf - maximum number of function evaluations
1482fee21e36SBarry Smith 
148333174efeSLois Curfman McInnes    Notes:
148433174efeSLois Curfman McInnes    The user can specify PETSC_NULL for any parameter that is not needed.
148533174efeSLois Curfman McInnes 
148636851e7fSLois Curfman McInnes    Level: intermediate
148736851e7fSLois Curfman McInnes 
148833174efeSLois Curfman McInnes .keywords: SNES, nonlinear, get, convergence, tolerances
148933174efeSLois Curfman McInnes 
149033174efeSLois Curfman McInnes .seealso: SNESSetTolerances()
149133174efeSLois Curfman McInnes @*/
149233174efeSLois Curfman McInnes int SNESGetTolerances(SNES snes,double *atol,double *rtol,double *stol,int *maxit,int *maxf)
149333174efeSLois Curfman McInnes {
14943a40ed3dSBarry Smith   PetscFunctionBegin;
149533174efeSLois Curfman McInnes   PetscValidHeaderSpecific(snes,SNES_COOKIE);
149633174efeSLois Curfman McInnes   if (atol)  *atol  = snes->atol;
149733174efeSLois Curfman McInnes   if (rtol)  *rtol  = snes->rtol;
149833174efeSLois Curfman McInnes   if (stol)  *stol  = snes->xtol;
149933174efeSLois Curfman McInnes   if (maxit) *maxit = snes->max_its;
150033174efeSLois Curfman McInnes   if (maxf)  *maxf  = snes->max_funcs;
15013a40ed3dSBarry Smith   PetscFunctionReturn(0);
150233174efeSLois Curfman McInnes }
150333174efeSLois Curfman McInnes 
15045615d1e5SSatish Balay #undef __FUNC__
15055615d1e5SSatish Balay #define __FUNC__ "SNESSetTrustRegionTolerance"
150633174efeSLois Curfman McInnes /*@
15079b94acceSBarry Smith    SNESSetTrustRegionTolerance - Sets the trust region parameter tolerance.
15089b94acceSBarry Smith 
1509fee21e36SBarry Smith    Collective on SNES
1510fee21e36SBarry Smith 
1511c7afd0dbSLois Curfman McInnes    Input Parameters:
1512c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1513c7afd0dbSLois Curfman McInnes -  tol - tolerance
1514c7afd0dbSLois Curfman McInnes 
15159b94acceSBarry Smith    Options Database Key:
1516c7afd0dbSLois Curfman McInnes .  -snes_trtol <tol> - Sets tol
15179b94acceSBarry Smith 
151836851e7fSLois Curfman McInnes    Level: intermediate
151936851e7fSLois Curfman McInnes 
15209b94acceSBarry Smith .keywords: SNES, nonlinear, set, trust region, tolerance
15219b94acceSBarry Smith 
1522d7a720efSLois Curfman McInnes .seealso: SNESSetTolerances(), SNESSetMinimizationFunctionTolerance()
15239b94acceSBarry Smith @*/
15249b94acceSBarry Smith int SNESSetTrustRegionTolerance(SNES snes,double tol)
15259b94acceSBarry Smith {
15263a40ed3dSBarry Smith   PetscFunctionBegin;
152777c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
15289b94acceSBarry Smith   snes->deltatol = tol;
15293a40ed3dSBarry Smith   PetscFunctionReturn(0);
15309b94acceSBarry Smith }
15319b94acceSBarry Smith 
15325615d1e5SSatish Balay #undef __FUNC__
15335615d1e5SSatish Balay #define __FUNC__ "SNESSetMinimizationFunctionTolerance"
15349b94acceSBarry Smith /*@
153577c4ece6SBarry Smith    SNESSetMinimizationFunctionTolerance - Sets the minimum allowable function tolerance
15369b94acceSBarry Smith    for unconstrained minimization solvers.
15379b94acceSBarry Smith 
1538fee21e36SBarry Smith    Collective on SNES
1539fee21e36SBarry Smith 
1540c7afd0dbSLois Curfman McInnes    Input Parameters:
1541c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1542c7afd0dbSLois Curfman McInnes -  ftol - minimum function tolerance
1543c7afd0dbSLois Curfman McInnes 
15449b94acceSBarry Smith    Options Database Key:
1545c7afd0dbSLois Curfman McInnes .  -snes_fmin <ftol> - Sets ftol
15469b94acceSBarry Smith 
15479b94acceSBarry Smith    Note:
154877c4ece6SBarry Smith    SNESSetMinimizationFunctionTolerance() is valid for SNES_UNCONSTRAINED_MINIMIZATION
15499b94acceSBarry Smith    methods only.
15509b94acceSBarry Smith 
155136851e7fSLois Curfman McInnes    Level: intermediate
155236851e7fSLois Curfman McInnes 
15539b94acceSBarry Smith .keywords: SNES, nonlinear, set, minimum, convergence, function, tolerance
15549b94acceSBarry Smith 
1555d7a720efSLois Curfman McInnes .seealso: SNESSetTolerances(), SNESSetTrustRegionTolerance()
15569b94acceSBarry Smith @*/
155777c4ece6SBarry Smith int SNESSetMinimizationFunctionTolerance(SNES snes,double ftol)
15589b94acceSBarry Smith {
15593a40ed3dSBarry Smith   PetscFunctionBegin;
156077c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
15619b94acceSBarry Smith   snes->fmin = ftol;
15623a40ed3dSBarry Smith   PetscFunctionReturn(0);
15639b94acceSBarry Smith }
15649b94acceSBarry Smith 
1565ce1608b8SBarry Smith #undef __FUNC__
1566ce1608b8SBarry Smith #define __FUNC__ "SNESLGMonitor"
1567ce1608b8SBarry Smith int SNESLGMonitor(SNES snes,int it,double norm,void *ctx)
1568ce1608b8SBarry Smith {
1569ce1608b8SBarry Smith   int ierr;
1570ce1608b8SBarry Smith 
1571ce1608b8SBarry Smith   PetscFunctionBegin;
1572ce1608b8SBarry Smith   ierr = KSPLGMonitor((KSP)snes,it,norm,ctx);CHKERRQ(ierr);
1573ce1608b8SBarry Smith   PetscFunctionReturn(0);
1574ce1608b8SBarry Smith }
1575ce1608b8SBarry Smith 
15769b94acceSBarry Smith /* ------------ Routines to set performance monitoring options ----------- */
15779b94acceSBarry Smith 
15785615d1e5SSatish Balay #undef __FUNC__
1579d4bb536fSBarry Smith #define __FUNC__ "SNESSetMonitor"
15809b94acceSBarry Smith /*@C
15815cd90555SBarry Smith    SNESSetMonitor - Sets an ADDITIONAL function that is to be used at every
15829b94acceSBarry Smith    iteration of the nonlinear solver to display the iteration's
15839b94acceSBarry Smith    progress.
15849b94acceSBarry Smith 
1585fee21e36SBarry Smith    Collective on SNES
1586fee21e36SBarry Smith 
1587c7afd0dbSLois Curfman McInnes    Input Parameters:
1588c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1589c7afd0dbSLois Curfman McInnes .  func - monitoring routine
1590c7afd0dbSLois Curfman McInnes -  mctx - [optional] user-defined context for private data for the
1591c7afd0dbSLois Curfman McInnes           monitor routine (may be PETSC_NULL)
15929b94acceSBarry Smith 
1593c7afd0dbSLois Curfman McInnes    Calling sequence of func:
159440a0c1c6SLois Curfman McInnes $     int func(SNES snes,int its, double norm,void *mctx)
1595c7afd0dbSLois Curfman McInnes 
1596c7afd0dbSLois Curfman McInnes +    snes - the SNES context
1597c7afd0dbSLois Curfman McInnes .    its - iteration number
1598c7afd0dbSLois Curfman McInnes .    norm - 2-norm function value (may be estimated)
1599c7afd0dbSLois Curfman McInnes             for SNES_NONLINEAR_EQUATIONS methods
160040a0c1c6SLois Curfman McInnes .    norm - 2-norm gradient value (may be estimated)
1601c7afd0dbSLois Curfman McInnes             for SNES_UNCONSTRAINED_MINIMIZATION methods
160240a0c1c6SLois Curfman McInnes -    mctx - [optional] monitoring context
16039b94acceSBarry Smith 
16049665c990SLois Curfman McInnes    Options Database Keys:
1605c7afd0dbSLois Curfman McInnes +    -snes_monitor        - sets SNESDefaultMonitor()
1606c7afd0dbSLois Curfman McInnes .    -snes_xmonitor       - sets line graph monitor,
1607c7afd0dbSLois Curfman McInnes                             uses SNESLGMonitorCreate()
1608c7afd0dbSLois Curfman McInnes _    -snes_cancelmonitors - cancels all monitors that have
1609c7afd0dbSLois Curfman McInnes                             been hardwired into a code by
1610c7afd0dbSLois Curfman McInnes                             calls to SNESSetMonitor(), but
1611c7afd0dbSLois Curfman McInnes                             does not cancel those set via
1612c7afd0dbSLois Curfman McInnes                             the options database.
16139665c990SLois Curfman McInnes 
1614639f9d9dSBarry Smith    Notes:
16156bc08f3fSLois Curfman McInnes    Several different monitoring routines may be set by calling
16166bc08f3fSLois Curfman McInnes    SNESSetMonitor() multiple times; all will be called in the
16176bc08f3fSLois Curfman McInnes    order in which they were set.
1618639f9d9dSBarry Smith 
161936851e7fSLois Curfman McInnes    Level: intermediate
162036851e7fSLois Curfman McInnes 
16219b94acceSBarry Smith .keywords: SNES, nonlinear, set, monitor
16229b94acceSBarry Smith 
16235cd90555SBarry Smith .seealso: SNESDefaultMonitor(), SNESClearMonitor()
16249b94acceSBarry Smith @*/
162574679c65SBarry Smith int SNESSetMonitor( SNES snes, int (*func)(SNES,int,double,void*),void *mctx )
16269b94acceSBarry Smith {
16273a40ed3dSBarry Smith   PetscFunctionBegin;
1628639f9d9dSBarry Smith   if (snes->numbermonitors >= MAXSNESMONITORS) {
1629a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,0,"Too many monitors set");
1630639f9d9dSBarry Smith   }
1631639f9d9dSBarry Smith 
1632639f9d9dSBarry Smith   snes->monitor[snes->numbermonitors]           = func;
1633639f9d9dSBarry Smith   snes->monitorcontext[snes->numbermonitors++]  = (void*)mctx;
16343a40ed3dSBarry Smith   PetscFunctionReturn(0);
16359b94acceSBarry Smith }
16369b94acceSBarry Smith 
16375615d1e5SSatish Balay #undef __FUNC__
16385cd90555SBarry Smith #define __FUNC__ "SNESClearMonitor"
16395cd90555SBarry Smith /*@C
16405cd90555SBarry Smith    SNESClearMonitor - Clears all the monitor functions for a SNES object.
16415cd90555SBarry Smith 
1642c7afd0dbSLois Curfman McInnes    Collective on SNES
1643c7afd0dbSLois Curfman McInnes 
16445cd90555SBarry Smith    Input Parameters:
16455cd90555SBarry Smith .  snes - the SNES context
16465cd90555SBarry Smith 
16475cd90555SBarry Smith    Options Database:
1648c7afd0dbSLois Curfman McInnes .  -snes_cancelmonitors - cancels all monitors that have been hardwired
1649c7afd0dbSLois Curfman McInnes     into a code by calls to SNESSetMonitor(), but does not cancel those
1650c7afd0dbSLois Curfman McInnes     set via the options database
16515cd90555SBarry Smith 
16525cd90555SBarry Smith    Notes:
16535cd90555SBarry Smith    There is no way to clear one specific monitor from a SNES object.
16545cd90555SBarry Smith 
165536851e7fSLois Curfman McInnes    Level: intermediate
165636851e7fSLois Curfman McInnes 
16575cd90555SBarry Smith .keywords: SNES, nonlinear, set, monitor
16585cd90555SBarry Smith 
16595cd90555SBarry Smith .seealso: SNESDefaultMonitor(), SNESSetMonitor()
16605cd90555SBarry Smith @*/
16615cd90555SBarry Smith int SNESClearMonitor( SNES snes )
16625cd90555SBarry Smith {
16635cd90555SBarry Smith   PetscFunctionBegin;
16645cd90555SBarry Smith   snes->numbermonitors = 0;
16655cd90555SBarry Smith   PetscFunctionReturn(0);
16665cd90555SBarry Smith }
16675cd90555SBarry Smith 
16685cd90555SBarry Smith #undef __FUNC__
1669d4bb536fSBarry Smith #define __FUNC__ "SNESSetConvergenceTest"
16709b94acceSBarry Smith /*@C
16719b94acceSBarry Smith    SNESSetConvergenceTest - Sets the function that is to be used
16729b94acceSBarry Smith    to test for convergence of the nonlinear iterative solution.
16739b94acceSBarry Smith 
1674fee21e36SBarry Smith    Collective on SNES
1675fee21e36SBarry Smith 
1676c7afd0dbSLois Curfman McInnes    Input Parameters:
1677c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1678c7afd0dbSLois Curfman McInnes .  func - routine to test for convergence
1679c7afd0dbSLois Curfman McInnes -  cctx - [optional] context for private data for the convergence routine
1680c7afd0dbSLois Curfman McInnes           (may be PETSC_NULL)
16819b94acceSBarry Smith 
1682c7afd0dbSLois Curfman McInnes    Calling sequence of func:
16838d76a1e5SLois Curfman McInnes $     int func (SNES snes,double xnorm,double gnorm,double f,void *cctx)
1684c7afd0dbSLois Curfman McInnes 
1685c7afd0dbSLois Curfman McInnes +    snes - the SNES context
1686c7afd0dbSLois Curfman McInnes .    cctx - [optional] convergence context
1687c7afd0dbSLois Curfman McInnes .    xnorm - 2-norm of current iterate
1688c7afd0dbSLois Curfman McInnes .    gnorm - 2-norm of current step (SNES_NONLINEAR_EQUATIONS methods)
1689c7afd0dbSLois Curfman McInnes .    f - 2-norm of function (SNES_NONLINEAR_EQUATIONS methods)
1690c7afd0dbSLois Curfman McInnes .    gnorm - 2-norm of current gradient (SNES_UNCONSTRAINED_MINIMIZATION methods)
1691c7afd0dbSLois Curfman McInnes -    f - function value (SNES_UNCONSTRAINED_MINIMIZATION methods)
16929b94acceSBarry Smith 
169336851e7fSLois Curfman McInnes    Level: advanced
169436851e7fSLois Curfman McInnes 
16959b94acceSBarry Smith .keywords: SNES, nonlinear, set, convergence, test
16969b94acceSBarry Smith 
169740191667SLois Curfman McInnes .seealso: SNESConverged_EQ_LS(), SNESConverged_EQ_TR(),
169840191667SLois Curfman McInnes           SNESConverged_UM_LS(), SNESConverged_UM_TR()
16999b94acceSBarry Smith @*/
170074679c65SBarry Smith int SNESSetConvergenceTest(SNES snes,int (*func)(SNES,double,double,double,void*),void *cctx)
17019b94acceSBarry Smith {
17023a40ed3dSBarry Smith   PetscFunctionBegin;
17039b94acceSBarry Smith   (snes)->converged = func;
17049b94acceSBarry Smith   (snes)->cnvP      = cctx;
17053a40ed3dSBarry Smith   PetscFunctionReturn(0);
17069b94acceSBarry Smith }
17079b94acceSBarry Smith 
17085615d1e5SSatish Balay #undef __FUNC__
1709d4bb536fSBarry Smith #define __FUNC__ "SNESSetConvergenceHistory"
1710c9005455SLois Curfman McInnes /*@
1711c9005455SLois Curfman McInnes    SNESSetConvergenceHistory - Sets the array used to hold the convergence history.
1712c9005455SLois Curfman McInnes 
1713fee21e36SBarry Smith    Collective on SNES
1714fee21e36SBarry Smith 
1715c7afd0dbSLois Curfman McInnes    Input Parameters:
1716c7afd0dbSLois Curfman McInnes +  snes - iterative context obtained from SNESCreate()
1717c7afd0dbSLois Curfman McInnes .  a   - array to hold history
1718c7afd0dbSLois Curfman McInnes -  na  - size of a
1719c7afd0dbSLois Curfman McInnes 
1720c9005455SLois Curfman McInnes    Notes:
1721c9005455SLois Curfman McInnes    If set, this array will contain the function norms (for
1722c9005455SLois Curfman McInnes    SNES_NONLINEAR_EQUATIONS methods) or gradient norms
1723c9005455SLois Curfman McInnes    (for SNES_UNCONSTRAINED_MINIMIZATION methods) computed
1724c9005455SLois Curfman McInnes    at each step.
1725c9005455SLois Curfman McInnes 
1726c9005455SLois Curfman McInnes    This routine is useful, e.g., when running a code for purposes
1727c9005455SLois Curfman McInnes    of accurate performance monitoring, when no I/O should be done
1728c9005455SLois Curfman McInnes    during the section of code that is being timed.
1729c9005455SLois Curfman McInnes 
173036851e7fSLois Curfman McInnes    Level: intermediate
173136851e7fSLois Curfman McInnes 
1732c9005455SLois Curfman McInnes .keywords: SNES, set, convergence, history
1733c9005455SLois Curfman McInnes @*/
1734c9005455SLois Curfman McInnes int SNESSetConvergenceHistory(SNES snes, double *a, int na)
1735c9005455SLois Curfman McInnes {
17363a40ed3dSBarry Smith   PetscFunctionBegin;
1737c9005455SLois Curfman McInnes   PetscValidHeaderSpecific(snes,SNES_COOKIE);
1738c9005455SLois Curfman McInnes   if (na) PetscValidScalarPointer(a);
1739c9005455SLois Curfman McInnes   snes->conv_hist      = a;
1740c9005455SLois Curfman McInnes   snes->conv_hist_size = na;
17413a40ed3dSBarry Smith   PetscFunctionReturn(0);
1742c9005455SLois Curfman McInnes }
1743c9005455SLois Curfman McInnes 
1744c9005455SLois Curfman McInnes #undef __FUNC__
17455615d1e5SSatish Balay #define __FUNC__ "SNESScaleStep_Private"
17469b94acceSBarry Smith /*
17479b94acceSBarry Smith    SNESScaleStep_Private - Scales a step so that its length is less than the
17489b94acceSBarry Smith    positive parameter delta.
17499b94acceSBarry Smith 
17509b94acceSBarry Smith     Input Parameters:
1751c7afd0dbSLois Curfman McInnes +   snes - the SNES context
17529b94acceSBarry Smith .   y - approximate solution of linear system
17539b94acceSBarry Smith .   fnorm - 2-norm of current function
1754c7afd0dbSLois Curfman McInnes -   delta - trust region size
17559b94acceSBarry Smith 
17569b94acceSBarry Smith     Output Parameters:
1757c7afd0dbSLois Curfman McInnes +   gpnorm - predicted function norm at the new point, assuming local
17589b94acceSBarry Smith     linearization.  The value is zero if the step lies within the trust
17599b94acceSBarry Smith     region, and exceeds zero otherwise.
1760c7afd0dbSLois Curfman McInnes -   ynorm - 2-norm of the step
17619b94acceSBarry Smith 
17629b94acceSBarry Smith     Note:
176340191667SLois Curfman McInnes     For non-trust region methods such as SNES_EQ_LS, the parameter delta
17649b94acceSBarry Smith     is set to be the maximum allowable step size.
17659b94acceSBarry Smith 
17669b94acceSBarry Smith .keywords: SNES, nonlinear, scale, step
17679b94acceSBarry Smith */
17689b94acceSBarry Smith int SNESScaleStep_Private(SNES snes,Vec y,double *fnorm,double *delta,
17699b94acceSBarry Smith                           double *gpnorm,double *ynorm)
17709b94acceSBarry Smith {
17719b94acceSBarry Smith   double norm;
17729b94acceSBarry Smith   Scalar cnorm;
17733a40ed3dSBarry Smith   int    ierr;
17743a40ed3dSBarry Smith 
17753a40ed3dSBarry Smith   PetscFunctionBegin;
17763a40ed3dSBarry Smith   ierr = VecNorm(y,NORM_2, &norm );CHKERRQ(ierr);
17779b94acceSBarry Smith   if (norm > *delta) {
17789b94acceSBarry Smith      norm = *delta/norm;
17799b94acceSBarry Smith      *gpnorm = (1.0 - norm)*(*fnorm);
17809b94acceSBarry Smith      cnorm = norm;
17819b94acceSBarry Smith      VecScale( &cnorm, y );
17829b94acceSBarry Smith      *ynorm = *delta;
17839b94acceSBarry Smith   } else {
17849b94acceSBarry Smith      *gpnorm = 0.0;
17859b94acceSBarry Smith      *ynorm = norm;
17869b94acceSBarry Smith   }
17873a40ed3dSBarry Smith   PetscFunctionReturn(0);
17889b94acceSBarry Smith }
17899b94acceSBarry Smith 
17905615d1e5SSatish Balay #undef __FUNC__
17915615d1e5SSatish Balay #define __FUNC__ "SNESSolve"
17929b94acceSBarry Smith /*@
17939b94acceSBarry Smith    SNESSolve - Solves a nonlinear system.  Call SNESSolve after calling
179463a78c88SLois Curfman McInnes    SNESCreate() and optional routines of the form SNESSetXXX().
17959b94acceSBarry Smith 
1796c7afd0dbSLois Curfman McInnes    Collective on SNES
1797c7afd0dbSLois Curfman McInnes 
1798b2002411SLois Curfman McInnes    Input Parameters:
1799c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1800c7afd0dbSLois Curfman McInnes -  x - the solution vector
18019b94acceSBarry Smith 
18029b94acceSBarry Smith    Output Parameter:
1803b2002411SLois Curfman McInnes .  its - number of iterations until termination
18049b94acceSBarry Smith 
1805b2002411SLois Curfman McInnes    Notes:
18068ddd3da0SLois Curfman McInnes    The user should initialize the vector, x, with the initial guess
18078ddd3da0SLois Curfman McInnes    for the nonlinear solve prior to calling SNESSolve.  In particular,
18088ddd3da0SLois Curfman McInnes    to employ an initial guess of zero, the user should explicitly set
18098ddd3da0SLois Curfman McInnes    this vector to zero by calling VecSet().
18108ddd3da0SLois Curfman McInnes 
181136851e7fSLois Curfman McInnes    Level: beginner
181236851e7fSLois Curfman McInnes 
18139b94acceSBarry Smith .keywords: SNES, nonlinear, solve
18149b94acceSBarry Smith 
181563a78c88SLois Curfman McInnes .seealso: SNESCreate(), SNESDestroy()
18169b94acceSBarry Smith @*/
18178ddd3da0SLois Curfman McInnes int SNESSolve(SNES snes,Vec x,int *its)
18189b94acceSBarry Smith {
18193c7409f5SSatish Balay   int ierr, flg;
1820052efed2SBarry Smith 
18213a40ed3dSBarry Smith   PetscFunctionBegin;
182277c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
182374679c65SBarry Smith   PetscValidIntPointer(its);
182482bf6240SBarry Smith   if (!snes->setupcalled) {ierr = SNESSetUp(snes,x); CHKERRQ(ierr);}
1825c4fc05e7SBarry Smith   else {snes->vec_sol = snes->vec_sol_always = x;}
18269b94acceSBarry Smith   PLogEventBegin(SNES_Solve,snes,0,0,0);
1827c96a6f78SLois Curfman McInnes   snes->nfuncs = 0; snes->linear_its = 0; snes->nfailures = 0;
18289b94acceSBarry Smith   ierr = (*(snes)->solve)(snes,its); CHKERRQ(ierr);
18299b94acceSBarry Smith   PLogEventEnd(SNES_Solve,snes,0,0,0);
18303c7409f5SSatish Balay   ierr = OptionsHasName(PETSC_NULL,"-snes_view", &flg); CHKERRQ(ierr);
18316d4a8577SBarry Smith   if (flg) { ierr = SNESView(snes,VIEWER_STDOUT_WORLD); CHKERRQ(ierr); }
18323a40ed3dSBarry Smith   PetscFunctionReturn(0);
18339b94acceSBarry Smith }
18349b94acceSBarry Smith 
18359b94acceSBarry Smith /* --------- Internal routines for SNES Package --------- */
18369b94acceSBarry Smith 
18375615d1e5SSatish Balay #undef __FUNC__
18385615d1e5SSatish Balay #define __FUNC__ "SNESSetType"
183982bf6240SBarry Smith /*@C
18404b0e389bSBarry Smith    SNESSetType - Sets the method for the nonlinear solver.
18419b94acceSBarry Smith 
1842fee21e36SBarry Smith    Collective on SNES
1843fee21e36SBarry Smith 
1844c7afd0dbSLois Curfman McInnes    Input Parameters:
1845c7afd0dbSLois Curfman McInnes +  snes - the SNES context
1846c7afd0dbSLois Curfman McInnes -  method - a known method
1847c7afd0dbSLois Curfman McInnes 
1848c7afd0dbSLois Curfman McInnes    Options Database Key:
1849c7afd0dbSLois Curfman McInnes .  -snes_type <method> - Sets the method; use -help for a list
1850c7afd0dbSLois Curfman McInnes    of available methods (for instance, ls or tr)
1851ae12b187SLois Curfman McInnes 
18529b94acceSBarry Smith    Notes:
18539b94acceSBarry Smith    See "petsc/include/snes.h" for available methods (for instance)
185436851e7fSLois Curfman McInnes +    SNES_EQ_LS - Newton's method with line search
1855c7afd0dbSLois Curfman McInnes      (systems of nonlinear equations)
1856c7afd0dbSLois Curfman McInnes .    SNES_EQ_TR - Newton's method with trust region
1857c7afd0dbSLois Curfman McInnes      (systems of nonlinear equations)
1858c7afd0dbSLois Curfman McInnes .    SNES_UM_TR - Newton's method with trust region
1859c7afd0dbSLois Curfman McInnes      (unconstrained minimization)
186036851e7fSLois Curfman McInnes -    SNES_UM_LS - Newton's method with line search
1861c7afd0dbSLois Curfman McInnes      (unconstrained minimization)
18629b94acceSBarry Smith 
1863ae12b187SLois Curfman McInnes   Normally, it is best to use the SNESSetFromOptions() command and then
1864ae12b187SLois Curfman McInnes   set the SNES solver type from the options database rather than by using
1865ae12b187SLois Curfman McInnes   this routine.  Using the options database provides the user with
1866ae12b187SLois Curfman McInnes   maximum flexibility in evaluating the many nonlinear solvers.
1867ae12b187SLois Curfman McInnes   The SNESSetType() routine is provided for those situations where it
1868ae12b187SLois Curfman McInnes   is necessary to set the nonlinear solver independently of the command
1869ae12b187SLois Curfman McInnes   line or options database.  This might be the case, for example, when
1870ae12b187SLois Curfman McInnes   the choice of solver changes during the execution of the program,
1871ae12b187SLois Curfman McInnes   and the user's application is taking responsibility for choosing the
187236851e7fSLois Curfman McInnes   appropriate method.  In other words, this routine is not for beginners.
187336851e7fSLois Curfman McInnes 
187436851e7fSLois Curfman McInnes   Level: intermediate
1875a703fe33SLois Curfman McInnes 
1876f536c699SSatish Balay .keywords: SNES, set, method
18779b94acceSBarry Smith @*/
18784b0e389bSBarry Smith int SNESSetType(SNES snes,SNESType method)
18799b94acceSBarry Smith {
188084cb2905SBarry Smith   int ierr;
18819b94acceSBarry Smith   int (*r)(SNES);
18823a40ed3dSBarry Smith 
18833a40ed3dSBarry Smith   PetscFunctionBegin;
188477c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
188582bf6240SBarry Smith 
18863f1db9ecSBarry Smith   if (PetscTypeCompare(snes->type_name,method)) PetscFunctionReturn(0);
188782bf6240SBarry Smith 
188882bf6240SBarry Smith   if (snes->setupcalled) {
1889e1311b90SBarry Smith     ierr       = (*(snes)->destroy)(snes);CHKERRQ(ierr);
189082bf6240SBarry Smith     snes->data = 0;
189182bf6240SBarry Smith   }
18927d1a2b2bSBarry Smith 
18939b94acceSBarry Smith   /* Get the function pointers for the iterative method requested */
189482bf6240SBarry Smith   if (!SNESRegisterAllCalled) {ierr = SNESRegisterAll(PETSC_NULL); CHKERRQ(ierr);}
189582bf6240SBarry Smith 
1896488ecbafSBarry Smith   ierr =  FListFind(snes->comm, SNESList, method,(int (**)(void *)) &r );CHKERRQ(ierr);
189782bf6240SBarry Smith 
1898596552b5SBarry Smith   if (!r) SETERRQ1(1,1,"Unable to find requested SNES type %s",method);
18991548b14aSBarry Smith 
19000452661fSBarry Smith   if (snes->data) PetscFree(snes->data);
190182bf6240SBarry Smith   snes->data = 0;
19023a40ed3dSBarry Smith   ierr = (*r)(snes); CHKERRQ(ierr);
190382bf6240SBarry Smith 
190482bf6240SBarry Smith   if (snes->type_name) PetscFree(snes->type_name);
190582bf6240SBarry Smith   snes->type_name = (char *) PetscMalloc((PetscStrlen(method)+1)*sizeof(char));CHKPTRQ(snes->type_name);
190682bf6240SBarry Smith   PetscStrcpy(snes->type_name,method);
190782bf6240SBarry Smith   snes->set_method_called = 1;
190882bf6240SBarry Smith 
19093a40ed3dSBarry Smith   PetscFunctionReturn(0);
19109b94acceSBarry Smith }
19119b94acceSBarry Smith 
1912a847f771SSatish Balay 
19139b94acceSBarry Smith /* --------------------------------------------------------------------- */
19145615d1e5SSatish Balay #undef __FUNC__
1915d4bb536fSBarry Smith #define __FUNC__ "SNESRegisterDestroy"
19169b94acceSBarry Smith /*@C
19179b94acceSBarry Smith    SNESRegisterDestroy - Frees the list of nonlinear solvers that were
19189b94acceSBarry Smith    registered by SNESRegister().
19199b94acceSBarry Smith 
1920fee21e36SBarry Smith    Not Collective
1921fee21e36SBarry Smith 
192236851e7fSLois Curfman McInnes    Level: advanced
192336851e7fSLois Curfman McInnes 
19249b94acceSBarry Smith .keywords: SNES, nonlinear, register, destroy
19259b94acceSBarry Smith 
19269b94acceSBarry Smith .seealso: SNESRegisterAll(), SNESRegisterAll()
19279b94acceSBarry Smith @*/
1928cf256101SBarry Smith int SNESRegisterDestroy(void)
19299b94acceSBarry Smith {
193082bf6240SBarry Smith   int ierr;
193182bf6240SBarry Smith 
19323a40ed3dSBarry Smith   PetscFunctionBegin;
193382bf6240SBarry Smith   if (SNESList) {
1934488ecbafSBarry Smith     ierr = FListDestroy( SNESList );CHKERRQ(ierr);
193582bf6240SBarry Smith     SNESList = 0;
19369b94acceSBarry Smith   }
193784cb2905SBarry Smith   SNESRegisterAllCalled = 0;
19383a40ed3dSBarry Smith   PetscFunctionReturn(0);
19399b94acceSBarry Smith }
19409b94acceSBarry Smith 
19415615d1e5SSatish Balay #undef __FUNC__
1942d4bb536fSBarry Smith #define __FUNC__ "SNESGetType"
19439b94acceSBarry Smith /*@C
19449a28b0a6SLois Curfman McInnes    SNESGetType - Gets the SNES method type and name (as a string).
19459b94acceSBarry Smith 
1946c7afd0dbSLois Curfman McInnes    Not Collective
1947c7afd0dbSLois Curfman McInnes 
19489b94acceSBarry Smith    Input Parameter:
19494b0e389bSBarry Smith .  snes - nonlinear solver context
19509b94acceSBarry Smith 
19519b94acceSBarry Smith    Output Parameter:
195282bf6240SBarry Smith .  method - SNES method (a charactor string)
19539b94acceSBarry Smith 
195436851e7fSLois Curfman McInnes    Level: intermediate
195536851e7fSLois Curfman McInnes 
19569b94acceSBarry Smith .keywords: SNES, nonlinear, get, method, name
19579b94acceSBarry Smith @*/
195882bf6240SBarry Smith int SNESGetType(SNES snes, SNESType *method)
19599b94acceSBarry Smith {
19603a40ed3dSBarry Smith   PetscFunctionBegin;
196182bf6240SBarry Smith   *method = snes->type_name;
19623a40ed3dSBarry Smith   PetscFunctionReturn(0);
19639b94acceSBarry Smith }
19649b94acceSBarry Smith 
19655615d1e5SSatish Balay #undef __FUNC__
1966d4bb536fSBarry Smith #define __FUNC__ "SNESGetSolution"
19679b94acceSBarry Smith /*@C
19689b94acceSBarry Smith    SNESGetSolution - Returns the vector where the approximate solution is
19699b94acceSBarry Smith    stored.
19709b94acceSBarry Smith 
1971c7afd0dbSLois Curfman McInnes    Not Collective, but Vec is parallel if SNES is parallel
1972c7afd0dbSLois Curfman McInnes 
19739b94acceSBarry Smith    Input Parameter:
19749b94acceSBarry Smith .  snes - the SNES context
19759b94acceSBarry Smith 
19769b94acceSBarry Smith    Output Parameter:
19779b94acceSBarry Smith .  x - the solution
19789b94acceSBarry Smith 
197936851e7fSLois Curfman McInnes    Level: advanced
198036851e7fSLois Curfman McInnes 
19819b94acceSBarry Smith .keywords: SNES, nonlinear, get, solution
19829b94acceSBarry Smith 
1983a86d99e1SLois Curfman McInnes .seealso: SNESGetFunction(), SNESGetGradient(), SNESGetSolutionUpdate()
19849b94acceSBarry Smith @*/
19859b94acceSBarry Smith int SNESGetSolution(SNES snes,Vec *x)
19869b94acceSBarry Smith {
19873a40ed3dSBarry Smith   PetscFunctionBegin;
198877c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
19899b94acceSBarry Smith   *x = snes->vec_sol_always;
19903a40ed3dSBarry Smith   PetscFunctionReturn(0);
19919b94acceSBarry Smith }
19929b94acceSBarry Smith 
19935615d1e5SSatish Balay #undef __FUNC__
1994d4bb536fSBarry Smith #define __FUNC__ "SNESGetSolutionUpdate"
19959b94acceSBarry Smith /*@C
19969b94acceSBarry Smith    SNESGetSolutionUpdate - Returns the vector where the solution update is
19979b94acceSBarry Smith    stored.
19989b94acceSBarry Smith 
1999c7afd0dbSLois Curfman McInnes    Not Collective, but Vec is parallel if SNES is parallel
2000c7afd0dbSLois Curfman McInnes 
20019b94acceSBarry Smith    Input Parameter:
20029b94acceSBarry Smith .  snes - the SNES context
20039b94acceSBarry Smith 
20049b94acceSBarry Smith    Output Parameter:
20059b94acceSBarry Smith .  x - the solution update
20069b94acceSBarry Smith 
200736851e7fSLois Curfman McInnes    Level: advanced
200836851e7fSLois Curfman McInnes 
20099b94acceSBarry Smith .keywords: SNES, nonlinear, get, solution, update
20109b94acceSBarry Smith 
20119b94acceSBarry Smith .seealso: SNESGetSolution(), SNESGetFunction
20129b94acceSBarry Smith @*/
20139b94acceSBarry Smith int SNESGetSolutionUpdate(SNES snes,Vec *x)
20149b94acceSBarry Smith {
20153a40ed3dSBarry Smith   PetscFunctionBegin;
201677c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
20179b94acceSBarry Smith   *x = snes->vec_sol_update_always;
20183a40ed3dSBarry Smith   PetscFunctionReturn(0);
20199b94acceSBarry Smith }
20209b94acceSBarry Smith 
20215615d1e5SSatish Balay #undef __FUNC__
2022d4bb536fSBarry Smith #define __FUNC__ "SNESGetFunction"
20239b94acceSBarry Smith /*@C
20243638b69dSLois Curfman McInnes    SNESGetFunction - Returns the vector where the function is stored.
20259b94acceSBarry Smith 
2026c7afd0dbSLois Curfman McInnes    Not Collective, but Vec is parallel if SNES is parallel
2027c7afd0dbSLois Curfman McInnes 
20289b94acceSBarry Smith    Input Parameter:
20299b94acceSBarry Smith .  snes - the SNES context
20309b94acceSBarry Smith 
20319b94acceSBarry Smith    Output Parameter:
20323638b69dSLois Curfman McInnes .  r - the function
20339b94acceSBarry Smith 
20349b94acceSBarry Smith    Notes:
20359b94acceSBarry Smith    SNESGetFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only
20369b94acceSBarry Smith    Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are
20379b94acceSBarry Smith    SNESGetMinimizationFunction() and SNESGetGradient();
20389b94acceSBarry Smith 
203936851e7fSLois Curfman McInnes    Level: advanced
204036851e7fSLois Curfman McInnes 
2041a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, get, function
20429b94acceSBarry Smith 
204331615d04SLois Curfman McInnes .seealso: SNESSetFunction(), SNESGetSolution(), SNESGetMinimizationFunction(),
204431615d04SLois Curfman McInnes           SNESGetGradient()
20459b94acceSBarry Smith @*/
20469b94acceSBarry Smith int SNESGetFunction(SNES snes,Vec *r)
20479b94acceSBarry Smith {
20483a40ed3dSBarry Smith   PetscFunctionBegin;
204977c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2050a8c6a408SBarry Smith   if (snes->method_class != SNES_NONLINEAR_EQUATIONS) {
2051a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_NONLINEAR_EQUATIONS only");
2052a8c6a408SBarry Smith   }
20539b94acceSBarry Smith   *r = snes->vec_func_always;
20543a40ed3dSBarry Smith   PetscFunctionReturn(0);
20559b94acceSBarry Smith }
20569b94acceSBarry Smith 
20575615d1e5SSatish Balay #undef __FUNC__
2058d4bb536fSBarry Smith #define __FUNC__ "SNESGetGradient"
20599b94acceSBarry Smith /*@C
20603638b69dSLois Curfman McInnes    SNESGetGradient - Returns the vector where the gradient is stored.
20619b94acceSBarry Smith 
2062c7afd0dbSLois Curfman McInnes    Not Collective, but Vec is parallel if SNES is parallel
2063c7afd0dbSLois Curfman McInnes 
20649b94acceSBarry Smith    Input Parameter:
20659b94acceSBarry Smith .  snes - the SNES context
20669b94acceSBarry Smith 
20679b94acceSBarry Smith    Output Parameter:
20689b94acceSBarry Smith .  r - the gradient
20699b94acceSBarry Smith 
20709b94acceSBarry Smith    Notes:
20719b94acceSBarry Smith    SNESGetGradient() is valid for SNES_UNCONSTRAINED_MINIMIZATION methods
20729b94acceSBarry Smith    only.  An analogous routine for SNES_NONLINEAR_EQUATIONS methods is
20739b94acceSBarry Smith    SNESGetFunction().
20749b94acceSBarry Smith 
207536851e7fSLois Curfman McInnes    Level: advanced
207636851e7fSLois Curfman McInnes 
20779b94acceSBarry Smith .keywords: SNES, nonlinear, get, gradient
20789b94acceSBarry Smith 
207931615d04SLois Curfman McInnes .seealso: SNESGetMinimizationFunction(), SNESGetSolution(), SNESGetFunction()
20809b94acceSBarry Smith @*/
20819b94acceSBarry Smith int SNESGetGradient(SNES snes,Vec *r)
20829b94acceSBarry Smith {
20833a40ed3dSBarry Smith   PetscFunctionBegin;
208477c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
20853a40ed3dSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
2086a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_UNCONSTRAINED_MINIMIZATION only");
20873a40ed3dSBarry Smith   }
20889b94acceSBarry Smith   *r = snes->vec_func_always;
20893a40ed3dSBarry Smith   PetscFunctionReturn(0);
20909b94acceSBarry Smith }
20919b94acceSBarry Smith 
20925615d1e5SSatish Balay #undef __FUNC__
2093d4bb536fSBarry Smith #define __FUNC__ "SNESGetMinimizationFunction"
20949b94acceSBarry Smith /*@
20959b94acceSBarry Smith    SNESGetMinimizationFunction - Returns the scalar function value for
20969b94acceSBarry Smith    unconstrained minimization problems.
20979b94acceSBarry Smith 
2098c7afd0dbSLois Curfman McInnes    Not Collective
2099c7afd0dbSLois Curfman McInnes 
21009b94acceSBarry Smith    Input Parameter:
21019b94acceSBarry Smith .  snes - the SNES context
21029b94acceSBarry Smith 
21039b94acceSBarry Smith    Output Parameter:
21049b94acceSBarry Smith .  r - the function
21059b94acceSBarry Smith 
21069b94acceSBarry Smith    Notes:
21079b94acceSBarry Smith    SNESGetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION
21089b94acceSBarry Smith    methods only.  An analogous routine for SNES_NONLINEAR_EQUATIONS methods is
21099b94acceSBarry Smith    SNESGetFunction().
21109b94acceSBarry Smith 
211136851e7fSLois Curfman McInnes    Level: advanced
211236851e7fSLois Curfman McInnes 
21139b94acceSBarry Smith .keywords: SNES, nonlinear, get, function
21149b94acceSBarry Smith 
211531615d04SLois Curfman McInnes .seealso: SNESGetGradient(), SNESGetSolution(), SNESGetFunction()
21169b94acceSBarry Smith @*/
21179b94acceSBarry Smith int SNESGetMinimizationFunction(SNES snes,double *r)
21189b94acceSBarry Smith {
21193a40ed3dSBarry Smith   PetscFunctionBegin;
212077c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
212174679c65SBarry Smith   PetscValidScalarPointer(r);
21223a40ed3dSBarry Smith   if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) {
2123a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_UNCONSTRAINED_MINIMIZATION only");
21243a40ed3dSBarry Smith   }
21259b94acceSBarry Smith   *r = snes->fc;
21263a40ed3dSBarry Smith   PetscFunctionReturn(0);
21279b94acceSBarry Smith }
21289b94acceSBarry Smith 
21295615d1e5SSatish Balay #undef __FUNC__
2130d4bb536fSBarry Smith #define __FUNC__ "SNESSetOptionsPrefix"
21313c7409f5SSatish Balay /*@C
21323c7409f5SSatish Balay    SNESSetOptionsPrefix - Sets the prefix used for searching for all
2133d850072dSLois Curfman McInnes    SNES options in the database.
21343c7409f5SSatish Balay 
2135fee21e36SBarry Smith    Collective on SNES
2136fee21e36SBarry Smith 
2137c7afd0dbSLois Curfman McInnes    Input Parameter:
2138c7afd0dbSLois Curfman McInnes +  snes - the SNES context
2139c7afd0dbSLois Curfman McInnes -  prefix - the prefix to prepend to all option names
2140c7afd0dbSLois Curfman McInnes 
2141d850072dSLois Curfman McInnes    Notes:
2142a83b1b31SSatish Balay    A hyphen (-) must NOT be given at the beginning of the prefix name.
2143c7afd0dbSLois Curfman McInnes    The first character of all runtime options is AUTOMATICALLY the hyphen.
2144d850072dSLois Curfman McInnes 
214536851e7fSLois Curfman McInnes    Level: advanced
214636851e7fSLois Curfman McInnes 
21473c7409f5SSatish Balay .keywords: SNES, set, options, prefix, database
2148a86d99e1SLois Curfman McInnes 
2149a86d99e1SLois Curfman McInnes .seealso: SNESSetFromOptions()
21503c7409f5SSatish Balay @*/
21513c7409f5SSatish Balay int SNESSetOptionsPrefix(SNES snes,char *prefix)
21523c7409f5SSatish Balay {
21533c7409f5SSatish Balay   int ierr;
21543c7409f5SSatish Balay 
21553a40ed3dSBarry Smith   PetscFunctionBegin;
215677c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2157639f9d9dSBarry Smith   ierr = PetscObjectSetOptionsPrefix((PetscObject)snes, prefix); CHKERRQ(ierr);
21583c7409f5SSatish Balay   ierr = SLESSetOptionsPrefix(snes->sles,prefix);CHKERRQ(ierr);
21593a40ed3dSBarry Smith   PetscFunctionReturn(0);
21603c7409f5SSatish Balay }
21613c7409f5SSatish Balay 
21625615d1e5SSatish Balay #undef __FUNC__
2163d4bb536fSBarry Smith #define __FUNC__ "SNESAppendOptionsPrefix"
21643c7409f5SSatish Balay /*@C
2165f525115eSLois Curfman McInnes    SNESAppendOptionsPrefix - Appends to the prefix used for searching for all
2166d850072dSLois Curfman McInnes    SNES options in the database.
21673c7409f5SSatish Balay 
2168fee21e36SBarry Smith    Collective on SNES
2169fee21e36SBarry Smith 
2170c7afd0dbSLois Curfman McInnes    Input Parameters:
2171c7afd0dbSLois Curfman McInnes +  snes - the SNES context
2172c7afd0dbSLois Curfman McInnes -  prefix - the prefix to prepend to all option names
2173c7afd0dbSLois Curfman McInnes 
2174d850072dSLois Curfman McInnes    Notes:
2175a83b1b31SSatish Balay    A hyphen (-) must NOT be given at the beginning of the prefix name.
2176c7afd0dbSLois Curfman McInnes    The first character of all runtime options is AUTOMATICALLY the hyphen.
2177d850072dSLois Curfman McInnes 
217836851e7fSLois Curfman McInnes    Level: advanced
217936851e7fSLois Curfman McInnes 
21803c7409f5SSatish Balay .keywords: SNES, append, options, prefix, database
2181a86d99e1SLois Curfman McInnes 
2182a86d99e1SLois Curfman McInnes .seealso: SNESGetOptionsPrefix()
21833c7409f5SSatish Balay @*/
21843c7409f5SSatish Balay int SNESAppendOptionsPrefix(SNES snes,char *prefix)
21853c7409f5SSatish Balay {
21863c7409f5SSatish Balay   int ierr;
21873c7409f5SSatish Balay 
21883a40ed3dSBarry Smith   PetscFunctionBegin;
218977c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2190639f9d9dSBarry Smith   ierr = PetscObjectAppendOptionsPrefix((PetscObject)snes, prefix); CHKERRQ(ierr);
21913c7409f5SSatish Balay   ierr = SLESAppendOptionsPrefix(snes->sles,prefix);CHKERRQ(ierr);
21923a40ed3dSBarry Smith   PetscFunctionReturn(0);
21933c7409f5SSatish Balay }
21943c7409f5SSatish Balay 
21955615d1e5SSatish Balay #undef __FUNC__
2196d4bb536fSBarry Smith #define __FUNC__ "SNESGetOptionsPrefix"
2197c83590e2SSatish Balay /*@
21983c7409f5SSatish Balay    SNESGetOptionsPrefix - Sets the prefix used for searching for all
21993c7409f5SSatish Balay    SNES options in the database.
22003c7409f5SSatish Balay 
2201c7afd0dbSLois Curfman McInnes    Not Collective
2202c7afd0dbSLois Curfman McInnes 
22033c7409f5SSatish Balay    Input Parameter:
22043c7409f5SSatish Balay .  snes - the SNES context
22053c7409f5SSatish Balay 
22063c7409f5SSatish Balay    Output Parameter:
22073c7409f5SSatish Balay .  prefix - pointer to the prefix string used
22083c7409f5SSatish Balay 
220936851e7fSLois Curfman McInnes    Level: advanced
221036851e7fSLois Curfman McInnes 
22113c7409f5SSatish Balay .keywords: SNES, get, options, prefix, database
2212a86d99e1SLois Curfman McInnes 
2213a86d99e1SLois Curfman McInnes .seealso: SNESAppendOptionsPrefix()
22143c7409f5SSatish Balay @*/
22153c7409f5SSatish Balay int SNESGetOptionsPrefix(SNES snes,char **prefix)
22163c7409f5SSatish Balay {
22173c7409f5SSatish Balay   int ierr;
22183c7409f5SSatish Balay 
22193a40ed3dSBarry Smith   PetscFunctionBegin;
222077c4ece6SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2221639f9d9dSBarry Smith   ierr = PetscObjectGetOptionsPrefix((PetscObject)snes, prefix); CHKERRQ(ierr);
22223a40ed3dSBarry Smith   PetscFunctionReturn(0);
22233c7409f5SSatish Balay }
22243c7409f5SSatish Balay 
2225ca161407SBarry Smith #undef __FUNC__
2226ca161407SBarry Smith #define __FUNC__ "SNESPrintHelp"
2227ca161407SBarry Smith /*@
2228ca161407SBarry Smith    SNESPrintHelp - Prints all options for the SNES component.
2229ca161407SBarry Smith 
2230c7afd0dbSLois Curfman McInnes    Collective on SNES
2231c7afd0dbSLois Curfman McInnes 
2232ca161407SBarry Smith    Input Parameter:
2233ca161407SBarry Smith .  snes - the SNES context
2234ca161407SBarry Smith 
2235ca161407SBarry Smith    Options Database Keys:
2236c7afd0dbSLois Curfman McInnes +  -help - Prints SNES options
2237c7afd0dbSLois Curfman McInnes -  -h - Prints SNES options
2238ca161407SBarry Smith 
223936851e7fSLois Curfman McInnes    Level: beginner
224036851e7fSLois Curfman McInnes 
2241ca161407SBarry Smith .keywords: SNES, nonlinear, help
2242ca161407SBarry Smith 
2243ca161407SBarry Smith .seealso: SNESSetFromOptions()
2244ca161407SBarry Smith @*/
2245ca161407SBarry Smith int SNESPrintHelp(SNES snes)
2246ca161407SBarry Smith {
2247ca161407SBarry Smith   char                p[64];
2248ca161407SBarry Smith   SNES_KSP_EW_ConvCtx *kctx;
2249ca161407SBarry Smith   int                 ierr;
2250ca161407SBarry Smith 
2251ca161407SBarry Smith   PetscFunctionBegin;
2252ca161407SBarry Smith   PetscValidHeaderSpecific(snes,SNES_COOKIE);
2253ca161407SBarry Smith 
2254ca161407SBarry Smith   PetscStrcpy(p,"-");
2255ca161407SBarry Smith   if (snes->prefix) PetscStrcat(p, snes->prefix);
2256ca161407SBarry Smith 
2257ca161407SBarry Smith   kctx = (SNES_KSP_EW_ConvCtx *)snes->kspconvctx;
2258ca161407SBarry Smith 
225976be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm,"SNES options ------------------------------------------------\n");
2260488ecbafSBarry Smith   ierr = FListPrintTypes(snes->comm,stdout,snes->prefix,"snes_type",SNESList);CHKERRQ(ierr);
226176be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm," %ssnes_view: view SNES info after each nonlinear solve\n",p);
226276be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm," %ssnes_max_it <its>: max iterations (default %d)\n",p,snes->max_its);
226376be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm," %ssnes_max_funcs <maxf>: max function evals (default %d)\n",p,snes->max_funcs);
226476be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm," %ssnes_stol <stol>: successive step tolerance (default %g)\n",p,snes->xtol);
226576be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm," %ssnes_atol <atol>: absolute tolerance (default %g)\n",p,snes->atol);
226676be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm," %ssnes_rtol <rtol>: relative tolerance (default %g)\n",p,snes->rtol);
226776be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm," %ssnes_trtol <trtol>: trust region parameter tolerance (default %g)\n",p,snes->deltatol);
226876be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm," SNES Monitoring Options: Choose any of the following\n");
226976be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm,"   %ssnes_cancelmonitors: cancels all monitors hardwired in code\n",p);
227076be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm,"   %ssnes_monitor: use default SNES convergence monitor, prints\n\
2271ca161407SBarry Smith     residual norm at each iteration.\n",p);
227276be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm,"   %ssnes_smonitor: same as the above, but prints fewer digits of the\n\
2273ca161407SBarry Smith     residual norm for small residual norms. This is useful to conceal\n\
2274ca161407SBarry Smith     meaningless digits that may be different on different machines.\n",p);
227576be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm,"   %ssnes_xmonitor [x,y,w,h]: use X graphics convergence monitor\n",p);
2276ca161407SBarry Smith   if (snes->type == SNES_NONLINEAR_EQUATIONS) {
227776be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,
2278ca161407SBarry Smith      " Options for solving systems of nonlinear equations only:\n");
227976be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,"   %ssnes_fd: use finite differences for Jacobian\n",p);
228076be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,"   %ssnes_mf: use matrix-free Jacobian\n",p);
228176be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,"   %ssnes_mf_operator:use matrix-free Jacobian and user-provided preconditioning matrix\n",p);
2282e24b481bSBarry Smith     (*PetscHelpPrintf)(snes->comm,"   %ssnes_mf_ksp_monitor - if using matrix-free multiply then prints h at each KSP iteration\n",p);
228376be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,"   %ssnes_no_convergence_test: Do not test for convergence, always run to SNES max its\n",p);
228476be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,"   %ssnes_ksp_ew_conv: use Eisenstat-Walker computation of KSP rtol. Params are:\n",p);
228576be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,
2286ca161407SBarry Smith      "     %ssnes_ksp_ew_version <version> (1 or 2, default is %d)\n",p,kctx->version);
228776be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,
2288ca161407SBarry Smith      "     %ssnes_ksp_ew_rtol0 <rtol0> (0 <= rtol0 < 1, default %g)\n",p,kctx->rtol_0);
228976be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,
2290ca161407SBarry Smith      "     %ssnes_ksp_ew_rtolmax <rtolmax> (0 <= rtolmax < 1, default %g)\n",p,kctx->rtol_max);
229176be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,
2292ca161407SBarry Smith      "     %ssnes_ksp_ew_gamma <gamma> (0 <= gamma <= 1, default %g)\n",p,kctx->gamma);
229376be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,
2294ca161407SBarry Smith      "     %ssnes_ksp_ew_alpha <alpha> (1 < alpha <= 2, default %g)\n",p,kctx->alpha);
229576be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,
2296ca161407SBarry Smith      "     %ssnes_ksp_ew_alpha2 <alpha2> (default %g)\n",p,kctx->alpha2);
229776be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,
2298ca161407SBarry Smith      "     %ssnes_ksp_ew_threshold <threshold> (0 < threshold < 1, default %g)\n",p,kctx->threshold);
2299ca161407SBarry Smith   } else if (snes->type == SNES_UNCONSTRAINED_MINIMIZATION) {
230076be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,
2301ca161407SBarry Smith      " Options for solving unconstrained minimization problems only:\n");
230276be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,"   %ssnes_fmin <ftol>: minimum function tolerance (default %g)\n",p,snes->fmin);
230376be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,"   %ssnes_fd: use finite differences for Hessian\n",p);
230476be9ce4SBarry Smith     (*PetscHelpPrintf)(snes->comm,"   %ssnes_mf: use matrix-free Hessian\n",p);
2305ca161407SBarry Smith   }
230676be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm," Run program with -help %ssnes_type <method> for help on ",p);
230776be9ce4SBarry Smith   (*PetscHelpPrintf)(snes->comm,"a particular method\n");
2308ca161407SBarry Smith   if (snes->printhelp) {
2309ca161407SBarry Smith     ierr = (*snes->printhelp)(snes,p);CHKERRQ(ierr);
2310ca161407SBarry Smith   }
2311ca161407SBarry Smith   PetscFunctionReturn(0);
2312ca161407SBarry Smith }
23133c7409f5SSatish Balay 
2314acb85ae6SSatish Balay /*MC
2315b2002411SLois Curfman McInnes    SNESRegister - Adds a method to the nonlinear solver package.
23169b94acceSBarry Smith 
2317b2002411SLois Curfman McInnes    Synopsis:
2318b2002411SLois Curfman McInnes    SNESRegister(char *name_solver,char *path,char *name_create,int (*routine_create)(SNES))
23199b94acceSBarry Smith 
23208d76a1e5SLois Curfman McInnes    Not collective
23218d76a1e5SLois Curfman McInnes 
2322b2002411SLois Curfman McInnes    Input Parameters:
2323c7afd0dbSLois Curfman McInnes +  name_solver - name of a new user-defined solver
2324b2002411SLois Curfman McInnes .  path - path (either absolute or relative) the library containing this solver
2325b2002411SLois Curfman McInnes .  name_create - name of routine to create method context
2326c7afd0dbSLois Curfman McInnes -  routine_create - routine to create method context
23279b94acceSBarry Smith 
2328b2002411SLois Curfman McInnes    Notes:
2329b2002411SLois Curfman McInnes    SNESRegister() may be called multiple times to add several user-defined solvers.
23303a40ed3dSBarry Smith 
2331b2002411SLois Curfman McInnes    If dynamic libraries are used, then the fourth input argument (routine_create)
2332b2002411SLois Curfman McInnes    is ignored.
2333b2002411SLois Curfman McInnes 
2334b2002411SLois Curfman McInnes    Sample usage:
233569225d78SLois Curfman McInnes .vb
2336b2002411SLois Curfman McInnes    SNESRegister("my_solver",/home/username/my_lib/lib/libg/solaris/mylib.a,
2337b2002411SLois Curfman McInnes                 "MySolverCreate",MySolverCreate);
233869225d78SLois Curfman McInnes .ve
2339b2002411SLois Curfman McInnes 
2340b2002411SLois Curfman McInnes    Then, your solver can be chosen with the procedural interface via
2341b2002411SLois Curfman McInnes $     SNESSetType(snes,"my_solver")
2342b2002411SLois Curfman McInnes    or at runtime via the option
2343b2002411SLois Curfman McInnes $     -snes_type my_solver
2344b2002411SLois Curfman McInnes 
234536851e7fSLois Curfman McInnes    Level: advanced
234636851e7fSLois Curfman McInnes 
2347b2002411SLois Curfman McInnes .keywords: SNES, nonlinear, register
2348b2002411SLois Curfman McInnes 
2349b2002411SLois Curfman McInnes .seealso: SNESRegisterAll(), SNESRegisterDestroy()
2350b2002411SLois Curfman McInnes M*/
2351b2002411SLois Curfman McInnes 
2352b2002411SLois Curfman McInnes #undef __FUNC__
2353b2002411SLois Curfman McInnes #define __FUNC__ "SNESRegister_Private"
2354b2002411SLois Curfman McInnes int SNESRegister_Private(char *sname,char *path,char *name,int (*function)(SNES))
2355b2002411SLois Curfman McInnes {
2356b2002411SLois Curfman McInnes   char fullname[256];
2357b2002411SLois Curfman McInnes   int  ierr;
2358b2002411SLois Curfman McInnes 
2359b2002411SLois Curfman McInnes   PetscFunctionBegin;
2360b2002411SLois Curfman McInnes   PetscStrcpy(fullname,path); PetscStrcat(fullname,":");PetscStrcat(fullname,name);
2361488ecbafSBarry Smith   ierr = FListAdd_Private(&SNESList,sname,fullname, (int (*)(void*))function);CHKERRQ(ierr);
2362b2002411SLois Curfman McInnes   PetscFunctionReturn(0);
2363b2002411SLois Curfman McInnes }
2364