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