1a5eb4965SSatish Balay #ifdef PETSC_RCS_HEADER 2*3f1db9ecSBarry Smith static char vcid[] = "$Id: snes.c,v 1.163 1998/12/03 04:05:20 bsmith Exp bsmith $"; 39b94acceSBarry Smith #endif 49b94acceSBarry Smith 570f55243SBarry Smith #include "src/snes/snesimpl.h" /*I "snes.h" I*/ 6f5eb4b81SSatish Balay #include "src/sys/nreg.h" 79b94acceSBarry Smith 884cb2905SBarry Smith int SNESRegisterAllCalled = 0; 9488ecbafSBarry Smith FList SNESList = 0; 1082bf6240SBarry Smith 115615d1e5SSatish Balay #undef __FUNC__ 12d4bb536fSBarry Smith #define __FUNC__ "SNESView" 139b94acceSBarry Smith /*@ 149b94acceSBarry Smith SNESView - Prints the SNES data structure. 159b94acceSBarry Smith 16fee21e36SBarry Smith Collective on SNES, unless Viewer is VIEWER_STDOUT_SELF 17fee21e36SBarry Smith 18c7afd0dbSLois Curfman McInnes Input Parameters: 19c7afd0dbSLois Curfman McInnes + SNES - the SNES context 20c7afd0dbSLois Curfman McInnes - viewer - visualization context 21c7afd0dbSLois Curfman McInnes 229b94acceSBarry Smith Options Database Key: 23c8a8ba5cSLois Curfman McInnes . -snes_view - Calls SNESView() at end of SNESSolve() 249b94acceSBarry Smith 259b94acceSBarry Smith Notes: 269b94acceSBarry Smith The available visualization contexts include 27c7afd0dbSLois Curfman McInnes + VIEWER_STDOUT_SELF - standard output (default) 28c7afd0dbSLois Curfman McInnes - VIEWER_STDOUT_WORLD - synchronized standard 29c8a8ba5cSLois Curfman McInnes output where only the first processor opens 30c8a8ba5cSLois Curfman McInnes the file. All other processors send their 31c8a8ba5cSLois Curfman McInnes data to the first processor to print. 329b94acceSBarry Smith 333e081fefSLois Curfman McInnes The user can open an alternative visualization context with 3477ed5343SBarry Smith ViewerASCIIOpen() - output to a specified file. 359b94acceSBarry Smith 369b94acceSBarry Smith .keywords: SNES, view 379b94acceSBarry Smith 3877ed5343SBarry Smith .seealso: ViewerASCIIOpen() 399b94acceSBarry Smith @*/ 409b94acceSBarry Smith int SNESView(SNES snes,Viewer viewer) 419b94acceSBarry Smith { 429b94acceSBarry Smith SNES_KSP_EW_ConvCtx *kctx; 439b94acceSBarry Smith FILE *fd; 449b94acceSBarry Smith int ierr; 459b94acceSBarry Smith SLES sles; 469b94acceSBarry Smith char *method; 4719bcc07fSBarry Smith ViewerType vtype; 489b94acceSBarry Smith 493a40ed3dSBarry Smith PetscFunctionBegin; 5074679c65SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 5174679c65SBarry Smith if (viewer) {PetscValidHeader(viewer);} 5274679c65SBarry Smith else { viewer = VIEWER_STDOUT_SELF; } 5374679c65SBarry Smith 5419bcc07fSBarry Smith ierr = ViewerGetType(viewer,&vtype); CHKERRQ(ierr); 55*3f1db9ecSBarry Smith if (PetscTypeCompare(vtype,ASCII_VIEWER)) { 5690ace30eSBarry Smith ierr = ViewerASCIIGetPointer(viewer,&fd); CHKERRQ(ierr); 5777c4ece6SBarry Smith PetscFPrintf(snes->comm,fd,"SNES Object:\n"); 5882bf6240SBarry Smith SNESGetType(snes,&method); 5977c4ece6SBarry Smith PetscFPrintf(snes->comm,fd," method: %s\n",method); 60e1311b90SBarry Smith if (snes->view) (*snes->view)(snes,viewer); 6177c4ece6SBarry Smith PetscFPrintf(snes->comm,fd, 629b94acceSBarry Smith " maximum iterations=%d, maximum function evaluations=%d\n", 639b94acceSBarry Smith snes->max_its,snes->max_funcs); 6477c4ece6SBarry Smith PetscFPrintf(snes->comm,fd, 659b94acceSBarry Smith " tolerances: relative=%g, absolute=%g, truncation=%g, solution=%g\n", 669b94acceSBarry Smith snes->rtol, snes->atol, snes->trunctol, snes->xtol); 677a00f4a9SLois Curfman McInnes PetscFPrintf(snes->comm,fd, 687a00f4a9SLois Curfman McInnes " total number of linear solver iterations=%d\n",snes->linear_its); 69ae3c334cSLois Curfman McInnes PetscFPrintf(snes->comm,fd, 7068632166SLois Curfman McInnes " total number of function evaluations=%d\n",snes->nfuncs); 719b94acceSBarry Smith if (snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) 7277c4ece6SBarry Smith PetscFPrintf(snes->comm,fd," min function tolerance=%g\n",snes->fmin); 739b94acceSBarry Smith if (snes->ksp_ewconv) { 749b94acceSBarry Smith kctx = (SNES_KSP_EW_ConvCtx *)snes->kspconvctx; 759b94acceSBarry Smith if (kctx) { 7677c4ece6SBarry Smith PetscFPrintf(snes->comm,fd, 779b94acceSBarry Smith " Eisenstat-Walker computation of KSP relative tolerance (version %d)\n", 789b94acceSBarry Smith kctx->version); 7977c4ece6SBarry Smith PetscFPrintf(snes->comm,fd, 809b94acceSBarry Smith " rtol_0=%g, rtol_max=%g, threshold=%g\n",kctx->rtol_0, 819b94acceSBarry Smith kctx->rtol_max,kctx->threshold); 8277c4ece6SBarry Smith PetscFPrintf(snes->comm,fd," gamma=%g, alpha=%g, alpha2=%g\n", 839b94acceSBarry Smith kctx->gamma,kctx->alpha,kctx->alpha2); 849b94acceSBarry Smith } 859b94acceSBarry Smith } 86*3f1db9ecSBarry Smith } else if (PetscTypeCompare(vtype,STRING_VIEWER)) { 8782bf6240SBarry Smith SNESGetType(snes,&method); 88c30f285eSLois Curfman McInnes ViewerStringSPrintf(viewer," %-3.3s",method); 8919bcc07fSBarry Smith } 9077ed5343SBarry Smith ierr = SNESGetSLES(snes,&sles);CHKERRQ(ierr); 919b94acceSBarry Smith ierr = SLESView(sles,viewer); CHKERRQ(ierr); 923a40ed3dSBarry Smith PetscFunctionReturn(0); 939b94acceSBarry Smith } 949b94acceSBarry Smith 95639f9d9dSBarry Smith /* 96639f9d9dSBarry Smith We retain a list of functions that also take SNES command 97639f9d9dSBarry Smith line options. These are called at the end SNESSetFromOptions() 98639f9d9dSBarry Smith */ 99639f9d9dSBarry Smith #define MAXSETFROMOPTIONS 5 100639f9d9dSBarry Smith static int numberofsetfromoptions; 101639f9d9dSBarry Smith static int (*othersetfromoptions[MAXSETFROMOPTIONS])(SNES); 102639f9d9dSBarry Smith 1035615d1e5SSatish Balay #undef __FUNC__ 104d4bb536fSBarry Smith #define __FUNC__ "SNESAddOptionsChecker" 105639f9d9dSBarry Smith /*@ 106639f9d9dSBarry Smith SNESAddOptionsChecker - Adds an additional function to check for SNES options. 107639f9d9dSBarry Smith 108c7afd0dbSLois Curfman McInnes Not Collective 109c7afd0dbSLois Curfman McInnes 110639f9d9dSBarry Smith Input Parameter: 111639f9d9dSBarry Smith . snescheck - function that checks for options 112639f9d9dSBarry Smith 113639f9d9dSBarry Smith .seealso: SNESSetFromOptions() 114639f9d9dSBarry Smith @*/ 115639f9d9dSBarry Smith int SNESAddOptionsChecker(int (*snescheck)(SNES) ) 116639f9d9dSBarry Smith { 1173a40ed3dSBarry Smith PetscFunctionBegin; 118639f9d9dSBarry Smith if (numberofsetfromoptions >= MAXSETFROMOPTIONS) { 119a8c6a408SBarry Smith SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,0,"Too many options checkers, only 5 allowed"); 120639f9d9dSBarry Smith } 121639f9d9dSBarry Smith 122639f9d9dSBarry Smith othersetfromoptions[numberofsetfromoptions++] = snescheck; 1233a40ed3dSBarry Smith PetscFunctionReturn(0); 124639f9d9dSBarry Smith } 125639f9d9dSBarry Smith 1265615d1e5SSatish Balay #undef __FUNC__ 1275615d1e5SSatish Balay #define __FUNC__ "SNESSetFromOptions" 1289b94acceSBarry Smith /*@ 129682d7d0cSBarry Smith SNESSetFromOptions - Sets various SNES and SLES parameters from user options. 1309b94acceSBarry Smith 131c7afd0dbSLois Curfman McInnes Collective on SNES 132c7afd0dbSLois Curfman McInnes 1339b94acceSBarry Smith Input Parameter: 1349b94acceSBarry Smith . snes - the SNES context 1359b94acceSBarry Smith 13682738288SBarry Smith Options Database: 13782738288SBarry Smith + -snes_type type - SNES_EQ_LS, SNES_EQ_TR, SNES_UM_TR, SNES_UM_LS etc 13882738288SBarry Smith . -snes_stol - convergence tolerance in terms of the norm 13982738288SBarry Smith of the change in the solution between steps 14082738288SBarry Smith . -snes_atol atol - absolute tolerance of residual norm 14182738288SBarry Smith . -snes_rtol rtol - relative decrease in tolerance norm from initial 14282738288SBarry Smith . -snes_max_it max_it - maximum number of iterations 14382738288SBarry Smith . -snes_max_funcs max_funcs - maximum number of function evaluations 14482738288SBarry Smith . -snes_trtol trtol - trust region tolerance 14582738288SBarry Smith . -snes_no_convergence_test - skip convergence test in nonlinear or minimization 14682738288SBarry Smith solver; hence iterations will continue until max_it 14782738288SBarry Smith or some other criteria is reached. Saves expense 14882738288SBarry Smith of convergence test 14982738288SBarry Smith . -snes_monitor - prints residual norm at each iteration 15082738288SBarry Smith . -snes_xmonitor - plots residual norm at each iteration 151e24b481bSBarry Smith . -snes_fd - use finite differences to compute Jacobian; very slow, only for testing 152e24b481bSBarry Smith - -snes_mf_ksp_monitor - if using matrix-free multiply then prints h at each KSP iteration 15382738288SBarry Smith 15482738288SBarry Smith Options Database for Eisenstat-Walker method: 15582738288SBarry Smith + -snes_ksp_eq_conv - use Eisenstat-Walker method for determining linear system convergence 15682738288SBarry Smith . -snes_ksp_eq_version ver - version of Eisenstat-Walker method 15782738288SBarry Smith . -snes_ksp_ew_rtol0 rtol0 - 15882738288SBarry Smith . -snes_ksp_ew_rtolmax rtolmax - 15982738288SBarry Smith . -snes_ksp_ew_gamma gamma - 16082738288SBarry Smith . -snes_ksp_ew_alpha alpha - 16182738288SBarry Smith . -snes_ksp_ew_alpha2 alpha2 - 16282738288SBarry Smith - -snes_ksp_ew_threshold threshold - 16382738288SBarry Smith 16411ca99fdSLois Curfman McInnes Notes: 16511ca99fdSLois Curfman McInnes To see all options, run your program with the -help option or consult 16611ca99fdSLois Curfman McInnes the users manual. 16783e2fdc7SBarry Smith 1689b94acceSBarry Smith .keywords: SNES, nonlinear, set, options, database 1699b94acceSBarry Smith 170a86d99e1SLois Curfman McInnes .seealso: SNESPrintHelp(), SNESSetOptionsPrefix() 1719b94acceSBarry Smith @*/ 1729b94acceSBarry Smith int SNESSetFromOptions(SNES snes) 1739b94acceSBarry Smith { 17482bf6240SBarry Smith char method[256]; 1759b94acceSBarry Smith double tmp; 1769b94acceSBarry Smith SLES sles; 17781f57ec7SBarry Smith int ierr, flg,i,loc[4],nmax = 4; 1783c7409f5SSatish Balay int version = PETSC_DEFAULT; 1799b94acceSBarry Smith double rtol_0 = PETSC_DEFAULT; 1809b94acceSBarry Smith double rtol_max = PETSC_DEFAULT; 1819b94acceSBarry Smith double gamma2 = PETSC_DEFAULT; 1829b94acceSBarry Smith double alpha = PETSC_DEFAULT; 1839b94acceSBarry Smith double alpha2 = PETSC_DEFAULT; 1849b94acceSBarry Smith double threshold = PETSC_DEFAULT; 1859b94acceSBarry Smith 1863a40ed3dSBarry Smith PetscFunctionBegin; 18781f57ec7SBarry Smith loc[0] = PETSC_DECIDE; loc[1] = PETSC_DECIDE; loc[2] = 300; loc[3] = 300; 18881f57ec7SBarry Smith 18977c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 19082bf6240SBarry Smith if (snes->setupcalled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call prior to SNESSetUp"); 191ca161407SBarry Smith 19282bf6240SBarry Smith if (!SNESRegisterAllCalled) {ierr = SNESRegisterAll(PETSC_NULL);CHKERRQ(ierr);} 19382bf6240SBarry Smith ierr = OptionsGetString(snes->prefix,"-snes_type",method,256,&flg); 194052efed2SBarry Smith if (flg) { 19582bf6240SBarry Smith ierr = SNESSetType(snes,(SNESType) method); CHKERRQ(ierr); 1965334005bSBarry Smith } 1973c7409f5SSatish Balay ierr = OptionsGetDouble(snes->prefix,"-snes_stol",&tmp, &flg); CHKERRQ(ierr); 198d64ed03dSBarry Smith if (flg) { 199d64ed03dSBarry Smith ierr = SNESSetTolerances(snes,PETSC_DEFAULT,PETSC_DEFAULT,tmp,PETSC_DEFAULT,PETSC_DEFAULT);CHKERRQ(ierr); 200d64ed03dSBarry Smith } 2013c7409f5SSatish Balay ierr = OptionsGetDouble(snes->prefix,"-snes_atol",&tmp, &flg); CHKERRQ(ierr); 202d64ed03dSBarry Smith if (flg) { 203d64ed03dSBarry Smith ierr = SNESSetTolerances(snes,tmp,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_DEFAULT);CHKERRQ(ierr); 204d64ed03dSBarry Smith } 2053c7409f5SSatish Balay ierr = OptionsGetDouble(snes->prefix,"-snes_rtol",&tmp, &flg); CHKERRQ(ierr); 206d64ed03dSBarry Smith if (flg) { 207d64ed03dSBarry Smith ierr = SNESSetTolerances(snes,PETSC_DEFAULT,tmp,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_DEFAULT);CHKERRQ(ierr); 208d64ed03dSBarry Smith } 2093c7409f5SSatish Balay ierr = OptionsGetInt(snes->prefix,"-snes_max_it",&snes->max_its, &flg); CHKERRQ(ierr); 2103c7409f5SSatish Balay ierr = OptionsGetInt(snes->prefix,"-snes_max_funcs",&snes->max_funcs, &flg);CHKERRQ(ierr); 211d7a720efSLois Curfman McInnes ierr = OptionsGetDouble(snes->prefix,"-snes_trtol",&tmp, &flg); CHKERRQ(ierr); 212d64ed03dSBarry Smith if (flg) { ierr = SNESSetTrustRegionTolerance(snes,tmp); CHKERRQ(ierr); } 213d7a720efSLois Curfman McInnes ierr = OptionsGetDouble(snes->prefix,"-snes_fmin",&tmp, &flg); CHKERRQ(ierr); 214d64ed03dSBarry Smith if (flg) { ierr = SNESSetMinimizationFunctionTolerance(snes,tmp); CHKERRQ(ierr);} 2153c7409f5SSatish Balay ierr = OptionsHasName(snes->prefix,"-snes_ksp_ew_conv", &flg); CHKERRQ(ierr); 2163c7409f5SSatish Balay if (flg) { snes->ksp_ewconv = 1; } 217b18e04deSLois Curfman McInnes ierr = OptionsGetInt(snes->prefix,"-snes_ksp_ew_version",&version,&flg); CHKERRQ(ierr); 218b18e04deSLois Curfman McInnes ierr = OptionsGetDouble(snes->prefix,"-snes_ksp_ew_rtol0",&rtol_0,&flg); CHKERRQ(ierr); 219b18e04deSLois Curfman McInnes ierr = OptionsGetDouble(snes->prefix,"-snes_ksp_ew_rtolmax",&rtol_max,&flg);CHKERRQ(ierr); 220b18e04deSLois Curfman McInnes ierr = OptionsGetDouble(snes->prefix,"-snes_ksp_ew_gamma",&gamma2,&flg); CHKERRQ(ierr); 221b18e04deSLois Curfman McInnes ierr = OptionsGetDouble(snes->prefix,"-snes_ksp_ew_alpha",&alpha,&flg); CHKERRQ(ierr); 222b18e04deSLois Curfman McInnes ierr = OptionsGetDouble(snes->prefix,"-snes_ksp_ew_alpha2",&alpha2,&flg); CHKERRQ(ierr); 223b18e04deSLois Curfman McInnes ierr = OptionsGetDouble(snes->prefix,"-snes_ksp_ew_threshold",&threshold,&flg);CHKERRQ(ierr); 22493c39befSBarry Smith 22593c39befSBarry Smith ierr = OptionsHasName(snes->prefix,"-snes_no_convergence_test",&flg); CHKERRQ(ierr); 22693c39befSBarry Smith if (flg) {snes->converged = 0;} 22793c39befSBarry Smith 2289b94acceSBarry Smith ierr = SNES_KSP_SetParametersEW(snes,version,rtol_0,rtol_max,gamma2,alpha, 2299b94acceSBarry Smith alpha2,threshold); CHKERRQ(ierr); 2305bbad29bSBarry Smith ierr = OptionsHasName(snes->prefix,"-snes_cancelmonitors",&flg); CHKERRQ(ierr); 2315cd90555SBarry Smith if (flg) {ierr = SNESClearMonitor(snes);CHKERRQ(ierr);} 2323c7409f5SSatish Balay ierr = OptionsHasName(snes->prefix,"-snes_monitor",&flg); CHKERRQ(ierr); 233639f9d9dSBarry Smith if (flg) {ierr = SNESSetMonitor(snes,SNESDefaultMonitor,0);CHKERRQ(ierr);} 2343c7409f5SSatish Balay ierr = OptionsHasName(snes->prefix,"-snes_smonitor",&flg); CHKERRQ(ierr); 235*3f1db9ecSBarry Smith if (flg) {ierr = SNESSetMonitor(snes,SNESDefaultSMonitor,0); CHKERRQ(ierr);} 236*3f1db9ecSBarry Smith ierr = OptionsHasName(snes->prefix,"-snes_vecmonitor",&flg); CHKERRQ(ierr); 237*3f1db9ecSBarry Smith if (flg) {ierr = SNESSetMonitor(snes,SNESVecViewMonitor,0); CHKERRQ(ierr);} 23881f57ec7SBarry Smith ierr = OptionsGetIntArray(snes->prefix,"-snes_xmonitor",loc,&nmax,&flg);CHKERRQ(ierr); 2393c7409f5SSatish Balay if (flg) { 24017699dbbSLois Curfman McInnes int rank = 0; 241d7e8b826SBarry Smith DrawLG lg; 24217699dbbSLois Curfman McInnes MPI_Initialized(&rank); 24317699dbbSLois Curfman McInnes if (rank) MPI_Comm_rank(snes->comm,&rank); 24417699dbbSLois Curfman McInnes if (!rank) { 24581f57ec7SBarry Smith ierr = SNESLGMonitorCreate(0,0,loc[0],loc[1],loc[2],loc[3],&lg); CHKERRQ(ierr); 2469b94acceSBarry Smith ierr = SNESSetMonitor(snes,SNESLGMonitor,(void *)lg); CHKERRQ(ierr); 247f8c826e1SBarry Smith snes->xmonitor = lg; 2489b94acceSBarry Smith PLogObjectParent(snes,lg); 2499b94acceSBarry Smith } 2509b94acceSBarry Smith } 251e24b481bSBarry Smith 252e24b481bSBarry Smith 2533c7409f5SSatish Balay ierr = OptionsHasName(snes->prefix,"-snes_fd", &flg); CHKERRQ(ierr); 2543c7409f5SSatish Balay if (flg && snes->method_class == SNES_NONLINEAR_EQUATIONS) { 2559b94acceSBarry Smith ierr = SNESSetJacobian(snes,snes->jacobian,snes->jacobian_pre, 2569b94acceSBarry Smith SNESDefaultComputeJacobian,snes->funP); CHKERRQ(ierr); 257981c4779SBarry Smith PLogInfo(snes,"SNESSetFromOptions: Setting default finite difference Jacobian matrix\n"); 258981c4779SBarry Smith } else if (flg && snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) { 25931615d04SLois Curfman McInnes ierr = SNESSetHessian(snes,snes->jacobian,snes->jacobian_pre, 26031615d04SLois Curfman McInnes SNESDefaultComputeHessian,snes->funP); CHKERRQ(ierr); 261d64ed03dSBarry Smith PLogInfo(snes,"SNESSetFromOptions: Setting default finite difference Hessian matrix\n"); 2629b94acceSBarry Smith } 263639f9d9dSBarry Smith 264639f9d9dSBarry Smith for ( i=0; i<numberofsetfromoptions; i++ ) { 265639f9d9dSBarry Smith ierr = (*othersetfromoptions[i])(snes); CHKERRQ(ierr); 266639f9d9dSBarry Smith } 267639f9d9dSBarry Smith 2689b94acceSBarry Smith ierr = SNESGetSLES(snes,&sles); CHKERRQ(ierr); 2699b94acceSBarry Smith ierr = SLESSetFromOptions(sles); CHKERRQ(ierr); 27093993e2dSLois Curfman McInnes 271e24b481bSBarry Smith /* set the special KSP monitor for matrix-free application */ 272e24b481bSBarry Smith ierr = OptionsHasName(snes->prefix,"-snes_mf_ksp_monitor",&flg); CHKERRQ(ierr); 273e24b481bSBarry Smith if (flg) { 274e24b481bSBarry Smith KSP ksp; 275e24b481bSBarry Smith ierr = SLESGetKSP(sles,&ksp);CHKERRQ(ierr); 276e24b481bSBarry Smith ierr = KSPSetMonitor(ksp,MatSNESFDMFKSPMonitor,PETSC_NULL);CHKERRQ(ierr); 277e24b481bSBarry Smith } 278e24b481bSBarry Smith 27982bf6240SBarry Smith /* 28093993e2dSLois Curfman McInnes Since the private setfromoptions requires the type to have 28193993e2dSLois Curfman McInnes been set already, we make sure a type is set by this time. 28282bf6240SBarry Smith */ 28382bf6240SBarry Smith if (!snes->type_name) { 28482bf6240SBarry Smith if (snes->method_class == SNES_NONLINEAR_EQUATIONS) { 28582bf6240SBarry Smith ierr = SNESSetType(snes,SNES_EQ_LS); CHKERRQ(ierr); 28682bf6240SBarry Smith } else { 28782bf6240SBarry Smith ierr = SNESSetType(snes,SNES_UM_TR); CHKERRQ(ierr); 28882bf6240SBarry Smith } 28982bf6240SBarry Smith } 29082bf6240SBarry Smith 29182bf6240SBarry Smith ierr = OptionsHasName(PETSC_NULL,"-help", &flg); CHKERRQ(ierr); 29282bf6240SBarry Smith if (flg) { ierr = SNESPrintHelp(snes); CHKERRQ(ierr);} 29382bf6240SBarry Smith 2943a40ed3dSBarry Smith if (snes->setfromoptions) { 2953a40ed3dSBarry Smith ierr = (*snes->setfromoptions)(snes);CHKERRQ(ierr); 2963a40ed3dSBarry Smith } 2973a40ed3dSBarry Smith PetscFunctionReturn(0); 2989b94acceSBarry Smith } 2999b94acceSBarry Smith 300a847f771SSatish Balay 3015615d1e5SSatish Balay #undef __FUNC__ 302d4bb536fSBarry Smith #define __FUNC__ "SNESSetApplicationContext" 3039b94acceSBarry Smith /*@ 3049b94acceSBarry Smith SNESSetApplicationContext - Sets the optional user-defined context for 3059b94acceSBarry Smith the nonlinear solvers. 3069b94acceSBarry Smith 307fee21e36SBarry Smith Collective on SNES 308fee21e36SBarry Smith 309c7afd0dbSLois Curfman McInnes Input Parameters: 310c7afd0dbSLois Curfman McInnes + snes - the SNES context 311c7afd0dbSLois Curfman McInnes - usrP - optional user context 312c7afd0dbSLois Curfman McInnes 3139b94acceSBarry Smith .keywords: SNES, nonlinear, set, application, context 3149b94acceSBarry Smith 3159b94acceSBarry Smith .seealso: SNESGetApplicationContext() 3169b94acceSBarry Smith @*/ 3179b94acceSBarry Smith int SNESSetApplicationContext(SNES snes,void *usrP) 3189b94acceSBarry Smith { 3193a40ed3dSBarry Smith PetscFunctionBegin; 32077c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 3219b94acceSBarry Smith snes->user = usrP; 3223a40ed3dSBarry Smith PetscFunctionReturn(0); 3239b94acceSBarry Smith } 32474679c65SBarry Smith 3255615d1e5SSatish Balay #undef __FUNC__ 326d4bb536fSBarry Smith #define __FUNC__ "SNESGetApplicationContext" 3279b94acceSBarry Smith /*@C 3289b94acceSBarry Smith SNESGetApplicationContext - Gets the user-defined context for the 3299b94acceSBarry Smith nonlinear solvers. 3309b94acceSBarry Smith 331c7afd0dbSLois Curfman McInnes Not Collective 332c7afd0dbSLois Curfman McInnes 3339b94acceSBarry Smith Input Parameter: 3349b94acceSBarry Smith . snes - SNES context 3359b94acceSBarry Smith 3369b94acceSBarry Smith Output Parameter: 3379b94acceSBarry Smith . usrP - user context 3389b94acceSBarry Smith 3399b94acceSBarry Smith .keywords: SNES, nonlinear, get, application, context 3409b94acceSBarry Smith 3419b94acceSBarry Smith .seealso: SNESSetApplicationContext() 3429b94acceSBarry Smith @*/ 3439b94acceSBarry Smith int SNESGetApplicationContext( SNES snes, void **usrP ) 3449b94acceSBarry Smith { 3453a40ed3dSBarry Smith PetscFunctionBegin; 34677c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 3479b94acceSBarry Smith *usrP = snes->user; 3483a40ed3dSBarry Smith PetscFunctionReturn(0); 3499b94acceSBarry Smith } 35074679c65SBarry Smith 3515615d1e5SSatish Balay #undef __FUNC__ 352d4bb536fSBarry Smith #define __FUNC__ "SNESGetIterationNumber" 3539b94acceSBarry Smith /*@ 3549b94acceSBarry Smith SNESGetIterationNumber - Gets the current iteration number of the 3559b94acceSBarry Smith nonlinear solver. 3569b94acceSBarry Smith 357c7afd0dbSLois Curfman McInnes Not Collective 358c7afd0dbSLois Curfman McInnes 3599b94acceSBarry Smith Input Parameter: 3609b94acceSBarry Smith . snes - SNES context 3619b94acceSBarry Smith 3629b94acceSBarry Smith Output Parameter: 3639b94acceSBarry Smith . iter - iteration number 3649b94acceSBarry Smith 3659b94acceSBarry Smith .keywords: SNES, nonlinear, get, iteration, number 3669b94acceSBarry Smith @*/ 3679b94acceSBarry Smith int SNESGetIterationNumber(SNES snes,int* iter) 3689b94acceSBarry Smith { 3693a40ed3dSBarry Smith PetscFunctionBegin; 37077c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 37174679c65SBarry Smith PetscValidIntPointer(iter); 3729b94acceSBarry Smith *iter = snes->iter; 3733a40ed3dSBarry Smith PetscFunctionReturn(0); 3749b94acceSBarry Smith } 37574679c65SBarry Smith 3765615d1e5SSatish Balay #undef __FUNC__ 3775615d1e5SSatish Balay #define __FUNC__ "SNESGetFunctionNorm" 3789b94acceSBarry Smith /*@ 3799b94acceSBarry Smith SNESGetFunctionNorm - Gets the norm of the current function that was set 3809b94acceSBarry Smith with SNESSSetFunction(). 3819b94acceSBarry Smith 382c7afd0dbSLois Curfman McInnes Collective on SNES 383c7afd0dbSLois Curfman McInnes 3849b94acceSBarry Smith Input Parameter: 3859b94acceSBarry Smith . snes - SNES context 3869b94acceSBarry Smith 3879b94acceSBarry Smith Output Parameter: 3889b94acceSBarry Smith . fnorm - 2-norm of function 3899b94acceSBarry Smith 3909b94acceSBarry Smith Note: 3919b94acceSBarry Smith SNESGetFunctionNorm() is valid for SNES_NONLINEAR_EQUATIONS methods only. 392a86d99e1SLois Curfman McInnes A related routine for SNES_UNCONSTRAINED_MINIMIZATION methods is 393a86d99e1SLois Curfman McInnes SNESGetGradientNorm(). 3949b94acceSBarry Smith 3959b94acceSBarry Smith .keywords: SNES, nonlinear, get, function, norm 396a86d99e1SLois Curfman McInnes 397a86d99e1SLois Curfman McInnes .seealso: SNESSetFunction() 3989b94acceSBarry Smith @*/ 3999b94acceSBarry Smith int SNESGetFunctionNorm(SNES snes,Scalar *fnorm) 4009b94acceSBarry Smith { 4013a40ed3dSBarry Smith PetscFunctionBegin; 40277c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 40374679c65SBarry Smith PetscValidScalarPointer(fnorm); 40474679c65SBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 405d252947aSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"For SNES_NONLINEAR_EQUATIONS only"); 40674679c65SBarry Smith } 4079b94acceSBarry Smith *fnorm = snes->norm; 4083a40ed3dSBarry Smith PetscFunctionReturn(0); 4099b94acceSBarry Smith } 41074679c65SBarry Smith 4115615d1e5SSatish Balay #undef __FUNC__ 4125615d1e5SSatish Balay #define __FUNC__ "SNESGetGradientNorm" 4139b94acceSBarry Smith /*@ 4149b94acceSBarry Smith SNESGetGradientNorm - Gets the norm of the current gradient that was set 4159b94acceSBarry Smith with SNESSSetGradient(). 4169b94acceSBarry Smith 417c7afd0dbSLois Curfman McInnes Collective on SNES 418c7afd0dbSLois Curfman McInnes 4199b94acceSBarry Smith Input Parameter: 4209b94acceSBarry Smith . snes - SNES context 4219b94acceSBarry Smith 4229b94acceSBarry Smith Output Parameter: 4239b94acceSBarry Smith . fnorm - 2-norm of gradient 4249b94acceSBarry Smith 4259b94acceSBarry Smith Note: 4269b94acceSBarry Smith SNESGetGradientNorm() is valid for SNES_UNCONSTRAINED_MINIMIZATION 427a86d99e1SLois Curfman McInnes methods only. A related routine for SNES_NONLINEAR_EQUATIONS methods 428a86d99e1SLois Curfman McInnes is SNESGetFunctionNorm(). 4299b94acceSBarry Smith 4309b94acceSBarry Smith .keywords: SNES, nonlinear, get, gradient, norm 431a86d99e1SLois Curfman McInnes 432a86d99e1SLois Curfman McInnes .seelso: SNESSetGradient() 4339b94acceSBarry Smith @*/ 4349b94acceSBarry Smith int SNESGetGradientNorm(SNES snes,Scalar *gnorm) 4359b94acceSBarry Smith { 4363a40ed3dSBarry Smith PetscFunctionBegin; 43777c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 43874679c65SBarry Smith PetscValidScalarPointer(gnorm); 43974679c65SBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 440d252947aSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 44174679c65SBarry Smith } 4429b94acceSBarry Smith *gnorm = snes->norm; 4433a40ed3dSBarry Smith PetscFunctionReturn(0); 4449b94acceSBarry Smith } 44574679c65SBarry Smith 4465615d1e5SSatish Balay #undef __FUNC__ 447d4bb536fSBarry Smith #define __FUNC__ "SNESGetNumberUnsuccessfulSteps" 4489b94acceSBarry Smith /*@ 4499b94acceSBarry Smith SNESGetNumberUnsuccessfulSteps - Gets the number of unsuccessful steps 4509b94acceSBarry Smith attempted by the nonlinear solver. 4519b94acceSBarry Smith 452c7afd0dbSLois Curfman McInnes Not Collective 453c7afd0dbSLois Curfman McInnes 4549b94acceSBarry Smith Input Parameter: 4559b94acceSBarry Smith . snes - SNES context 4569b94acceSBarry Smith 4579b94acceSBarry Smith Output Parameter: 4589b94acceSBarry Smith . nfails - number of unsuccessful steps attempted 4599b94acceSBarry Smith 460c96a6f78SLois Curfman McInnes Notes: 461c96a6f78SLois Curfman McInnes This counter is reset to zero for each successive call to SNESSolve(). 462c96a6f78SLois Curfman McInnes 4639b94acceSBarry Smith .keywords: SNES, nonlinear, get, number, unsuccessful, steps 4649b94acceSBarry Smith @*/ 4659b94acceSBarry Smith int SNESGetNumberUnsuccessfulSteps(SNES snes,int* nfails) 4669b94acceSBarry Smith { 4673a40ed3dSBarry Smith PetscFunctionBegin; 46877c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 46974679c65SBarry Smith PetscValidIntPointer(nfails); 4709b94acceSBarry Smith *nfails = snes->nfailures; 4713a40ed3dSBarry Smith PetscFunctionReturn(0); 4729b94acceSBarry Smith } 473a847f771SSatish Balay 4745615d1e5SSatish Balay #undef __FUNC__ 475d4bb536fSBarry Smith #define __FUNC__ "SNESGetNumberLinearIterations" 476c96a6f78SLois Curfman McInnes /*@ 477c96a6f78SLois Curfman McInnes SNESGetNumberLinearIterations - Gets the total number of linear iterations 478c96a6f78SLois Curfman McInnes used by the nonlinear solver. 479c96a6f78SLois Curfman McInnes 480c7afd0dbSLois Curfman McInnes Not Collective 481c7afd0dbSLois Curfman McInnes 482c96a6f78SLois Curfman McInnes Input Parameter: 483c96a6f78SLois Curfman McInnes . snes - SNES context 484c96a6f78SLois Curfman McInnes 485c96a6f78SLois Curfman McInnes Output Parameter: 486c96a6f78SLois Curfman McInnes . lits - number of linear iterations 487c96a6f78SLois Curfman McInnes 488c96a6f78SLois Curfman McInnes Notes: 489c96a6f78SLois Curfman McInnes This counter is reset to zero for each successive call to SNESSolve(). 490c96a6f78SLois Curfman McInnes 491c96a6f78SLois Curfman McInnes .keywords: SNES, nonlinear, get, number, linear, iterations 492c96a6f78SLois Curfman McInnes @*/ 49386bddb7dSBarry Smith int SNESGetNumberLinearIterations(SNES snes,int* lits) 494c96a6f78SLois Curfman McInnes { 4953a40ed3dSBarry Smith PetscFunctionBegin; 496c96a6f78SLois Curfman McInnes PetscValidHeaderSpecific(snes,SNES_COOKIE); 497c96a6f78SLois Curfman McInnes PetscValidIntPointer(lits); 498c96a6f78SLois Curfman McInnes *lits = snes->linear_its; 4993a40ed3dSBarry Smith PetscFunctionReturn(0); 500c96a6f78SLois Curfman McInnes } 501c96a6f78SLois Curfman McInnes 502c96a6f78SLois Curfman McInnes #undef __FUNC__ 503d4bb536fSBarry Smith #define __FUNC__ "SNESGetSLES" 5049b94acceSBarry Smith /*@C 5059b94acceSBarry Smith SNESGetSLES - Returns the SLES context for a SNES solver. 5069b94acceSBarry Smith 507c7afd0dbSLois Curfman McInnes Not Collective, but if SNES object is parallel, then SLES object is parallel 508c7afd0dbSLois Curfman McInnes 5099b94acceSBarry Smith Input Parameter: 5109b94acceSBarry Smith . snes - the SNES context 5119b94acceSBarry Smith 5129b94acceSBarry Smith Output Parameter: 5139b94acceSBarry Smith . sles - the SLES context 5149b94acceSBarry Smith 5159b94acceSBarry Smith Notes: 5169b94acceSBarry Smith The user can then directly manipulate the SLES context to set various 5179b94acceSBarry Smith options, etc. Likewise, the user can then extract and manipulate the 5189b94acceSBarry Smith KSP and PC contexts as well. 5199b94acceSBarry Smith 5209b94acceSBarry Smith .keywords: SNES, nonlinear, get, SLES, context 5219b94acceSBarry Smith 5229b94acceSBarry Smith .seealso: SLESGetPC(), SLESGetKSP() 5239b94acceSBarry Smith @*/ 5249b94acceSBarry Smith int SNESGetSLES(SNES snes,SLES *sles) 5259b94acceSBarry Smith { 5263a40ed3dSBarry Smith PetscFunctionBegin; 52777c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 5289b94acceSBarry Smith *sles = snes->sles; 5293a40ed3dSBarry Smith PetscFunctionReturn(0); 5309b94acceSBarry Smith } 53182bf6240SBarry Smith 532e24b481bSBarry Smith #undef __FUNC__ 533e24b481bSBarry Smith #define __FUNC__ "SNESPublish_Petsc" 534e24b481bSBarry Smith static int SNESPublish_Petsc(PetscObject object) 535e24b481bSBarry Smith { 536e24b481bSBarry Smith #if defined(HAVE_AMS) 537e24b481bSBarry Smith SNES v = (SNES) object; 538e24b481bSBarry Smith int ierr; 539e24b481bSBarry Smith 540e24b481bSBarry Smith PetscFunctionBegin; 541e24b481bSBarry Smith 542e24b481bSBarry Smith /* if it is already published then return */ 543e24b481bSBarry Smith if (v->amem >=0 ) PetscFunctionReturn(0); 544e24b481bSBarry Smith 545*3f1db9ecSBarry Smith ierr = PetscObjectPublishBaseBegin(object);CHKERRQ(ierr); 546e24b481bSBarry Smith ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Iteration",&v->iter,1,AMS_INT,AMS_READ, 547e24b481bSBarry Smith AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 548e24b481bSBarry Smith ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Residual",&v->norm,1,AMS_DOUBLE,AMS_READ, 549e24b481bSBarry Smith AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 550e24b481bSBarry Smith ierr = PetscObjectPublishBaseEnd(object);CHKERRQ(ierr); 551e24b481bSBarry Smith #else 552e24b481bSBarry Smith PetscFunctionBegin; 553e24b481bSBarry Smith #endif 554e24b481bSBarry Smith PetscFunctionReturn(0); 555e24b481bSBarry Smith } 556e24b481bSBarry Smith 5579b94acceSBarry Smith /* -----------------------------------------------------------*/ 5585615d1e5SSatish Balay #undef __FUNC__ 5595615d1e5SSatish Balay #define __FUNC__ "SNESCreate" 5609b94acceSBarry Smith /*@C 5619b94acceSBarry Smith SNESCreate - Creates a nonlinear solver context. 5629b94acceSBarry Smith 563c7afd0dbSLois Curfman McInnes Collective on MPI_Comm 564c7afd0dbSLois Curfman McInnes 565c7afd0dbSLois Curfman McInnes Input Parameters: 566c7afd0dbSLois Curfman McInnes + comm - MPI communicator 567c7afd0dbSLois Curfman McInnes - type - type of method, either 568c7afd0dbSLois Curfman McInnes SNES_NONLINEAR_EQUATIONS (for systems of nonlinear equations) 569c7afd0dbSLois Curfman McInnes or SNES_UNCONSTRAINED_MINIMIZATION (for unconstrained minimization) 5709b94acceSBarry Smith 5719b94acceSBarry Smith Output Parameter: 5729b94acceSBarry Smith . outsnes - the new SNES context 5739b94acceSBarry Smith 574c7afd0dbSLois Curfman McInnes Options Database Keys: 575c7afd0dbSLois Curfman McInnes + -snes_mf - Activates default matrix-free Jacobian-vector products, 576c7afd0dbSLois Curfman McInnes and no preconditioning matrix 577c7afd0dbSLois Curfman McInnes . -snes_mf_operator - Activates default matrix-free Jacobian-vector 578c7afd0dbSLois Curfman McInnes products, and a user-provided preconditioning matrix 579c7afd0dbSLois Curfman McInnes as set by SNESSetJacobian() 580c7afd0dbSLois Curfman McInnes - -snes_fd - Uses (slow!) finite differences to compute Jacobian 581c1f60f51SBarry Smith 5829b94acceSBarry Smith .keywords: SNES, nonlinear, create, context 5839b94acceSBarry Smith 58463a78c88SLois Curfman McInnes .seealso: SNESSolve(), SNESDestroy() 5859b94acceSBarry Smith @*/ 5864b0e389bSBarry Smith int SNESCreate(MPI_Comm comm,SNESProblemType type,SNES *outsnes) 5879b94acceSBarry Smith { 5889b94acceSBarry Smith int ierr; 5899b94acceSBarry Smith SNES snes; 5909b94acceSBarry Smith SNES_KSP_EW_ConvCtx *kctx; 59137fcc0dbSBarry Smith 5923a40ed3dSBarry Smith PetscFunctionBegin; 5939b94acceSBarry Smith *outsnes = 0; 594d64ed03dSBarry Smith if (type != SNES_UNCONSTRAINED_MINIMIZATION && type != SNES_NONLINEAR_EQUATIONS){ 595d252947aSBarry Smith SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,0,"incorrect method type"); 596d64ed03dSBarry Smith } 597*3f1db9ecSBarry Smith PetscHeaderCreate(snes,_p_SNES,int,SNES_COOKIE,0,"SNES",comm,SNESDestroy,SNESView); 5989b94acceSBarry Smith PLogObjectCreate(snes); 599e24b481bSBarry Smith snes->bops->publish = SNESPublish_Petsc; 6009b94acceSBarry Smith snes->max_its = 50; 6019750a799SBarry Smith snes->max_funcs = 10000; 6029b94acceSBarry Smith snes->norm = 0.0; 6035a2d0531SBarry Smith if (type == SNES_UNCONSTRAINED_MINIMIZATION) { 604b18e04deSLois Curfman McInnes snes->rtol = 1.e-8; 605b18e04deSLois Curfman McInnes snes->ttol = 0.0; 6069b94acceSBarry Smith snes->atol = 1.e-10; 607d64ed03dSBarry Smith } else { 608b4874afaSBarry Smith snes->rtol = 1.e-8; 609b4874afaSBarry Smith snes->ttol = 0.0; 610b4874afaSBarry Smith snes->atol = 1.e-50; 611b4874afaSBarry Smith } 6129b94acceSBarry Smith snes->xtol = 1.e-8; 613b18e04deSLois Curfman McInnes snes->trunctol = 1.e-12; /* no longer used */ 6149b94acceSBarry Smith snes->nfuncs = 0; 6159b94acceSBarry Smith snes->nfailures = 0; 6167a00f4a9SLois Curfman McInnes snes->linear_its = 0; 617639f9d9dSBarry Smith snes->numbermonitors = 0; 6189b94acceSBarry Smith snes->data = 0; 6199b94acceSBarry Smith snes->view = 0; 6209b94acceSBarry Smith snes->computeumfunction = 0; 6219b94acceSBarry Smith snes->umfunP = 0; 6229b94acceSBarry Smith snes->fc = 0; 6239b94acceSBarry Smith snes->deltatol = 1.e-12; 6249b94acceSBarry Smith snes->fmin = -1.e30; 6259b94acceSBarry Smith snes->method_class = type; 6269b94acceSBarry Smith snes->set_method_called = 0; 62782bf6240SBarry Smith snes->setupcalled = 0; 6289b94acceSBarry Smith snes->ksp_ewconv = 0; 6296f24a144SLois Curfman McInnes snes->xmonitor = 0; 6306f24a144SLois Curfman McInnes snes->vwork = 0; 6316f24a144SLois Curfman McInnes snes->nwork = 0; 632c9005455SLois Curfman McInnes snes->conv_hist_size = 0; 633c9005455SLois Curfman McInnes snes->conv_act_size = 0; 634c9005455SLois Curfman McInnes snes->conv_hist = 0; 6359b94acceSBarry Smith 6369b94acceSBarry Smith /* Create context to compute Eisenstat-Walker relative tolerance for KSP */ 6370452661fSBarry Smith kctx = PetscNew(SNES_KSP_EW_ConvCtx); CHKPTRQ(kctx); 638eed86810SBarry Smith PLogObjectMemory(snes,sizeof(SNES_KSP_EW_ConvCtx)); 6399b94acceSBarry Smith snes->kspconvctx = (void*)kctx; 6409b94acceSBarry Smith kctx->version = 2; 6419b94acceSBarry Smith kctx->rtol_0 = .3; /* Eisenstat and Walker suggest rtol_0=.5, but 6429b94acceSBarry Smith this was too large for some test cases */ 6439b94acceSBarry Smith kctx->rtol_last = 0; 6449b94acceSBarry Smith kctx->rtol_max = .9; 6459b94acceSBarry Smith kctx->gamma = 1.0; 6469b94acceSBarry Smith kctx->alpha2 = .5*(1.0 + sqrt(5.0)); 6479b94acceSBarry Smith kctx->alpha = kctx->alpha2; 6489b94acceSBarry Smith kctx->threshold = .1; 6499b94acceSBarry Smith kctx->lresid_last = 0; 6509b94acceSBarry Smith kctx->norm_last = 0; 6519b94acceSBarry Smith 6529b94acceSBarry Smith ierr = SLESCreate(comm,&snes->sles); CHKERRQ(ierr); 6539b94acceSBarry Smith PLogObjectParent(snes,snes->sles) 6545334005bSBarry Smith 6559b94acceSBarry Smith *outsnes = snes; 656e24b481bSBarry Smith PetscPublishAll(snes); 6573a40ed3dSBarry Smith PetscFunctionReturn(0); 6589b94acceSBarry Smith } 6599b94acceSBarry Smith 6609b94acceSBarry Smith /* --------------------------------------------------------------- */ 6615615d1e5SSatish Balay #undef __FUNC__ 662d4bb536fSBarry Smith #define __FUNC__ "SNESSetFunction" 6639b94acceSBarry Smith /*@C 6649b94acceSBarry Smith SNESSetFunction - Sets the function evaluation routine and function 6659b94acceSBarry Smith vector for use by the SNES routines in solving systems of nonlinear 6669b94acceSBarry Smith equations. 6679b94acceSBarry Smith 668fee21e36SBarry Smith Collective on SNES 669fee21e36SBarry Smith 670c7afd0dbSLois Curfman McInnes Input Parameters: 671c7afd0dbSLois Curfman McInnes + snes - the SNES context 672c7afd0dbSLois Curfman McInnes . func - function evaluation routine 673c7afd0dbSLois Curfman McInnes . r - vector to store function value 674c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined context for private data for the 675c7afd0dbSLois Curfman McInnes function evaluation routine (may be PETSC_NULL) 6769b94acceSBarry Smith 677c7afd0dbSLois Curfman McInnes Calling sequence of func: 6788d76a1e5SLois Curfman McInnes $ func (SNES snes,Vec x,Vec f,void *ctx); 679c7afd0dbSLois Curfman McInnes 680313e4042SLois Curfman McInnes . f - function vector 681c7afd0dbSLois Curfman McInnes - ctx - optional user-defined function context 6829b94acceSBarry Smith 6839b94acceSBarry Smith Notes: 6849b94acceSBarry Smith The Newton-like methods typically solve linear systems of the form 6859b94acceSBarry Smith $ f'(x) x = -f(x), 686c7afd0dbSLois Curfman McInnes where f'(x) denotes the Jacobian matrix and f(x) is the function. 6879b94acceSBarry Smith 6889b94acceSBarry Smith SNESSetFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only. 6899b94acceSBarry Smith Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are 6909b94acceSBarry Smith SNESSetMinimizationFunction() and SNESSetGradient(); 6919b94acceSBarry Smith 6929b94acceSBarry Smith .keywords: SNES, nonlinear, set, function 6939b94acceSBarry Smith 694a86d99e1SLois Curfman McInnes .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian() 6959b94acceSBarry Smith @*/ 6965334005bSBarry Smith int SNESSetFunction( SNES snes, Vec r, int (*func)(SNES,Vec,Vec,void*),void *ctx) 6979b94acceSBarry Smith { 6983a40ed3dSBarry Smith PetscFunctionBegin; 69977c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 700a8c6a408SBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 701a8c6a408SBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_NONLINEAR_EQUATIONS only"); 702a8c6a408SBarry Smith } 7039b94acceSBarry Smith snes->computefunction = func; 7049b94acceSBarry Smith snes->vec_func = snes->vec_func_always = r; 7059b94acceSBarry Smith snes->funP = ctx; 7063a40ed3dSBarry Smith PetscFunctionReturn(0); 7079b94acceSBarry Smith } 7089b94acceSBarry Smith 7095615d1e5SSatish Balay #undef __FUNC__ 7105615d1e5SSatish Balay #define __FUNC__ "SNESComputeFunction" 7119b94acceSBarry Smith /*@ 7129b94acceSBarry Smith SNESComputeFunction - Computes the function that has been set with 7139b94acceSBarry Smith SNESSetFunction(). 7149b94acceSBarry Smith 715c7afd0dbSLois Curfman McInnes Collective on SNES 716c7afd0dbSLois Curfman McInnes 7179b94acceSBarry Smith Input Parameters: 718c7afd0dbSLois Curfman McInnes + snes - the SNES context 719c7afd0dbSLois Curfman McInnes - x - input vector 7209b94acceSBarry Smith 7219b94acceSBarry Smith Output Parameter: 7223638b69dSLois Curfman McInnes . y - function vector, as set by SNESSetFunction() 7239b94acceSBarry Smith 7241bffabb2SLois Curfman McInnes Notes: 7259b94acceSBarry Smith SNESComputeFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only. 7269b94acceSBarry Smith Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are 7279b94acceSBarry Smith SNESComputeMinimizationFunction() and SNESComputeGradient(); 7289b94acceSBarry Smith 7299b94acceSBarry Smith .keywords: SNES, nonlinear, compute, function 7309b94acceSBarry Smith 731a86d99e1SLois Curfman McInnes .seealso: SNESSetFunction(), SNESGetFunction() 7329b94acceSBarry Smith @*/ 7339b94acceSBarry Smith int SNESComputeFunction(SNES snes,Vec x, Vec y) 7349b94acceSBarry Smith { 7359b94acceSBarry Smith int ierr; 7369b94acceSBarry Smith 7373a40ed3dSBarry Smith PetscFunctionBegin; 738d4bb536fSBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 739a8c6a408SBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_NONLINEAR_EQUATIONS only"); 740d4bb536fSBarry Smith } 7419b94acceSBarry Smith PLogEventBegin(SNES_FunctionEval,snes,x,y,0); 742d64ed03dSBarry Smith PetscStackPush("SNES user function"); 7439b94acceSBarry Smith ierr = (*snes->computefunction)(snes,x,y,snes->funP); CHKERRQ(ierr); 744d64ed03dSBarry Smith PetscStackPop; 745ae3c334cSLois Curfman McInnes snes->nfuncs++; 7469b94acceSBarry Smith PLogEventEnd(SNES_FunctionEval,snes,x,y,0); 7473a40ed3dSBarry Smith PetscFunctionReturn(0); 7489b94acceSBarry Smith } 7499b94acceSBarry Smith 7505615d1e5SSatish Balay #undef __FUNC__ 751d4bb536fSBarry Smith #define __FUNC__ "SNESSetMinimizationFunction" 7529b94acceSBarry Smith /*@C 7539b94acceSBarry Smith SNESSetMinimizationFunction - Sets the function evaluation routine for 7549b94acceSBarry Smith unconstrained minimization. 7559b94acceSBarry Smith 756fee21e36SBarry Smith Collective on SNES 757fee21e36SBarry Smith 758c7afd0dbSLois Curfman McInnes Input Parameters: 759c7afd0dbSLois Curfman McInnes + snes - the SNES context 760c7afd0dbSLois Curfman McInnes . func - function evaluation routine 761c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined context for private data for the 762c7afd0dbSLois Curfman McInnes function evaluation routine (may be PETSC_NULL) 7639b94acceSBarry Smith 764c7afd0dbSLois Curfman McInnes Calling sequence of func: 7658d76a1e5SLois Curfman McInnes $ func (SNES snes,Vec x,double *f,void *ctx); 766c7afd0dbSLois Curfman McInnes 767c7afd0dbSLois Curfman McInnes + x - input vector 7689b94acceSBarry Smith . f - function 769c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined function context 7709b94acceSBarry Smith 7719b94acceSBarry Smith Notes: 7729b94acceSBarry Smith SNESSetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION 7739b94acceSBarry Smith methods only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is 7749b94acceSBarry Smith SNESSetFunction(). 7759b94acceSBarry Smith 7769b94acceSBarry Smith .keywords: SNES, nonlinear, set, minimization, function 7779b94acceSBarry Smith 778a86d99e1SLois Curfman McInnes .seealso: SNESGetMinimizationFunction(), SNESComputeMinimizationFunction(), 779a86d99e1SLois Curfman McInnes SNESSetHessian(), SNESSetGradient() 7809b94acceSBarry Smith @*/ 7819b94acceSBarry Smith int SNESSetMinimizationFunction(SNES snes,int (*func)(SNES,Vec,double*,void*), 7829b94acceSBarry Smith void *ctx) 7839b94acceSBarry Smith { 7843a40ed3dSBarry Smith PetscFunctionBegin; 78577c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 786a8c6a408SBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 787a8c6a408SBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,0,"Only for SNES_UNCONSTRAINED_MINIMIZATION"); 788a8c6a408SBarry Smith } 7899b94acceSBarry Smith snes->computeumfunction = func; 7909b94acceSBarry Smith snes->umfunP = ctx; 7913a40ed3dSBarry Smith PetscFunctionReturn(0); 7929b94acceSBarry Smith } 7939b94acceSBarry Smith 7945615d1e5SSatish Balay #undef __FUNC__ 7955615d1e5SSatish Balay #define __FUNC__ "SNESComputeMinimizationFunction" 7969b94acceSBarry Smith /*@ 7979b94acceSBarry Smith SNESComputeMinimizationFunction - Computes the function that has been 7989b94acceSBarry Smith set with SNESSetMinimizationFunction(). 7999b94acceSBarry Smith 800c7afd0dbSLois Curfman McInnes Collective on SNES 801c7afd0dbSLois Curfman McInnes 8029b94acceSBarry Smith Input Parameters: 803c7afd0dbSLois Curfman McInnes + snes - the SNES context 804c7afd0dbSLois Curfman McInnes - x - input vector 8059b94acceSBarry Smith 8069b94acceSBarry Smith Output Parameter: 8079b94acceSBarry Smith . y - function value 8089b94acceSBarry Smith 8099b94acceSBarry Smith Notes: 8109b94acceSBarry Smith SNESComputeMinimizationFunction() is valid only for 8119b94acceSBarry Smith SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for 8129b94acceSBarry Smith SNES_NONLINEAR_EQUATIONS methods is SNESComputeFunction(). 813a86d99e1SLois Curfman McInnes 814a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, compute, minimization, function 815a86d99e1SLois Curfman McInnes 816a86d99e1SLois Curfman McInnes .seealso: SNESSetMinimizationFunction(), SNESGetMinimizationFunction(), 817a86d99e1SLois Curfman McInnes SNESComputeGradient(), SNESComputeHessian() 8189b94acceSBarry Smith @*/ 8199b94acceSBarry Smith int SNESComputeMinimizationFunction(SNES snes,Vec x,double *y) 8209b94acceSBarry Smith { 8219b94acceSBarry Smith int ierr; 8223a40ed3dSBarry Smith 8233a40ed3dSBarry Smith PetscFunctionBegin; 824a8c6a408SBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 825a8c6a408SBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,0,"Only for SNES_UNCONSTRAINED_MINIMIZATION"); 826a8c6a408SBarry Smith } 8279b94acceSBarry Smith PLogEventBegin(SNES_MinimizationFunctionEval,snes,x,y,0); 828d64ed03dSBarry Smith PetscStackPush("SNES user minimzation function"); 8299b94acceSBarry Smith ierr = (*snes->computeumfunction)(snes,x,y,snes->umfunP); CHKERRQ(ierr); 830d64ed03dSBarry Smith PetscStackPop; 831ae3c334cSLois Curfman McInnes snes->nfuncs++; 8329b94acceSBarry Smith PLogEventEnd(SNES_MinimizationFunctionEval,snes,x,y,0); 8333a40ed3dSBarry Smith PetscFunctionReturn(0); 8349b94acceSBarry Smith } 8359b94acceSBarry Smith 8365615d1e5SSatish Balay #undef __FUNC__ 837d4bb536fSBarry Smith #define __FUNC__ "SNESSetGradient" 8389b94acceSBarry Smith /*@C 8399b94acceSBarry Smith SNESSetGradient - Sets the gradient evaluation routine and gradient 8409b94acceSBarry Smith vector for use by the SNES routines. 8419b94acceSBarry Smith 842c7afd0dbSLois Curfman McInnes Collective on SNES 843c7afd0dbSLois Curfman McInnes 8449b94acceSBarry Smith Input Parameters: 845c7afd0dbSLois Curfman McInnes + snes - the SNES context 8469b94acceSBarry Smith . func - function evaluation routine 847044dda88SLois Curfman McInnes . ctx - optional user-defined context for private data for the 848044dda88SLois Curfman McInnes gradient evaluation routine (may be PETSC_NULL) 849c7afd0dbSLois Curfman McInnes - r - vector to store gradient value 850fee21e36SBarry Smith 8519b94acceSBarry Smith Calling sequence of func: 8528d76a1e5SLois Curfman McInnes $ func (SNES, Vec x, Vec g, void *ctx); 8539b94acceSBarry Smith 854c7afd0dbSLois Curfman McInnes + x - input vector 8559b94acceSBarry Smith . g - gradient vector 856c7afd0dbSLois Curfman McInnes - ctx - optional user-defined gradient context 8579b94acceSBarry Smith 8589b94acceSBarry Smith Notes: 8599b94acceSBarry Smith SNESSetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION 8609b94acceSBarry Smith methods only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is 8619b94acceSBarry Smith SNESSetFunction(). 8629b94acceSBarry Smith 8639b94acceSBarry Smith .keywords: SNES, nonlinear, set, function 8649b94acceSBarry Smith 865a86d99e1SLois Curfman McInnes .seealso: SNESGetGradient(), SNESComputeGradient(), SNESSetHessian(), 866a86d99e1SLois Curfman McInnes SNESSetMinimizationFunction(), 8679b94acceSBarry Smith @*/ 86874679c65SBarry Smith int SNESSetGradient(SNES snes,Vec r,int (*func)(SNES,Vec,Vec,void*),void *ctx) 8699b94acceSBarry Smith { 8703a40ed3dSBarry Smith PetscFunctionBegin; 87177c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 872a8c6a408SBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 873a8c6a408SBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 874a8c6a408SBarry Smith } 8759b94acceSBarry Smith snes->computefunction = func; 8769b94acceSBarry Smith snes->vec_func = snes->vec_func_always = r; 8779b94acceSBarry Smith snes->funP = ctx; 8783a40ed3dSBarry Smith PetscFunctionReturn(0); 8799b94acceSBarry Smith } 8809b94acceSBarry Smith 8815615d1e5SSatish Balay #undef __FUNC__ 8825615d1e5SSatish Balay #define __FUNC__ "SNESComputeGradient" 8839b94acceSBarry Smith /*@ 884a86d99e1SLois Curfman McInnes SNESComputeGradient - Computes the gradient that has been set with 885a86d99e1SLois Curfman McInnes SNESSetGradient(). 8869b94acceSBarry Smith 887c7afd0dbSLois Curfman McInnes Collective on SNES 888c7afd0dbSLois Curfman McInnes 8899b94acceSBarry Smith Input Parameters: 890c7afd0dbSLois Curfman McInnes + snes - the SNES context 891c7afd0dbSLois Curfman McInnes - x - input vector 8929b94acceSBarry Smith 8939b94acceSBarry Smith Output Parameter: 8949b94acceSBarry Smith . y - gradient vector 8959b94acceSBarry Smith 8969b94acceSBarry Smith Notes: 8979b94acceSBarry Smith SNESComputeGradient() is valid only for 8989b94acceSBarry Smith SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for 8999b94acceSBarry Smith SNES_NONLINEAR_EQUATIONS methods is SNESComputeFunction(). 900a86d99e1SLois Curfman McInnes 901a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, compute, gradient 902a86d99e1SLois Curfman McInnes 903a86d99e1SLois Curfman McInnes .seealso: SNESSetGradient(), SNESGetGradient(), 904a86d99e1SLois Curfman McInnes SNESComputeMinimizationFunction(), SNESComputeHessian() 9059b94acceSBarry Smith @*/ 9069b94acceSBarry Smith int SNESComputeGradient(SNES snes,Vec x, Vec y) 9079b94acceSBarry Smith { 9089b94acceSBarry Smith int ierr; 9093a40ed3dSBarry Smith 9103a40ed3dSBarry Smith PetscFunctionBegin; 9113a40ed3dSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 912a8c6a408SBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 9133a40ed3dSBarry Smith } 9149b94acceSBarry Smith PLogEventBegin(SNES_GradientEval,snes,x,y,0); 915d64ed03dSBarry Smith PetscStackPush("SNES user gradient function"); 9169b94acceSBarry Smith ierr = (*snes->computefunction)(snes,x,y,snes->funP); CHKERRQ(ierr); 917d64ed03dSBarry Smith PetscStackPop; 9189b94acceSBarry Smith PLogEventEnd(SNES_GradientEval,snes,x,y,0); 9193a40ed3dSBarry Smith PetscFunctionReturn(0); 9209b94acceSBarry Smith } 9219b94acceSBarry Smith 9225615d1e5SSatish Balay #undef __FUNC__ 9235615d1e5SSatish Balay #define __FUNC__ "SNESComputeJacobian" 92462fef451SLois Curfman McInnes /*@ 92562fef451SLois Curfman McInnes SNESComputeJacobian - Computes the Jacobian matrix that has been 92662fef451SLois Curfman McInnes set with SNESSetJacobian(). 92762fef451SLois Curfman McInnes 928c7afd0dbSLois Curfman McInnes Collective on SNES and Mat 929c7afd0dbSLois Curfman McInnes 93062fef451SLois Curfman McInnes Input Parameters: 931c7afd0dbSLois Curfman McInnes + snes - the SNES context 932c7afd0dbSLois Curfman McInnes - x - input vector 93362fef451SLois Curfman McInnes 93462fef451SLois Curfman McInnes Output Parameters: 935c7afd0dbSLois Curfman McInnes + A - Jacobian matrix 93662fef451SLois Curfman McInnes . B - optional preconditioning matrix 937c7afd0dbSLois Curfman McInnes - flag - flag indicating matrix structure 938fee21e36SBarry Smith 93962fef451SLois Curfman McInnes Notes: 94062fef451SLois Curfman McInnes Most users should not need to explicitly call this routine, as it 94162fef451SLois Curfman McInnes is used internally within the nonlinear solvers. 94262fef451SLois Curfman McInnes 943dc5a77f8SLois Curfman McInnes See SLESSetOperators() for important information about setting the 944dc5a77f8SLois Curfman McInnes flag parameter. 94562fef451SLois Curfman McInnes 94662fef451SLois Curfman McInnes SNESComputeJacobian() is valid only for SNES_NONLINEAR_EQUATIONS 94762fef451SLois Curfman McInnes methods. An analogous routine for SNES_UNCONSTRAINED_MINIMIZATION 948005c665bSBarry Smith methods is SNESComputeHessian(). 94962fef451SLois Curfman McInnes 95062fef451SLois Curfman McInnes .keywords: SNES, compute, Jacobian, matrix 95162fef451SLois Curfman McInnes 95262fef451SLois Curfman McInnes .seealso: SNESSetJacobian(), SLESSetOperators() 95362fef451SLois Curfman McInnes @*/ 9549b94acceSBarry Smith int SNESComputeJacobian(SNES snes,Vec X,Mat *A,Mat *B,MatStructure *flg) 9559b94acceSBarry Smith { 9569b94acceSBarry Smith int ierr; 9573a40ed3dSBarry Smith 9583a40ed3dSBarry Smith PetscFunctionBegin; 9593a40ed3dSBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 960a8c6a408SBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_NONLINEAR_EQUATIONS only"); 9613a40ed3dSBarry Smith } 9623a40ed3dSBarry Smith if (!snes->computejacobian) PetscFunctionReturn(0); 9639b94acceSBarry Smith PLogEventBegin(SNES_JacobianEval,snes,X,*A,*B); 964c4fc05e7SBarry Smith *flg = DIFFERENT_NONZERO_PATTERN; 965d64ed03dSBarry Smith PetscStackPush("SNES user Jacobian function"); 9669b94acceSBarry Smith ierr = (*snes->computejacobian)(snes,X,A,B,flg,snes->jacP); CHKERRQ(ierr); 967d64ed03dSBarry Smith PetscStackPop; 9689b94acceSBarry Smith PLogEventEnd(SNES_JacobianEval,snes,X,*A,*B); 9696d84be18SBarry Smith /* make sure user returned a correct Jacobian and preconditioner */ 97077c4ece6SBarry Smith PetscValidHeaderSpecific(*A,MAT_COOKIE); 97177c4ece6SBarry Smith PetscValidHeaderSpecific(*B,MAT_COOKIE); 9723a40ed3dSBarry Smith PetscFunctionReturn(0); 9739b94acceSBarry Smith } 9749b94acceSBarry Smith 9755615d1e5SSatish Balay #undef __FUNC__ 9765615d1e5SSatish Balay #define __FUNC__ "SNESComputeHessian" 97762fef451SLois Curfman McInnes /*@ 97862fef451SLois Curfman McInnes SNESComputeHessian - Computes the Hessian matrix that has been 97962fef451SLois Curfman McInnes set with SNESSetHessian(). 98062fef451SLois Curfman McInnes 981c7afd0dbSLois Curfman McInnes Collective on SNES and Mat 982c7afd0dbSLois Curfman McInnes 98362fef451SLois Curfman McInnes Input Parameters: 984c7afd0dbSLois Curfman McInnes + snes - the SNES context 985c7afd0dbSLois Curfman McInnes - x - input vector 98662fef451SLois Curfman McInnes 98762fef451SLois Curfman McInnes Output Parameters: 988c7afd0dbSLois Curfman McInnes + A - Hessian matrix 98962fef451SLois Curfman McInnes . B - optional preconditioning matrix 990c7afd0dbSLois Curfman McInnes - flag - flag indicating matrix structure 991fee21e36SBarry Smith 99262fef451SLois Curfman McInnes Notes: 99362fef451SLois Curfman McInnes Most users should not need to explicitly call this routine, as it 99462fef451SLois Curfman McInnes is used internally within the nonlinear solvers. 99562fef451SLois Curfman McInnes 996dc5a77f8SLois Curfman McInnes See SLESSetOperators() for important information about setting the 997dc5a77f8SLois Curfman McInnes flag parameter. 99862fef451SLois Curfman McInnes 99962fef451SLois Curfman McInnes SNESComputeHessian() is valid only for 100062fef451SLois Curfman McInnes SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for 100162fef451SLois Curfman McInnes SNES_NONLINEAR_EQUATIONS methods is SNESComputeJacobian(). 100262fef451SLois Curfman McInnes 100362fef451SLois Curfman McInnes .keywords: SNES, compute, Hessian, matrix 100462fef451SLois Curfman McInnes 1005a86d99e1SLois Curfman McInnes .seealso: SNESSetHessian(), SLESSetOperators(), SNESComputeGradient(), 1006a86d99e1SLois Curfman McInnes SNESComputeMinimizationFunction() 100762fef451SLois Curfman McInnes @*/ 100862fef451SLois Curfman McInnes int SNESComputeHessian(SNES snes,Vec x,Mat *A,Mat *B,MatStructure *flag) 10099b94acceSBarry Smith { 10109b94acceSBarry Smith int ierr; 10113a40ed3dSBarry Smith 10123a40ed3dSBarry Smith PetscFunctionBegin; 10133a40ed3dSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 1014a8c6a408SBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 10153a40ed3dSBarry Smith } 10163a40ed3dSBarry Smith if (!snes->computejacobian) PetscFunctionReturn(0); 101762fef451SLois Curfman McInnes PLogEventBegin(SNES_HessianEval,snes,x,*A,*B); 10180f4a323eSLois Curfman McInnes *flag = DIFFERENT_NONZERO_PATTERN; 1019d64ed03dSBarry Smith PetscStackPush("SNES user Hessian function"); 102062fef451SLois Curfman McInnes ierr = (*snes->computejacobian)(snes,x,A,B,flag,snes->jacP); CHKERRQ(ierr); 1021d64ed03dSBarry Smith PetscStackPop; 102262fef451SLois Curfman McInnes PLogEventEnd(SNES_HessianEval,snes,x,*A,*B); 10230f4a323eSLois Curfman McInnes /* make sure user returned a correct Jacobian and preconditioner */ 102477c4ece6SBarry Smith PetscValidHeaderSpecific(*A,MAT_COOKIE); 102577c4ece6SBarry Smith PetscValidHeaderSpecific(*B,MAT_COOKIE); 10263a40ed3dSBarry Smith PetscFunctionReturn(0); 10279b94acceSBarry Smith } 10289b94acceSBarry Smith 10295615d1e5SSatish Balay #undef __FUNC__ 1030d4bb536fSBarry Smith #define __FUNC__ "SNESSetJacobian" 10319b94acceSBarry Smith /*@C 10329b94acceSBarry Smith SNESSetJacobian - Sets the function to compute Jacobian as well as the 1033044dda88SLois Curfman McInnes location to store the matrix. 10349b94acceSBarry Smith 1035c7afd0dbSLois Curfman McInnes Collective on SNES and Mat 1036c7afd0dbSLois Curfman McInnes 10379b94acceSBarry Smith Input Parameters: 1038c7afd0dbSLois Curfman McInnes + snes - the SNES context 10399b94acceSBarry Smith . A - Jacobian matrix 10409b94acceSBarry Smith . B - preconditioner matrix (usually same as the Jacobian) 10419b94acceSBarry Smith . func - Jacobian evaluation routine 1042c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined context for private data for the 10432cd2dfdcSLois Curfman McInnes Jacobian evaluation routine (may be PETSC_NULL) 10449b94acceSBarry Smith 10459b94acceSBarry Smith Calling sequence of func: 10468d76a1e5SLois Curfman McInnes $ func (SNES snes,Vec x,Mat *A,Mat *B,int *flag,void *ctx); 10479b94acceSBarry Smith 1048c7afd0dbSLois Curfman McInnes + x - input vector 10499b94acceSBarry Smith . A - Jacobian matrix 10509b94acceSBarry Smith . B - preconditioner matrix, usually the same as A 1051ac21db08SLois Curfman McInnes . flag - flag indicating information about the preconditioner matrix 1052ac21db08SLois Curfman McInnes structure (same as flag in SLESSetOperators()) 1053c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined Jacobian context 10549b94acceSBarry Smith 10559b94acceSBarry Smith Notes: 1056dc5a77f8SLois Curfman McInnes See SLESSetOperators() for important information about setting the flag 10572cd2dfdcSLois Curfman McInnes output parameter in the routine func(). Be sure to read this information! 1058ac21db08SLois Curfman McInnes 1059ac21db08SLois Curfman McInnes The routine func() takes Mat * as the matrix arguments rather than Mat. 10609b94acceSBarry Smith This allows the Jacobian evaluation routine to replace A and/or B with a 10619b94acceSBarry Smith completely new new matrix structure (not just different matrix elements) 10629b94acceSBarry Smith when appropriate, for instance, if the nonzero structure is changing 10639b94acceSBarry Smith throughout the global iterations. 10649b94acceSBarry Smith 10659b94acceSBarry Smith .keywords: SNES, nonlinear, set, Jacobian, matrix 10669b94acceSBarry Smith 1067ac21db08SLois Curfman McInnes .seealso: SLESSetOperators(), SNESSetFunction() 10689b94acceSBarry Smith @*/ 10699b94acceSBarry Smith int SNESSetJacobian(SNES snes,Mat A,Mat B,int (*func)(SNES,Vec,Mat*,Mat*, 10709b94acceSBarry Smith MatStructure*,void*),void *ctx) 10719b94acceSBarry Smith { 10723a40ed3dSBarry Smith PetscFunctionBegin; 107377c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1074a8c6a408SBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 1075a8c6a408SBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_NONLINEAR_EQUATIONS only"); 1076a8c6a408SBarry Smith } 10779b94acceSBarry Smith snes->computejacobian = func; 10789b94acceSBarry Smith snes->jacP = ctx; 10799b94acceSBarry Smith snes->jacobian = A; 10809b94acceSBarry Smith snes->jacobian_pre = B; 10813a40ed3dSBarry Smith PetscFunctionReturn(0); 10829b94acceSBarry Smith } 108362fef451SLois Curfman McInnes 10845615d1e5SSatish Balay #undef __FUNC__ 1085d4bb536fSBarry Smith #define __FUNC__ "SNESGetJacobian" 1086b4fd4287SBarry Smith /*@ 1087b4fd4287SBarry Smith SNESGetJacobian - Returns the Jacobian matrix and optionally the user 1088b4fd4287SBarry Smith provided context for evaluating the Jacobian. 1089b4fd4287SBarry Smith 1090c7afd0dbSLois Curfman McInnes Not Collective, but Mat object will be parallel if SNES object is 1091c7afd0dbSLois Curfman McInnes 1092b4fd4287SBarry Smith Input Parameter: 1093b4fd4287SBarry Smith . snes - the nonlinear solver context 1094b4fd4287SBarry Smith 1095b4fd4287SBarry Smith Output Parameters: 1096c7afd0dbSLois Curfman McInnes + A - location to stash Jacobian matrix (or PETSC_NULL) 1097b4fd4287SBarry Smith . B - location to stash preconditioner matrix (or PETSC_NULL) 1098c7afd0dbSLois Curfman McInnes - ctx - location to stash Jacobian ctx (or PETSC_NULL) 1099fee21e36SBarry Smith 1100b4fd4287SBarry Smith .seealso: SNESSetJacobian(), SNESComputeJacobian() 1101b4fd4287SBarry Smith @*/ 1102b4fd4287SBarry Smith int SNESGetJacobian(SNES snes,Mat *A,Mat *B, void **ctx) 1103b4fd4287SBarry Smith { 11043a40ed3dSBarry Smith PetscFunctionBegin; 11053a40ed3dSBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 1106a8c6a408SBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_NONLINEAR_EQUATIONS only"); 11073a40ed3dSBarry Smith } 1108b4fd4287SBarry Smith if (A) *A = snes->jacobian; 1109b4fd4287SBarry Smith if (B) *B = snes->jacobian_pre; 1110b4fd4287SBarry Smith if (ctx) *ctx = snes->jacP; 11113a40ed3dSBarry Smith PetscFunctionReturn(0); 1112b4fd4287SBarry Smith } 1113b4fd4287SBarry Smith 11145615d1e5SSatish Balay #undef __FUNC__ 1115d4bb536fSBarry Smith #define __FUNC__ "SNESSetHessian" 11169b94acceSBarry Smith /*@C 11179b94acceSBarry Smith SNESSetHessian - Sets the function to compute Hessian as well as the 1118044dda88SLois Curfman McInnes location to store the matrix. 11199b94acceSBarry Smith 1120c7afd0dbSLois Curfman McInnes Collective on SNES and Mat 1121c7afd0dbSLois Curfman McInnes 11229b94acceSBarry Smith Input Parameters: 1123c7afd0dbSLois Curfman McInnes + snes - the SNES context 11249b94acceSBarry Smith . A - Hessian matrix 11259b94acceSBarry Smith . B - preconditioner matrix (usually same as the Hessian) 11269b94acceSBarry Smith . func - Jacobian evaluation routine 1127c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined context for private data for the 1128313e4042SLois Curfman McInnes Hessian evaluation routine (may be PETSC_NULL) 11299b94acceSBarry Smith 11309b94acceSBarry Smith Calling sequence of func: 11318d76a1e5SLois Curfman McInnes $ func (SNES snes,Vec x,Mat *A,Mat *B,int *flag,void *ctx); 11329b94acceSBarry Smith 1133c7afd0dbSLois Curfman McInnes + x - input vector 11349b94acceSBarry Smith . A - Hessian matrix 11359b94acceSBarry Smith . B - preconditioner matrix, usually the same as A 1136ac21db08SLois Curfman McInnes . flag - flag indicating information about the preconditioner matrix 1137ac21db08SLois Curfman McInnes structure (same as flag in SLESSetOperators()) 1138c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined Hessian context 11399b94acceSBarry Smith 11409b94acceSBarry Smith Notes: 1141dc5a77f8SLois Curfman McInnes See SLESSetOperators() for important information about setting the flag 11422cd2dfdcSLois Curfman McInnes output parameter in the routine func(). Be sure to read this information! 1143ac21db08SLois Curfman McInnes 11449b94acceSBarry Smith The function func() takes Mat * as the matrix arguments rather than Mat. 11459b94acceSBarry Smith This allows the Hessian evaluation routine to replace A and/or B with a 11469b94acceSBarry Smith completely new new matrix structure (not just different matrix elements) 11479b94acceSBarry Smith when appropriate, for instance, if the nonzero structure is changing 11489b94acceSBarry Smith throughout the global iterations. 11499b94acceSBarry Smith 11509b94acceSBarry Smith .keywords: SNES, nonlinear, set, Hessian, matrix 11519b94acceSBarry Smith 1152ac21db08SLois Curfman McInnes .seealso: SNESSetMinimizationFunction(), SNESSetGradient(), SLESSetOperators() 11539b94acceSBarry Smith @*/ 11549b94acceSBarry Smith int SNESSetHessian(SNES snes,Mat A,Mat B,int (*func)(SNES,Vec,Mat*,Mat*, 11559b94acceSBarry Smith MatStructure*,void*),void *ctx) 11569b94acceSBarry Smith { 11573a40ed3dSBarry Smith PetscFunctionBegin; 115877c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1159d4bb536fSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 1160a8c6a408SBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 1161d4bb536fSBarry Smith } 11629b94acceSBarry Smith snes->computejacobian = func; 11639b94acceSBarry Smith snes->jacP = ctx; 11649b94acceSBarry Smith snes->jacobian = A; 11659b94acceSBarry Smith snes->jacobian_pre = B; 11663a40ed3dSBarry Smith PetscFunctionReturn(0); 11679b94acceSBarry Smith } 11689b94acceSBarry Smith 11695615d1e5SSatish Balay #undef __FUNC__ 1170d4bb536fSBarry Smith #define __FUNC__ "SNESGetHessian" 117162fef451SLois Curfman McInnes /*@ 117262fef451SLois Curfman McInnes SNESGetHessian - Returns the Hessian matrix and optionally the user 117362fef451SLois Curfman McInnes provided context for evaluating the Hessian. 117462fef451SLois Curfman McInnes 1175c7afd0dbSLois Curfman McInnes Not Collective, but Mat object is parallel if SNES object is parallel 1176c7afd0dbSLois Curfman McInnes 117762fef451SLois Curfman McInnes Input Parameter: 117862fef451SLois Curfman McInnes . snes - the nonlinear solver context 117962fef451SLois Curfman McInnes 118062fef451SLois Curfman McInnes Output Parameters: 1181c7afd0dbSLois Curfman McInnes + A - location to stash Hessian matrix (or PETSC_NULL) 118262fef451SLois Curfman McInnes . B - location to stash preconditioner matrix (or PETSC_NULL) 1183c7afd0dbSLois Curfman McInnes - ctx - location to stash Hessian ctx (or PETSC_NULL) 1184fee21e36SBarry Smith 118562fef451SLois Curfman McInnes .seealso: SNESSetHessian(), SNESComputeHessian() 1186c7afd0dbSLois Curfman McInnes 1187c7afd0dbSLois Curfman McInnes .keywords: SNES, get, Hessian 118862fef451SLois Curfman McInnes @*/ 118962fef451SLois Curfman McInnes int SNESGetHessian(SNES snes,Mat *A,Mat *B, void **ctx) 119062fef451SLois Curfman McInnes { 11913a40ed3dSBarry Smith PetscFunctionBegin; 11923a40ed3dSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION){ 1193a8c6a408SBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 11943a40ed3dSBarry Smith } 119562fef451SLois Curfman McInnes if (A) *A = snes->jacobian; 119662fef451SLois Curfman McInnes if (B) *B = snes->jacobian_pre; 119762fef451SLois Curfman McInnes if (ctx) *ctx = snes->jacP; 11983a40ed3dSBarry Smith PetscFunctionReturn(0); 119962fef451SLois Curfman McInnes } 120062fef451SLois Curfman McInnes 12019b94acceSBarry Smith /* ----- Routines to initialize and destroy a nonlinear solver ---- */ 12029b94acceSBarry Smith 12035615d1e5SSatish Balay #undef __FUNC__ 12045615d1e5SSatish Balay #define __FUNC__ "SNESSetUp" 12059b94acceSBarry Smith /*@ 12069b94acceSBarry Smith SNESSetUp - Sets up the internal data structures for the later use 1207272ac6f2SLois Curfman McInnes of a nonlinear solver. 12089b94acceSBarry Smith 1209fee21e36SBarry Smith Collective on SNES 1210fee21e36SBarry Smith 1211c7afd0dbSLois Curfman McInnes Input Parameters: 1212c7afd0dbSLois Curfman McInnes + snes - the SNES context 1213c7afd0dbSLois Curfman McInnes - x - the solution vector 1214c7afd0dbSLois Curfman McInnes 1215272ac6f2SLois Curfman McInnes Notes: 1216272ac6f2SLois Curfman McInnes For basic use of the SNES solvers the user need not explicitly call 1217272ac6f2SLois Curfman McInnes SNESSetUp(), since these actions will automatically occur during 1218272ac6f2SLois Curfman McInnes the call to SNESSolve(). However, if one wishes to control this 1219272ac6f2SLois Curfman McInnes phase separately, SNESSetUp() should be called after SNESCreate() 1220272ac6f2SLois Curfman McInnes and optional routines of the form SNESSetXXX(), but before SNESSolve(). 1221272ac6f2SLois Curfman McInnes 12229b94acceSBarry Smith .keywords: SNES, nonlinear, setup 12239b94acceSBarry Smith 12249b94acceSBarry Smith .seealso: SNESCreate(), SNESSolve(), SNESDestroy() 12259b94acceSBarry Smith @*/ 12268ddd3da0SLois Curfman McInnes int SNESSetUp(SNES snes,Vec x) 12279b94acceSBarry Smith { 1228272ac6f2SLois Curfman McInnes int ierr, flg; 12293a40ed3dSBarry Smith 12303a40ed3dSBarry Smith PetscFunctionBegin; 123177c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 123277c4ece6SBarry Smith PetscValidHeaderSpecific(x,VEC_COOKIE); 12338ddd3da0SLois Curfman McInnes snes->vec_sol = snes->vec_sol_always = x; 12349b94acceSBarry Smith 1235c1f60f51SBarry Smith ierr = OptionsHasName(snes->prefix,"-snes_mf_operator", &flg); CHKERRQ(ierr); 1236c1f60f51SBarry Smith /* 1237c1f60f51SBarry Smith This version replaces the user provided Jacobian matrix with a 1238dfa02198SLois Curfman McInnes matrix-free version but still employs the user-provided preconditioner matrix 1239c1f60f51SBarry Smith */ 1240c1f60f51SBarry Smith if (flg) { 1241c1f60f51SBarry Smith Mat J; 1242e24b481bSBarry Smith ierr = MatCreateSNESFDMF(snes,snes->vec_sol,&J);CHKERRQ(ierr); 1243c1f60f51SBarry Smith PLogObjectParent(snes,J); 1244c1f60f51SBarry Smith snes->mfshell = J; 1245c1f60f51SBarry Smith if (snes->method_class == SNES_NONLINEAR_EQUATIONS) { 1246c1f60f51SBarry Smith snes->jacobian = J; 1247c1f60f51SBarry Smith PLogInfo(snes,"SNESSetUp: Setting default matrix-free operator Jacobian routines\n"); 1248d64ed03dSBarry Smith } else if (snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) { 1249c1f60f51SBarry Smith snes->jacobian = J; 1250c1f60f51SBarry Smith PLogInfo(snes,"SNESSetUp: Setting default matrix-free operator Hessian routines\n"); 1251d4bb536fSBarry Smith } else { 1252a8c6a408SBarry Smith SETERRQ(PETSC_ERR_SUP,0,"Method class doesn't support matrix-free operator option"); 1253d4bb536fSBarry Smith } 1254e24b481bSBarry Smith ierr = MatSNESFDMFSetFromOptions(J);CHKERRQ(ierr); 1255c1f60f51SBarry Smith } 1256272ac6f2SLois Curfman McInnes ierr = OptionsHasName(snes->prefix,"-snes_mf", &flg); CHKERRQ(ierr); 1257c1f60f51SBarry Smith /* 1258dfa02198SLois Curfman McInnes This version replaces both the user-provided Jacobian and the user- 1259c1f60f51SBarry Smith provided preconditioner matrix with the default matrix free version. 1260c1f60f51SBarry Smith */ 126131615d04SLois Curfman McInnes if (flg) { 1262272ac6f2SLois Curfman McInnes Mat J; 1263e24b481bSBarry Smith ierr = MatCreateSNESFDMF(snes,snes->vec_sol,&J);CHKERRQ(ierr); 1264272ac6f2SLois Curfman McInnes PLogObjectParent(snes,J); 1265272ac6f2SLois Curfman McInnes snes->mfshell = J; 126683e56afdSLois Curfman McInnes if (snes->method_class == SNES_NONLINEAR_EQUATIONS) { 126783e56afdSLois Curfman McInnes ierr = SNESSetJacobian(snes,J,J,0,snes->funP); CHKERRQ(ierr); 126894a424c1SBarry Smith PLogInfo(snes,"SNESSetUp: Setting default matrix-free Jacobian routines\n"); 1269d64ed03dSBarry Smith } else if (snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) { 127083e56afdSLois Curfman McInnes ierr = SNESSetHessian(snes,J,J,0,snes->funP); CHKERRQ(ierr); 127194a424c1SBarry Smith PLogInfo(snes,"SNESSetUp: Setting default matrix-free Hessian routines\n"); 1272d4bb536fSBarry Smith } else { 1273a8c6a408SBarry Smith SETERRQ(PETSC_ERR_SUP,0,"Method class doesn't support matrix-free option"); 1274d4bb536fSBarry Smith } 1275e24b481bSBarry Smith ierr = MatSNESFDMFSetFromOptions(J);CHKERRQ(ierr); 1276272ac6f2SLois Curfman McInnes } 12779b94acceSBarry Smith if ((snes->method_class == SNES_NONLINEAR_EQUATIONS)) { 1278a8c6a408SBarry Smith if (!snes->vec_func) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call SNESSetFunction() first"); 1279a8c6a408SBarry Smith if (!snes->computefunction) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call SNESSetFunction() first"); 1280a8c6a408SBarry Smith if (!snes->jacobian) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call SNESSetJacobian() first"); 1281a8c6a408SBarry Smith if (snes->vec_func == snes->vec_sol) { 1282a8c6a408SBarry Smith SETERRQ(PETSC_ERR_ARG_IDN,0,"Solution vector cannot be function vector"); 1283a8c6a408SBarry Smith } 1284a703fe33SLois Curfman McInnes 1285a703fe33SLois Curfman McInnes /* Set the KSP stopping criterion to use the Eisenstat-Walker method */ 128682bf6240SBarry Smith if (snes->ksp_ewconv && PetscStrcmp(snes->type_name,SNES_EQ_TR)) { 1287a703fe33SLois Curfman McInnes SLES sles; KSP ksp; 1288a703fe33SLois Curfman McInnes ierr = SNESGetSLES(snes,&sles); CHKERRQ(ierr); 1289a703fe33SLois Curfman McInnes ierr = SLESGetKSP(sles,&ksp); CHKERRQ(ierr); 1290a703fe33SLois Curfman McInnes ierr = KSPSetConvergenceTest(ksp,SNES_KSP_EW_Converged_Private, 1291a703fe33SLois Curfman McInnes (void *)snes); CHKERRQ(ierr); 1292a703fe33SLois Curfman McInnes } 12939b94acceSBarry Smith } else if ((snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION)) { 1294a8c6a408SBarry Smith if (!snes->vec_func) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call SNESSetGradient() first"); 1295a8c6a408SBarry Smith if (!snes->computefunction) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call SNESSetGradient() first"); 1296a8c6a408SBarry Smith if (!snes->computeumfunction) { 1297a8c6a408SBarry Smith SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call SNESSetMinimizationFunction() first"); 1298a8c6a408SBarry Smith } 1299a8c6a408SBarry Smith if (!snes->jacobian) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must call SNESSetHessian() first"); 1300d4bb536fSBarry Smith } else { 1301a8c6a408SBarry Smith SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,0,"Unknown method class"); 1302d4bb536fSBarry Smith } 1303a703fe33SLois Curfman McInnes if (snes->setup) {ierr = (*snes->setup)(snes); CHKERRQ(ierr);} 130482bf6240SBarry Smith snes->setupcalled = 1; 13053a40ed3dSBarry Smith PetscFunctionReturn(0); 13069b94acceSBarry Smith } 13079b94acceSBarry Smith 13085615d1e5SSatish Balay #undef __FUNC__ 1309d4bb536fSBarry Smith #define __FUNC__ "SNESDestroy" 13109b94acceSBarry Smith /*@C 13119b94acceSBarry Smith SNESDestroy - Destroys the nonlinear solver context that was created 13129b94acceSBarry Smith with SNESCreate(). 13139b94acceSBarry Smith 1314c7afd0dbSLois Curfman McInnes Collective on SNES 1315c7afd0dbSLois Curfman McInnes 13169b94acceSBarry Smith Input Parameter: 13179b94acceSBarry Smith . snes - the SNES context 13189b94acceSBarry Smith 13199b94acceSBarry Smith .keywords: SNES, nonlinear, destroy 13209b94acceSBarry Smith 132163a78c88SLois Curfman McInnes .seealso: SNESCreate(), SNESSolve() 13229b94acceSBarry Smith @*/ 13239b94acceSBarry Smith int SNESDestroy(SNES snes) 13249b94acceSBarry Smith { 13259b94acceSBarry Smith int ierr; 13263a40ed3dSBarry Smith 13273a40ed3dSBarry Smith PetscFunctionBegin; 132877c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 13293a40ed3dSBarry Smith if (--snes->refct > 0) PetscFunctionReturn(0); 1330d4bb536fSBarry Smith 1331e1311b90SBarry Smith if (snes->destroy) {ierr = (*(snes)->destroy)(snes); CHKERRQ(ierr);} 13320452661fSBarry Smith if (snes->kspconvctx) PetscFree(snes->kspconvctx); 1333522c5e43SBarry Smith if (snes->mfshell) {ierr = MatDestroy(snes->mfshell);CHKERRQ(ierr);} 13349b94acceSBarry Smith ierr = SLESDestroy(snes->sles); CHKERRQ(ierr); 1335522c5e43SBarry Smith if (snes->xmonitor) {ierr = SNESLGMonitorDestroy(snes->xmonitor);CHKERRQ(ierr);} 1336522c5e43SBarry Smith if (snes->vwork) {ierr = VecDestroyVecs(snes->vwork,snes->nvwork);CHKERRQ(ierr);} 13379b94acceSBarry Smith PLogObjectDestroy((PetscObject)snes); 13380452661fSBarry Smith PetscHeaderDestroy((PetscObject)snes); 13393a40ed3dSBarry Smith PetscFunctionReturn(0); 13409b94acceSBarry Smith } 13419b94acceSBarry Smith 13429b94acceSBarry Smith /* ----------- Routines to set solver parameters ---------- */ 13439b94acceSBarry Smith 13445615d1e5SSatish Balay #undef __FUNC__ 13455615d1e5SSatish Balay #define __FUNC__ "SNESSetTolerances" 13469b94acceSBarry Smith /*@ 1347d7a720efSLois Curfman McInnes SNESSetTolerances - Sets various parameters used in convergence tests. 13489b94acceSBarry Smith 1349c7afd0dbSLois Curfman McInnes Collective on SNES 1350c7afd0dbSLois Curfman McInnes 13519b94acceSBarry Smith Input Parameters: 1352c7afd0dbSLois Curfman McInnes + snes - the SNES context 135333174efeSLois Curfman McInnes . atol - absolute convergence tolerance 135433174efeSLois Curfman McInnes . rtol - relative convergence tolerance 135533174efeSLois Curfman McInnes . stol - convergence tolerance in terms of the norm 135633174efeSLois Curfman McInnes of the change in the solution between steps 135733174efeSLois Curfman McInnes . maxit - maximum number of iterations 1358c7afd0dbSLois Curfman McInnes - maxf - maximum number of function evaluations 1359fee21e36SBarry Smith 136033174efeSLois Curfman McInnes Options Database Keys: 1361c7afd0dbSLois Curfman McInnes + -snes_atol <atol> - Sets atol 1362c7afd0dbSLois Curfman McInnes . -snes_rtol <rtol> - Sets rtol 1363c7afd0dbSLois Curfman McInnes . -snes_stol <stol> - Sets stol 1364c7afd0dbSLois Curfman McInnes . -snes_max_it <maxit> - Sets maxit 1365c7afd0dbSLois Curfman McInnes - -snes_max_funcs <maxf> - Sets maxf 13669b94acceSBarry Smith 1367d7a720efSLois Curfman McInnes Notes: 13689b94acceSBarry Smith The default maximum number of iterations is 50. 13699b94acceSBarry Smith The default maximum number of function evaluations is 1000. 13709b94acceSBarry Smith 137133174efeSLois Curfman McInnes .keywords: SNES, nonlinear, set, convergence, tolerances 13729b94acceSBarry Smith 1373d7a720efSLois Curfman McInnes .seealso: SNESSetTrustRegionTolerance(), SNESSetMinimizationFunctionTolerance() 13749b94acceSBarry Smith @*/ 1375d7a720efSLois Curfman McInnes int SNESSetTolerances(SNES snes,double atol,double rtol,double stol,int maxit,int maxf) 13769b94acceSBarry Smith { 13773a40ed3dSBarry Smith PetscFunctionBegin; 137877c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1379d7a720efSLois Curfman McInnes if (atol != PETSC_DEFAULT) snes->atol = atol; 1380d7a720efSLois Curfman McInnes if (rtol != PETSC_DEFAULT) snes->rtol = rtol; 1381d7a720efSLois Curfman McInnes if (stol != PETSC_DEFAULT) snes->xtol = stol; 1382d7a720efSLois Curfman McInnes if (maxit != PETSC_DEFAULT) snes->max_its = maxit; 1383d7a720efSLois Curfman McInnes if (maxf != PETSC_DEFAULT) snes->max_funcs = maxf; 13843a40ed3dSBarry Smith PetscFunctionReturn(0); 13859b94acceSBarry Smith } 13869b94acceSBarry Smith 13875615d1e5SSatish Balay #undef __FUNC__ 13885615d1e5SSatish Balay #define __FUNC__ "SNESGetTolerances" 13899b94acceSBarry Smith /*@ 139033174efeSLois Curfman McInnes SNESGetTolerances - Gets various parameters used in convergence tests. 139133174efeSLois Curfman McInnes 1392c7afd0dbSLois Curfman McInnes Not Collective 1393c7afd0dbSLois Curfman McInnes 139433174efeSLois Curfman McInnes Input Parameters: 1395c7afd0dbSLois Curfman McInnes + snes - the SNES context 139633174efeSLois Curfman McInnes . atol - absolute convergence tolerance 139733174efeSLois Curfman McInnes . rtol - relative convergence tolerance 139833174efeSLois Curfman McInnes . stol - convergence tolerance in terms of the norm 139933174efeSLois Curfman McInnes of the change in the solution between steps 140033174efeSLois Curfman McInnes . maxit - maximum number of iterations 1401c7afd0dbSLois Curfman McInnes - maxf - maximum number of function evaluations 1402fee21e36SBarry Smith 140333174efeSLois Curfman McInnes Notes: 140433174efeSLois Curfman McInnes The user can specify PETSC_NULL for any parameter that is not needed. 140533174efeSLois Curfman McInnes 140633174efeSLois Curfman McInnes .keywords: SNES, nonlinear, get, convergence, tolerances 140733174efeSLois Curfman McInnes 140833174efeSLois Curfman McInnes .seealso: SNESSetTolerances() 140933174efeSLois Curfman McInnes @*/ 141033174efeSLois Curfman McInnes int SNESGetTolerances(SNES snes,double *atol,double *rtol,double *stol,int *maxit,int *maxf) 141133174efeSLois Curfman McInnes { 14123a40ed3dSBarry Smith PetscFunctionBegin; 141333174efeSLois Curfman McInnes PetscValidHeaderSpecific(snes,SNES_COOKIE); 141433174efeSLois Curfman McInnes if (atol) *atol = snes->atol; 141533174efeSLois Curfman McInnes if (rtol) *rtol = snes->rtol; 141633174efeSLois Curfman McInnes if (stol) *stol = snes->xtol; 141733174efeSLois Curfman McInnes if (maxit) *maxit = snes->max_its; 141833174efeSLois Curfman McInnes if (maxf) *maxf = snes->max_funcs; 14193a40ed3dSBarry Smith PetscFunctionReturn(0); 142033174efeSLois Curfman McInnes } 142133174efeSLois Curfman McInnes 14225615d1e5SSatish Balay #undef __FUNC__ 14235615d1e5SSatish Balay #define __FUNC__ "SNESSetTrustRegionTolerance" 142433174efeSLois Curfman McInnes /*@ 14259b94acceSBarry Smith SNESSetTrustRegionTolerance - Sets the trust region parameter tolerance. 14269b94acceSBarry Smith 1427fee21e36SBarry Smith Collective on SNES 1428fee21e36SBarry Smith 1429c7afd0dbSLois Curfman McInnes Input Parameters: 1430c7afd0dbSLois Curfman McInnes + snes - the SNES context 1431c7afd0dbSLois Curfman McInnes - tol - tolerance 1432c7afd0dbSLois Curfman McInnes 14339b94acceSBarry Smith Options Database Key: 1434c7afd0dbSLois Curfman McInnes . -snes_trtol <tol> - Sets tol 14359b94acceSBarry Smith 14369b94acceSBarry Smith .keywords: SNES, nonlinear, set, trust region, tolerance 14379b94acceSBarry Smith 1438d7a720efSLois Curfman McInnes .seealso: SNESSetTolerances(), SNESSetMinimizationFunctionTolerance() 14399b94acceSBarry Smith @*/ 14409b94acceSBarry Smith int SNESSetTrustRegionTolerance(SNES snes,double tol) 14419b94acceSBarry Smith { 14423a40ed3dSBarry Smith PetscFunctionBegin; 144377c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 14449b94acceSBarry Smith snes->deltatol = tol; 14453a40ed3dSBarry Smith PetscFunctionReturn(0); 14469b94acceSBarry Smith } 14479b94acceSBarry Smith 14485615d1e5SSatish Balay #undef __FUNC__ 14495615d1e5SSatish Balay #define __FUNC__ "SNESSetMinimizationFunctionTolerance" 14509b94acceSBarry Smith /*@ 145177c4ece6SBarry Smith SNESSetMinimizationFunctionTolerance - Sets the minimum allowable function tolerance 14529b94acceSBarry Smith for unconstrained minimization solvers. 14539b94acceSBarry Smith 1454fee21e36SBarry Smith Collective on SNES 1455fee21e36SBarry Smith 1456c7afd0dbSLois Curfman McInnes Input Parameters: 1457c7afd0dbSLois Curfman McInnes + snes - the SNES context 1458c7afd0dbSLois Curfman McInnes - ftol - minimum function tolerance 1459c7afd0dbSLois Curfman McInnes 14609b94acceSBarry Smith Options Database Key: 1461c7afd0dbSLois Curfman McInnes . -snes_fmin <ftol> - Sets ftol 14629b94acceSBarry Smith 14639b94acceSBarry Smith Note: 146477c4ece6SBarry Smith SNESSetMinimizationFunctionTolerance() is valid for SNES_UNCONSTRAINED_MINIMIZATION 14659b94acceSBarry Smith methods only. 14669b94acceSBarry Smith 14679b94acceSBarry Smith .keywords: SNES, nonlinear, set, minimum, convergence, function, tolerance 14689b94acceSBarry Smith 1469d7a720efSLois Curfman McInnes .seealso: SNESSetTolerances(), SNESSetTrustRegionTolerance() 14709b94acceSBarry Smith @*/ 147177c4ece6SBarry Smith int SNESSetMinimizationFunctionTolerance(SNES snes,double ftol) 14729b94acceSBarry Smith { 14733a40ed3dSBarry Smith PetscFunctionBegin; 147477c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 14759b94acceSBarry Smith snes->fmin = ftol; 14763a40ed3dSBarry Smith PetscFunctionReturn(0); 14779b94acceSBarry Smith } 14789b94acceSBarry Smith 14799b94acceSBarry Smith /* ------------ Routines to set performance monitoring options ----------- */ 14809b94acceSBarry Smith 14815615d1e5SSatish Balay #undef __FUNC__ 1482d4bb536fSBarry Smith #define __FUNC__ "SNESSetMonitor" 14839b94acceSBarry Smith /*@C 14845cd90555SBarry Smith SNESSetMonitor - Sets an ADDITIONAL function that is to be used at every 14859b94acceSBarry Smith iteration of the nonlinear solver to display the iteration's 14869b94acceSBarry Smith progress. 14879b94acceSBarry Smith 1488fee21e36SBarry Smith Collective on SNES 1489fee21e36SBarry Smith 1490c7afd0dbSLois Curfman McInnes Input Parameters: 1491c7afd0dbSLois Curfman McInnes + snes - the SNES context 1492c7afd0dbSLois Curfman McInnes . func - monitoring routine 1493c7afd0dbSLois Curfman McInnes - mctx - [optional] user-defined context for private data for the 1494c7afd0dbSLois Curfman McInnes monitor routine (may be PETSC_NULL) 14959b94acceSBarry Smith 1496c7afd0dbSLois Curfman McInnes Calling sequence of func: 14978d76a1e5SLois Curfman McInnes $ int func(SNES snes,int its, Vec x,Vec f,double norm,void *mctx) 1498c7afd0dbSLois Curfman McInnes 1499c7afd0dbSLois Curfman McInnes + snes - the SNES context 1500c7afd0dbSLois Curfman McInnes . its - iteration number 1501c7afd0dbSLois Curfman McInnes . mctx - [optional] monitoring context 1502c7afd0dbSLois Curfman McInnes . norm - 2-norm function value (may be estimated) 1503c7afd0dbSLois Curfman McInnes for SNES_NONLINEAR_EQUATIONS methods 1504c7afd0dbSLois Curfman McInnes - norm - 2-norm gradient value (may be estimated) 1505c7afd0dbSLois Curfman McInnes for SNES_UNCONSTRAINED_MINIMIZATION methods 15069b94acceSBarry Smith 15079665c990SLois Curfman McInnes Options Database Keys: 1508c7afd0dbSLois Curfman McInnes + -snes_monitor - sets SNESDefaultMonitor() 1509c7afd0dbSLois Curfman McInnes . -snes_xmonitor - sets line graph monitor, 1510c7afd0dbSLois Curfman McInnes uses SNESLGMonitorCreate() 1511c7afd0dbSLois Curfman McInnes _ -snes_cancelmonitors - cancels all monitors that have 1512c7afd0dbSLois Curfman McInnes been hardwired into a code by 1513c7afd0dbSLois Curfman McInnes calls to SNESSetMonitor(), but 1514c7afd0dbSLois Curfman McInnes does not cancel those set via 1515c7afd0dbSLois Curfman McInnes the options database. 15169665c990SLois Curfman McInnes 1517639f9d9dSBarry Smith Notes: 15186bc08f3fSLois Curfman McInnes Several different monitoring routines may be set by calling 15196bc08f3fSLois Curfman McInnes SNESSetMonitor() multiple times; all will be called in the 15206bc08f3fSLois Curfman McInnes order in which they were set. 1521639f9d9dSBarry Smith 15229b94acceSBarry Smith .keywords: SNES, nonlinear, set, monitor 15239b94acceSBarry Smith 15245cd90555SBarry Smith .seealso: SNESDefaultMonitor(), SNESClearMonitor() 15259b94acceSBarry Smith @*/ 152674679c65SBarry Smith int SNESSetMonitor( SNES snes, int (*func)(SNES,int,double,void*),void *mctx ) 15279b94acceSBarry Smith { 15283a40ed3dSBarry Smith PetscFunctionBegin; 1529639f9d9dSBarry Smith if (snes->numbermonitors >= MAXSNESMONITORS) { 1530a8c6a408SBarry Smith SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,0,"Too many monitors set"); 1531639f9d9dSBarry Smith } 1532639f9d9dSBarry Smith 1533639f9d9dSBarry Smith snes->monitor[snes->numbermonitors] = func; 1534639f9d9dSBarry Smith snes->monitorcontext[snes->numbermonitors++] = (void*)mctx; 15353a40ed3dSBarry Smith PetscFunctionReturn(0); 15369b94acceSBarry Smith } 15379b94acceSBarry Smith 15385615d1e5SSatish Balay #undef __FUNC__ 15395cd90555SBarry Smith #define __FUNC__ "SNESClearMonitor" 15405cd90555SBarry Smith /*@C 15415cd90555SBarry Smith SNESClearMonitor - Clears all the monitor functions for a SNES object. 15425cd90555SBarry Smith 1543c7afd0dbSLois Curfman McInnes Collective on SNES 1544c7afd0dbSLois Curfman McInnes 15455cd90555SBarry Smith Input Parameters: 15465cd90555SBarry Smith . snes - the SNES context 15475cd90555SBarry Smith 15485cd90555SBarry Smith Options Database: 1549c7afd0dbSLois Curfman McInnes . -snes_cancelmonitors - cancels all monitors that have been hardwired 1550c7afd0dbSLois Curfman McInnes into a code by calls to SNESSetMonitor(), but does not cancel those 1551c7afd0dbSLois Curfman McInnes set via the options database 15525cd90555SBarry Smith 15535cd90555SBarry Smith Notes: 15545cd90555SBarry Smith There is no way to clear one specific monitor from a SNES object. 15555cd90555SBarry Smith 15565cd90555SBarry Smith .keywords: SNES, nonlinear, set, monitor 15575cd90555SBarry Smith 15585cd90555SBarry Smith .seealso: SNESDefaultMonitor(), SNESSetMonitor() 15595cd90555SBarry Smith @*/ 15605cd90555SBarry Smith int SNESClearMonitor( SNES snes ) 15615cd90555SBarry Smith { 15625cd90555SBarry Smith PetscFunctionBegin; 15635cd90555SBarry Smith snes->numbermonitors = 0; 15645cd90555SBarry Smith PetscFunctionReturn(0); 15655cd90555SBarry Smith } 15665cd90555SBarry Smith 15675cd90555SBarry Smith #undef __FUNC__ 1568d4bb536fSBarry Smith #define __FUNC__ "SNESSetConvergenceTest" 15699b94acceSBarry Smith /*@C 15709b94acceSBarry Smith SNESSetConvergenceTest - Sets the function that is to be used 15719b94acceSBarry Smith to test for convergence of the nonlinear iterative solution. 15729b94acceSBarry Smith 1573fee21e36SBarry Smith Collective on SNES 1574fee21e36SBarry Smith 1575c7afd0dbSLois Curfman McInnes Input Parameters: 1576c7afd0dbSLois Curfman McInnes + snes - the SNES context 1577c7afd0dbSLois Curfman McInnes . func - routine to test for convergence 1578c7afd0dbSLois Curfman McInnes - cctx - [optional] context for private data for the convergence routine 1579c7afd0dbSLois Curfman McInnes (may be PETSC_NULL) 15809b94acceSBarry Smith 1581c7afd0dbSLois Curfman McInnes Calling sequence of func: 15828d76a1e5SLois Curfman McInnes $ int func (SNES snes,double xnorm,double gnorm,double f,void *cctx) 1583c7afd0dbSLois Curfman McInnes 1584c7afd0dbSLois Curfman McInnes + snes - the SNES context 1585c7afd0dbSLois Curfman McInnes . cctx - [optional] convergence context 1586c7afd0dbSLois Curfman McInnes . xnorm - 2-norm of current iterate 1587c7afd0dbSLois Curfman McInnes . gnorm - 2-norm of current step (SNES_NONLINEAR_EQUATIONS methods) 1588c7afd0dbSLois Curfman McInnes . f - 2-norm of function (SNES_NONLINEAR_EQUATIONS methods) 1589c7afd0dbSLois Curfman McInnes . gnorm - 2-norm of current gradient (SNES_UNCONSTRAINED_MINIMIZATION methods) 1590c7afd0dbSLois Curfman McInnes - f - function value (SNES_UNCONSTRAINED_MINIMIZATION methods) 15919b94acceSBarry Smith 15929b94acceSBarry Smith .keywords: SNES, nonlinear, set, convergence, test 15939b94acceSBarry Smith 159440191667SLois Curfman McInnes .seealso: SNESConverged_EQ_LS(), SNESConverged_EQ_TR(), 159540191667SLois Curfman McInnes SNESConverged_UM_LS(), SNESConverged_UM_TR() 15969b94acceSBarry Smith @*/ 159774679c65SBarry Smith int SNESSetConvergenceTest(SNES snes,int (*func)(SNES,double,double,double,void*),void *cctx) 15989b94acceSBarry Smith { 15993a40ed3dSBarry Smith PetscFunctionBegin; 16009b94acceSBarry Smith (snes)->converged = func; 16019b94acceSBarry Smith (snes)->cnvP = cctx; 16023a40ed3dSBarry Smith PetscFunctionReturn(0); 16039b94acceSBarry Smith } 16049b94acceSBarry Smith 16055615d1e5SSatish Balay #undef __FUNC__ 1606d4bb536fSBarry Smith #define __FUNC__ "SNESSetConvergenceHistory" 1607c9005455SLois Curfman McInnes /*@ 1608c9005455SLois Curfman McInnes SNESSetConvergenceHistory - Sets the array used to hold the convergence history. 1609c9005455SLois Curfman McInnes 1610fee21e36SBarry Smith Collective on SNES 1611fee21e36SBarry Smith 1612c7afd0dbSLois Curfman McInnes Input Parameters: 1613c7afd0dbSLois Curfman McInnes + snes - iterative context obtained from SNESCreate() 1614c7afd0dbSLois Curfman McInnes . a - array to hold history 1615c7afd0dbSLois Curfman McInnes - na - size of a 1616c7afd0dbSLois Curfman McInnes 1617c9005455SLois Curfman McInnes Notes: 1618c9005455SLois Curfman McInnes If set, this array will contain the function norms (for 1619c9005455SLois Curfman McInnes SNES_NONLINEAR_EQUATIONS methods) or gradient norms 1620c9005455SLois Curfman McInnes (for SNES_UNCONSTRAINED_MINIMIZATION methods) computed 1621c9005455SLois Curfman McInnes at each step. 1622c9005455SLois Curfman McInnes 1623c9005455SLois Curfman McInnes This routine is useful, e.g., when running a code for purposes 1624c9005455SLois Curfman McInnes of accurate performance monitoring, when no I/O should be done 1625c9005455SLois Curfman McInnes during the section of code that is being timed. 1626c9005455SLois Curfman McInnes 1627c9005455SLois Curfman McInnes .keywords: SNES, set, convergence, history 1628c9005455SLois Curfman McInnes @*/ 1629c9005455SLois Curfman McInnes int SNESSetConvergenceHistory(SNES snes, double *a, int na) 1630c9005455SLois Curfman McInnes { 16313a40ed3dSBarry Smith PetscFunctionBegin; 1632c9005455SLois Curfman McInnes PetscValidHeaderSpecific(snes,SNES_COOKIE); 1633c9005455SLois Curfman McInnes if (na) PetscValidScalarPointer(a); 1634c9005455SLois Curfman McInnes snes->conv_hist = a; 1635c9005455SLois Curfman McInnes snes->conv_hist_size = na; 16363a40ed3dSBarry Smith PetscFunctionReturn(0); 1637c9005455SLois Curfman McInnes } 1638c9005455SLois Curfman McInnes 1639c9005455SLois Curfman McInnes #undef __FUNC__ 16405615d1e5SSatish Balay #define __FUNC__ "SNESScaleStep_Private" 16419b94acceSBarry Smith /* 16429b94acceSBarry Smith SNESScaleStep_Private - Scales a step so that its length is less than the 16439b94acceSBarry Smith positive parameter delta. 16449b94acceSBarry Smith 16459b94acceSBarry Smith Input Parameters: 1646c7afd0dbSLois Curfman McInnes + snes - the SNES context 16479b94acceSBarry Smith . y - approximate solution of linear system 16489b94acceSBarry Smith . fnorm - 2-norm of current function 1649c7afd0dbSLois Curfman McInnes - delta - trust region size 16509b94acceSBarry Smith 16519b94acceSBarry Smith Output Parameters: 1652c7afd0dbSLois Curfman McInnes + gpnorm - predicted function norm at the new point, assuming local 16539b94acceSBarry Smith linearization. The value is zero if the step lies within the trust 16549b94acceSBarry Smith region, and exceeds zero otherwise. 1655c7afd0dbSLois Curfman McInnes - ynorm - 2-norm of the step 16569b94acceSBarry Smith 16579b94acceSBarry Smith Note: 165840191667SLois Curfman McInnes For non-trust region methods such as SNES_EQ_LS, the parameter delta 16599b94acceSBarry Smith is set to be the maximum allowable step size. 16609b94acceSBarry Smith 16619b94acceSBarry Smith .keywords: SNES, nonlinear, scale, step 16629b94acceSBarry Smith */ 16639b94acceSBarry Smith int SNESScaleStep_Private(SNES snes,Vec y,double *fnorm,double *delta, 16649b94acceSBarry Smith double *gpnorm,double *ynorm) 16659b94acceSBarry Smith { 16669b94acceSBarry Smith double norm; 16679b94acceSBarry Smith Scalar cnorm; 16683a40ed3dSBarry Smith int ierr; 16693a40ed3dSBarry Smith 16703a40ed3dSBarry Smith PetscFunctionBegin; 16713a40ed3dSBarry Smith ierr = VecNorm(y,NORM_2, &norm );CHKERRQ(ierr); 16729b94acceSBarry Smith if (norm > *delta) { 16739b94acceSBarry Smith norm = *delta/norm; 16749b94acceSBarry Smith *gpnorm = (1.0 - norm)*(*fnorm); 16759b94acceSBarry Smith cnorm = norm; 16769b94acceSBarry Smith VecScale( &cnorm, y ); 16779b94acceSBarry Smith *ynorm = *delta; 16789b94acceSBarry Smith } else { 16799b94acceSBarry Smith *gpnorm = 0.0; 16809b94acceSBarry Smith *ynorm = norm; 16819b94acceSBarry Smith } 16823a40ed3dSBarry Smith PetscFunctionReturn(0); 16839b94acceSBarry Smith } 16849b94acceSBarry Smith 16855615d1e5SSatish Balay #undef __FUNC__ 16865615d1e5SSatish Balay #define __FUNC__ "SNESSolve" 16879b94acceSBarry Smith /*@ 16889b94acceSBarry Smith SNESSolve - Solves a nonlinear system. Call SNESSolve after calling 168963a78c88SLois Curfman McInnes SNESCreate() and optional routines of the form SNESSetXXX(). 16909b94acceSBarry Smith 1691c7afd0dbSLois Curfman McInnes Collective on SNES 1692c7afd0dbSLois Curfman McInnes 1693b2002411SLois Curfman McInnes Input Parameters: 1694c7afd0dbSLois Curfman McInnes + snes - the SNES context 1695c7afd0dbSLois Curfman McInnes - x - the solution vector 16969b94acceSBarry Smith 16979b94acceSBarry Smith Output Parameter: 1698b2002411SLois Curfman McInnes . its - number of iterations until termination 16999b94acceSBarry Smith 1700b2002411SLois Curfman McInnes Notes: 17018ddd3da0SLois Curfman McInnes The user should initialize the vector, x, with the initial guess 17028ddd3da0SLois Curfman McInnes for the nonlinear solve prior to calling SNESSolve. In particular, 17038ddd3da0SLois Curfman McInnes to employ an initial guess of zero, the user should explicitly set 17048ddd3da0SLois Curfman McInnes this vector to zero by calling VecSet(). 17058ddd3da0SLois Curfman McInnes 17069b94acceSBarry Smith .keywords: SNES, nonlinear, solve 17079b94acceSBarry Smith 170863a78c88SLois Curfman McInnes .seealso: SNESCreate(), SNESDestroy() 17099b94acceSBarry Smith @*/ 17108ddd3da0SLois Curfman McInnes int SNESSolve(SNES snes,Vec x,int *its) 17119b94acceSBarry Smith { 17123c7409f5SSatish Balay int ierr, flg; 1713052efed2SBarry Smith 17143a40ed3dSBarry Smith PetscFunctionBegin; 171577c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 171674679c65SBarry Smith PetscValidIntPointer(its); 171782bf6240SBarry Smith if (!snes->setupcalled) {ierr = SNESSetUp(snes,x); CHKERRQ(ierr);} 1718c4fc05e7SBarry Smith else {snes->vec_sol = snes->vec_sol_always = x;} 17199b94acceSBarry Smith PLogEventBegin(SNES_Solve,snes,0,0,0); 1720c96a6f78SLois Curfman McInnes snes->nfuncs = 0; snes->linear_its = 0; snes->nfailures = 0; 17219b94acceSBarry Smith ierr = (*(snes)->solve)(snes,its); CHKERRQ(ierr); 17229b94acceSBarry Smith PLogEventEnd(SNES_Solve,snes,0,0,0); 17233c7409f5SSatish Balay ierr = OptionsHasName(PETSC_NULL,"-snes_view", &flg); CHKERRQ(ierr); 17246d4a8577SBarry Smith if (flg) { ierr = SNESView(snes,VIEWER_STDOUT_WORLD); CHKERRQ(ierr); } 17253a40ed3dSBarry Smith PetscFunctionReturn(0); 17269b94acceSBarry Smith } 17279b94acceSBarry Smith 17289b94acceSBarry Smith /* --------- Internal routines for SNES Package --------- */ 17299b94acceSBarry Smith 17305615d1e5SSatish Balay #undef __FUNC__ 17315615d1e5SSatish Balay #define __FUNC__ "SNESSetType" 173282bf6240SBarry Smith /*@C 17334b0e389bSBarry Smith SNESSetType - Sets the method for the nonlinear solver. 17349b94acceSBarry Smith 1735fee21e36SBarry Smith Collective on SNES 1736fee21e36SBarry Smith 1737c7afd0dbSLois Curfman McInnes Input Parameters: 1738c7afd0dbSLois Curfman McInnes + snes - the SNES context 1739c7afd0dbSLois Curfman McInnes - method - a known method 1740c7afd0dbSLois Curfman McInnes 1741c7afd0dbSLois Curfman McInnes Options Database Key: 1742c7afd0dbSLois Curfman McInnes . -snes_type <method> - Sets the method; use -help for a list 1743c7afd0dbSLois Curfman McInnes of available methods (for instance, ls or tr) 1744ae12b187SLois Curfman McInnes 17459b94acceSBarry Smith Notes: 17469b94acceSBarry Smith See "petsc/include/snes.h" for available methods (for instance) 1747c7afd0dbSLois Curfman McInnes . SNES_EQ_LS - Newton's method with line search 1748c7afd0dbSLois Curfman McInnes (systems of nonlinear equations) 1749c7afd0dbSLois Curfman McInnes . SNES_EQ_TR - Newton's method with trust region 1750c7afd0dbSLois Curfman McInnes (systems of nonlinear equations) 1751c7afd0dbSLois Curfman McInnes . SNES_UM_TR - Newton's method with trust region 1752c7afd0dbSLois Curfman McInnes (unconstrained minimization) 1753c7afd0dbSLois Curfman McInnes . SNES_UM_LS - Newton's method with line search 1754c7afd0dbSLois Curfman McInnes (unconstrained minimization) 17559b94acceSBarry Smith 1756ae12b187SLois Curfman McInnes Normally, it is best to use the SNESSetFromOptions() command and then 1757ae12b187SLois Curfman McInnes set the SNES solver type from the options database rather than by using 1758ae12b187SLois Curfman McInnes this routine. Using the options database provides the user with 1759ae12b187SLois Curfman McInnes maximum flexibility in evaluating the many nonlinear solvers. 1760ae12b187SLois Curfman McInnes The SNESSetType() routine is provided for those situations where it 1761ae12b187SLois Curfman McInnes is necessary to set the nonlinear solver independently of the command 1762ae12b187SLois Curfman McInnes line or options database. This might be the case, for example, when 1763ae12b187SLois Curfman McInnes the choice of solver changes during the execution of the program, 1764ae12b187SLois Curfman McInnes and the user's application is taking responsibility for choosing the 1765ae12b187SLois Curfman McInnes appropriate method. In other words, this routine is for the advanced user. 1766a703fe33SLois Curfman McInnes 1767f536c699SSatish Balay .keywords: SNES, set, method 17689b94acceSBarry Smith @*/ 17694b0e389bSBarry Smith int SNESSetType(SNES snes,SNESType method) 17709b94acceSBarry Smith { 177184cb2905SBarry Smith int ierr; 17729b94acceSBarry Smith int (*r)(SNES); 17733a40ed3dSBarry Smith 17743a40ed3dSBarry Smith PetscFunctionBegin; 177577c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 177682bf6240SBarry Smith 1777*3f1db9ecSBarry Smith if (PetscTypeCompare(snes->type_name,method)) PetscFunctionReturn(0); 177882bf6240SBarry Smith 177982bf6240SBarry Smith if (snes->setupcalled) { 1780e1311b90SBarry Smith ierr = (*(snes)->destroy)(snes);CHKERRQ(ierr); 178182bf6240SBarry Smith snes->data = 0; 178282bf6240SBarry Smith } 17837d1a2b2bSBarry Smith 17849b94acceSBarry Smith /* Get the function pointers for the iterative method requested */ 178582bf6240SBarry Smith if (!SNESRegisterAllCalled) {ierr = SNESRegisterAll(PETSC_NULL); CHKERRQ(ierr);} 178682bf6240SBarry Smith 1787488ecbafSBarry Smith ierr = FListFind(snes->comm, SNESList, method,(int (**)(void *)) &r );CHKERRQ(ierr); 178882bf6240SBarry Smith 17891548b14aSBarry Smith if (!r) SETERRQ(1,1,"Unable to find requested SNES type"); 17901548b14aSBarry Smith 17910452661fSBarry Smith if (snes->data) PetscFree(snes->data); 179282bf6240SBarry Smith snes->data = 0; 17933a40ed3dSBarry Smith ierr = (*r)(snes); CHKERRQ(ierr); 179482bf6240SBarry Smith 179582bf6240SBarry Smith if (snes->type_name) PetscFree(snes->type_name); 179682bf6240SBarry Smith snes->type_name = (char *) PetscMalloc((PetscStrlen(method)+1)*sizeof(char));CHKPTRQ(snes->type_name); 179782bf6240SBarry Smith PetscStrcpy(snes->type_name,method); 179882bf6240SBarry Smith snes->set_method_called = 1; 179982bf6240SBarry Smith 18003a40ed3dSBarry Smith PetscFunctionReturn(0); 18019b94acceSBarry Smith } 18029b94acceSBarry Smith 1803a847f771SSatish Balay 18049b94acceSBarry Smith /* --------------------------------------------------------------------- */ 18055615d1e5SSatish Balay #undef __FUNC__ 1806d4bb536fSBarry Smith #define __FUNC__ "SNESRegisterDestroy" 18079b94acceSBarry Smith /*@C 18089b94acceSBarry Smith SNESRegisterDestroy - Frees the list of nonlinear solvers that were 18099b94acceSBarry Smith registered by SNESRegister(). 18109b94acceSBarry Smith 1811fee21e36SBarry Smith Not Collective 1812fee21e36SBarry Smith 18139b94acceSBarry Smith .keywords: SNES, nonlinear, register, destroy 18149b94acceSBarry Smith 18159b94acceSBarry Smith .seealso: SNESRegisterAll(), SNESRegisterAll() 18169b94acceSBarry Smith @*/ 1817cf256101SBarry Smith int SNESRegisterDestroy(void) 18189b94acceSBarry Smith { 181982bf6240SBarry Smith int ierr; 182082bf6240SBarry Smith 18213a40ed3dSBarry Smith PetscFunctionBegin; 182282bf6240SBarry Smith if (SNESList) { 1823488ecbafSBarry Smith ierr = FListDestroy( SNESList );CHKERRQ(ierr); 182482bf6240SBarry Smith SNESList = 0; 18259b94acceSBarry Smith } 182684cb2905SBarry Smith SNESRegisterAllCalled = 0; 18273a40ed3dSBarry Smith PetscFunctionReturn(0); 18289b94acceSBarry Smith } 18299b94acceSBarry Smith 18305615d1e5SSatish Balay #undef __FUNC__ 1831d4bb536fSBarry Smith #define __FUNC__ "SNESGetType" 18329b94acceSBarry Smith /*@C 18339a28b0a6SLois Curfman McInnes SNESGetType - Gets the SNES method type and name (as a string). 18349b94acceSBarry Smith 1835c7afd0dbSLois Curfman McInnes Not Collective 1836c7afd0dbSLois Curfman McInnes 18379b94acceSBarry Smith Input Parameter: 18384b0e389bSBarry Smith . snes - nonlinear solver context 18399b94acceSBarry Smith 18409b94acceSBarry Smith Output Parameter: 184182bf6240SBarry Smith . method - SNES method (a charactor string) 18429b94acceSBarry Smith 18439b94acceSBarry Smith .keywords: SNES, nonlinear, get, method, name 18449b94acceSBarry Smith @*/ 184582bf6240SBarry Smith int SNESGetType(SNES snes, SNESType *method) 18469b94acceSBarry Smith { 18473a40ed3dSBarry Smith PetscFunctionBegin; 184882bf6240SBarry Smith *method = snes->type_name; 18493a40ed3dSBarry Smith PetscFunctionReturn(0); 18509b94acceSBarry Smith } 18519b94acceSBarry Smith 18525615d1e5SSatish Balay #undef __FUNC__ 1853d4bb536fSBarry Smith #define __FUNC__ "SNESGetSolution" 18549b94acceSBarry Smith /*@C 18559b94acceSBarry Smith SNESGetSolution - Returns the vector where the approximate solution is 18569b94acceSBarry Smith stored. 18579b94acceSBarry Smith 1858c7afd0dbSLois Curfman McInnes Not Collective, but Vec is parallel if SNES is parallel 1859c7afd0dbSLois Curfman McInnes 18609b94acceSBarry Smith Input Parameter: 18619b94acceSBarry Smith . snes - the SNES context 18629b94acceSBarry Smith 18639b94acceSBarry Smith Output Parameter: 18649b94acceSBarry Smith . x - the solution 18659b94acceSBarry Smith 18669b94acceSBarry Smith .keywords: SNES, nonlinear, get, solution 18679b94acceSBarry Smith 1868a86d99e1SLois Curfman McInnes .seealso: SNESGetFunction(), SNESGetGradient(), SNESGetSolutionUpdate() 18699b94acceSBarry Smith @*/ 18709b94acceSBarry Smith int SNESGetSolution(SNES snes,Vec *x) 18719b94acceSBarry Smith { 18723a40ed3dSBarry Smith PetscFunctionBegin; 187377c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 18749b94acceSBarry Smith *x = snes->vec_sol_always; 18753a40ed3dSBarry Smith PetscFunctionReturn(0); 18769b94acceSBarry Smith } 18779b94acceSBarry Smith 18785615d1e5SSatish Balay #undef __FUNC__ 1879d4bb536fSBarry Smith #define __FUNC__ "SNESGetSolutionUpdate" 18809b94acceSBarry Smith /*@C 18819b94acceSBarry Smith SNESGetSolutionUpdate - Returns the vector where the solution update is 18829b94acceSBarry Smith stored. 18839b94acceSBarry Smith 1884c7afd0dbSLois Curfman McInnes Not Collective, but Vec is parallel if SNES is parallel 1885c7afd0dbSLois Curfman McInnes 18869b94acceSBarry Smith Input Parameter: 18879b94acceSBarry Smith . snes - the SNES context 18889b94acceSBarry Smith 18899b94acceSBarry Smith Output Parameter: 18909b94acceSBarry Smith . x - the solution update 18919b94acceSBarry Smith 18929b94acceSBarry Smith .keywords: SNES, nonlinear, get, solution, update 18939b94acceSBarry Smith 18949b94acceSBarry Smith .seealso: SNESGetSolution(), SNESGetFunction 18959b94acceSBarry Smith @*/ 18969b94acceSBarry Smith int SNESGetSolutionUpdate(SNES snes,Vec *x) 18979b94acceSBarry Smith { 18983a40ed3dSBarry Smith PetscFunctionBegin; 189977c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 19009b94acceSBarry Smith *x = snes->vec_sol_update_always; 19013a40ed3dSBarry Smith PetscFunctionReturn(0); 19029b94acceSBarry Smith } 19039b94acceSBarry Smith 19045615d1e5SSatish Balay #undef __FUNC__ 1905d4bb536fSBarry Smith #define __FUNC__ "SNESGetFunction" 19069b94acceSBarry Smith /*@C 19073638b69dSLois Curfman McInnes SNESGetFunction - Returns the vector where the function is stored. 19089b94acceSBarry Smith 1909c7afd0dbSLois Curfman McInnes Not Collective, but Vec is parallel if SNES is parallel 1910c7afd0dbSLois Curfman McInnes 19119b94acceSBarry Smith Input Parameter: 19129b94acceSBarry Smith . snes - the SNES context 19139b94acceSBarry Smith 19149b94acceSBarry Smith Output Parameter: 19153638b69dSLois Curfman McInnes . r - the function 19169b94acceSBarry Smith 19179b94acceSBarry Smith Notes: 19189b94acceSBarry Smith SNESGetFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only 19199b94acceSBarry Smith Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are 19209b94acceSBarry Smith SNESGetMinimizationFunction() and SNESGetGradient(); 19219b94acceSBarry Smith 1922a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, get, function 19239b94acceSBarry Smith 192431615d04SLois Curfman McInnes .seealso: SNESSetFunction(), SNESGetSolution(), SNESGetMinimizationFunction(), 192531615d04SLois Curfman McInnes SNESGetGradient() 19269b94acceSBarry Smith @*/ 19279b94acceSBarry Smith int SNESGetFunction(SNES snes,Vec *r) 19289b94acceSBarry Smith { 19293a40ed3dSBarry Smith PetscFunctionBegin; 193077c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1931a8c6a408SBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 1932a8c6a408SBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_NONLINEAR_EQUATIONS only"); 1933a8c6a408SBarry Smith } 19349b94acceSBarry Smith *r = snes->vec_func_always; 19353a40ed3dSBarry Smith PetscFunctionReturn(0); 19369b94acceSBarry Smith } 19379b94acceSBarry Smith 19385615d1e5SSatish Balay #undef __FUNC__ 1939d4bb536fSBarry Smith #define __FUNC__ "SNESGetGradient" 19409b94acceSBarry Smith /*@C 19413638b69dSLois Curfman McInnes SNESGetGradient - Returns the vector where the gradient is stored. 19429b94acceSBarry Smith 1943c7afd0dbSLois Curfman McInnes Not Collective, but Vec is parallel if SNES is parallel 1944c7afd0dbSLois Curfman McInnes 19459b94acceSBarry Smith Input Parameter: 19469b94acceSBarry Smith . snes - the SNES context 19479b94acceSBarry Smith 19489b94acceSBarry Smith Output Parameter: 19499b94acceSBarry Smith . r - the gradient 19509b94acceSBarry Smith 19519b94acceSBarry Smith Notes: 19529b94acceSBarry Smith SNESGetGradient() is valid for SNES_UNCONSTRAINED_MINIMIZATION methods 19539b94acceSBarry Smith only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is 19549b94acceSBarry Smith SNESGetFunction(). 19559b94acceSBarry Smith 19569b94acceSBarry Smith .keywords: SNES, nonlinear, get, gradient 19579b94acceSBarry Smith 195831615d04SLois Curfman McInnes .seealso: SNESGetMinimizationFunction(), SNESGetSolution(), SNESGetFunction() 19599b94acceSBarry Smith @*/ 19609b94acceSBarry Smith int SNESGetGradient(SNES snes,Vec *r) 19619b94acceSBarry Smith { 19623a40ed3dSBarry Smith PetscFunctionBegin; 196377c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 19643a40ed3dSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 1965a8c6a408SBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 19663a40ed3dSBarry Smith } 19679b94acceSBarry Smith *r = snes->vec_func_always; 19683a40ed3dSBarry Smith PetscFunctionReturn(0); 19699b94acceSBarry Smith } 19709b94acceSBarry Smith 19715615d1e5SSatish Balay #undef __FUNC__ 1972d4bb536fSBarry Smith #define __FUNC__ "SNESGetMinimizationFunction" 19739b94acceSBarry Smith /*@ 19749b94acceSBarry Smith SNESGetMinimizationFunction - Returns the scalar function value for 19759b94acceSBarry Smith unconstrained minimization problems. 19769b94acceSBarry Smith 1977c7afd0dbSLois Curfman McInnes Not Collective 1978c7afd0dbSLois Curfman McInnes 19799b94acceSBarry Smith Input Parameter: 19809b94acceSBarry Smith . snes - the SNES context 19819b94acceSBarry Smith 19829b94acceSBarry Smith Output Parameter: 19839b94acceSBarry Smith . r - the function 19849b94acceSBarry Smith 19859b94acceSBarry Smith Notes: 19869b94acceSBarry Smith SNESGetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION 19879b94acceSBarry Smith methods only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is 19889b94acceSBarry Smith SNESGetFunction(). 19899b94acceSBarry Smith 19909b94acceSBarry Smith .keywords: SNES, nonlinear, get, function 19919b94acceSBarry Smith 199231615d04SLois Curfman McInnes .seealso: SNESGetGradient(), SNESGetSolution(), SNESGetFunction() 19939b94acceSBarry Smith @*/ 19949b94acceSBarry Smith int SNESGetMinimizationFunction(SNES snes,double *r) 19959b94acceSBarry Smith { 19963a40ed3dSBarry Smith PetscFunctionBegin; 199777c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 199874679c65SBarry Smith PetscValidScalarPointer(r); 19993a40ed3dSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 2000a8c6a408SBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,0,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 20013a40ed3dSBarry Smith } 20029b94acceSBarry Smith *r = snes->fc; 20033a40ed3dSBarry Smith PetscFunctionReturn(0); 20049b94acceSBarry Smith } 20059b94acceSBarry Smith 20065615d1e5SSatish Balay #undef __FUNC__ 2007d4bb536fSBarry Smith #define __FUNC__ "SNESSetOptionsPrefix" 20083c7409f5SSatish Balay /*@C 20093c7409f5SSatish Balay SNESSetOptionsPrefix - Sets the prefix used for searching for all 2010d850072dSLois Curfman McInnes SNES options in the database. 20113c7409f5SSatish Balay 2012fee21e36SBarry Smith Collective on SNES 2013fee21e36SBarry Smith 2014c7afd0dbSLois Curfman McInnes Input Parameter: 2015c7afd0dbSLois Curfman McInnes + snes - the SNES context 2016c7afd0dbSLois Curfman McInnes - prefix - the prefix to prepend to all option names 2017c7afd0dbSLois Curfman McInnes 2018d850072dSLois Curfman McInnes Notes: 2019a83b1b31SSatish Balay A hyphen (-) must NOT be given at the beginning of the prefix name. 2020c7afd0dbSLois Curfman McInnes The first character of all runtime options is AUTOMATICALLY the hyphen. 2021d850072dSLois Curfman McInnes 20223c7409f5SSatish Balay .keywords: SNES, set, options, prefix, database 2023a86d99e1SLois Curfman McInnes 2024a86d99e1SLois Curfman McInnes .seealso: SNESSetFromOptions() 20253c7409f5SSatish Balay @*/ 20263c7409f5SSatish Balay int SNESSetOptionsPrefix(SNES snes,char *prefix) 20273c7409f5SSatish Balay { 20283c7409f5SSatish Balay int ierr; 20293c7409f5SSatish Balay 20303a40ed3dSBarry Smith PetscFunctionBegin; 203177c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2032639f9d9dSBarry Smith ierr = PetscObjectSetOptionsPrefix((PetscObject)snes, prefix); CHKERRQ(ierr); 20333c7409f5SSatish Balay ierr = SLESSetOptionsPrefix(snes->sles,prefix);CHKERRQ(ierr); 20343a40ed3dSBarry Smith PetscFunctionReturn(0); 20353c7409f5SSatish Balay } 20363c7409f5SSatish Balay 20375615d1e5SSatish Balay #undef __FUNC__ 2038d4bb536fSBarry Smith #define __FUNC__ "SNESAppendOptionsPrefix" 20393c7409f5SSatish Balay /*@C 2040f525115eSLois Curfman McInnes SNESAppendOptionsPrefix - Appends to the prefix used for searching for all 2041d850072dSLois Curfman McInnes SNES options in the database. 20423c7409f5SSatish Balay 2043fee21e36SBarry Smith Collective on SNES 2044fee21e36SBarry Smith 2045c7afd0dbSLois Curfman McInnes Input Parameters: 2046c7afd0dbSLois Curfman McInnes + snes - the SNES context 2047c7afd0dbSLois Curfman McInnes - prefix - the prefix to prepend to all option names 2048c7afd0dbSLois Curfman McInnes 2049d850072dSLois Curfman McInnes Notes: 2050a83b1b31SSatish Balay A hyphen (-) must NOT be given at the beginning of the prefix name. 2051c7afd0dbSLois Curfman McInnes The first character of all runtime options is AUTOMATICALLY the hyphen. 2052d850072dSLois Curfman McInnes 20533c7409f5SSatish Balay .keywords: SNES, append, options, prefix, database 2054a86d99e1SLois Curfman McInnes 2055a86d99e1SLois Curfman McInnes .seealso: SNESGetOptionsPrefix() 20563c7409f5SSatish Balay @*/ 20573c7409f5SSatish Balay int SNESAppendOptionsPrefix(SNES snes,char *prefix) 20583c7409f5SSatish Balay { 20593c7409f5SSatish Balay int ierr; 20603c7409f5SSatish Balay 20613a40ed3dSBarry Smith PetscFunctionBegin; 206277c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2063639f9d9dSBarry Smith ierr = PetscObjectAppendOptionsPrefix((PetscObject)snes, prefix); CHKERRQ(ierr); 20643c7409f5SSatish Balay ierr = SLESAppendOptionsPrefix(snes->sles,prefix);CHKERRQ(ierr); 20653a40ed3dSBarry Smith PetscFunctionReturn(0); 20663c7409f5SSatish Balay } 20673c7409f5SSatish Balay 20685615d1e5SSatish Balay #undef __FUNC__ 2069d4bb536fSBarry Smith #define __FUNC__ "SNESGetOptionsPrefix" 2070c83590e2SSatish Balay /*@ 20713c7409f5SSatish Balay SNESGetOptionsPrefix - Sets the prefix used for searching for all 20723c7409f5SSatish Balay SNES options in the database. 20733c7409f5SSatish Balay 2074c7afd0dbSLois Curfman McInnes Not Collective 2075c7afd0dbSLois Curfman McInnes 20763c7409f5SSatish Balay Input Parameter: 20773c7409f5SSatish Balay . snes - the SNES context 20783c7409f5SSatish Balay 20793c7409f5SSatish Balay Output Parameter: 20803c7409f5SSatish Balay . prefix - pointer to the prefix string used 20813c7409f5SSatish Balay 20823c7409f5SSatish Balay .keywords: SNES, get, options, prefix, database 2083a86d99e1SLois Curfman McInnes 2084a86d99e1SLois Curfman McInnes .seealso: SNESAppendOptionsPrefix() 20853c7409f5SSatish Balay @*/ 20863c7409f5SSatish Balay int SNESGetOptionsPrefix(SNES snes,char **prefix) 20873c7409f5SSatish Balay { 20883c7409f5SSatish Balay int ierr; 20893c7409f5SSatish Balay 20903a40ed3dSBarry Smith PetscFunctionBegin; 209177c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2092639f9d9dSBarry Smith ierr = PetscObjectGetOptionsPrefix((PetscObject)snes, prefix); CHKERRQ(ierr); 20933a40ed3dSBarry Smith PetscFunctionReturn(0); 20943c7409f5SSatish Balay } 20953c7409f5SSatish Balay 2096ca161407SBarry Smith #undef __FUNC__ 2097ca161407SBarry Smith #define __FUNC__ "SNESPrintHelp" 2098ca161407SBarry Smith /*@ 2099ca161407SBarry Smith SNESPrintHelp - Prints all options for the SNES component. 2100ca161407SBarry Smith 2101c7afd0dbSLois Curfman McInnes Collective on SNES 2102c7afd0dbSLois Curfman McInnes 2103ca161407SBarry Smith Input Parameter: 2104ca161407SBarry Smith . snes - the SNES context 2105ca161407SBarry Smith 2106ca161407SBarry Smith Options Database Keys: 2107c7afd0dbSLois Curfman McInnes + -help - Prints SNES options 2108c7afd0dbSLois Curfman McInnes - -h - Prints SNES options 2109ca161407SBarry Smith 2110ca161407SBarry Smith .keywords: SNES, nonlinear, help 2111ca161407SBarry Smith 2112ca161407SBarry Smith .seealso: SNESSetFromOptions() 2113ca161407SBarry Smith @*/ 2114ca161407SBarry Smith int SNESPrintHelp(SNES snes) 2115ca161407SBarry Smith { 2116ca161407SBarry Smith char p[64]; 2117ca161407SBarry Smith SNES_KSP_EW_ConvCtx *kctx; 2118ca161407SBarry Smith int ierr; 2119ca161407SBarry Smith 2120ca161407SBarry Smith PetscFunctionBegin; 2121ca161407SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2122ca161407SBarry Smith 2123ca161407SBarry Smith PetscStrcpy(p,"-"); 2124ca161407SBarry Smith if (snes->prefix) PetscStrcat(p, snes->prefix); 2125ca161407SBarry Smith 2126ca161407SBarry Smith kctx = (SNES_KSP_EW_ConvCtx *)snes->kspconvctx; 2127ca161407SBarry Smith 212876be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm,"SNES options ------------------------------------------------\n"); 2129488ecbafSBarry Smith ierr = FListPrintTypes(snes->comm,stdout,snes->prefix,"snes_type",SNESList);CHKERRQ(ierr); 213076be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm," %ssnes_view: view SNES info after each nonlinear solve\n",p); 213176be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm," %ssnes_max_it <its>: max iterations (default %d)\n",p,snes->max_its); 213276be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm," %ssnes_max_funcs <maxf>: max function evals (default %d)\n",p,snes->max_funcs); 213376be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm," %ssnes_stol <stol>: successive step tolerance (default %g)\n",p,snes->xtol); 213476be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm," %ssnes_atol <atol>: absolute tolerance (default %g)\n",p,snes->atol); 213576be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm," %ssnes_rtol <rtol>: relative tolerance (default %g)\n",p,snes->rtol); 213676be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm," %ssnes_trtol <trtol>: trust region parameter tolerance (default %g)\n",p,snes->deltatol); 213776be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm," SNES Monitoring Options: Choose any of the following\n"); 213876be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm," %ssnes_cancelmonitors: cancels all monitors hardwired in code\n",p); 213976be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm," %ssnes_monitor: use default SNES convergence monitor, prints\n\ 2140ca161407SBarry Smith residual norm at each iteration.\n",p); 214176be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm," %ssnes_smonitor: same as the above, but prints fewer digits of the\n\ 2142ca161407SBarry Smith residual norm for small residual norms. This is useful to conceal\n\ 2143ca161407SBarry Smith meaningless digits that may be different on different machines.\n",p); 214476be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm," %ssnes_xmonitor [x,y,w,h]: use X graphics convergence monitor\n",p); 2145ca161407SBarry Smith if (snes->type == SNES_NONLINEAR_EQUATIONS) { 214676be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm, 2147ca161407SBarry Smith " Options for solving systems of nonlinear equations only:\n"); 214876be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm," %ssnes_fd: use finite differences for Jacobian\n",p); 214976be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm," %ssnes_mf: use matrix-free Jacobian\n",p); 215076be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm," %ssnes_mf_operator:use matrix-free Jacobian and user-provided preconditioning matrix\n",p); 2151e24b481bSBarry Smith (*PetscHelpPrintf)(snes->comm," %ssnes_mf_ksp_monitor - if using matrix-free multiply then prints h at each KSP iteration\n",p); 215276be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm," %ssnes_no_convergence_test: Do not test for convergence, always run to SNES max its\n",p); 215376be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm," %ssnes_ksp_ew_conv: use Eisenstat-Walker computation of KSP rtol. Params are:\n",p); 215476be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm, 2155ca161407SBarry Smith " %ssnes_ksp_ew_version <version> (1 or 2, default is %d)\n",p,kctx->version); 215676be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm, 2157ca161407SBarry Smith " %ssnes_ksp_ew_rtol0 <rtol0> (0 <= rtol0 < 1, default %g)\n",p,kctx->rtol_0); 215876be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm, 2159ca161407SBarry Smith " %ssnes_ksp_ew_rtolmax <rtolmax> (0 <= rtolmax < 1, default %g)\n",p,kctx->rtol_max); 216076be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm, 2161ca161407SBarry Smith " %ssnes_ksp_ew_gamma <gamma> (0 <= gamma <= 1, default %g)\n",p,kctx->gamma); 216276be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm, 2163ca161407SBarry Smith " %ssnes_ksp_ew_alpha <alpha> (1 < alpha <= 2, default %g)\n",p,kctx->alpha); 216476be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm, 2165ca161407SBarry Smith " %ssnes_ksp_ew_alpha2 <alpha2> (default %g)\n",p,kctx->alpha2); 216676be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm, 2167ca161407SBarry Smith " %ssnes_ksp_ew_threshold <threshold> (0 < threshold < 1, default %g)\n",p,kctx->threshold); 2168ca161407SBarry Smith } else if (snes->type == SNES_UNCONSTRAINED_MINIMIZATION) { 216976be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm, 2170ca161407SBarry Smith " Options for solving unconstrained minimization problems only:\n"); 217176be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm," %ssnes_fmin <ftol>: minimum function tolerance (default %g)\n",p,snes->fmin); 217276be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm," %ssnes_fd: use finite differences for Hessian\n",p); 217376be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm," %ssnes_mf: use matrix-free Hessian\n",p); 2174ca161407SBarry Smith } 217576be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm," Run program with -help %ssnes_type <method> for help on ",p); 217676be9ce4SBarry Smith (*PetscHelpPrintf)(snes->comm,"a particular method\n"); 2177ca161407SBarry Smith if (snes->printhelp) { 2178ca161407SBarry Smith ierr = (*snes->printhelp)(snes,p);CHKERRQ(ierr); 2179ca161407SBarry Smith } 2180ca161407SBarry Smith PetscFunctionReturn(0); 2181ca161407SBarry Smith } 21823c7409f5SSatish Balay 2183acb85ae6SSatish Balay /*MC 2184b2002411SLois Curfman McInnes SNESRegister - Adds a method to the nonlinear solver package. 21859b94acceSBarry Smith 2186b2002411SLois Curfman McInnes Synopsis: 2187b2002411SLois Curfman McInnes SNESRegister(char *name_solver,char *path,char *name_create,int (*routine_create)(SNES)) 21889b94acceSBarry Smith 21898d76a1e5SLois Curfman McInnes Not collective 21908d76a1e5SLois Curfman McInnes 2191b2002411SLois Curfman McInnes Input Parameters: 2192c7afd0dbSLois Curfman McInnes + name_solver - name of a new user-defined solver 2193b2002411SLois Curfman McInnes . path - path (either absolute or relative) the library containing this solver 2194b2002411SLois Curfman McInnes . name_create - name of routine to create method context 2195c7afd0dbSLois Curfman McInnes - routine_create - routine to create method context 21969b94acceSBarry Smith 2197b2002411SLois Curfman McInnes Notes: 2198b2002411SLois Curfman McInnes SNESRegister() may be called multiple times to add several user-defined solvers. 21993a40ed3dSBarry Smith 2200b2002411SLois Curfman McInnes If dynamic libraries are used, then the fourth input argument (routine_create) 2201b2002411SLois Curfman McInnes is ignored. 2202b2002411SLois Curfman McInnes 2203b2002411SLois Curfman McInnes Sample usage: 220469225d78SLois Curfman McInnes .vb 2205b2002411SLois Curfman McInnes SNESRegister("my_solver",/home/username/my_lib/lib/libg/solaris/mylib.a, 2206b2002411SLois Curfman McInnes "MySolverCreate",MySolverCreate); 220769225d78SLois Curfman McInnes .ve 2208b2002411SLois Curfman McInnes 2209b2002411SLois Curfman McInnes Then, your solver can be chosen with the procedural interface via 2210b2002411SLois Curfman McInnes $ SNESSetType(snes,"my_solver") 2211b2002411SLois Curfman McInnes or at runtime via the option 2212b2002411SLois Curfman McInnes $ -snes_type my_solver 2213b2002411SLois Curfman McInnes 2214b2002411SLois Curfman McInnes .keywords: SNES, nonlinear, register 2215b2002411SLois Curfman McInnes 2216b2002411SLois Curfman McInnes .seealso: SNESRegisterAll(), SNESRegisterDestroy() 2217b2002411SLois Curfman McInnes M*/ 2218b2002411SLois Curfman McInnes 2219b2002411SLois Curfman McInnes #undef __FUNC__ 2220b2002411SLois Curfman McInnes #define __FUNC__ "SNESRegister_Private" 2221b2002411SLois Curfman McInnes int SNESRegister_Private(char *sname,char *path,char *name,int (*function)(SNES)) 2222b2002411SLois Curfman McInnes { 2223b2002411SLois Curfman McInnes char fullname[256]; 2224b2002411SLois Curfman McInnes int ierr; 2225b2002411SLois Curfman McInnes 2226b2002411SLois Curfman McInnes PetscFunctionBegin; 2227b2002411SLois Curfman McInnes PetscStrcpy(fullname,path); PetscStrcat(fullname,":");PetscStrcat(fullname,name); 2228488ecbafSBarry Smith ierr = FListAdd_Private(&SNESList,sname,fullname, (int (*)(void*))function);CHKERRQ(ierr); 2229b2002411SLois Curfman McInnes PetscFunctionReturn(0); 2230b2002411SLois Curfman McInnes } 2231