163dd3a1aSKris Buschelman #define PETSCSNES_DLL 29b94acceSBarry Smith 3b9147fbbSdalcinl #include "include/private/snesimpl.h" /*I "petscsnes.h" I*/ 49b94acceSBarry Smith 54c49b128SBarry Smith PetscTruth SNESRegisterAllCalled = PETSC_FALSE; 68ba1e511SMatthew Knepley PetscFList SNESList = PETSC_NULL; 78ba1e511SMatthew Knepley 88ba1e511SMatthew Knepley /* Logging support */ 963dd3a1aSKris Buschelman PetscCookie PETSCSNES_DLLEXPORT SNES_COOKIE = 0; 106849ba73SBarry Smith PetscEvent SNES_Solve = 0, SNES_LineSearch = 0, SNES_FunctionEval = 0, SNES_JacobianEval = 0; 11a09944afSBarry Smith 12a09944afSBarry Smith #undef __FUNCT__ 134a2ae208SSatish Balay #define __FUNCT__ "SNESView" 147e2c5f70SBarry Smith /*@C 159b94acceSBarry Smith SNESView - Prints the SNES data structure. 169b94acceSBarry Smith 174c49b128SBarry Smith Collective on SNES 18fee21e36SBarry Smith 19c7afd0dbSLois Curfman McInnes Input Parameters: 20c7afd0dbSLois Curfman McInnes + SNES - the SNES context 21c7afd0dbSLois Curfman McInnes - viewer - visualization context 22c7afd0dbSLois Curfman McInnes 239b94acceSBarry Smith Options Database Key: 24c8a8ba5cSLois Curfman McInnes . -snes_view - Calls SNESView() at end of SNESSolve() 259b94acceSBarry Smith 269b94acceSBarry Smith Notes: 279b94acceSBarry Smith The available visualization contexts include 28b0a32e0cSBarry Smith + PETSC_VIEWER_STDOUT_SELF - standard output (default) 29b0a32e0cSBarry Smith - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 30c8a8ba5cSLois Curfman McInnes output where only the first processor opens 31c8a8ba5cSLois Curfman McInnes the file. All other processors send their 32c8a8ba5cSLois Curfman McInnes data to the first processor to print. 339b94acceSBarry Smith 343e081fefSLois Curfman McInnes The user can open an alternative visualization context with 35b0a32e0cSBarry Smith PetscViewerASCIIOpen() - output to a specified file. 369b94acceSBarry Smith 3736851e7fSLois Curfman McInnes Level: beginner 3836851e7fSLois Curfman McInnes 399b94acceSBarry Smith .keywords: SNES, view 409b94acceSBarry Smith 41b0a32e0cSBarry Smith .seealso: PetscViewerASCIIOpen() 429b94acceSBarry Smith @*/ 4363dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESView(SNES snes,PetscViewer viewer) 449b94acceSBarry Smith { 45fa9f3622SBarry Smith SNESKSPEW *kctx; 46dfbe8321SBarry Smith PetscErrorCode ierr; 4794b7f48cSBarry Smith KSP ksp; 48e060cb09SBarry Smith SNESType type; 4932077d6dSBarry Smith PetscTruth iascii,isstring; 509b94acceSBarry Smith 513a40ed3dSBarry Smith PetscFunctionBegin; 524482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 533050cee2SBarry Smith if (!viewer) { 543050cee2SBarry Smith ierr = PetscViewerASCIIGetStdout(snes->comm,&viewer);CHKERRQ(ierr); 553050cee2SBarry Smith } 564482741eSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_COOKIE,2); 57c9780b6fSBarry Smith PetscCheckSameComm(snes,1,viewer,2); 5874679c65SBarry Smith 5932077d6dSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); 60b0a32e0cSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_STRING,&isstring);CHKERRQ(ierr); 6132077d6dSBarry Smith if (iascii) { 623a7fca6bSBarry Smith if (snes->prefix) { 633a7fca6bSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"SNES Object:(%s)\n",snes->prefix);CHKERRQ(ierr); 643a7fca6bSBarry Smith } else { 65b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"SNES Object:\n");CHKERRQ(ierr); 663a7fca6bSBarry Smith } 67454a90a3SBarry Smith ierr = SNESGetType(snes,&type);CHKERRQ(ierr); 68454a90a3SBarry Smith if (type) { 69b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," type: %s\n",type);CHKERRQ(ierr); 70184914b5SBarry Smith } else { 71b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," type: not set yet\n");CHKERRQ(ierr); 72184914b5SBarry Smith } 73e7788613SBarry Smith if (snes->ops->view) { 74b0a32e0cSBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 75e7788613SBarry Smith ierr = (*snes->ops->view)(snes,viewer);CHKERRQ(ierr); 76b0a32e0cSBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 770ef38995SBarry Smith } 7877431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," maximum iterations=%D, maximum function evaluations=%D\n",snes->max_its,snes->max_funcs);CHKERRQ(ierr); 79a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," tolerances: relative=%G, absolute=%G, solution=%G\n", 8070441072SBarry Smith snes->rtol,snes->abstol,snes->xtol);CHKERRQ(ierr); 8177431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," total number of linear solver iterations=%D\n",snes->linear_its);CHKERRQ(ierr); 8277431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," total number of function evaluations=%D\n",snes->nfuncs);CHKERRQ(ierr); 839b94acceSBarry Smith if (snes->ksp_ewconv) { 84fa9f3622SBarry Smith kctx = (SNESKSPEW *)snes->kspconvctx; 859b94acceSBarry Smith if (kctx) { 8677431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Eisenstat-Walker computation of KSP relative tolerance (version %D)\n",kctx->version);CHKERRQ(ierr); 87a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," rtol_0=%G, rtol_max=%G, threshold=%G\n",kctx->rtol_0,kctx->rtol_max,kctx->threshold);CHKERRQ(ierr); 88a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," gamma=%G, alpha=%G, alpha2=%G\n",kctx->gamma,kctx->alpha,kctx->alpha2);CHKERRQ(ierr); 899b94acceSBarry Smith } 909b94acceSBarry Smith } 910f5bd95cSBarry Smith } else if (isstring) { 92454a90a3SBarry Smith ierr = SNESGetType(snes,&type);CHKERRQ(ierr); 93b0a32e0cSBarry Smith ierr = PetscViewerStringSPrintf(viewer," %-3.3s",type);CHKERRQ(ierr); 9419bcc07fSBarry Smith } 9594b7f48cSBarry Smith ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr); 96b0a32e0cSBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 9794b7f48cSBarry Smith ierr = KSPView(ksp,viewer);CHKERRQ(ierr); 98b0a32e0cSBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 993a40ed3dSBarry Smith PetscFunctionReturn(0); 1009b94acceSBarry Smith } 1019b94acceSBarry Smith 10276b2cf59SMatthew Knepley /* 10376b2cf59SMatthew Knepley We retain a list of functions that also take SNES command 10476b2cf59SMatthew Knepley line options. These are called at the end SNESSetFromOptions() 10576b2cf59SMatthew Knepley */ 10676b2cf59SMatthew Knepley #define MAXSETFROMOPTIONS 5 107a7cc72afSBarry Smith static PetscInt numberofsetfromoptions; 1086849ba73SBarry Smith static PetscErrorCode (*othersetfromoptions[MAXSETFROMOPTIONS])(SNES); 10976b2cf59SMatthew Knepley 110e74ef692SMatthew Knepley #undef __FUNCT__ 111e74ef692SMatthew Knepley #define __FUNCT__ "SNESAddOptionsChecker" 112ac226902SBarry Smith /*@C 11376b2cf59SMatthew Knepley SNESAddOptionsChecker - Adds an additional function to check for SNES options. 11476b2cf59SMatthew Knepley 11576b2cf59SMatthew Knepley Not Collective 11676b2cf59SMatthew Knepley 11776b2cf59SMatthew Knepley Input Parameter: 11876b2cf59SMatthew Knepley . snescheck - function that checks for options 11976b2cf59SMatthew Knepley 12076b2cf59SMatthew Knepley Level: developer 12176b2cf59SMatthew Knepley 12276b2cf59SMatthew Knepley .seealso: SNESSetFromOptions() 12376b2cf59SMatthew Knepley @*/ 12463dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESAddOptionsChecker(PetscErrorCode (*snescheck)(SNES)) 12576b2cf59SMatthew Knepley { 12676b2cf59SMatthew Knepley PetscFunctionBegin; 12776b2cf59SMatthew Knepley if (numberofsetfromoptions >= MAXSETFROMOPTIONS) { 12877431f27SBarry Smith SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE, "Too many options checkers, only %D allowed", MAXSETFROMOPTIONS); 12976b2cf59SMatthew Knepley } 13076b2cf59SMatthew Knepley othersetfromoptions[numberofsetfromoptions++] = snescheck; 13176b2cf59SMatthew Knepley PetscFunctionReturn(0); 13276b2cf59SMatthew Knepley } 13376b2cf59SMatthew Knepley 1344a2ae208SSatish Balay #undef __FUNCT__ 1354a2ae208SSatish Balay #define __FUNCT__ "SNESSetFromOptions" 1369b94acceSBarry Smith /*@ 13794b7f48cSBarry Smith SNESSetFromOptions - Sets various SNES and KSP parameters from user options. 1389b94acceSBarry Smith 139c7afd0dbSLois Curfman McInnes Collective on SNES 140c7afd0dbSLois Curfman McInnes 1419b94acceSBarry Smith Input Parameter: 1429b94acceSBarry Smith . snes - the SNES context 1439b94acceSBarry Smith 14436851e7fSLois Curfman McInnes Options Database Keys: 1456831982aSBarry Smith + -snes_type <type> - ls, tr, umls, umtr, test 14682738288SBarry Smith . -snes_stol - convergence tolerance in terms of the norm 14782738288SBarry Smith of the change in the solution between steps 14870441072SBarry Smith . -snes_atol <abstol> - absolute tolerance of residual norm 149b39c3a46SLois Curfman McInnes . -snes_rtol <rtol> - relative decrease in tolerance norm from initial 150b39c3a46SLois Curfman McInnes . -snes_max_it <max_it> - maximum number of iterations 151b39c3a46SLois Curfman McInnes . -snes_max_funcs <max_funcs> - maximum number of function evaluations 15250ffb88aSMatthew Knepley . -snes_max_fail <max_fail> - maximum number of failures 153b39c3a46SLois Curfman McInnes . -snes_trtol <trtol> - trust region tolerance 1542492ecdbSBarry Smith . -snes_no_convergence_test - skip convergence test in nonlinear 15582738288SBarry Smith solver; hence iterations will continue until max_it 1561fbbfb26SLois Curfman McInnes or some other criterion is reached. Saves expense 15782738288SBarry Smith of convergence test 158e8105e01SRichard Katz . -snes_monitor <optional filename> - prints residual norm at each iteration. if no 159e8105e01SRichard Katz filename given prints to stdout 160a6570f20SBarry Smith . -snes_monitor_solution - plots solution at each iteration 161a6570f20SBarry Smith . -snes_monitor_residual - plots residual (not its norm) at each iteration 162a6570f20SBarry Smith . -snes_monitor_solution_update - plots update to solution at each iteration 163a6570f20SBarry Smith . -snes_monitor_draw - plots residual norm at each iteration 164e24b481bSBarry Smith . -snes_fd - use finite differences to compute Jacobian; very slow, only for testing 1655968eb51SBarry Smith . -snes_mf_ksp_monitor - if using matrix-free multiply then print h at each KSP iteration 166fee2055bSBarry Smith - -snes_converged_reason - print the reason for convergence/divergence after each solve 16782738288SBarry Smith 16882738288SBarry Smith Options Database for Eisenstat-Walker method: 169fa9f3622SBarry Smith + -snes_ksp_ew - use Eisenstat-Walker method for determining linear system convergence 1704b27c08aSLois Curfman McInnes . -snes_ksp_ew_version ver - version of Eisenstat-Walker method 17136851e7fSLois Curfman McInnes . -snes_ksp_ew_rtol0 <rtol0> - Sets rtol0 17236851e7fSLois Curfman McInnes . -snes_ksp_ew_rtolmax <rtolmax> - Sets rtolmax 17336851e7fSLois Curfman McInnes . -snes_ksp_ew_gamma <gamma> - Sets gamma 17436851e7fSLois Curfman McInnes . -snes_ksp_ew_alpha <alpha> - Sets alpha 17536851e7fSLois Curfman McInnes . -snes_ksp_ew_alpha2 <alpha2> - Sets alpha2 17636851e7fSLois Curfman McInnes - -snes_ksp_ew_threshold <threshold> - Sets threshold 17782738288SBarry Smith 17811ca99fdSLois Curfman McInnes Notes: 17911ca99fdSLois Curfman McInnes To see all options, run your program with the -help option or consult 18011ca99fdSLois Curfman McInnes the users manual. 18183e2fdc7SBarry Smith 18236851e7fSLois Curfman McInnes Level: beginner 18336851e7fSLois Curfman McInnes 1849b94acceSBarry Smith .keywords: SNES, nonlinear, set, options, database 1859b94acceSBarry Smith 18669ed319cSSatish Balay .seealso: SNESSetOptionsPrefix() 1879b94acceSBarry Smith @*/ 18863dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESSetFromOptions(SNES snes) 1899b94acceSBarry Smith { 190f1af5d2fSBarry Smith PetscTruth flg; 19185385478SLisandro Dalcin PetscInt i,indx; 19285385478SLisandro Dalcin const char *deft = SNESLS; 19385385478SLisandro Dalcin const char *convtests[] = {"default","skip"}; 19485385478SLisandro Dalcin SNESKSPEW *kctx = NULL; 195e8105e01SRichard Katz char type[256], monfilename[PETSC_MAX_PATH_LEN]; 19623d894e5SBarry Smith PetscViewerASCIIMonitor monviewer; 19785385478SLisandro Dalcin PetscErrorCode ierr; 1989b94acceSBarry Smith 1993a40ed3dSBarry Smith PetscFunctionBegin; 2004482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 201ca161407SBarry Smith 202b0a32e0cSBarry Smith ierr = PetscOptionsBegin(snes->comm,snes->prefix,"Nonlinear solver (SNES) options","SNES");CHKERRQ(ierr); 203186905e3SBarry Smith if (!SNESRegisterAllCalled) {ierr = SNESRegisterAll(PETSC_NULL);CHKERRQ(ierr);} 20485385478SLisandro Dalcin if (snes->type_name) { deft = snes->type_name; } 205b0a32e0cSBarry Smith ierr = PetscOptionsList("-snes_type","Nonlinear solver method","SNESSetType",SNESList,deft,type,256,&flg);CHKERRQ(ierr); 206d64ed03dSBarry Smith if (flg) { 207186905e3SBarry Smith ierr = SNESSetType(snes,type);CHKERRQ(ierr); 208186905e3SBarry Smith } else if (!snes->type_name) { 209186905e3SBarry Smith ierr = SNESSetType(snes,deft);CHKERRQ(ierr); 210d64ed03dSBarry Smith } 211909c8a9fSBarry Smith ierr = PetscOptionsName("-snes_view","Print detailed information on solver used","SNESView",0);CHKERRQ(ierr); 21293c39befSBarry Smith 21387828ca2SBarry Smith ierr = PetscOptionsReal("-snes_stol","Stop if step length less then","SNESSetTolerances",snes->xtol,&snes->xtol,0);CHKERRQ(ierr); 21470441072SBarry Smith ierr = PetscOptionsReal("-snes_atol","Stop if function norm less then","SNESSetTolerances",snes->abstol,&snes->abstol,0);CHKERRQ(ierr); 215186905e3SBarry Smith 21687828ca2SBarry Smith ierr = PetscOptionsReal("-snes_rtol","Stop if decrease in function norm less then","SNESSetTolerances",snes->rtol,&snes->rtol,0);CHKERRQ(ierr); 217b0a32e0cSBarry Smith ierr = PetscOptionsInt("-snes_max_it","Maximum iterations","SNESSetTolerances",snes->max_its,&snes->max_its,PETSC_NULL);CHKERRQ(ierr); 218b0a32e0cSBarry Smith ierr = PetscOptionsInt("-snes_max_funcs","Maximum function evaluations","SNESSetTolerances",snes->max_funcs,&snes->max_funcs,PETSC_NULL);CHKERRQ(ierr); 21950ffb88aSMatthew Knepley ierr = PetscOptionsInt("-snes_max_fail","Maximum failures","SNESSetTolerances",snes->maxFailures,&snes->maxFailures,PETSC_NULL);CHKERRQ(ierr); 22085385478SLisandro Dalcin 22185385478SLisandro Dalcin ierr = PetscOptionsEList("-snes_convergence_test","Convergence test","SNESSetConvergenceTest",convtests,2,"default",&indx,&flg);CHKERRQ(ierr); 22285385478SLisandro Dalcin if (flg) { 22385385478SLisandro Dalcin switch (indx) { 22485385478SLisandro Dalcin case 0: ierr = SNESSetConvergenceTest(snes,SNESDefaultConverged,PETSC_NULL);CHKERRQ(ierr); break; 22585385478SLisandro Dalcin case 1: ierr = SNESSetConvergenceTest(snes,SNESSkipConverged,PETSC_NULL);CHKERRQ(ierr); break; 22685385478SLisandro Dalcin } 22785385478SLisandro Dalcin } 22885385478SLisandro Dalcin 2295968eb51SBarry Smith ierr = PetscOptionsName("-snes_converged_reason","Print reason for converged or diverged","SNESSolve",&flg);CHKERRQ(ierr); 2305968eb51SBarry Smith if (flg) { 2315968eb51SBarry Smith snes->printreason = PETSC_TRUE; 2325968eb51SBarry Smith } 233186905e3SBarry Smith 23485385478SLisandro Dalcin kctx = (SNESKSPEW *)snes->kspconvctx; 23585385478SLisandro Dalcin 236fa9f3622SBarry Smith ierr = PetscOptionsTruth("-snes_ksp_ew","Use Eisentat-Walker linear system convergence test","SNESKSPSetUseEW",snes->ksp_ewconv,&snes->ksp_ewconv,PETSC_NULL);CHKERRQ(ierr); 237186905e3SBarry Smith 238fa9f3622SBarry Smith ierr = PetscOptionsInt("-snes_ksp_ew_version","Version 1, 2 or 3","SNESKSPSetParametersEW",kctx->version,&kctx->version,0);CHKERRQ(ierr); 239fa9f3622SBarry Smith ierr = PetscOptionsReal("-snes_ksp_ew_rtol0","0 <= rtol0 < 1","SNESKSPSetParametersEW",kctx->rtol_0,&kctx->rtol_0,0);CHKERRQ(ierr); 240fa9f3622SBarry Smith ierr = PetscOptionsReal("-snes_ksp_ew_rtolmax","0 <= rtolmax < 1","SNESKSPSetParametersEW",kctx->rtol_max,&kctx->rtol_max,0);CHKERRQ(ierr); 241fa9f3622SBarry Smith ierr = PetscOptionsReal("-snes_ksp_ew_gamma","0 <= gamma <= 1","SNESKSPSetParametersEW",kctx->gamma,&kctx->gamma,0);CHKERRQ(ierr); 242fa9f3622SBarry Smith ierr = PetscOptionsReal("-snes_ksp_ew_alpha","1 < alpha <= 2","SNESKSPSetParametersEW",kctx->alpha,&kctx->alpha,0);CHKERRQ(ierr); 243fa9f3622SBarry Smith ierr = PetscOptionsReal("-snes_ksp_ew_alpha2","alpha2","SNESKSPSetParametersEW",kctx->alpha2,&kctx->alpha2,0);CHKERRQ(ierr); 244fa9f3622SBarry Smith ierr = PetscOptionsReal("-snes_ksp_ew_threshold","0 < threshold < 1","SNESKSPSetParametersEW",kctx->threshold,&kctx->threshold,0);CHKERRQ(ierr); 245186905e3SBarry Smith 246a6570f20SBarry Smith ierr = PetscOptionsName("-snes_monitor_cancel","Remove all monitors","SNESMonitorCancel",&flg);CHKERRQ(ierr); 247a6570f20SBarry Smith if (flg) {ierr = SNESMonitorCancel(snes);CHKERRQ(ierr);} 248eabae89aSBarry Smith 249a6570f20SBarry Smith ierr = PetscOptionsString("-snes_monitor","Monitor norm of function","SNESMonitorSet","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr); 250e8105e01SRichard Katz if (flg) { 25123d894e5SBarry Smith ierr = PetscViewerASCIIMonitorCreate(snes->comm,monfilename,0,&monviewer);CHKERRQ(ierr); 25223d894e5SBarry Smith ierr = SNESMonitorSet(snes,SNESMonitorDefault,monviewer,(PetscErrorCode (*)(void*))PetscViewerASCIIMonitorDestroy);CHKERRQ(ierr); 253e8105e01SRichard Katz } 254eabae89aSBarry Smith 255a6570f20SBarry Smith ierr = PetscOptionsString("-snes_ratiomonitor","Monitor ratios of norms of function","SNESMonitorSetRatio","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr); 256eabae89aSBarry Smith if (flg) { 25723d894e5SBarry Smith ierr = PetscViewerASCIIMonitorCreate(snes->comm,monfilename,0,&monviewer);CHKERRQ(ierr); 258f1bef1bcSMatthew Knepley ierr = SNESMonitorSetRatio(snes,monviewer);CHKERRQ(ierr); 259e8105e01SRichard Katz } 260eabae89aSBarry Smith 261a6570f20SBarry Smith ierr = PetscOptionsString("-snes_monitor_short","Monitor norm of function (fewer digits)","SNESMonitorSet","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr); 262eabae89aSBarry Smith if (flg) { 26323d894e5SBarry Smith ierr = PetscViewerASCIIMonitorCreate(snes->comm,monfilename,0,&monviewer);CHKERRQ(ierr); 26423d894e5SBarry Smith ierr = SNESMonitorSet(snes,SNESMonitorDefaultShort,monviewer,(PetscErrorCode (*)(void*))PetscViewerASCIIMonitorDestroy);CHKERRQ(ierr); 265eabae89aSBarry Smith } 266eabae89aSBarry Smith 267a6570f20SBarry Smith ierr = PetscOptionsName("-snes_monitor_solution","Plot solution at each iteration","SNESMonitorSolution",&flg);CHKERRQ(ierr); 268a6570f20SBarry Smith if (flg) {ierr = SNESMonitorSet(snes,SNESMonitorSolution,0,0);CHKERRQ(ierr);} 269a6570f20SBarry Smith ierr = PetscOptionsName("-snes_monitor_solution_update","Plot correction at each iteration","SNESMonitorSolutionUpdate",&flg);CHKERRQ(ierr); 270a6570f20SBarry Smith if (flg) {ierr = SNESMonitorSet(snes,SNESMonitorSolutionUpdate,0,0);CHKERRQ(ierr);} 271a6570f20SBarry Smith ierr = PetscOptionsName("-snes_monitor_residual","Plot residual at each iteration","SNESMonitorResidual",&flg);CHKERRQ(ierr); 272a6570f20SBarry Smith if (flg) {ierr = SNESMonitorSet(snes,SNESMonitorResidual,0,0);CHKERRQ(ierr);} 273a6570f20SBarry Smith ierr = PetscOptionsName("-snes_monitor_draw","Plot function norm at each iteration","SNESMonitorLG",&flg);CHKERRQ(ierr); 274a6570f20SBarry Smith if (flg) {ierr = SNESMonitorSet(snes,SNESMonitorLG,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);} 275e24b481bSBarry Smith 276b0a32e0cSBarry Smith ierr = PetscOptionsName("-snes_fd","Use finite differences (slow) to compute Jacobian","SNESDefaultComputeJacobian",&flg);CHKERRQ(ierr); 2774b27c08aSLois Curfman McInnes if (flg) { 278186905e3SBarry Smith ierr = SNESSetJacobian(snes,snes->jacobian,snes->jacobian_pre,SNESDefaultComputeJacobian,snes->funP);CHKERRQ(ierr); 279ae15b995SBarry Smith ierr = PetscInfo(snes,"Setting default finite difference Jacobian matrix\n");CHKERRQ(ierr); 2809b94acceSBarry Smith } 281639f9d9dSBarry Smith 28276b2cf59SMatthew Knepley for(i = 0; i < numberofsetfromoptions; i++) { 28376b2cf59SMatthew Knepley ierr = (*othersetfromoptions[i])(snes);CHKERRQ(ierr); 28476b2cf59SMatthew Knepley } 28576b2cf59SMatthew Knepley 286e7788613SBarry Smith if (snes->ops->setfromoptions) { 287e7788613SBarry Smith ierr = (*snes->ops->setfromoptions)(snes);CHKERRQ(ierr); 288639f9d9dSBarry Smith } 289b0a32e0cSBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 2904bbc92c1SBarry Smith 29185385478SLisandro Dalcin ierr = KSPSetFromOptions(snes->ksp);CHKERRQ(ierr); 29293993e2dSLois Curfman McInnes 2933a40ed3dSBarry Smith PetscFunctionReturn(0); 2949b94acceSBarry Smith } 2959b94acceSBarry Smith 296a847f771SSatish Balay 2974a2ae208SSatish Balay #undef __FUNCT__ 2984a2ae208SSatish Balay #define __FUNCT__ "SNESSetApplicationContext" 2999b94acceSBarry Smith /*@ 3009b94acceSBarry Smith SNESSetApplicationContext - Sets the optional user-defined context for 3019b94acceSBarry Smith the nonlinear solvers. 3029b94acceSBarry Smith 303fee21e36SBarry Smith Collective on SNES 304fee21e36SBarry Smith 305c7afd0dbSLois Curfman McInnes Input Parameters: 306c7afd0dbSLois Curfman McInnes + snes - the SNES context 307c7afd0dbSLois Curfman McInnes - usrP - optional user context 308c7afd0dbSLois Curfman McInnes 30936851e7fSLois Curfman McInnes Level: intermediate 31036851e7fSLois Curfman McInnes 3119b94acceSBarry Smith .keywords: SNES, nonlinear, set, application, context 3129b94acceSBarry Smith 3139b94acceSBarry Smith .seealso: SNESGetApplicationContext() 3149b94acceSBarry Smith @*/ 31563dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESSetApplicationContext(SNES snes,void *usrP) 3169b94acceSBarry Smith { 3173a40ed3dSBarry Smith PetscFunctionBegin; 3184482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 3199b94acceSBarry Smith snes->user = usrP; 3203a40ed3dSBarry Smith PetscFunctionReturn(0); 3219b94acceSBarry Smith } 32274679c65SBarry Smith 3234a2ae208SSatish Balay #undef __FUNCT__ 3244a2ae208SSatish Balay #define __FUNCT__ "SNESGetApplicationContext" 3259b94acceSBarry Smith /*@C 3269b94acceSBarry Smith SNESGetApplicationContext - Gets the user-defined context for the 3279b94acceSBarry Smith nonlinear solvers. 3289b94acceSBarry Smith 329c7afd0dbSLois Curfman McInnes Not Collective 330c7afd0dbSLois Curfman McInnes 3319b94acceSBarry Smith Input Parameter: 3329b94acceSBarry Smith . snes - SNES context 3339b94acceSBarry Smith 3349b94acceSBarry Smith Output Parameter: 3359b94acceSBarry Smith . usrP - user context 3369b94acceSBarry Smith 33736851e7fSLois Curfman McInnes Level: intermediate 33836851e7fSLois Curfman McInnes 3399b94acceSBarry Smith .keywords: SNES, nonlinear, get, application, context 3409b94acceSBarry Smith 3419b94acceSBarry Smith .seealso: SNESSetApplicationContext() 3429b94acceSBarry Smith @*/ 34363dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESGetApplicationContext(SNES snes,void **usrP) 3449b94acceSBarry Smith { 3453a40ed3dSBarry Smith PetscFunctionBegin; 3464482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 3479b94acceSBarry Smith *usrP = snes->user; 3483a40ed3dSBarry Smith PetscFunctionReturn(0); 3499b94acceSBarry Smith } 35074679c65SBarry Smith 3514a2ae208SSatish Balay #undef __FUNCT__ 3524a2ae208SSatish Balay #define __FUNCT__ "SNESGetIterationNumber" 3539b94acceSBarry Smith /*@ 354c8228a4eSBarry Smith SNESGetIterationNumber - Gets the number of nonlinear iterations completed 355c8228a4eSBarry Smith at this time. 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 365c8228a4eSBarry Smith Notes: 366c8228a4eSBarry Smith For example, during the computation of iteration 2 this would return 1. 367c8228a4eSBarry Smith 368c8228a4eSBarry Smith This is useful for using lagged Jacobians (where one does not recompute the 36908405cd6SLois Curfman McInnes Jacobian at each SNES iteration). For example, the code 37008405cd6SLois Curfman McInnes .vb 37108405cd6SLois Curfman McInnes ierr = SNESGetIterationNumber(snes,&it); 37208405cd6SLois Curfman McInnes if (!(it % 2)) { 37308405cd6SLois Curfman McInnes [compute Jacobian here] 37408405cd6SLois Curfman McInnes } 37508405cd6SLois Curfman McInnes .ve 376c8228a4eSBarry Smith can be used in your ComputeJacobian() function to cause the Jacobian to be 37708405cd6SLois Curfman McInnes recomputed every second SNES iteration. 378c8228a4eSBarry Smith 37936851e7fSLois Curfman McInnes Level: intermediate 38036851e7fSLois Curfman McInnes 3812b668275SBarry Smith .keywords: SNES, nonlinear, get, iteration, number, 3822b668275SBarry Smith 383b850b91aSLisandro Dalcin .seealso: SNESGetFunctionNorm(), SNESGetLinearSolveIterations() 3849b94acceSBarry Smith @*/ 38563dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESGetIterationNumber(SNES snes,PetscInt* iter) 3869b94acceSBarry Smith { 3873a40ed3dSBarry Smith PetscFunctionBegin; 3884482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 3894482741eSBarry Smith PetscValidIntPointer(iter,2); 3909b94acceSBarry Smith *iter = snes->iter; 3913a40ed3dSBarry Smith PetscFunctionReturn(0); 3929b94acceSBarry Smith } 39374679c65SBarry Smith 3944a2ae208SSatish Balay #undef __FUNCT__ 3954a2ae208SSatish Balay #define __FUNCT__ "SNESGetFunctionNorm" 3969b94acceSBarry Smith /*@ 3979b94acceSBarry Smith SNESGetFunctionNorm - Gets the norm of the current function that was set 3989b94acceSBarry Smith with SNESSSetFunction(). 3999b94acceSBarry Smith 400c7afd0dbSLois Curfman McInnes Collective on SNES 401c7afd0dbSLois Curfman McInnes 4029b94acceSBarry Smith Input Parameter: 4039b94acceSBarry Smith . snes - SNES context 4049b94acceSBarry Smith 4059b94acceSBarry Smith Output Parameter: 4069b94acceSBarry Smith . fnorm - 2-norm of function 4079b94acceSBarry Smith 40836851e7fSLois Curfman McInnes Level: intermediate 40936851e7fSLois Curfman McInnes 4109b94acceSBarry Smith .keywords: SNES, nonlinear, get, function, norm 411a86d99e1SLois Curfman McInnes 412b850b91aSLisandro Dalcin .seealso: SNESGetFunction(), SNESGetIterationNumber(), SNESGetLinearSolveIterations() 4139b94acceSBarry Smith @*/ 41471f87433Sdalcinl PetscErrorCode PETSCSNES_DLLEXPORT SNESGetFunctionNorm(SNES snes,PetscReal *fnorm) 4159b94acceSBarry Smith { 4163a40ed3dSBarry Smith PetscFunctionBegin; 4174482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 4184482741eSBarry Smith PetscValidScalarPointer(fnorm,2); 4199b94acceSBarry Smith *fnorm = snes->norm; 4203a40ed3dSBarry Smith PetscFunctionReturn(0); 4219b94acceSBarry Smith } 42274679c65SBarry Smith 4234a2ae208SSatish Balay #undef __FUNCT__ 424b850b91aSLisandro Dalcin #define __FUNCT__ "SNESGetNonlinearStepFailures" 4259b94acceSBarry Smith /*@ 426b850b91aSLisandro Dalcin SNESGetNonlinearStepFailures - Gets the number of unsuccessful steps 4279b94acceSBarry Smith attempted by the nonlinear solver. 4289b94acceSBarry Smith 429c7afd0dbSLois Curfman McInnes Not Collective 430c7afd0dbSLois Curfman McInnes 4319b94acceSBarry Smith Input Parameter: 4329b94acceSBarry Smith . snes - SNES context 4339b94acceSBarry Smith 4349b94acceSBarry Smith Output Parameter: 4359b94acceSBarry Smith . nfails - number of unsuccessful steps attempted 4369b94acceSBarry Smith 437c96a6f78SLois Curfman McInnes Notes: 438c96a6f78SLois Curfman McInnes This counter is reset to zero for each successive call to SNESSolve(). 439c96a6f78SLois Curfman McInnes 44036851e7fSLois Curfman McInnes Level: intermediate 44136851e7fSLois Curfman McInnes 4429b94acceSBarry Smith .keywords: SNES, nonlinear, get, number, unsuccessful, steps 4439b94acceSBarry Smith @*/ 444b850b91aSLisandro Dalcin PetscErrorCode PETSCSNES_DLLEXPORT SNESGetNonlinearStepFailures(SNES snes,PetscInt* nfails) 4459b94acceSBarry Smith { 4463a40ed3dSBarry Smith PetscFunctionBegin; 4474482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 4484482741eSBarry Smith PetscValidIntPointer(nfails,2); 44950ffb88aSMatthew Knepley *nfails = snes->numFailures; 45050ffb88aSMatthew Knepley PetscFunctionReturn(0); 45150ffb88aSMatthew Knepley } 45250ffb88aSMatthew Knepley 45350ffb88aSMatthew Knepley #undef __FUNCT__ 454b850b91aSLisandro Dalcin #define __FUNCT__ "SNESSetMaxNonlinearStepFailures" 45550ffb88aSMatthew Knepley /*@ 456b850b91aSLisandro Dalcin SNESSetMaxNonlinearStepFailures - Sets the maximum number of unsuccessful steps 45750ffb88aSMatthew Knepley attempted by the nonlinear solver before it gives up. 45850ffb88aSMatthew Knepley 45950ffb88aSMatthew Knepley Not Collective 46050ffb88aSMatthew Knepley 46150ffb88aSMatthew Knepley Input Parameters: 46250ffb88aSMatthew Knepley + snes - SNES context 46350ffb88aSMatthew Knepley - maxFails - maximum of unsuccessful steps 46450ffb88aSMatthew Knepley 46550ffb88aSMatthew Knepley Level: intermediate 46650ffb88aSMatthew Knepley 46750ffb88aSMatthew Knepley .keywords: SNES, nonlinear, set, maximum, unsuccessful, steps 46850ffb88aSMatthew Knepley @*/ 469b850b91aSLisandro Dalcin PetscErrorCode PETSCSNES_DLLEXPORT SNESSetMaxNonlinearStepFailures(SNES snes, PetscInt maxFails) 47050ffb88aSMatthew Knepley { 47150ffb88aSMatthew Knepley PetscFunctionBegin; 4724482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 47350ffb88aSMatthew Knepley snes->maxFailures = maxFails; 47450ffb88aSMatthew Knepley PetscFunctionReturn(0); 47550ffb88aSMatthew Knepley } 47650ffb88aSMatthew Knepley 47750ffb88aSMatthew Knepley #undef __FUNCT__ 478b850b91aSLisandro Dalcin #define __FUNCT__ "SNESGetMaxNonlinearStepFailures" 47950ffb88aSMatthew Knepley /*@ 480b850b91aSLisandro Dalcin SNESGetMaxNonlinearStepFailures - Gets the maximum number of unsuccessful steps 48150ffb88aSMatthew Knepley attempted by the nonlinear solver before it gives up. 48250ffb88aSMatthew Knepley 48350ffb88aSMatthew Knepley Not Collective 48450ffb88aSMatthew Knepley 48550ffb88aSMatthew Knepley Input Parameter: 48650ffb88aSMatthew Knepley . snes - SNES context 48750ffb88aSMatthew Knepley 48850ffb88aSMatthew Knepley Output Parameter: 48950ffb88aSMatthew Knepley . maxFails - maximum of unsuccessful steps 49050ffb88aSMatthew Knepley 49150ffb88aSMatthew Knepley Level: intermediate 49250ffb88aSMatthew Knepley 49350ffb88aSMatthew Knepley .keywords: SNES, nonlinear, get, maximum, unsuccessful, steps 49450ffb88aSMatthew Knepley @*/ 495b850b91aSLisandro Dalcin PetscErrorCode PETSCSNES_DLLEXPORT SNESGetMaxNonlinearStepFailures(SNES snes, PetscInt *maxFails) 49650ffb88aSMatthew Knepley { 49750ffb88aSMatthew Knepley PetscFunctionBegin; 4984482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 4994482741eSBarry Smith PetscValidIntPointer(maxFails,2); 50050ffb88aSMatthew Knepley *maxFails = snes->maxFailures; 5013a40ed3dSBarry Smith PetscFunctionReturn(0); 5029b94acceSBarry Smith } 503a847f771SSatish Balay 5044a2ae208SSatish Balay #undef __FUNCT__ 5052541af92SBarry Smith #define __FUNCT__ "SNESGetNumberFunctionEvals" 5062541af92SBarry Smith /*@ 5072541af92SBarry Smith SNESGetNumberFunctionEvals - Gets the number of user provided function evaluations 5082541af92SBarry Smith done by SNES. 5092541af92SBarry Smith 5102541af92SBarry Smith Not Collective 5112541af92SBarry Smith 5122541af92SBarry Smith Input Parameter: 5132541af92SBarry Smith . snes - SNES context 5142541af92SBarry Smith 5152541af92SBarry Smith Output Parameter: 5162541af92SBarry Smith . nfuncs - number of evaluations 5172541af92SBarry Smith 5182541af92SBarry Smith Level: intermediate 5192541af92SBarry Smith 5202541af92SBarry Smith .keywords: SNES, nonlinear, get, maximum, unsuccessful, steps 5212541af92SBarry Smith @*/ 5222541af92SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESGetNumberFunctionEvals(SNES snes, PetscInt *nfuncs) 5232541af92SBarry Smith { 5242541af92SBarry Smith PetscFunctionBegin; 5252541af92SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 5262541af92SBarry Smith PetscValidIntPointer(nfuncs,2); 5272541af92SBarry Smith *nfuncs = snes->nfuncs; 5282541af92SBarry Smith PetscFunctionReturn(0); 5292541af92SBarry Smith } 5302541af92SBarry Smith 5312541af92SBarry Smith #undef __FUNCT__ 5323d4c4710SBarry Smith #define __FUNCT__ "SNESGetLinearSolveFailures" 5333d4c4710SBarry Smith /*@ 5343d4c4710SBarry Smith SNESGetLinearSolveFailures - Gets the number of failed (non-converged) 5353d4c4710SBarry Smith linear solvers. 5363d4c4710SBarry Smith 5373d4c4710SBarry Smith Not Collective 5383d4c4710SBarry Smith 5393d4c4710SBarry Smith Input Parameter: 5403d4c4710SBarry Smith . snes - SNES context 5413d4c4710SBarry Smith 5423d4c4710SBarry Smith Output Parameter: 5433d4c4710SBarry Smith . nfails - number of failed solves 5443d4c4710SBarry Smith 5453d4c4710SBarry Smith Notes: 5463d4c4710SBarry Smith This counter is reset to zero for each successive call to SNESSolve(). 5473d4c4710SBarry Smith 5483d4c4710SBarry Smith Level: intermediate 5493d4c4710SBarry Smith 5503d4c4710SBarry Smith .keywords: SNES, nonlinear, get, number, unsuccessful, steps 5513d4c4710SBarry Smith @*/ 5523d4c4710SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESGetLinearSolveFailures(SNES snes,PetscInt* nfails) 5533d4c4710SBarry Smith { 5543d4c4710SBarry Smith PetscFunctionBegin; 5553d4c4710SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 5563d4c4710SBarry Smith PetscValidIntPointer(nfails,2); 5573d4c4710SBarry Smith *nfails = snes->numLinearSolveFailures; 5583d4c4710SBarry Smith PetscFunctionReturn(0); 5593d4c4710SBarry Smith } 5603d4c4710SBarry Smith 5613d4c4710SBarry Smith #undef __FUNCT__ 5623d4c4710SBarry Smith #define __FUNCT__ "SNESSetMaxLinearSolveFailures" 5633d4c4710SBarry Smith /*@ 5643d4c4710SBarry Smith SNESSetMaxLinearSolveFailures - the number of failed linear solve attempts 5653d4c4710SBarry Smith allowed before SNES returns with a diverged reason of SNES_DIVERGED_LINEAR_SOLVE 5663d4c4710SBarry Smith 5673d4c4710SBarry Smith Collective on SNES 5683d4c4710SBarry Smith 5693d4c4710SBarry Smith Input Parameters: 5703d4c4710SBarry Smith + snes - SNES context 5713d4c4710SBarry Smith - maxFails - maximum allowed linear solve failures 5723d4c4710SBarry Smith 5733d4c4710SBarry Smith Level: intermediate 5743d4c4710SBarry Smith 5753d4c4710SBarry Smith Notes: By default this is 1; that is SNES returns on the first failed linear solve 5763d4c4710SBarry Smith 5773d4c4710SBarry Smith .keywords: SNES, nonlinear, set, maximum, unsuccessful, steps 5783d4c4710SBarry Smith 5793d4c4710SBarry Smith .seealso: SNESGetLinearSolveFailures(), SNESGetMaxLinearSolveFailures() 5803d4c4710SBarry Smith @*/ 5813d4c4710SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESSetMaxLinearSolveFailures(SNES snes, PetscInt maxFails) 5823d4c4710SBarry Smith { 5833d4c4710SBarry Smith PetscFunctionBegin; 5843d4c4710SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 5853d4c4710SBarry Smith snes->maxLinearSolveFailures = maxFails; 5863d4c4710SBarry Smith PetscFunctionReturn(0); 5873d4c4710SBarry Smith } 5883d4c4710SBarry Smith 5893d4c4710SBarry Smith #undef __FUNCT__ 5903d4c4710SBarry Smith #define __FUNCT__ "SNESGetMaxLinearSolveFailures" 5913d4c4710SBarry Smith /*@ 5923d4c4710SBarry Smith SNESGetMaxLinearSolveFailures - gets the maximum number of linear solve failures that 5933d4c4710SBarry Smith are allowed before SNES terminates 5943d4c4710SBarry Smith 5953d4c4710SBarry Smith Not Collective 5963d4c4710SBarry Smith 5973d4c4710SBarry Smith Input Parameter: 5983d4c4710SBarry Smith . snes - SNES context 5993d4c4710SBarry Smith 6003d4c4710SBarry Smith Output Parameter: 6013d4c4710SBarry Smith . maxFails - maximum of unsuccessful solves allowed 6023d4c4710SBarry Smith 6033d4c4710SBarry Smith Level: intermediate 6043d4c4710SBarry Smith 6053d4c4710SBarry Smith Notes: By default this is 1; that is SNES returns on the first failed linear solve 6063d4c4710SBarry Smith 6073d4c4710SBarry Smith .keywords: SNES, nonlinear, get, maximum, unsuccessful, steps 6083d4c4710SBarry Smith 6093d4c4710SBarry Smith .seealso: SNESGetLinearSolveFailures(), SNESGetMaxLinearSolveFailures() 6103d4c4710SBarry Smith @*/ 6113d4c4710SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESGetMaxLinearSolveFailures(SNES snes, PetscInt *maxFails) 6123d4c4710SBarry Smith { 6133d4c4710SBarry Smith PetscFunctionBegin; 6143d4c4710SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 6153d4c4710SBarry Smith PetscValidIntPointer(maxFails,2); 6163d4c4710SBarry Smith *maxFails = snes->maxLinearSolveFailures; 6173d4c4710SBarry Smith PetscFunctionReturn(0); 6183d4c4710SBarry Smith } 6193d4c4710SBarry Smith 6203d4c4710SBarry Smith #undef __FUNCT__ 621b850b91aSLisandro Dalcin #define __FUNCT__ "SNESGetLinearSolveIterations" 622c96a6f78SLois Curfman McInnes /*@ 623b850b91aSLisandro Dalcin SNESGetLinearSolveIterations - Gets the total number of linear iterations 624c96a6f78SLois Curfman McInnes used by the nonlinear solver. 625c96a6f78SLois Curfman McInnes 626c7afd0dbSLois Curfman McInnes Not Collective 627c7afd0dbSLois Curfman McInnes 628c96a6f78SLois Curfman McInnes Input Parameter: 629c96a6f78SLois Curfman McInnes . snes - SNES context 630c96a6f78SLois Curfman McInnes 631c96a6f78SLois Curfman McInnes Output Parameter: 632c96a6f78SLois Curfman McInnes . lits - number of linear iterations 633c96a6f78SLois Curfman McInnes 634c96a6f78SLois Curfman McInnes Notes: 635c96a6f78SLois Curfman McInnes This counter is reset to zero for each successive call to SNESSolve(). 636c96a6f78SLois Curfman McInnes 63736851e7fSLois Curfman McInnes Level: intermediate 63836851e7fSLois Curfman McInnes 639c96a6f78SLois Curfman McInnes .keywords: SNES, nonlinear, get, number, linear, iterations 6402b668275SBarry Smith 6412b668275SBarry Smith .seealso: SNESGetIterationNumber(), SNESGetFunctionNorm() 642c96a6f78SLois Curfman McInnes @*/ 643b850b91aSLisandro Dalcin PetscErrorCode PETSCSNES_DLLEXPORT SNESGetLinearSolveIterations(SNES snes,PetscInt* lits) 644c96a6f78SLois Curfman McInnes { 6453a40ed3dSBarry Smith PetscFunctionBegin; 6464482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 6474482741eSBarry Smith PetscValidIntPointer(lits,2); 648c96a6f78SLois Curfman McInnes *lits = snes->linear_its; 6493a40ed3dSBarry Smith PetscFunctionReturn(0); 650c96a6f78SLois Curfman McInnes } 651c96a6f78SLois Curfman McInnes 6524a2ae208SSatish Balay #undef __FUNCT__ 65394b7f48cSBarry Smith #define __FUNCT__ "SNESGetKSP" 65452baeb72SSatish Balay /*@ 65594b7f48cSBarry Smith SNESGetKSP - Returns the KSP context for a SNES solver. 6569b94acceSBarry Smith 65794b7f48cSBarry Smith Not Collective, but if SNES object is parallel, then KSP object is parallel 658c7afd0dbSLois Curfman McInnes 6599b94acceSBarry Smith Input Parameter: 6609b94acceSBarry Smith . snes - the SNES context 6619b94acceSBarry Smith 6629b94acceSBarry Smith Output Parameter: 66394b7f48cSBarry Smith . ksp - the KSP context 6649b94acceSBarry Smith 6659b94acceSBarry Smith Notes: 66694b7f48cSBarry Smith The user can then directly manipulate the KSP context to set various 6679b94acceSBarry Smith options, etc. Likewise, the user can then extract and manipulate the 6682999313aSBarry Smith PC contexts as well. 6699b94acceSBarry Smith 67036851e7fSLois Curfman McInnes Level: beginner 67136851e7fSLois Curfman McInnes 67294b7f48cSBarry Smith .keywords: SNES, nonlinear, get, KSP, context 6739b94acceSBarry Smith 6742999313aSBarry Smith .seealso: KSPGetPC(), SNESCreate(), KSPCreate(), SNESSetKSP() 6759b94acceSBarry Smith @*/ 67663dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESGetKSP(SNES snes,KSP *ksp) 6779b94acceSBarry Smith { 6783a40ed3dSBarry Smith PetscFunctionBegin; 6794482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 6804482741eSBarry Smith PetscValidPointer(ksp,2); 68194b7f48cSBarry Smith *ksp = snes->ksp; 6823a40ed3dSBarry Smith PetscFunctionReturn(0); 6839b94acceSBarry Smith } 68482bf6240SBarry Smith 6854a2ae208SSatish Balay #undef __FUNCT__ 6862999313aSBarry Smith #define __FUNCT__ "SNESSetKSP" 6872999313aSBarry Smith /*@ 6882999313aSBarry Smith SNESSetKSP - Sets a KSP context for the SNES object to use 6892999313aSBarry Smith 6902999313aSBarry Smith Not Collective, but the SNES and KSP objects must live on the same MPI_Comm 6912999313aSBarry Smith 6922999313aSBarry Smith Input Parameters: 6932999313aSBarry Smith + snes - the SNES context 6942999313aSBarry Smith - ksp - the KSP context 6952999313aSBarry Smith 6962999313aSBarry Smith Notes: 6972999313aSBarry Smith The SNES object already has its KSP object, you can obtain with SNESGetKSP() 6982999313aSBarry Smith so this routine is rarely needed. 6992999313aSBarry Smith 7002999313aSBarry Smith The KSP object that is already in the SNES object has its reference count 7012999313aSBarry Smith decreased by one. 7022999313aSBarry Smith 7032999313aSBarry Smith Level: developer 7042999313aSBarry Smith 7052999313aSBarry Smith .keywords: SNES, nonlinear, get, KSP, context 7062999313aSBarry Smith 7072999313aSBarry Smith .seealso: KSPGetPC(), SNESCreate(), KSPCreate(), SNESSetKSP() 7082999313aSBarry Smith @*/ 7092999313aSBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESSetKSP(SNES snes,KSP ksp) 7102999313aSBarry Smith { 7112999313aSBarry Smith PetscErrorCode ierr; 7122999313aSBarry Smith 7132999313aSBarry Smith PetscFunctionBegin; 7142999313aSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 7152999313aSBarry Smith PetscValidHeaderSpecific(ksp,KSP_COOKIE,2); 7162999313aSBarry Smith PetscCheckSameComm(snes,1,ksp,2); 7177dcf0eaaSdalcinl ierr = PetscObjectReference((PetscObject)ksp);CHKERRQ(ierr); 718906ed7ccSBarry Smith if (snes->ksp) {ierr = PetscObjectDereference((PetscObject)snes->ksp);CHKERRQ(ierr);} 7192999313aSBarry Smith snes->ksp = ksp; 7202999313aSBarry Smith PetscFunctionReturn(0); 7212999313aSBarry Smith } 7222999313aSBarry Smith 7232999313aSBarry Smith #undef __FUNCT__ 7244a2ae208SSatish Balay #define __FUNCT__ "SNESPublish_Petsc" 7256849ba73SBarry Smith static PetscErrorCode SNESPublish_Petsc(PetscObject obj) 726e24b481bSBarry Smith { 727e24b481bSBarry Smith PetscFunctionBegin; 728e24b481bSBarry Smith PetscFunctionReturn(0); 729e24b481bSBarry Smith } 730e24b481bSBarry Smith 7319b94acceSBarry Smith /* -----------------------------------------------------------*/ 7324a2ae208SSatish Balay #undef __FUNCT__ 7334a2ae208SSatish Balay #define __FUNCT__ "SNESCreate" 73452baeb72SSatish Balay /*@ 7359b94acceSBarry Smith SNESCreate - Creates a nonlinear solver context. 7369b94acceSBarry Smith 737c7afd0dbSLois Curfman McInnes Collective on MPI_Comm 738c7afd0dbSLois Curfman McInnes 739c7afd0dbSLois Curfman McInnes Input Parameters: 740906ed7ccSBarry Smith . comm - MPI communicator 7419b94acceSBarry Smith 7429b94acceSBarry Smith Output Parameter: 7439b94acceSBarry Smith . outsnes - the new SNES context 7449b94acceSBarry Smith 745c7afd0dbSLois Curfman McInnes Options Database Keys: 746c7afd0dbSLois Curfman McInnes + -snes_mf - Activates default matrix-free Jacobian-vector products, 747c7afd0dbSLois Curfman McInnes and no preconditioning matrix 748c7afd0dbSLois Curfman McInnes . -snes_mf_operator - Activates default matrix-free Jacobian-vector 749c7afd0dbSLois Curfman McInnes products, and a user-provided preconditioning matrix 750c7afd0dbSLois Curfman McInnes as set by SNESSetJacobian() 751c7afd0dbSLois Curfman McInnes - -snes_fd - Uses (slow!) finite differences to compute Jacobian 752c1f60f51SBarry Smith 75336851e7fSLois Curfman McInnes Level: beginner 75436851e7fSLois Curfman McInnes 7559b94acceSBarry Smith .keywords: SNES, nonlinear, create, context 7569b94acceSBarry Smith 7574b27c08aSLois Curfman McInnes .seealso: SNESSolve(), SNESDestroy(), SNES 7589b94acceSBarry Smith @*/ 75963dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESCreate(MPI_Comm comm,SNES *outsnes) 7609b94acceSBarry Smith { 761dfbe8321SBarry Smith PetscErrorCode ierr; 7629b94acceSBarry Smith SNES snes; 763fa9f3622SBarry Smith SNESKSPEW *kctx; 76437fcc0dbSBarry Smith 7653a40ed3dSBarry Smith PetscFunctionBegin; 766ed1caa07SMatthew Knepley PetscValidPointer(outsnes,2); 7678ba1e511SMatthew Knepley *outsnes = PETSC_NULL; 7688ba1e511SMatthew Knepley #ifndef PETSC_USE_DYNAMIC_LIBRARIES 7698ba1e511SMatthew Knepley ierr = SNESInitializePackage(PETSC_NULL);CHKERRQ(ierr); 7708ba1e511SMatthew Knepley #endif 7718ba1e511SMatthew Knepley 772e7788613SBarry Smith ierr = PetscHeaderCreate(snes,_p_SNES,struct _SNESOps,SNES_COOKIE,0,"SNES",comm,SNESDestroy,SNESView);CHKERRQ(ierr); 773e24b481bSBarry Smith snes->bops->publish = SNESPublish_Petsc; 77485385478SLisandro Dalcin snes->ops->converged = SNESDefaultConverged; 7759b94acceSBarry Smith snes->max_its = 50; 7769750a799SBarry Smith snes->max_funcs = 10000; 7779b94acceSBarry Smith snes->norm = 0.0; 778b4874afaSBarry Smith snes->rtol = 1.e-8; 779b4874afaSBarry Smith snes->ttol = 0.0; 78070441072SBarry Smith snes->abstol = 1.e-50; 7819b94acceSBarry Smith snes->xtol = 1.e-8; 7824b27c08aSLois Curfman McInnes snes->deltatol = 1.e-12; 7839b94acceSBarry Smith snes->nfuncs = 0; 78450ffb88aSMatthew Knepley snes->numFailures = 0; 78550ffb88aSMatthew Knepley snes->maxFailures = 1; 7867a00f4a9SLois Curfman McInnes snes->linear_its = 0; 787639f9d9dSBarry Smith snes->numbermonitors = 0; 7889b94acceSBarry Smith snes->data = 0; 7894dc4c822SBarry Smith snes->setupcalled = PETSC_FALSE; 790186905e3SBarry Smith snes->ksp_ewconv = PETSC_FALSE; 7916f24a144SLois Curfman McInnes snes->vwork = 0; 7926f24a144SLois Curfman McInnes snes->nwork = 0; 793758f92a0SBarry Smith snes->conv_hist_len = 0; 794758f92a0SBarry Smith snes->conv_hist_max = 0; 795758f92a0SBarry Smith snes->conv_hist = PETSC_NULL; 796758f92a0SBarry Smith snes->conv_hist_its = PETSC_NULL; 797758f92a0SBarry Smith snes->conv_hist_reset = PETSC_TRUE; 798184914b5SBarry Smith snes->reason = SNES_CONVERGED_ITERATING; 7999b94acceSBarry Smith 8003d4c4710SBarry Smith snes->numLinearSolveFailures = 0; 8013d4c4710SBarry Smith snes->maxLinearSolveFailures = 1; 8023d4c4710SBarry Smith 8039b94acceSBarry Smith /* Create context to compute Eisenstat-Walker relative tolerance for KSP */ 80438f2d2fdSLisandro Dalcin ierr = PetscNewLog(snes,SNESKSPEW,&kctx);CHKERRQ(ierr); 8059b94acceSBarry Smith snes->kspconvctx = (void*)kctx; 8069b94acceSBarry Smith kctx->version = 2; 8079b94acceSBarry Smith kctx->rtol_0 = .3; /* Eisenstat and Walker suggest rtol_0=.5, but 8089b94acceSBarry Smith this was too large for some test cases */ 8099b94acceSBarry Smith kctx->rtol_last = 0; 8109b94acceSBarry Smith kctx->rtol_max = .9; 8119b94acceSBarry Smith kctx->gamma = 1.0; 81271f87433Sdalcinl kctx->alpha = .5*(1.0 + sqrt(5.0)); 81371f87433Sdalcinl kctx->alpha2 = kctx->alpha; 8149b94acceSBarry Smith kctx->threshold = .1; 8159b94acceSBarry Smith kctx->lresid_last = 0; 8169b94acceSBarry Smith kctx->norm_last = 0; 8179b94acceSBarry Smith 81894b7f48cSBarry Smith ierr = KSPCreate(comm,&snes->ksp);CHKERRQ(ierr); 81952e6d16bSBarry Smith ierr = PetscLogObjectParent(snes,snes->ksp);CHKERRQ(ierr); 8205334005bSBarry Smith 8219b94acceSBarry Smith *outsnes = snes; 82200036973SBarry Smith ierr = PetscPublishAll(snes);CHKERRQ(ierr); 8233a40ed3dSBarry Smith PetscFunctionReturn(0); 8249b94acceSBarry Smith } 8259b94acceSBarry Smith 8264a2ae208SSatish Balay #undef __FUNCT__ 8274a2ae208SSatish Balay #define __FUNCT__ "SNESSetFunction" 8289b94acceSBarry Smith /*@C 8299b94acceSBarry Smith SNESSetFunction - Sets the function evaluation routine and function 8309b94acceSBarry Smith vector for use by the SNES routines in solving systems of nonlinear 8319b94acceSBarry Smith equations. 8329b94acceSBarry Smith 833fee21e36SBarry Smith Collective on SNES 834fee21e36SBarry Smith 835c7afd0dbSLois Curfman McInnes Input Parameters: 836c7afd0dbSLois Curfman McInnes + snes - the SNES context 837c7afd0dbSLois Curfman McInnes . r - vector to store function value 838de044059SHong Zhang . func - function evaluation routine 839c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined context for private data for the 840c7afd0dbSLois Curfman McInnes function evaluation routine (may be PETSC_NULL) 8419b94acceSBarry Smith 842c7afd0dbSLois Curfman McInnes Calling sequence of func: 8438d76a1e5SLois Curfman McInnes $ func (SNES snes,Vec x,Vec f,void *ctx); 844c7afd0dbSLois Curfman McInnes 845313e4042SLois Curfman McInnes . f - function vector 846c7afd0dbSLois Curfman McInnes - ctx - optional user-defined function context 8479b94acceSBarry Smith 8489b94acceSBarry Smith Notes: 8499b94acceSBarry Smith The Newton-like methods typically solve linear systems of the form 8509b94acceSBarry Smith $ f'(x) x = -f(x), 851c7afd0dbSLois Curfman McInnes where f'(x) denotes the Jacobian matrix and f(x) is the function. 8529b94acceSBarry Smith 85336851e7fSLois Curfman McInnes Level: beginner 85436851e7fSLois Curfman McInnes 8559b94acceSBarry Smith .keywords: SNES, nonlinear, set, function 8569b94acceSBarry Smith 857a86d99e1SLois Curfman McInnes .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian() 8589b94acceSBarry Smith @*/ 85963dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESSetFunction(SNES snes,Vec r,PetscErrorCode (*func)(SNES,Vec,Vec,void*),void *ctx) 8609b94acceSBarry Smith { 86185385478SLisandro Dalcin PetscErrorCode ierr; 8623a40ed3dSBarry Smith PetscFunctionBegin; 8634482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 8644482741eSBarry Smith PetscValidHeaderSpecific(r,VEC_COOKIE,2); 865c9780b6fSBarry Smith PetscCheckSameComm(snes,1,r,2); 86685385478SLisandro Dalcin ierr = PetscObjectReference((PetscObject)r);CHKERRQ(ierr); 86785385478SLisandro Dalcin if (snes->vec_func) { ierr = VecDestroy(snes->vec_func);CHKERRQ(ierr); } 868e7788613SBarry Smith snes->ops->computefunction = func; 86985385478SLisandro Dalcin snes->vec_func = r; 8709b94acceSBarry Smith snes->funP = ctx; 8713a40ed3dSBarry Smith PetscFunctionReturn(0); 8729b94acceSBarry Smith } 8739b94acceSBarry Smith 8743ab0aad5SBarry Smith /* --------------------------------------------------------------- */ 8753ab0aad5SBarry Smith #undef __FUNCT__ 8761096aae1SMatthew Knepley #define __FUNCT__ "SNESGetRhs" 8771096aae1SMatthew Knepley /*@C 8781096aae1SMatthew Knepley SNESGetRhs - Gets the vector for solving F(x) = rhs. If rhs is not set 8791096aae1SMatthew Knepley it assumes a zero right hand side. 8801096aae1SMatthew Knepley 8811096aae1SMatthew Knepley Collective on SNES 8821096aae1SMatthew Knepley 8831096aae1SMatthew Knepley Input Parameter: 8841096aae1SMatthew Knepley . snes - the SNES context 8851096aae1SMatthew Knepley 8861096aae1SMatthew Knepley Output Parameter: 887*bc08b0f1SBarry Smith . rhs - the right hand side vector or PETSC_NULL if the right hand side vector is null 8881096aae1SMatthew Knepley 8891096aae1SMatthew Knepley Level: intermediate 8901096aae1SMatthew Knepley 8911096aae1SMatthew Knepley .keywords: SNES, nonlinear, get, function, right hand side 8921096aae1SMatthew Knepley 89385385478SLisandro Dalcin .seealso: SNESGetSolution(), SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian(), SNESSetFunction() 8941096aae1SMatthew Knepley @*/ 8951096aae1SMatthew Knepley PetscErrorCode PETSCSNES_DLLEXPORT SNESGetRhs(SNES snes,Vec *rhs) 8961096aae1SMatthew Knepley { 8971096aae1SMatthew Knepley PetscFunctionBegin; 8981096aae1SMatthew Knepley PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 8991096aae1SMatthew Knepley PetscValidPointer(rhs,2); 90085385478SLisandro Dalcin *rhs = snes->vec_rhs; 9011096aae1SMatthew Knepley PetscFunctionReturn(0); 9021096aae1SMatthew Knepley } 9031096aae1SMatthew Knepley 9041096aae1SMatthew Knepley #undef __FUNCT__ 9054a2ae208SSatish Balay #define __FUNCT__ "SNESComputeFunction" 9069b94acceSBarry Smith /*@ 90736851e7fSLois Curfman McInnes SNESComputeFunction - Calls the function that has been set with 9089b94acceSBarry Smith SNESSetFunction(). 9099b94acceSBarry Smith 910c7afd0dbSLois Curfman McInnes Collective on SNES 911c7afd0dbSLois Curfman McInnes 9129b94acceSBarry Smith Input Parameters: 913c7afd0dbSLois Curfman McInnes + snes - the SNES context 914c7afd0dbSLois Curfman McInnes - x - input vector 9159b94acceSBarry Smith 9169b94acceSBarry Smith Output Parameter: 9173638b69dSLois Curfman McInnes . y - function vector, as set by SNESSetFunction() 9189b94acceSBarry Smith 9191bffabb2SLois Curfman McInnes Notes: 92036851e7fSLois Curfman McInnes SNESComputeFunction() is typically used within nonlinear solvers 92136851e7fSLois Curfman McInnes implementations, so most users would not generally call this routine 92236851e7fSLois Curfman McInnes themselves. 92336851e7fSLois Curfman McInnes 92436851e7fSLois Curfman McInnes Level: developer 92536851e7fSLois Curfman McInnes 9269b94acceSBarry Smith .keywords: SNES, nonlinear, compute, function 9279b94acceSBarry Smith 928a86d99e1SLois Curfman McInnes .seealso: SNESSetFunction(), SNESGetFunction() 9299b94acceSBarry Smith @*/ 93063dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESComputeFunction(SNES snes,Vec x,Vec y) 9319b94acceSBarry Smith { 932dfbe8321SBarry Smith PetscErrorCode ierr; 9339b94acceSBarry Smith 9343a40ed3dSBarry Smith PetscFunctionBegin; 9354482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 9364482741eSBarry Smith PetscValidHeaderSpecific(x,VEC_COOKIE,2); 9374482741eSBarry Smith PetscValidHeaderSpecific(y,VEC_COOKIE,3); 938c9780b6fSBarry Smith PetscCheckSameComm(snes,1,x,2); 939c9780b6fSBarry Smith PetscCheckSameComm(snes,1,y,3); 940184914b5SBarry Smith 941d5ba7fb7SMatthew Knepley ierr = PetscLogEventBegin(SNES_FunctionEval,snes,x,y,0);CHKERRQ(ierr); 942e7788613SBarry Smith if (snes->ops->computefunction) { 943d64ed03dSBarry Smith PetscStackPush("SNES user function"); 944e9a2bbcdSBarry Smith CHKMEMQ; 945e7788613SBarry Smith ierr = (*snes->ops->computefunction)(snes,x,y,snes->funP); 946e9a2bbcdSBarry Smith CHKMEMQ; 947d64ed03dSBarry Smith PetscStackPop; 948d5e45103SBarry Smith if (PetscExceptionValue(ierr)) { 94919717074SBarry Smith PetscErrorCode pierr = PetscLogEventEnd(SNES_FunctionEval,snes,x,y,0);CHKERRQ(pierr); 95019717074SBarry Smith } 951d5e45103SBarry Smith CHKERRQ(ierr); 95285385478SLisandro Dalcin } else if (snes->vec_rhs) { 9531096aae1SMatthew Knepley ierr = MatMult(snes->jacobian, x, y);CHKERRQ(ierr); 9541096aae1SMatthew Knepley } else { 9551096aae1SMatthew Knepley SETERRQ(PETSC_ERR_ARG_WRONGSTATE, "Must call SNESSetFunction() before SNESComputeFunction(), likely called from SNESSolve()."); 9561096aae1SMatthew Knepley } 95785385478SLisandro Dalcin if (snes->vec_rhs) { 95885385478SLisandro Dalcin ierr = VecAXPY(y,-1.0,snes->vec_rhs);CHKERRQ(ierr); 9593ab0aad5SBarry Smith } 960ae3c334cSLois Curfman McInnes snes->nfuncs++; 961d5ba7fb7SMatthew Knepley ierr = PetscLogEventEnd(SNES_FunctionEval,snes,x,y,0);CHKERRQ(ierr); 9623a40ed3dSBarry Smith PetscFunctionReturn(0); 9639b94acceSBarry Smith } 9649b94acceSBarry Smith 9654a2ae208SSatish Balay #undef __FUNCT__ 9664a2ae208SSatish Balay #define __FUNCT__ "SNESComputeJacobian" 96762fef451SLois Curfman McInnes /*@ 96862fef451SLois Curfman McInnes SNESComputeJacobian - Computes the Jacobian matrix that has been 96962fef451SLois Curfman McInnes set with SNESSetJacobian(). 97062fef451SLois Curfman McInnes 971c7afd0dbSLois Curfman McInnes Collective on SNES and Mat 972c7afd0dbSLois Curfman McInnes 97362fef451SLois Curfman McInnes Input Parameters: 974c7afd0dbSLois Curfman McInnes + snes - the SNES context 975c7afd0dbSLois Curfman McInnes - x - input vector 97662fef451SLois Curfman McInnes 97762fef451SLois Curfman McInnes Output Parameters: 978c7afd0dbSLois Curfman McInnes + A - Jacobian matrix 97962fef451SLois Curfman McInnes . B - optional preconditioning matrix 9802b668275SBarry Smith - flag - flag indicating matrix structure (one of, SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER) 981fee21e36SBarry Smith 98262fef451SLois Curfman McInnes Notes: 98362fef451SLois Curfman McInnes Most users should not need to explicitly call this routine, as it 98462fef451SLois Curfman McInnes is used internally within the nonlinear solvers. 98562fef451SLois Curfman McInnes 98694b7f48cSBarry Smith See KSPSetOperators() for important information about setting the 987dc5a77f8SLois Curfman McInnes flag parameter. 98862fef451SLois Curfman McInnes 98936851e7fSLois Curfman McInnes Level: developer 99036851e7fSLois Curfman McInnes 99162fef451SLois Curfman McInnes .keywords: SNES, compute, Jacobian, matrix 99262fef451SLois Curfman McInnes 9932b668275SBarry Smith .seealso: SNESSetJacobian(), KSPSetOperators(), MatStructure 99462fef451SLois Curfman McInnes @*/ 99563dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESComputeJacobian(SNES snes,Vec X,Mat *A,Mat *B,MatStructure *flg) 9969b94acceSBarry Smith { 997dfbe8321SBarry Smith PetscErrorCode ierr; 9983a40ed3dSBarry Smith 9993a40ed3dSBarry Smith PetscFunctionBegin; 10004482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 10014482741eSBarry Smith PetscValidHeaderSpecific(X,VEC_COOKIE,2); 10024482741eSBarry Smith PetscValidPointer(flg,5); 1003c9780b6fSBarry Smith PetscCheckSameComm(snes,1,X,2); 1004e7788613SBarry Smith if (!snes->ops->computejacobian) PetscFunctionReturn(0); 1005d5ba7fb7SMatthew Knepley ierr = PetscLogEventBegin(SNES_JacobianEval,snes,X,*A,*B);CHKERRQ(ierr); 1006c4fc05e7SBarry Smith *flg = DIFFERENT_NONZERO_PATTERN; 1007d64ed03dSBarry Smith PetscStackPush("SNES user Jacobian function"); 1008dc67937bSBarry Smith CHKMEMQ; 1009e7788613SBarry Smith ierr = (*snes->ops->computejacobian)(snes,X,A,B,flg,snes->jacP);CHKERRQ(ierr); 1010dc67937bSBarry Smith CHKMEMQ; 1011d64ed03dSBarry Smith PetscStackPop; 1012d5ba7fb7SMatthew Knepley ierr = PetscLogEventEnd(SNES_JacobianEval,snes,X,*A,*B);CHKERRQ(ierr); 10136d84be18SBarry Smith /* make sure user returned a correct Jacobian and preconditioner */ 10146ce558aeSBarry Smith /* PetscValidHeaderSpecific(*A,MAT_COOKIE,3); 10156ce558aeSBarry Smith PetscValidHeaderSpecific(*B,MAT_COOKIE,4); */ 10163a40ed3dSBarry Smith PetscFunctionReturn(0); 10179b94acceSBarry Smith } 10189b94acceSBarry Smith 10194a2ae208SSatish Balay #undef __FUNCT__ 10204a2ae208SSatish Balay #define __FUNCT__ "SNESSetJacobian" 10219b94acceSBarry Smith /*@C 10229b94acceSBarry Smith SNESSetJacobian - Sets the function to compute Jacobian as well as the 1023044dda88SLois Curfman McInnes location to store the matrix. 10249b94acceSBarry Smith 1025c7afd0dbSLois Curfman McInnes Collective on SNES and Mat 1026c7afd0dbSLois Curfman McInnes 10279b94acceSBarry Smith Input Parameters: 1028c7afd0dbSLois Curfman McInnes + snes - the SNES context 10299b94acceSBarry Smith . A - Jacobian matrix 10309b94acceSBarry Smith . B - preconditioner matrix (usually same as the Jacobian) 10319b94acceSBarry Smith . func - Jacobian evaluation routine 1032c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined context for private data for the 10332cd2dfdcSLois Curfman McInnes Jacobian evaluation routine (may be PETSC_NULL) 10349b94acceSBarry Smith 10359b94acceSBarry Smith Calling sequence of func: 10368d76a1e5SLois Curfman McInnes $ func (SNES snes,Vec x,Mat *A,Mat *B,int *flag,void *ctx); 10379b94acceSBarry Smith 1038c7afd0dbSLois Curfman McInnes + x - input vector 10399b94acceSBarry Smith . A - Jacobian matrix 10409b94acceSBarry Smith . B - preconditioner matrix, usually the same as A 1041ac21db08SLois Curfman McInnes . flag - flag indicating information about the preconditioner matrix 10422b668275SBarry Smith structure (same as flag in KSPSetOperators()), one of SAME_NONZERO_PATTERN,DIFFERENT_NONZERO_PATTERN,SAME_PRECONDITIONER 1043c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined Jacobian context 10449b94acceSBarry Smith 10459b94acceSBarry Smith Notes: 104694b7f48cSBarry Smith See KSPSetOperators() for important information about setting the flag 10472cd2dfdcSLois Curfman McInnes output parameter in the routine func(). Be sure to read this information! 1048ac21db08SLois Curfman McInnes 1049ac21db08SLois Curfman McInnes The routine func() takes Mat * as the matrix arguments rather than Mat. 10509b94acceSBarry Smith This allows the Jacobian evaluation routine to replace A and/or B with a 10519b94acceSBarry Smith completely new new matrix structure (not just different matrix elements) 10529b94acceSBarry Smith when appropriate, for instance, if the nonzero structure is changing 10539b94acceSBarry Smith throughout the global iterations. 10549b94acceSBarry Smith 105536851e7fSLois Curfman McInnes Level: beginner 105636851e7fSLois Curfman McInnes 10579b94acceSBarry Smith .keywords: SNES, nonlinear, set, Jacobian, matrix 10589b94acceSBarry Smith 10593ec795f1SBarry Smith .seealso: KSPSetOperators(), SNESSetFunction(), MatMFFDComputeJacobian(), SNESDefaultComputeJacobianColor(), MatStructure 10609b94acceSBarry Smith @*/ 106163dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESSetJacobian(SNES snes,Mat A,Mat B,PetscErrorCode (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx) 10629b94acceSBarry Smith { 1063dfbe8321SBarry Smith PetscErrorCode ierr; 10643a7fca6bSBarry Smith 10653a40ed3dSBarry Smith PetscFunctionBegin; 10664482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 10674482741eSBarry Smith if (A) PetscValidHeaderSpecific(A,MAT_COOKIE,2); 10684482741eSBarry Smith if (B) PetscValidHeaderSpecific(B,MAT_COOKIE,3); 1069c9780b6fSBarry Smith if (A) PetscCheckSameComm(snes,1,A,2); 1070c9780b6fSBarry Smith if (B) PetscCheckSameComm(snes,1,B,2); 1071e7788613SBarry Smith if (func) snes->ops->computejacobian = func; 10723a7fca6bSBarry Smith if (ctx) snes->jacP = ctx; 10733a7fca6bSBarry Smith if (A) { 10747dcf0eaaSdalcinl ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); 10753a7fca6bSBarry Smith if (snes->jacobian) {ierr = MatDestroy(snes->jacobian);CHKERRQ(ierr);} 10769b94acceSBarry Smith snes->jacobian = A; 10773a7fca6bSBarry Smith } 10783a7fca6bSBarry Smith if (B) { 10797dcf0eaaSdalcinl ierr = PetscObjectReference((PetscObject)B);CHKERRQ(ierr); 10803a7fca6bSBarry Smith if (snes->jacobian_pre) {ierr = MatDestroy(snes->jacobian_pre);CHKERRQ(ierr);} 10819b94acceSBarry Smith snes->jacobian_pre = B; 10823a7fca6bSBarry Smith } 10833a40ed3dSBarry Smith PetscFunctionReturn(0); 10849b94acceSBarry Smith } 108562fef451SLois Curfman McInnes 10864a2ae208SSatish Balay #undef __FUNCT__ 10874a2ae208SSatish Balay #define __FUNCT__ "SNESGetJacobian" 1088c2aafc4cSSatish Balay /*@C 1089b4fd4287SBarry Smith SNESGetJacobian - Returns the Jacobian matrix and optionally the user 1090b4fd4287SBarry Smith provided context for evaluating the Jacobian. 1091b4fd4287SBarry Smith 1092c7afd0dbSLois Curfman McInnes Not Collective, but Mat object will be parallel if SNES object is 1093c7afd0dbSLois Curfman McInnes 1094b4fd4287SBarry Smith Input Parameter: 1095b4fd4287SBarry Smith . snes - the nonlinear solver context 1096b4fd4287SBarry Smith 1097b4fd4287SBarry Smith Output Parameters: 1098c7afd0dbSLois Curfman McInnes + A - location to stash Jacobian matrix (or PETSC_NULL) 1099b4fd4287SBarry Smith . B - location to stash preconditioner matrix (or PETSC_NULL) 110070e92668SMatthew Knepley . func - location to put Jacobian function (or PETSC_NULL) 110170e92668SMatthew Knepley - ctx - location to stash Jacobian ctx (or PETSC_NULL) 1102fee21e36SBarry Smith 110336851e7fSLois Curfman McInnes Level: advanced 110436851e7fSLois Curfman McInnes 1105b4fd4287SBarry Smith .seealso: SNESSetJacobian(), SNESComputeJacobian() 1106b4fd4287SBarry Smith @*/ 110770e92668SMatthew Knepley PetscErrorCode PETSCSNES_DLLEXPORT SNESGetJacobian(SNES snes,Mat *A,Mat *B,PetscErrorCode (**func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx) 1108b4fd4287SBarry Smith { 11093a40ed3dSBarry Smith PetscFunctionBegin; 11104482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 1111b4fd4287SBarry Smith if (A) *A = snes->jacobian; 1112b4fd4287SBarry Smith if (B) *B = snes->jacobian_pre; 1113e7788613SBarry Smith if (func) *func = snes->ops->computejacobian; 111470e92668SMatthew Knepley if (ctx) *ctx = snes->jacP; 11153a40ed3dSBarry Smith PetscFunctionReturn(0); 1116b4fd4287SBarry Smith } 1117b4fd4287SBarry Smith 11189b94acceSBarry Smith /* ----- Routines to initialize and destroy a nonlinear solver ---- */ 111963dd3a1aSKris Buschelman EXTERN PetscErrorCode PETSCSNES_DLLEXPORT SNESDefaultMatrixFreeCreate2(SNES,Vec,Mat*); 11209b94acceSBarry Smith 11214a2ae208SSatish Balay #undef __FUNCT__ 11224a2ae208SSatish Balay #define __FUNCT__ "SNESSetUp" 11239b94acceSBarry Smith /*@ 11249b94acceSBarry Smith SNESSetUp - Sets up the internal data structures for the later use 1125272ac6f2SLois Curfman McInnes of a nonlinear solver. 11269b94acceSBarry Smith 1127fee21e36SBarry Smith Collective on SNES 1128fee21e36SBarry Smith 1129c7afd0dbSLois Curfman McInnes Input Parameters: 113070e92668SMatthew Knepley . snes - the SNES context 1131c7afd0dbSLois Curfman McInnes 1132272ac6f2SLois Curfman McInnes Notes: 1133272ac6f2SLois Curfman McInnes For basic use of the SNES solvers the user need not explicitly call 1134272ac6f2SLois Curfman McInnes SNESSetUp(), since these actions will automatically occur during 1135272ac6f2SLois Curfman McInnes the call to SNESSolve(). However, if one wishes to control this 1136272ac6f2SLois Curfman McInnes phase separately, SNESSetUp() should be called after SNESCreate() 1137272ac6f2SLois Curfman McInnes and optional routines of the form SNESSetXXX(), but before SNESSolve(). 1138272ac6f2SLois Curfman McInnes 113936851e7fSLois Curfman McInnes Level: advanced 114036851e7fSLois Curfman McInnes 11419b94acceSBarry Smith .keywords: SNES, nonlinear, setup 11429b94acceSBarry Smith 11439b94acceSBarry Smith .seealso: SNESCreate(), SNESSolve(), SNESDestroy() 11449b94acceSBarry Smith @*/ 114570e92668SMatthew Knepley PetscErrorCode PETSCSNES_DLLEXPORT SNESSetUp(SNES snes) 11469b94acceSBarry Smith { 1147dfbe8321SBarry Smith PetscErrorCode ierr; 114871f87433Sdalcinl PetscTruth flg; 11493a40ed3dSBarry Smith 11503a40ed3dSBarry Smith PetscFunctionBegin; 11514482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 11524dc4c822SBarry Smith if (snes->setupcalled) PetscFunctionReturn(0); 11539b94acceSBarry Smith 115485385478SLisandro Dalcin if (!snes->type_name) { 115585385478SLisandro Dalcin ierr = SNESSetType(snes,SNESLS);CHKERRQ(ierr); 115685385478SLisandro Dalcin } 115785385478SLisandro Dalcin 1158b0a32e0cSBarry Smith ierr = PetscOptionsHasName(snes->prefix,"-snes_mf_operator",&flg);CHKERRQ(ierr); 1159c1f60f51SBarry Smith /* 1160c1f60f51SBarry Smith This version replaces the user provided Jacobian matrix with a 1161dfa02198SLois Curfman McInnes matrix-free version but still employs the user-provided preconditioner matrix 1162c1f60f51SBarry Smith */ 1163c1f60f51SBarry Smith if (flg) { 1164c1f60f51SBarry Smith Mat J; 1165fef1beadSBarry Smith ierr = MatCreateSNESMF(snes,&J);CHKERRQ(ierr); 11663ec795f1SBarry Smith ierr = MatMFFDSetFromOptions(J);CHKERRQ(ierr); 1167ae15b995SBarry Smith ierr = PetscInfo(snes,"Setting default matrix-free operator routines\n");CHKERRQ(ierr); 11683a7fca6bSBarry Smith ierr = SNESSetJacobian(snes,J,0,0,0);CHKERRQ(ierr); 11693a7fca6bSBarry Smith ierr = MatDestroy(J);CHKERRQ(ierr); 1170c1f60f51SBarry Smith } 117145fc7adcSBarry Smith 117203c60df9SBarry Smith #if !defined(PETSC_USE_COMPLEX) && !defined(PETSC_USE_SINGLE) && !defined(PETSC_USE_MAT_SINGLE) && !defined(PETSC_USE_LONG_DOUBLE) && !defined(PETSC_USE_INT) 117345fc7adcSBarry Smith ierr = PetscOptionsHasName(snes->prefix,"-snes_mf_operator2",&flg);CHKERRQ(ierr); 117445fc7adcSBarry Smith if (flg) { 117545fc7adcSBarry Smith Mat J; 117645fc7adcSBarry Smith ierr = SNESDefaultMatrixFreeCreate2(snes,snes->vec_sol,&J);CHKERRQ(ierr); 117775396ef9SLisandro Dalcin ierr = PetscInfo(snes,"Setting default matrix-free operator routines (version 2)\n");CHKERRQ(ierr); 117845fc7adcSBarry Smith ierr = SNESSetJacobian(snes,J,0,0,0);CHKERRQ(ierr); 117945fc7adcSBarry Smith ierr = MatDestroy(J);CHKERRQ(ierr); 118045fc7adcSBarry Smith } 118132a4b47aSMatthew Knepley #endif 118245fc7adcSBarry Smith 1183b0a32e0cSBarry Smith ierr = PetscOptionsHasName(snes->prefix,"-snes_mf",&flg);CHKERRQ(ierr); 1184c1f60f51SBarry Smith /* 1185dfa02198SLois Curfman McInnes This version replaces both the user-provided Jacobian and the user- 1186c1f60f51SBarry Smith provided preconditioner matrix with the default matrix free version. 1187c1f60f51SBarry Smith */ 118831615d04SLois Curfman McInnes if (flg) { 1189272ac6f2SLois Curfman McInnes Mat J; 1190b5d62d44SBarry Smith KSP ksp; 119194b7f48cSBarry Smith PC pc; 119275396ef9SLisandro Dalcin /* create and set matrix-free operator */ 1193fef1beadSBarry Smith ierr = MatCreateSNESMF(snes,&J);CHKERRQ(ierr); 11943ec795f1SBarry Smith ierr = MatMFFDSetFromOptions(J);CHKERRQ(ierr); 119575396ef9SLisandro Dalcin ierr = PetscInfo(snes,"Setting default matrix-free operator routines\n");CHKERRQ(ierr); 11963ec795f1SBarry Smith ierr = SNESSetJacobian(snes,J,J,MatMFFDComputeJacobian,snes->funP);CHKERRQ(ierr); 11973a7fca6bSBarry Smith ierr = MatDestroy(J);CHKERRQ(ierr); 1198f3ef73ceSBarry Smith /* force no preconditioner */ 119994b7f48cSBarry Smith ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr); 1200b5d62d44SBarry Smith ierr = KSPGetPC(ksp,&pc);CHKERRQ(ierr); 1201a9815358SBarry Smith ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr); 1202a9815358SBarry Smith if (!flg) { 120375396ef9SLisandro Dalcin ierr = PetscInfo(snes,"Setting default matrix-free preconditioner routines;\nThat is no preconditioner is being used\n");CHKERRQ(ierr); 1204f3ef73ceSBarry Smith ierr = PCSetType(pc,PCNONE);CHKERRQ(ierr); 1205272ac6f2SLois Curfman McInnes } 1206a9815358SBarry Smith } 1207f3ef73ceSBarry Smith 120885385478SLisandro Dalcin if (!snes->vec_func && !snes->vec_rhs) { 12091096aae1SMatthew Knepley SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetFunction() first"); 12101096aae1SMatthew Knepley } 121185385478SLisandro Dalcin if (!snes->ops->computefunction && !snes->vec_rhs) { 12121096aae1SMatthew Knepley SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetFunction() first"); 12131096aae1SMatthew Knepley } 121475396ef9SLisandro Dalcin if (!snes->jacobian) { 121575396ef9SLisandro Dalcin SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetJacobian() first \n or use -snes_mf option"); 121675396ef9SLisandro Dalcin } 1217a8c6a408SBarry Smith if (snes->vec_func == snes->vec_sol) { 121829bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_IDN,"Solution vector cannot be function vector"); 1219a8c6a408SBarry Smith } 1220a703fe33SLois Curfman McInnes 1221410397dcSLisandro Dalcin if (snes->ops->setup) { 1222410397dcSLisandro Dalcin ierr = (*snes->ops->setup)(snes);CHKERRQ(ierr); 1223410397dcSLisandro Dalcin } 12247aaed0d8SBarry Smith snes->setupcalled = PETSC_TRUE; 12253a40ed3dSBarry Smith PetscFunctionReturn(0); 12269b94acceSBarry Smith } 12279b94acceSBarry Smith 12284a2ae208SSatish Balay #undef __FUNCT__ 12294a2ae208SSatish Balay #define __FUNCT__ "SNESDestroy" 123052baeb72SSatish Balay /*@ 12319b94acceSBarry Smith SNESDestroy - Destroys the nonlinear solver context that was created 12329b94acceSBarry Smith with SNESCreate(). 12339b94acceSBarry Smith 1234c7afd0dbSLois Curfman McInnes Collective on SNES 1235c7afd0dbSLois Curfman McInnes 12369b94acceSBarry Smith Input Parameter: 12379b94acceSBarry Smith . snes - the SNES context 12389b94acceSBarry Smith 123936851e7fSLois Curfman McInnes Level: beginner 124036851e7fSLois Curfman McInnes 12419b94acceSBarry Smith .keywords: SNES, nonlinear, destroy 12429b94acceSBarry Smith 124363a78c88SLois Curfman McInnes .seealso: SNESCreate(), SNESSolve() 12449b94acceSBarry Smith @*/ 124563dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESDestroy(SNES snes) 12469b94acceSBarry Smith { 12476849ba73SBarry Smith PetscErrorCode ierr; 12483a40ed3dSBarry Smith 12493a40ed3dSBarry Smith PetscFunctionBegin; 12504482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 12513a40ed3dSBarry Smith if (--snes->refct > 0) PetscFunctionReturn(0); 1252d4bb536fSBarry Smith 1253be0abb6dSBarry Smith /* if memory was published with AMS then destroy it */ 12540f5bd95cSBarry Smith ierr = PetscObjectDepublish(snes);CHKERRQ(ierr); 1255e7788613SBarry Smith if (snes->ops->destroy) {ierr = (*(snes)->ops->destroy)(snes);CHKERRQ(ierr);} 125685385478SLisandro Dalcin 125785385478SLisandro Dalcin if (snes->vec_rhs) {ierr = VecDestroy(snes->vec_rhs);CHKERRQ(ierr);} 125885385478SLisandro Dalcin if (snes->vec_sol) {ierr = VecDestroy(snes->vec_sol);CHKERRQ(ierr);} 125985385478SLisandro Dalcin if (snes->vec_func) {ierr = VecDestroy(snes->vec_func);CHKERRQ(ierr);} 12603a7fca6bSBarry Smith if (snes->jacobian) {ierr = MatDestroy(snes->jacobian);CHKERRQ(ierr);} 12613a7fca6bSBarry Smith if (snes->jacobian_pre) {ierr = MatDestroy(snes->jacobian_pre);CHKERRQ(ierr);} 126294b7f48cSBarry Smith ierr = KSPDestroy(snes->ksp);CHKERRQ(ierr); 126385385478SLisandro Dalcin ierr = PetscFree(snes->kspconvctx);CHKERRQ(ierr); 1264522c5e43SBarry Smith if (snes->vwork) {ierr = VecDestroyVecs(snes->vwork,snes->nvwork);CHKERRQ(ierr);} 1265a6570f20SBarry Smith ierr = SNESMonitorCancel(snes);CHKERRQ(ierr); 1266a79aaaedSSatish Balay ierr = PetscHeaderDestroy(snes);CHKERRQ(ierr); 12673a40ed3dSBarry Smith PetscFunctionReturn(0); 12689b94acceSBarry Smith } 12699b94acceSBarry Smith 12709b94acceSBarry Smith /* ----------- Routines to set solver parameters ---------- */ 12719b94acceSBarry Smith 12724a2ae208SSatish Balay #undef __FUNCT__ 12734a2ae208SSatish Balay #define __FUNCT__ "SNESSetTolerances" 12749b94acceSBarry Smith /*@ 1275d7a720efSLois Curfman McInnes SNESSetTolerances - Sets various parameters used in convergence tests. 12769b94acceSBarry Smith 1277c7afd0dbSLois Curfman McInnes Collective on SNES 1278c7afd0dbSLois Curfman McInnes 12799b94acceSBarry Smith Input Parameters: 1280c7afd0dbSLois Curfman McInnes + snes - the SNES context 128170441072SBarry Smith . abstol - absolute convergence tolerance 128233174efeSLois Curfman McInnes . rtol - relative convergence tolerance 128333174efeSLois Curfman McInnes . stol - convergence tolerance in terms of the norm 128433174efeSLois Curfman McInnes of the change in the solution between steps 128533174efeSLois Curfman McInnes . maxit - maximum number of iterations 1286c7afd0dbSLois Curfman McInnes - maxf - maximum number of function evaluations 1287fee21e36SBarry Smith 128833174efeSLois Curfman McInnes Options Database Keys: 128970441072SBarry Smith + -snes_atol <abstol> - Sets abstol 1290c7afd0dbSLois Curfman McInnes . -snes_rtol <rtol> - Sets rtol 1291c7afd0dbSLois Curfman McInnes . -snes_stol <stol> - Sets stol 1292c7afd0dbSLois Curfman McInnes . -snes_max_it <maxit> - Sets maxit 1293c7afd0dbSLois Curfman McInnes - -snes_max_funcs <maxf> - Sets maxf 12949b94acceSBarry Smith 1295d7a720efSLois Curfman McInnes Notes: 12969b94acceSBarry Smith The default maximum number of iterations is 50. 12979b94acceSBarry Smith The default maximum number of function evaluations is 1000. 12989b94acceSBarry Smith 129936851e7fSLois Curfman McInnes Level: intermediate 130036851e7fSLois Curfman McInnes 130133174efeSLois Curfman McInnes .keywords: SNES, nonlinear, set, convergence, tolerances 13029b94acceSBarry Smith 13032492ecdbSBarry Smith .seealso: SNESSetTrustRegionTolerance() 13049b94acceSBarry Smith @*/ 130563dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESSetTolerances(SNES snes,PetscReal abstol,PetscReal rtol,PetscReal stol,PetscInt maxit,PetscInt maxf) 13069b94acceSBarry Smith { 13073a40ed3dSBarry Smith PetscFunctionBegin; 13084482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 130970441072SBarry Smith if (abstol != PETSC_DEFAULT) snes->abstol = abstol; 1310d7a720efSLois Curfman McInnes if (rtol != PETSC_DEFAULT) snes->rtol = rtol; 1311d7a720efSLois Curfman McInnes if (stol != PETSC_DEFAULT) snes->xtol = stol; 1312d7a720efSLois Curfman McInnes if (maxit != PETSC_DEFAULT) snes->max_its = maxit; 1313d7a720efSLois Curfman McInnes if (maxf != PETSC_DEFAULT) snes->max_funcs = maxf; 13143a40ed3dSBarry Smith PetscFunctionReturn(0); 13159b94acceSBarry Smith } 13169b94acceSBarry Smith 13174a2ae208SSatish Balay #undef __FUNCT__ 13184a2ae208SSatish Balay #define __FUNCT__ "SNESGetTolerances" 13199b94acceSBarry Smith /*@ 132033174efeSLois Curfman McInnes SNESGetTolerances - Gets various parameters used in convergence tests. 132133174efeSLois Curfman McInnes 1322c7afd0dbSLois Curfman McInnes Not Collective 1323c7afd0dbSLois Curfman McInnes 132433174efeSLois Curfman McInnes Input Parameters: 1325c7afd0dbSLois Curfman McInnes + snes - the SNES context 132685385478SLisandro Dalcin . atol - absolute convergence tolerance 132733174efeSLois Curfman McInnes . rtol - relative convergence tolerance 132833174efeSLois Curfman McInnes . stol - convergence tolerance in terms of the norm 132933174efeSLois Curfman McInnes of the change in the solution between steps 133033174efeSLois Curfman McInnes . maxit - maximum number of iterations 1331c7afd0dbSLois Curfman McInnes - maxf - maximum number of function evaluations 1332fee21e36SBarry Smith 133333174efeSLois Curfman McInnes Notes: 133433174efeSLois Curfman McInnes The user can specify PETSC_NULL for any parameter that is not needed. 133533174efeSLois Curfman McInnes 133636851e7fSLois Curfman McInnes Level: intermediate 133736851e7fSLois Curfman McInnes 133833174efeSLois Curfman McInnes .keywords: SNES, nonlinear, get, convergence, tolerances 133933174efeSLois Curfman McInnes 134033174efeSLois Curfman McInnes .seealso: SNESSetTolerances() 134133174efeSLois Curfman McInnes @*/ 134285385478SLisandro Dalcin PetscErrorCode PETSCSNES_DLLEXPORT SNESGetTolerances(SNES snes,PetscReal *atol,PetscReal *rtol,PetscReal *stol,PetscInt *maxit,PetscInt *maxf) 134333174efeSLois Curfman McInnes { 13443a40ed3dSBarry Smith PetscFunctionBegin; 13454482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 134685385478SLisandro Dalcin if (atol) *atol = snes->abstol; 134733174efeSLois Curfman McInnes if (rtol) *rtol = snes->rtol; 134833174efeSLois Curfman McInnes if (stol) *stol = snes->xtol; 134933174efeSLois Curfman McInnes if (maxit) *maxit = snes->max_its; 135033174efeSLois Curfman McInnes if (maxf) *maxf = snes->max_funcs; 13513a40ed3dSBarry Smith PetscFunctionReturn(0); 135233174efeSLois Curfman McInnes } 135333174efeSLois Curfman McInnes 13544a2ae208SSatish Balay #undef __FUNCT__ 13554a2ae208SSatish Balay #define __FUNCT__ "SNESSetTrustRegionTolerance" 135633174efeSLois Curfman McInnes /*@ 13579b94acceSBarry Smith SNESSetTrustRegionTolerance - Sets the trust region parameter tolerance. 13589b94acceSBarry Smith 1359fee21e36SBarry Smith Collective on SNES 1360fee21e36SBarry Smith 1361c7afd0dbSLois Curfman McInnes Input Parameters: 1362c7afd0dbSLois Curfman McInnes + snes - the SNES context 1363c7afd0dbSLois Curfman McInnes - tol - tolerance 1364c7afd0dbSLois Curfman McInnes 13659b94acceSBarry Smith Options Database Key: 1366c7afd0dbSLois Curfman McInnes . -snes_trtol <tol> - Sets tol 13679b94acceSBarry Smith 136836851e7fSLois Curfman McInnes Level: intermediate 136936851e7fSLois Curfman McInnes 13709b94acceSBarry Smith .keywords: SNES, nonlinear, set, trust region, tolerance 13719b94acceSBarry Smith 13722492ecdbSBarry Smith .seealso: SNESSetTolerances() 13739b94acceSBarry Smith @*/ 137463dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESSetTrustRegionTolerance(SNES snes,PetscReal tol) 13759b94acceSBarry Smith { 13763a40ed3dSBarry Smith PetscFunctionBegin; 13774482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 13789b94acceSBarry Smith snes->deltatol = tol; 13793a40ed3dSBarry Smith PetscFunctionReturn(0); 13809b94acceSBarry Smith } 13819b94acceSBarry Smith 1382df9fa365SBarry Smith /* 1383df9fa365SBarry Smith Duplicate the lg monitors for SNES from KSP; for some reason with 1384df9fa365SBarry Smith dynamic libraries things don't work under Sun4 if we just use 1385df9fa365SBarry Smith macros instead of functions 1386df9fa365SBarry Smith */ 13874a2ae208SSatish Balay #undef __FUNCT__ 1388a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorLG" 1389a6570f20SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorLG(SNES snes,PetscInt it,PetscReal norm,void *ctx) 1390ce1608b8SBarry Smith { 1391dfbe8321SBarry Smith PetscErrorCode ierr; 1392ce1608b8SBarry Smith 1393ce1608b8SBarry Smith PetscFunctionBegin; 13944482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 1395a6570f20SBarry Smith ierr = KSPMonitorLG((KSP)snes,it,norm,ctx);CHKERRQ(ierr); 1396ce1608b8SBarry Smith PetscFunctionReturn(0); 1397ce1608b8SBarry Smith } 1398ce1608b8SBarry Smith 13994a2ae208SSatish Balay #undef __FUNCT__ 1400a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorLGCreate" 1401a6570f20SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorLGCreate(const char host[],const char label[],int x,int y,int m,int n,PetscDrawLG *draw) 1402df9fa365SBarry Smith { 1403dfbe8321SBarry Smith PetscErrorCode ierr; 1404df9fa365SBarry Smith 1405df9fa365SBarry Smith PetscFunctionBegin; 1406a6570f20SBarry Smith ierr = KSPMonitorLGCreate(host,label,x,y,m,n,draw);CHKERRQ(ierr); 1407df9fa365SBarry Smith PetscFunctionReturn(0); 1408df9fa365SBarry Smith } 1409df9fa365SBarry Smith 14104a2ae208SSatish Balay #undef __FUNCT__ 1411a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorLGDestroy" 1412a6570f20SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorLGDestroy(PetscDrawLG draw) 1413df9fa365SBarry Smith { 1414dfbe8321SBarry Smith PetscErrorCode ierr; 1415df9fa365SBarry Smith 1416df9fa365SBarry Smith PetscFunctionBegin; 1417a6570f20SBarry Smith ierr = KSPMonitorLGDestroy(draw);CHKERRQ(ierr); 1418df9fa365SBarry Smith PetscFunctionReturn(0); 1419df9fa365SBarry Smith } 1420df9fa365SBarry Smith 14219b94acceSBarry Smith /* ------------ Routines to set performance monitoring options ----------- */ 14229b94acceSBarry Smith 14234a2ae208SSatish Balay #undef __FUNCT__ 1424a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorSet" 14259b94acceSBarry Smith /*@C 1426a6570f20SBarry Smith SNESMonitorSet - Sets an ADDITIONAL function that is to be used at every 14279b94acceSBarry Smith iteration of the nonlinear solver to display the iteration's 14289b94acceSBarry Smith progress. 14299b94acceSBarry Smith 1430fee21e36SBarry Smith Collective on SNES 1431fee21e36SBarry Smith 1432c7afd0dbSLois Curfman McInnes Input Parameters: 1433c7afd0dbSLois Curfman McInnes + snes - the SNES context 1434c7afd0dbSLois Curfman McInnes . func - monitoring routine 1435b8a78c4aSBarry Smith . mctx - [optional] user-defined context for private data for the 1436e8105e01SRichard Katz monitor routine (use PETSC_NULL if no context is desired) 1437b3006f0bSLois Curfman McInnes - monitordestroy - [optional] routine that frees monitor context 1438b3006f0bSLois Curfman McInnes (may be PETSC_NULL) 14399b94acceSBarry Smith 1440c7afd0dbSLois Curfman McInnes Calling sequence of func: 1441a7cc72afSBarry Smith $ int func(SNES snes,PetscInt its, PetscReal norm,void *mctx) 1442c7afd0dbSLois Curfman McInnes 1443c7afd0dbSLois Curfman McInnes + snes - the SNES context 1444c7afd0dbSLois Curfman McInnes . its - iteration number 1445c7afd0dbSLois Curfman McInnes . norm - 2-norm function value (may be estimated) 144640a0c1c6SLois Curfman McInnes - mctx - [optional] monitoring context 14479b94acceSBarry Smith 14489665c990SLois Curfman McInnes Options Database Keys: 1449a6570f20SBarry Smith + -snes_monitor - sets SNESMonitorDefault() 1450a6570f20SBarry Smith . -snes_monitor_draw - sets line graph monitor, 1451a6570f20SBarry Smith uses SNESMonitorLGCreate() 1452a6570f20SBarry Smith _ -snes_monitor_cancel - cancels all monitors that have 1453c7afd0dbSLois Curfman McInnes been hardwired into a code by 1454a6570f20SBarry Smith calls to SNESMonitorSet(), but 1455c7afd0dbSLois Curfman McInnes does not cancel those set via 1456c7afd0dbSLois Curfman McInnes the options database. 14579665c990SLois Curfman McInnes 1458639f9d9dSBarry Smith Notes: 14596bc08f3fSLois Curfman McInnes Several different monitoring routines may be set by calling 1460a6570f20SBarry Smith SNESMonitorSet() multiple times; all will be called in the 14616bc08f3fSLois Curfman McInnes order in which they were set. 1462639f9d9dSBarry Smith 146336851e7fSLois Curfman McInnes Level: intermediate 146436851e7fSLois Curfman McInnes 14659b94acceSBarry Smith .keywords: SNES, nonlinear, set, monitor 14669b94acceSBarry Smith 1467a6570f20SBarry Smith .seealso: SNESMonitorDefault(), SNESMonitorCancel() 14689b94acceSBarry Smith @*/ 1469b90d0a6eSBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorSet(SNES snes,PetscErrorCode (*monitor)(SNES,PetscInt,PetscReal,void*),void *mctx,PetscErrorCode (*monitordestroy)(void*)) 14709b94acceSBarry Smith { 1471b90d0a6eSBarry Smith PetscInt i; 1472b90d0a6eSBarry Smith 14733a40ed3dSBarry Smith PetscFunctionBegin; 14744482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 1475639f9d9dSBarry Smith if (snes->numbermonitors >= MAXSNESMONITORS) { 147629bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Too many monitors set"); 1477639f9d9dSBarry Smith } 1478b90d0a6eSBarry Smith for (i=0; i<snes->numbermonitors;i++) { 1479b90d0a6eSBarry Smith if (monitor == snes->monitor[i] && monitordestroy == snes->monitordestroy[i] && mctx == snes->monitorcontext[i]) PetscFunctionReturn(0); 1480b90d0a6eSBarry Smith 1481b90d0a6eSBarry Smith /* check if both default monitors that share common ASCII viewer */ 1482b90d0a6eSBarry Smith if (monitor == snes->monitor[i] && monitor == SNESMonitorDefault) { 1483b90d0a6eSBarry Smith if (mctx && snes->monitorcontext[i]) { 1484b90d0a6eSBarry Smith PetscErrorCode ierr; 1485b90d0a6eSBarry Smith PetscViewerASCIIMonitor viewer1 = (PetscViewerASCIIMonitor) mctx; 1486b90d0a6eSBarry Smith PetscViewerASCIIMonitor viewer2 = (PetscViewerASCIIMonitor) snes->monitorcontext[i]; 1487b90d0a6eSBarry Smith if (viewer1->viewer == viewer2->viewer) { 1488b90d0a6eSBarry Smith ierr = (*monitordestroy)(mctx);CHKERRQ(ierr); 1489b90d0a6eSBarry Smith PetscFunctionReturn(0); 1490b90d0a6eSBarry Smith } 1491b90d0a6eSBarry Smith } 1492b90d0a6eSBarry Smith } 1493b90d0a6eSBarry Smith } 1494b90d0a6eSBarry Smith snes->monitor[snes->numbermonitors] = monitor; 1495b8a78c4aSBarry Smith snes->monitordestroy[snes->numbermonitors] = monitordestroy; 1496639f9d9dSBarry Smith snes->monitorcontext[snes->numbermonitors++] = (void*)mctx; 14973a40ed3dSBarry Smith PetscFunctionReturn(0); 14989b94acceSBarry Smith } 14999b94acceSBarry Smith 15004a2ae208SSatish Balay #undef __FUNCT__ 1501a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorCancel" 15025cd90555SBarry Smith /*@C 1503a6570f20SBarry Smith SNESMonitorCancel - Clears all the monitor functions for a SNES object. 15045cd90555SBarry Smith 1505c7afd0dbSLois Curfman McInnes Collective on SNES 1506c7afd0dbSLois Curfman McInnes 15075cd90555SBarry Smith Input Parameters: 15085cd90555SBarry Smith . snes - the SNES context 15095cd90555SBarry Smith 15101a480d89SAdministrator Options Database Key: 1511a6570f20SBarry Smith . -snes_monitor_cancel - cancels all monitors that have been hardwired 1512a6570f20SBarry Smith into a code by calls to SNESMonitorSet(), but does not cancel those 1513c7afd0dbSLois Curfman McInnes set via the options database 15145cd90555SBarry Smith 15155cd90555SBarry Smith Notes: 15165cd90555SBarry Smith There is no way to clear one specific monitor from a SNES object. 15175cd90555SBarry Smith 151836851e7fSLois Curfman McInnes Level: intermediate 151936851e7fSLois Curfman McInnes 15205cd90555SBarry Smith .keywords: SNES, nonlinear, set, monitor 15215cd90555SBarry Smith 1522a6570f20SBarry Smith .seealso: SNESMonitorDefault(), SNESMonitorSet() 15235cd90555SBarry Smith @*/ 1524a6570f20SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorCancel(SNES snes) 15255cd90555SBarry Smith { 1526d952e501SBarry Smith PetscErrorCode ierr; 1527d952e501SBarry Smith PetscInt i; 1528d952e501SBarry Smith 15295cd90555SBarry Smith PetscFunctionBegin; 15304482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 1531d952e501SBarry Smith for (i=0; i<snes->numbermonitors; i++) { 1532d952e501SBarry Smith if (snes->monitordestroy[i]) { 1533d952e501SBarry Smith ierr = (*snes->monitordestroy[i])(snes->monitorcontext[i]);CHKERRQ(ierr); 1534d952e501SBarry Smith } 1535d952e501SBarry Smith } 15365cd90555SBarry Smith snes->numbermonitors = 0; 15375cd90555SBarry Smith PetscFunctionReturn(0); 15385cd90555SBarry Smith } 15395cd90555SBarry Smith 15404a2ae208SSatish Balay #undef __FUNCT__ 15414a2ae208SSatish Balay #define __FUNCT__ "SNESSetConvergenceTest" 15429b94acceSBarry Smith /*@C 15439b94acceSBarry Smith SNESSetConvergenceTest - Sets the function that is to be used 15449b94acceSBarry Smith to test for convergence of the nonlinear iterative solution. 15459b94acceSBarry Smith 1546fee21e36SBarry Smith Collective on SNES 1547fee21e36SBarry Smith 1548c7afd0dbSLois Curfman McInnes Input Parameters: 1549c7afd0dbSLois Curfman McInnes + snes - the SNES context 1550c7afd0dbSLois Curfman McInnes . func - routine to test for convergence 1551c7afd0dbSLois Curfman McInnes - cctx - [optional] context for private data for the convergence routine 1552c7afd0dbSLois Curfman McInnes (may be PETSC_NULL) 15539b94acceSBarry Smith 1554c7afd0dbSLois Curfman McInnes Calling sequence of func: 155506ee9f85SBarry Smith $ PetscErrorCode func (SNES snes,PetscInt it,PetscReal xnorm,PetscReal gnorm,PetscReal f,SNESConvergedReason *reason,void *cctx) 1556c7afd0dbSLois Curfman McInnes 1557c7afd0dbSLois Curfman McInnes + snes - the SNES context 155806ee9f85SBarry Smith . it - current iteration (0 is the first and is before any Newton step) 1559c7afd0dbSLois Curfman McInnes . cctx - [optional] convergence context 1560184914b5SBarry Smith . reason - reason for convergence/divergence 1561c7afd0dbSLois Curfman McInnes . xnorm - 2-norm of current iterate 15624b27c08aSLois Curfman McInnes . gnorm - 2-norm of current step 15634b27c08aSLois Curfman McInnes - f - 2-norm of function 15649b94acceSBarry Smith 156536851e7fSLois Curfman McInnes Level: advanced 156636851e7fSLois Curfman McInnes 15679b94acceSBarry Smith .keywords: SNES, nonlinear, set, convergence, test 15689b94acceSBarry Smith 156985385478SLisandro Dalcin .seealso: SNESDefaultConverged(), SNESSkipConverged() 15709b94acceSBarry Smith @*/ 157106ee9f85SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESSetConvergenceTest(SNES snes,PetscErrorCode (*func)(SNES,PetscInt,PetscReal,PetscReal,PetscReal,SNESConvergedReason*,void*),void *cctx) 15729b94acceSBarry Smith { 15733a40ed3dSBarry Smith PetscFunctionBegin; 15744482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 157585385478SLisandro Dalcin if (!func) func = SNESSkipConverged; 157685385478SLisandro Dalcin snes->ops->converged = func; 157785385478SLisandro Dalcin snes->cnvP = cctx; 15783a40ed3dSBarry Smith PetscFunctionReturn(0); 15799b94acceSBarry Smith } 15809b94acceSBarry Smith 15814a2ae208SSatish Balay #undef __FUNCT__ 15824a2ae208SSatish Balay #define __FUNCT__ "SNESGetConvergedReason" 158352baeb72SSatish Balay /*@ 1584184914b5SBarry Smith SNESGetConvergedReason - Gets the reason the SNES iteration was stopped. 1585184914b5SBarry Smith 1586184914b5SBarry Smith Not Collective 1587184914b5SBarry Smith 1588184914b5SBarry Smith Input Parameter: 1589184914b5SBarry Smith . snes - the SNES context 1590184914b5SBarry Smith 1591184914b5SBarry Smith Output Parameter: 1592e090d566SSatish Balay . reason - negative value indicates diverged, positive value converged, see petscsnes.h or the 1593184914b5SBarry Smith manual pages for the individual convergence tests for complete lists 1594184914b5SBarry Smith 1595184914b5SBarry Smith Level: intermediate 1596184914b5SBarry Smith 1597184914b5SBarry Smith Notes: Can only be called after the call the SNESSolve() is complete. 1598184914b5SBarry Smith 1599184914b5SBarry Smith .keywords: SNES, nonlinear, set, convergence, test 1600184914b5SBarry Smith 160185385478SLisandro Dalcin .seealso: SNESSetConvergenceTest(), SNESConvergedReason 1602184914b5SBarry Smith @*/ 160363dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESGetConvergedReason(SNES snes,SNESConvergedReason *reason) 1604184914b5SBarry Smith { 1605184914b5SBarry Smith PetscFunctionBegin; 16064482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 16074482741eSBarry Smith PetscValidPointer(reason,2); 1608184914b5SBarry Smith *reason = snes->reason; 1609184914b5SBarry Smith PetscFunctionReturn(0); 1610184914b5SBarry Smith } 1611184914b5SBarry Smith 16124a2ae208SSatish Balay #undef __FUNCT__ 16134a2ae208SSatish Balay #define __FUNCT__ "SNESSetConvergenceHistory" 1614c9005455SLois Curfman McInnes /*@ 1615c9005455SLois Curfman McInnes SNESSetConvergenceHistory - Sets the array used to hold the convergence history. 1616c9005455SLois Curfman McInnes 1617fee21e36SBarry Smith Collective on SNES 1618fee21e36SBarry Smith 1619c7afd0dbSLois Curfman McInnes Input Parameters: 1620c7afd0dbSLois Curfman McInnes + snes - iterative context obtained from SNESCreate() 1621c7afd0dbSLois Curfman McInnes . a - array to hold history 1622cd5578b5SBarry Smith . its - integer array holds the number of linear iterations for each solve. 1623758f92a0SBarry Smith . na - size of a and its 162464731454SLois Curfman McInnes - reset - PETSC_TRUE indicates each new nonlinear solve resets the history counter to zero, 1625758f92a0SBarry Smith else it continues storing new values for new nonlinear solves after the old ones 1626c7afd0dbSLois Curfman McInnes 1627c9005455SLois Curfman McInnes Notes: 16284b27c08aSLois Curfman McInnes If set, this array will contain the function norms computed 1629c9005455SLois Curfman McInnes at each step. 1630c9005455SLois Curfman McInnes 1631c9005455SLois Curfman McInnes This routine is useful, e.g., when running a code for purposes 1632c9005455SLois Curfman McInnes of accurate performance monitoring, when no I/O should be done 1633c9005455SLois Curfman McInnes during the section of code that is being timed. 1634c9005455SLois Curfman McInnes 163536851e7fSLois Curfman McInnes Level: intermediate 163636851e7fSLois Curfman McInnes 1637c9005455SLois Curfman McInnes .keywords: SNES, set, convergence, history 1638758f92a0SBarry Smith 163908405cd6SLois Curfman McInnes .seealso: SNESGetConvergenceHistory() 1640758f92a0SBarry Smith 1641c9005455SLois Curfman McInnes @*/ 1642a562a398SLisandro Dalcin PetscErrorCode PETSCSNES_DLLEXPORT SNESSetConvergenceHistory(SNES snes,PetscReal a[],PetscInt its[],PetscInt na,PetscTruth reset) 1643c9005455SLois Curfman McInnes { 16443a40ed3dSBarry Smith PetscFunctionBegin; 16454482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 16464482741eSBarry Smith if (na) PetscValidScalarPointer(a,2); 1647a562a398SLisandro Dalcin if (its) PetscValidIntPointer(its,3); 1648c9005455SLois Curfman McInnes snes->conv_hist = a; 1649758f92a0SBarry Smith snes->conv_hist_its = its; 1650758f92a0SBarry Smith snes->conv_hist_max = na; 1651758f92a0SBarry Smith snes->conv_hist_reset = reset; 1652758f92a0SBarry Smith PetscFunctionReturn(0); 1653758f92a0SBarry Smith } 1654758f92a0SBarry Smith 16554a2ae208SSatish Balay #undef __FUNCT__ 16564a2ae208SSatish Balay #define __FUNCT__ "SNESGetConvergenceHistory" 16570c4c9dddSBarry Smith /*@C 1658758f92a0SBarry Smith SNESGetConvergenceHistory - Gets the array used to hold the convergence history. 1659758f92a0SBarry Smith 1660758f92a0SBarry Smith Collective on SNES 1661758f92a0SBarry Smith 1662758f92a0SBarry Smith Input Parameter: 1663758f92a0SBarry Smith . snes - iterative context obtained from SNESCreate() 1664758f92a0SBarry Smith 1665758f92a0SBarry Smith Output Parameters: 1666758f92a0SBarry Smith . a - array to hold history 1667758f92a0SBarry Smith . its - integer array holds the number of linear iterations (or 1668758f92a0SBarry Smith negative if not converged) for each solve. 1669758f92a0SBarry Smith - na - size of a and its 1670758f92a0SBarry Smith 1671758f92a0SBarry Smith Notes: 1672758f92a0SBarry Smith The calling sequence for this routine in Fortran is 1673758f92a0SBarry Smith $ call SNESGetConvergenceHistory(SNES snes, integer na, integer ierr) 1674758f92a0SBarry Smith 1675758f92a0SBarry Smith This routine is useful, e.g., when running a code for purposes 1676758f92a0SBarry Smith of accurate performance monitoring, when no I/O should be done 1677758f92a0SBarry Smith during the section of code that is being timed. 1678758f92a0SBarry Smith 1679758f92a0SBarry Smith Level: intermediate 1680758f92a0SBarry Smith 1681758f92a0SBarry Smith .keywords: SNES, get, convergence, history 1682758f92a0SBarry Smith 1683758f92a0SBarry Smith .seealso: SNESSetConvergencHistory() 1684758f92a0SBarry Smith 1685758f92a0SBarry Smith @*/ 168663dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESGetConvergenceHistory(SNES snes,PetscReal *a[],PetscInt *its[],PetscInt *na) 1687758f92a0SBarry Smith { 1688758f92a0SBarry Smith PetscFunctionBegin; 16894482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 1690758f92a0SBarry Smith if (a) *a = snes->conv_hist; 1691758f92a0SBarry Smith if (its) *its = snes->conv_hist_its; 1692758f92a0SBarry Smith if (na) *na = snes->conv_hist_len; 16933a40ed3dSBarry Smith PetscFunctionReturn(0); 1694c9005455SLois Curfman McInnes } 1695c9005455SLois Curfman McInnes 1696e74ef692SMatthew Knepley #undef __FUNCT__ 1697e74ef692SMatthew Knepley #define __FUNCT__ "SNESSetUpdate" 1698ac226902SBarry Smith /*@C 169976b2cf59SMatthew Knepley SNESSetUpdate - Sets the general-purpose update function called 17007e4bb74cSBarry Smith at the beginning o every iteration of the nonlinear solve. Specifically 17017e4bb74cSBarry Smith it is called just before the Jacobian is "evaluated". 170276b2cf59SMatthew Knepley 170376b2cf59SMatthew Knepley Collective on SNES 170476b2cf59SMatthew Knepley 170576b2cf59SMatthew Knepley Input Parameters: 170676b2cf59SMatthew Knepley . snes - The nonlinear solver context 170776b2cf59SMatthew Knepley . func - The function 170876b2cf59SMatthew Knepley 170976b2cf59SMatthew Knepley Calling sequence of func: 1710b5d30489SBarry Smith . func (SNES snes, PetscInt step); 171176b2cf59SMatthew Knepley 171276b2cf59SMatthew Knepley . step - The current step of the iteration 171376b2cf59SMatthew Knepley 171476b2cf59SMatthew Knepley Level: intermediate 171576b2cf59SMatthew Knepley 171676b2cf59SMatthew Knepley .keywords: SNES, update 1717b5d30489SBarry Smith 171885385478SLisandro Dalcin .seealso SNESDefaultUpdate(), SNESSetJacobian(), SNESSolve() 171976b2cf59SMatthew Knepley @*/ 172063dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESSetUpdate(SNES snes, PetscErrorCode (*func)(SNES, PetscInt)) 172176b2cf59SMatthew Knepley { 172276b2cf59SMatthew Knepley PetscFunctionBegin; 17234482741eSBarry Smith PetscValidHeaderSpecific(snes, SNES_COOKIE,1); 1724e7788613SBarry Smith snes->ops->update = func; 172576b2cf59SMatthew Knepley PetscFunctionReturn(0); 172676b2cf59SMatthew Knepley } 172776b2cf59SMatthew Knepley 1728e74ef692SMatthew Knepley #undef __FUNCT__ 1729e74ef692SMatthew Knepley #define __FUNCT__ "SNESDefaultUpdate" 173076b2cf59SMatthew Knepley /*@ 173176b2cf59SMatthew Knepley SNESDefaultUpdate - The default update function which does nothing. 173276b2cf59SMatthew Knepley 173376b2cf59SMatthew Knepley Not collective 173476b2cf59SMatthew Knepley 173576b2cf59SMatthew Knepley Input Parameters: 173676b2cf59SMatthew Knepley . snes - The nonlinear solver context 173776b2cf59SMatthew Knepley . step - The current step of the iteration 173876b2cf59SMatthew Knepley 1739205452f4SMatthew Knepley Level: intermediate 1740205452f4SMatthew Knepley 174176b2cf59SMatthew Knepley .keywords: SNES, update 1742a6570f20SBarry Smith .seealso SNESSetUpdate(), SNESDefaultRhsBC(), SNESDefaultShortolutionBC() 174376b2cf59SMatthew Knepley @*/ 174463dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESDefaultUpdate(SNES snes, PetscInt step) 174576b2cf59SMatthew Knepley { 174676b2cf59SMatthew Knepley PetscFunctionBegin; 174776b2cf59SMatthew Knepley PetscFunctionReturn(0); 174876b2cf59SMatthew Knepley } 174976b2cf59SMatthew Knepley 17504a2ae208SSatish Balay #undef __FUNCT__ 17514a2ae208SSatish Balay #define __FUNCT__ "SNESScaleStep_Private" 17529b94acceSBarry Smith /* 17539b94acceSBarry Smith SNESScaleStep_Private - Scales a step so that its length is less than the 17549b94acceSBarry Smith positive parameter delta. 17559b94acceSBarry Smith 17569b94acceSBarry Smith Input Parameters: 1757c7afd0dbSLois Curfman McInnes + snes - the SNES context 17589b94acceSBarry Smith . y - approximate solution of linear system 17599b94acceSBarry Smith . fnorm - 2-norm of current function 1760c7afd0dbSLois Curfman McInnes - delta - trust region size 17619b94acceSBarry Smith 17629b94acceSBarry Smith Output Parameters: 1763c7afd0dbSLois Curfman McInnes + gpnorm - predicted function norm at the new point, assuming local 17649b94acceSBarry Smith linearization. The value is zero if the step lies within the trust 17659b94acceSBarry Smith region, and exceeds zero otherwise. 1766c7afd0dbSLois Curfman McInnes - ynorm - 2-norm of the step 17679b94acceSBarry Smith 17689b94acceSBarry Smith Note: 17694b27c08aSLois Curfman McInnes For non-trust region methods such as SNESLS, the parameter delta 17709b94acceSBarry Smith is set to be the maximum allowable step size. 17719b94acceSBarry Smith 17729b94acceSBarry Smith .keywords: SNES, nonlinear, scale, step 17739b94acceSBarry Smith */ 1774dfbe8321SBarry Smith PetscErrorCode SNESScaleStep_Private(SNES snes,Vec y,PetscReal *fnorm,PetscReal *delta,PetscReal *gpnorm,PetscReal *ynorm) 17759b94acceSBarry Smith { 1776064f8208SBarry Smith PetscReal nrm; 1777ea709b57SSatish Balay PetscScalar cnorm; 1778dfbe8321SBarry Smith PetscErrorCode ierr; 17793a40ed3dSBarry Smith 17803a40ed3dSBarry Smith PetscFunctionBegin; 17814482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 17824482741eSBarry Smith PetscValidHeaderSpecific(y,VEC_COOKIE,2); 1783c9780b6fSBarry Smith PetscCheckSameComm(snes,1,y,2); 1784184914b5SBarry Smith 1785064f8208SBarry Smith ierr = VecNorm(y,NORM_2,&nrm);CHKERRQ(ierr); 1786064f8208SBarry Smith if (nrm > *delta) { 1787064f8208SBarry Smith nrm = *delta/nrm; 1788064f8208SBarry Smith *gpnorm = (1.0 - nrm)*(*fnorm); 1789064f8208SBarry Smith cnorm = nrm; 17902dcb1b2aSMatthew Knepley ierr = VecScale(y,cnorm);CHKERRQ(ierr); 17919b94acceSBarry Smith *ynorm = *delta; 17929b94acceSBarry Smith } else { 17939b94acceSBarry Smith *gpnorm = 0.0; 1794064f8208SBarry Smith *ynorm = nrm; 17959b94acceSBarry Smith } 17963a40ed3dSBarry Smith PetscFunctionReturn(0); 17979b94acceSBarry Smith } 17989b94acceSBarry Smith 17994a2ae208SSatish Balay #undef __FUNCT__ 18004a2ae208SSatish Balay #define __FUNCT__ "SNESSolve" 18016ce558aeSBarry Smith /*@C 1802f69a0ea3SMatthew Knepley SNESSolve - Solves a nonlinear system F(x) = b. 1803f69a0ea3SMatthew Knepley Call SNESSolve() after calling SNESCreate() and optional routines of the form SNESSetXXX(). 18049b94acceSBarry Smith 1805c7afd0dbSLois Curfman McInnes Collective on SNES 1806c7afd0dbSLois Curfman McInnes 1807b2002411SLois Curfman McInnes Input Parameters: 1808c7afd0dbSLois Curfman McInnes + snes - the SNES context 1809f69a0ea3SMatthew Knepley . b - the constant part of the equation, or PETSC_NULL to use zero. 181085385478SLisandro Dalcin - x - the solution vector. 18119b94acceSBarry Smith 1812b2002411SLois Curfman McInnes Notes: 18138ddd3da0SLois Curfman McInnes The user should initialize the vector,x, with the initial guess 18148ddd3da0SLois Curfman McInnes for the nonlinear solve prior to calling SNESSolve. In particular, 18158ddd3da0SLois Curfman McInnes to employ an initial guess of zero, the user should explicitly set 18168ddd3da0SLois Curfman McInnes this vector to zero by calling VecSet(). 18178ddd3da0SLois Curfman McInnes 181836851e7fSLois Curfman McInnes Level: beginner 181936851e7fSLois Curfman McInnes 18209b94acceSBarry Smith .keywords: SNES, nonlinear, solve 18219b94acceSBarry Smith 182285385478SLisandro Dalcin .seealso: SNESCreate(), SNESDestroy(), SNESSetFunction(), SNESSetJacobian() 18239b94acceSBarry Smith @*/ 1824f69a0ea3SMatthew Knepley PetscErrorCode PETSCSNES_DLLEXPORT SNESSolve(SNES snes,Vec b,Vec x) 18259b94acceSBarry Smith { 1826dfbe8321SBarry Smith PetscErrorCode ierr; 1827f1af5d2fSBarry Smith PetscTruth flg; 1828eabae89aSBarry Smith char filename[PETSC_MAX_PATH_LEN]; 1829eabae89aSBarry Smith PetscViewer viewer; 1830052efed2SBarry Smith 18313a40ed3dSBarry Smith PetscFunctionBegin; 18324482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 1833f69a0ea3SMatthew Knepley PetscValidHeaderSpecific(x,VEC_COOKIE,3); 1834f69a0ea3SMatthew Knepley PetscCheckSameComm(snes,1,x,3); 183585385478SLisandro Dalcin if (b) PetscValidHeaderSpecific(b,VEC_COOKIE,2); 183685385478SLisandro Dalcin if (b) PetscCheckSameComm(snes,1,b,2); 183785385478SLisandro Dalcin 183885385478SLisandro Dalcin /* set solution vector */ 183985385478SLisandro Dalcin ierr = PetscObjectReference((PetscObject)x);CHKERRQ(ierr); 184085385478SLisandro Dalcin if (snes->vec_sol) { ierr = VecDestroy(snes->vec_sol);CHKERRQ(ierr); } 184185385478SLisandro Dalcin snes->vec_sol = x; 184285385478SLisandro Dalcin /* set afine vector if provided */ 184385385478SLisandro Dalcin if (b) { ierr = PetscObjectReference((PetscObject)b);CHKERRQ(ierr); } 184485385478SLisandro Dalcin if (snes->vec_rhs) { ierr = VecDestroy(snes->vec_rhs);CHKERRQ(ierr); } 184585385478SLisandro Dalcin snes->vec_rhs = b; 184685385478SLisandro Dalcin 184785385478SLisandro Dalcin if (!snes->vec_func && snes->vec_rhs) { 184885385478SLisandro Dalcin ierr = VecDuplicate(b, &snes->vec_func); CHKERRQ(ierr); 184970e92668SMatthew Knepley } 18503f149594SLisandro Dalcin 185170e92668SMatthew Knepley ierr = SNESSetUp(snes);CHKERRQ(ierr); 18523f149594SLisandro Dalcin 1853abc0a331SBarry Smith if (snes->conv_hist_reset) snes->conv_hist_len = 0; 185450ffb88aSMatthew Knepley snes->nfuncs = 0; snes->linear_its = 0; snes->numFailures = 0; 1855d5e45103SBarry Smith 18563f149594SLisandro Dalcin ierr = PetscLogEventBegin(SNES_Solve,snes,0,0,0);CHKERRQ(ierr); 18573f149594SLisandro Dalcin 1858e7788613SBarry Smith ierr = PetscExceptionTry1((*(snes)->ops->solve)(snes),PETSC_ERR_ARG_DOMAIN); 1859d5e45103SBarry Smith if (PetscExceptionValue(ierr)) { 186038f152feSBarry Smith /* this means that a caller above me has also tryed this exception so I don't handle it here, pass it up */ 186119717074SBarry Smith PetscErrorCode pierr = PetscLogEventEnd(SNES_Solve,snes,0,0,0);CHKERRQ(pierr); 1862c671dbe7SSatish Balay } else if (PetscExceptionCaught(ierr,PETSC_ERR_ARG_DOMAIN)) { 1863d5e45103SBarry Smith /* translate exception into SNES not converged reason */ 1864d5e45103SBarry Smith snes->reason = SNES_DIVERGED_FUNCTION_DOMAIN; 186538f152feSBarry Smith ierr = 0; 186638f152feSBarry Smith } 186738f152feSBarry Smith CHKERRQ(ierr); 186885385478SLisandro Dalcin ierr = PetscLogEventEnd(SNES_Solve,snes,0,0,0);CHKERRQ(ierr); 186985385478SLisandro Dalcin 18703f149594SLisandro Dalcin if (!snes->reason) { 18713f149594SLisandro Dalcin SETERRQ(PETSC_ERR_PLIB,"Internal error, solver returned without setting converged reason"); 18723f149594SLisandro Dalcin } 18733f149594SLisandro Dalcin 1874eabae89aSBarry Smith ierr = PetscOptionsGetString(snes->prefix,"-snes_view",filename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr); 1875eabae89aSBarry Smith if (flg && !PetscPreLoadingOn) { 1876eabae89aSBarry Smith ierr = PetscViewerASCIIOpen(snes->comm,filename,&viewer);CHKERRQ(ierr); 1877eabae89aSBarry Smith ierr = SNESView(snes,viewer);CHKERRQ(ierr); 1878eabae89aSBarry Smith ierr = PetscViewerDestroy(viewer);CHKERRQ(ierr); 1879eabae89aSBarry Smith } 1880eabae89aSBarry Smith 1881da9b6338SBarry Smith ierr = PetscOptionsHasName(snes->prefix,"-snes_test_local_min",&flg);CHKERRQ(ierr); 1882da9b6338SBarry Smith if (flg && !PetscPreLoadingOn) { ierr = SNESTestLocalMin(snes);CHKERRQ(ierr); } 18835968eb51SBarry Smith if (snes->printreason) { 18845968eb51SBarry Smith if (snes->reason > 0) { 18859dcbbd2bSBarry Smith ierr = PetscPrintf(snes->comm,"Nonlinear solve converged due to %s\n",SNESConvergedReasons[snes->reason]);CHKERRQ(ierr); 18865968eb51SBarry Smith } else { 18879dcbbd2bSBarry Smith ierr = PetscPrintf(snes->comm,"Nonlinear solve did not converge due to %s\n",SNESConvergedReasons[snes->reason]);CHKERRQ(ierr); 18885968eb51SBarry Smith } 18895968eb51SBarry Smith } 18905968eb51SBarry Smith 18913a40ed3dSBarry Smith PetscFunctionReturn(0); 18929b94acceSBarry Smith } 18939b94acceSBarry Smith 18949b94acceSBarry Smith /* --------- Internal routines for SNES Package --------- */ 18959b94acceSBarry Smith 18964a2ae208SSatish Balay #undef __FUNCT__ 18974a2ae208SSatish Balay #define __FUNCT__ "SNESSetType" 189882bf6240SBarry Smith /*@C 18994b0e389bSBarry Smith SNESSetType - Sets the method for the nonlinear solver. 19009b94acceSBarry Smith 1901fee21e36SBarry Smith Collective on SNES 1902fee21e36SBarry Smith 1903c7afd0dbSLois Curfman McInnes Input Parameters: 1904c7afd0dbSLois Curfman McInnes + snes - the SNES context 1905454a90a3SBarry Smith - type - a known method 1906c7afd0dbSLois Curfman McInnes 1907c7afd0dbSLois Curfman McInnes Options Database Key: 1908454a90a3SBarry Smith . -snes_type <type> - Sets the method; use -help for a list 1909c7afd0dbSLois Curfman McInnes of available methods (for instance, ls or tr) 1910ae12b187SLois Curfman McInnes 19119b94acceSBarry Smith Notes: 1912e090d566SSatish Balay See "petsc/include/petscsnes.h" for available methods (for instance) 19134b27c08aSLois Curfman McInnes + SNESLS - Newton's method with line search 1914c7afd0dbSLois Curfman McInnes (systems of nonlinear equations) 19154b27c08aSLois Curfman McInnes . SNESTR - Newton's method with trust region 1916c7afd0dbSLois Curfman McInnes (systems of nonlinear equations) 19179b94acceSBarry Smith 1918ae12b187SLois Curfman McInnes Normally, it is best to use the SNESSetFromOptions() command and then 1919ae12b187SLois Curfman McInnes set the SNES solver type from the options database rather than by using 1920ae12b187SLois Curfman McInnes this routine. Using the options database provides the user with 1921ae12b187SLois Curfman McInnes maximum flexibility in evaluating the many nonlinear solvers. 1922ae12b187SLois Curfman McInnes The SNESSetType() routine is provided for those situations where it 1923ae12b187SLois Curfman McInnes is necessary to set the nonlinear solver independently of the command 1924ae12b187SLois Curfman McInnes line or options database. This might be the case, for example, when 1925ae12b187SLois Curfman McInnes the choice of solver changes during the execution of the program, 1926ae12b187SLois Curfman McInnes and the user's application is taking responsibility for choosing the 1927b0a32e0cSBarry Smith appropriate method. 192836851e7fSLois Curfman McInnes 192936851e7fSLois Curfman McInnes Level: intermediate 1930a703fe33SLois Curfman McInnes 1931454a90a3SBarry Smith .keywords: SNES, set, type 1932435da068SBarry Smith 1933435da068SBarry Smith .seealso: SNESType, SNESCreate() 1934435da068SBarry Smith 19359b94acceSBarry Smith @*/ 1936e060cb09SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESSetType(SNES snes,SNESType type) 19379b94acceSBarry Smith { 1938dfbe8321SBarry Smith PetscErrorCode ierr,(*r)(SNES); 19396831982aSBarry Smith PetscTruth match; 19403a40ed3dSBarry Smith 19413a40ed3dSBarry Smith PetscFunctionBegin; 19424482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 19434482741eSBarry Smith PetscValidCharPointer(type,2); 194482bf6240SBarry Smith 19456831982aSBarry Smith ierr = PetscTypeCompare((PetscObject)snes,type,&match);CHKERRQ(ierr); 19460f5bd95cSBarry Smith if (match) PetscFunctionReturn(0); 194792ff6ae8SBarry Smith 19481d280d73SBarry Smith ierr = PetscFListFind(SNESList,snes->comm,type,(void (**)(void)) &r);CHKERRQ(ierr); 1949958c9bccSBarry Smith if (!r) SETERRQ1(PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested SNES type %s",type); 195075396ef9SLisandro Dalcin /* Destroy the previous private SNES context */ 195175396ef9SLisandro Dalcin if (snes->ops->destroy) { ierr = (*(snes)->ops->destroy)(snes);CHKERRQ(ierr); } 195275396ef9SLisandro Dalcin /* Reinitialize function pointers in SNESOps structure */ 195375396ef9SLisandro Dalcin snes->ops->setup = 0; 195475396ef9SLisandro Dalcin snes->ops->solve = 0; 195575396ef9SLisandro Dalcin snes->ops->view = 0; 195675396ef9SLisandro Dalcin snes->ops->setfromoptions = 0; 195775396ef9SLisandro Dalcin snes->ops->destroy = 0; 195875396ef9SLisandro Dalcin /* Call the SNESCreate_XXX routine for this particular Nonlinear solver */ 195975396ef9SLisandro Dalcin snes->setupcalled = PETSC_FALSE; 19603a40ed3dSBarry Smith ierr = (*r)(snes);CHKERRQ(ierr); 1961454a90a3SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)snes,type);CHKERRQ(ierr); 19623a40ed3dSBarry Smith PetscFunctionReturn(0); 19639b94acceSBarry Smith } 19649b94acceSBarry Smith 1965a847f771SSatish Balay 19669b94acceSBarry Smith /* --------------------------------------------------------------------- */ 19674a2ae208SSatish Balay #undef __FUNCT__ 19684a2ae208SSatish Balay #define __FUNCT__ "SNESRegisterDestroy" 196952baeb72SSatish Balay /*@ 19709b94acceSBarry Smith SNESRegisterDestroy - Frees the list of nonlinear solvers that were 1971f1af5d2fSBarry Smith registered by SNESRegisterDynamic(). 19729b94acceSBarry Smith 1973fee21e36SBarry Smith Not Collective 1974fee21e36SBarry Smith 197536851e7fSLois Curfman McInnes Level: advanced 197636851e7fSLois Curfman McInnes 19779b94acceSBarry Smith .keywords: SNES, nonlinear, register, destroy 19789b94acceSBarry Smith 19799b94acceSBarry Smith .seealso: SNESRegisterAll(), SNESRegisterAll() 19809b94acceSBarry Smith @*/ 198163dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESRegisterDestroy(void) 19829b94acceSBarry Smith { 1983dfbe8321SBarry Smith PetscErrorCode ierr; 198482bf6240SBarry Smith 19853a40ed3dSBarry Smith PetscFunctionBegin; 19861441b1d3SBarry Smith ierr = PetscFListDestroy(&SNESList);CHKERRQ(ierr); 19874c49b128SBarry Smith SNESRegisterAllCalled = PETSC_FALSE; 19883a40ed3dSBarry Smith PetscFunctionReturn(0); 19899b94acceSBarry Smith } 19909b94acceSBarry Smith 19914a2ae208SSatish Balay #undef __FUNCT__ 19924a2ae208SSatish Balay #define __FUNCT__ "SNESGetType" 19939b94acceSBarry Smith /*@C 19949a28b0a6SLois Curfman McInnes SNESGetType - Gets the SNES method type and name (as a string). 19959b94acceSBarry Smith 1996c7afd0dbSLois Curfman McInnes Not Collective 1997c7afd0dbSLois Curfman McInnes 19989b94acceSBarry Smith Input Parameter: 19994b0e389bSBarry Smith . snes - nonlinear solver context 20009b94acceSBarry Smith 20019b94acceSBarry Smith Output Parameter: 20023a7fca6bSBarry Smith . type - SNES method (a character string) 20039b94acceSBarry Smith 200436851e7fSLois Curfman McInnes Level: intermediate 200536851e7fSLois Curfman McInnes 2006454a90a3SBarry Smith .keywords: SNES, nonlinear, get, type, name 20079b94acceSBarry Smith @*/ 200863dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESGetType(SNES snes,SNESType *type) 20099b94acceSBarry Smith { 20103a40ed3dSBarry Smith PetscFunctionBegin; 20114482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 20124482741eSBarry Smith PetscValidPointer(type,2); 2013454a90a3SBarry Smith *type = snes->type_name; 20143a40ed3dSBarry Smith PetscFunctionReturn(0); 20159b94acceSBarry Smith } 20169b94acceSBarry Smith 20174a2ae208SSatish Balay #undef __FUNCT__ 20184a2ae208SSatish Balay #define __FUNCT__ "SNESGetSolution" 201952baeb72SSatish Balay /*@ 20209b94acceSBarry Smith SNESGetSolution - Returns the vector where the approximate solution is 20219b94acceSBarry Smith stored. 20229b94acceSBarry Smith 2023c7afd0dbSLois Curfman McInnes Not Collective, but Vec is parallel if SNES is parallel 2024c7afd0dbSLois Curfman McInnes 20259b94acceSBarry Smith Input Parameter: 20269b94acceSBarry Smith . snes - the SNES context 20279b94acceSBarry Smith 20289b94acceSBarry Smith Output Parameter: 20299b94acceSBarry Smith . x - the solution 20309b94acceSBarry Smith 203170e92668SMatthew Knepley Level: intermediate 203236851e7fSLois Curfman McInnes 20339b94acceSBarry Smith .keywords: SNES, nonlinear, get, solution 20349b94acceSBarry Smith 203585385478SLisandro Dalcin .seealso: SNESGetSolutionUpdate(), SNESGetFunction() 20369b94acceSBarry Smith @*/ 203763dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESGetSolution(SNES snes,Vec *x) 20389b94acceSBarry Smith { 20393a40ed3dSBarry Smith PetscFunctionBegin; 20404482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 20414482741eSBarry Smith PetscValidPointer(x,2); 204285385478SLisandro Dalcin *x = snes->vec_sol; 204370e92668SMatthew Knepley PetscFunctionReturn(0); 204470e92668SMatthew Knepley } 204570e92668SMatthew Knepley 204670e92668SMatthew Knepley #undef __FUNCT__ 20474a2ae208SSatish Balay #define __FUNCT__ "SNESGetSolutionUpdate" 204852baeb72SSatish Balay /*@ 20499b94acceSBarry Smith SNESGetSolutionUpdate - Returns the vector where the solution update is 20509b94acceSBarry Smith stored. 20519b94acceSBarry Smith 2052c7afd0dbSLois Curfman McInnes Not Collective, but Vec is parallel if SNES is parallel 2053c7afd0dbSLois Curfman McInnes 20549b94acceSBarry Smith Input Parameter: 20559b94acceSBarry Smith . snes - the SNES context 20569b94acceSBarry Smith 20579b94acceSBarry Smith Output Parameter: 20589b94acceSBarry Smith . x - the solution update 20599b94acceSBarry Smith 206036851e7fSLois Curfman McInnes Level: advanced 206136851e7fSLois Curfman McInnes 20629b94acceSBarry Smith .keywords: SNES, nonlinear, get, solution, update 20639b94acceSBarry Smith 206485385478SLisandro Dalcin .seealso: SNESGetSolution(), SNESGetFunction() 20659b94acceSBarry Smith @*/ 206663dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESGetSolutionUpdate(SNES snes,Vec *x) 20679b94acceSBarry Smith { 20683a40ed3dSBarry Smith PetscFunctionBegin; 20694482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 20704482741eSBarry Smith PetscValidPointer(x,2); 207185385478SLisandro Dalcin *x = snes->vec_sol_update; 20723a40ed3dSBarry Smith PetscFunctionReturn(0); 20739b94acceSBarry Smith } 20749b94acceSBarry Smith 20754a2ae208SSatish Balay #undef __FUNCT__ 20764a2ae208SSatish Balay #define __FUNCT__ "SNESGetFunction" 20779b94acceSBarry Smith /*@C 20783638b69dSLois Curfman McInnes SNESGetFunction - Returns the vector where the function is stored. 20799b94acceSBarry Smith 2080c7afd0dbSLois Curfman McInnes Not Collective, but Vec is parallel if SNES is parallel 2081c7afd0dbSLois Curfman McInnes 20829b94acceSBarry Smith Input Parameter: 20839b94acceSBarry Smith . snes - the SNES context 20849b94acceSBarry Smith 20859b94acceSBarry Smith Output Parameter: 20867bf4e008SBarry Smith + r - the function (or PETSC_NULL) 208770e92668SMatthew Knepley . func - the function (or PETSC_NULL) 208870e92668SMatthew Knepley - ctx - the function context (or PETSC_NULL) 20899b94acceSBarry Smith 209036851e7fSLois Curfman McInnes Level: advanced 209136851e7fSLois Curfman McInnes 2092a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, get, function 20939b94acceSBarry Smith 20944b27c08aSLois Curfman McInnes .seealso: SNESSetFunction(), SNESGetSolution() 20959b94acceSBarry Smith @*/ 209670e92668SMatthew Knepley PetscErrorCode PETSCSNES_DLLEXPORT SNESGetFunction(SNES snes,Vec *r,PetscErrorCode (**func)(SNES,Vec,Vec,void*),void **ctx) 20979b94acceSBarry Smith { 20983a40ed3dSBarry Smith PetscFunctionBegin; 20994482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 210085385478SLisandro Dalcin if (r) *r = snes->vec_func; 2101e7788613SBarry Smith if (func) *func = snes->ops->computefunction; 210270e92668SMatthew Knepley if (ctx) *ctx = snes->funP; 21033a40ed3dSBarry Smith PetscFunctionReturn(0); 21049b94acceSBarry Smith } 21059b94acceSBarry Smith 21064a2ae208SSatish Balay #undef __FUNCT__ 21074a2ae208SSatish Balay #define __FUNCT__ "SNESSetOptionsPrefix" 21083c7409f5SSatish Balay /*@C 21093c7409f5SSatish Balay SNESSetOptionsPrefix - Sets the prefix used for searching for all 2110d850072dSLois Curfman McInnes SNES options in the database. 21113c7409f5SSatish Balay 2112fee21e36SBarry Smith Collective on SNES 2113fee21e36SBarry Smith 2114c7afd0dbSLois Curfman McInnes Input Parameter: 2115c7afd0dbSLois Curfman McInnes + snes - the SNES context 2116c7afd0dbSLois Curfman McInnes - prefix - the prefix to prepend to all option names 2117c7afd0dbSLois Curfman McInnes 2118d850072dSLois Curfman McInnes Notes: 2119a83b1b31SSatish Balay A hyphen (-) must NOT be given at the beginning of the prefix name. 2120c7afd0dbSLois Curfman McInnes The first character of all runtime options is AUTOMATICALLY the hyphen. 2121d850072dSLois Curfman McInnes 212236851e7fSLois Curfman McInnes Level: advanced 212336851e7fSLois Curfman McInnes 21243c7409f5SSatish Balay .keywords: SNES, set, options, prefix, database 2125a86d99e1SLois Curfman McInnes 2126a86d99e1SLois Curfman McInnes .seealso: SNESSetFromOptions() 21273c7409f5SSatish Balay @*/ 212863dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESSetOptionsPrefix(SNES snes,const char prefix[]) 21293c7409f5SSatish Balay { 2130dfbe8321SBarry Smith PetscErrorCode ierr; 21313c7409f5SSatish Balay 21323a40ed3dSBarry Smith PetscFunctionBegin; 21334482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 2134639f9d9dSBarry Smith ierr = PetscObjectSetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr); 213594b7f48cSBarry Smith ierr = KSPSetOptionsPrefix(snes->ksp,prefix);CHKERRQ(ierr); 21363a40ed3dSBarry Smith PetscFunctionReturn(0); 21373c7409f5SSatish Balay } 21383c7409f5SSatish Balay 21394a2ae208SSatish Balay #undef __FUNCT__ 21404a2ae208SSatish Balay #define __FUNCT__ "SNESAppendOptionsPrefix" 21413c7409f5SSatish Balay /*@C 2142f525115eSLois Curfman McInnes SNESAppendOptionsPrefix - Appends to the prefix used for searching for all 2143d850072dSLois Curfman McInnes SNES options in the database. 21443c7409f5SSatish Balay 2145fee21e36SBarry Smith Collective on SNES 2146fee21e36SBarry Smith 2147c7afd0dbSLois Curfman McInnes Input Parameters: 2148c7afd0dbSLois Curfman McInnes + snes - the SNES context 2149c7afd0dbSLois Curfman McInnes - prefix - the prefix to prepend to all option names 2150c7afd0dbSLois Curfman McInnes 2151d850072dSLois Curfman McInnes Notes: 2152a83b1b31SSatish Balay A hyphen (-) must NOT be given at the beginning of the prefix name. 2153c7afd0dbSLois Curfman McInnes The first character of all runtime options is AUTOMATICALLY the hyphen. 2154d850072dSLois Curfman McInnes 215536851e7fSLois Curfman McInnes Level: advanced 215636851e7fSLois Curfman McInnes 21573c7409f5SSatish Balay .keywords: SNES, append, options, prefix, database 2158a86d99e1SLois Curfman McInnes 2159a86d99e1SLois Curfman McInnes .seealso: SNESGetOptionsPrefix() 21603c7409f5SSatish Balay @*/ 216163dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESAppendOptionsPrefix(SNES snes,const char prefix[]) 21623c7409f5SSatish Balay { 2163dfbe8321SBarry Smith PetscErrorCode ierr; 21643c7409f5SSatish Balay 21653a40ed3dSBarry Smith PetscFunctionBegin; 21664482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 2167639f9d9dSBarry Smith ierr = PetscObjectAppendOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr); 216894b7f48cSBarry Smith ierr = KSPAppendOptionsPrefix(snes->ksp,prefix);CHKERRQ(ierr); 21693a40ed3dSBarry Smith PetscFunctionReturn(0); 21703c7409f5SSatish Balay } 21713c7409f5SSatish Balay 21724a2ae208SSatish Balay #undef __FUNCT__ 21734a2ae208SSatish Balay #define __FUNCT__ "SNESGetOptionsPrefix" 21749ab63eb5SSatish Balay /*@C 21753c7409f5SSatish Balay SNESGetOptionsPrefix - Sets the prefix used for searching for all 21763c7409f5SSatish Balay SNES options in the database. 21773c7409f5SSatish Balay 2178c7afd0dbSLois Curfman McInnes Not Collective 2179c7afd0dbSLois Curfman McInnes 21803c7409f5SSatish Balay Input Parameter: 21813c7409f5SSatish Balay . snes - the SNES context 21823c7409f5SSatish Balay 21833c7409f5SSatish Balay Output Parameter: 21843c7409f5SSatish Balay . prefix - pointer to the prefix string used 21853c7409f5SSatish Balay 21869ab63eb5SSatish Balay Notes: On the fortran side, the user should pass in a string 'prifix' of 21879ab63eb5SSatish Balay sufficient length to hold the prefix. 21889ab63eb5SSatish Balay 218936851e7fSLois Curfman McInnes Level: advanced 219036851e7fSLois Curfman McInnes 21913c7409f5SSatish Balay .keywords: SNES, get, options, prefix, database 2192a86d99e1SLois Curfman McInnes 2193a86d99e1SLois Curfman McInnes .seealso: SNESAppendOptionsPrefix() 21943c7409f5SSatish Balay @*/ 2195e060cb09SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESGetOptionsPrefix(SNES snes,const char *prefix[]) 21963c7409f5SSatish Balay { 2197dfbe8321SBarry Smith PetscErrorCode ierr; 21983c7409f5SSatish Balay 21993a40ed3dSBarry Smith PetscFunctionBegin; 22004482741eSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 2201639f9d9dSBarry Smith ierr = PetscObjectGetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr); 22023a40ed3dSBarry Smith PetscFunctionReturn(0); 22033c7409f5SSatish Balay } 22043c7409f5SSatish Balay 2205b2002411SLois Curfman McInnes 22064a2ae208SSatish Balay #undef __FUNCT__ 22074a2ae208SSatish Balay #define __FUNCT__ "SNESRegister" 22083cea93caSBarry Smith /*@C 22093cea93caSBarry Smith SNESRegister - See SNESRegisterDynamic() 22103cea93caSBarry Smith 22117f6c08e0SMatthew Knepley Level: advanced 22123cea93caSBarry Smith @*/ 221363dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(SNES)) 2214b2002411SLois Curfman McInnes { 2215e2d1d2b7SBarry Smith char fullname[PETSC_MAX_PATH_LEN]; 2216dfbe8321SBarry Smith PetscErrorCode ierr; 2217b2002411SLois Curfman McInnes 2218b2002411SLois Curfman McInnes PetscFunctionBegin; 2219b0a32e0cSBarry Smith ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr); 2220c134de8dSSatish Balay ierr = PetscFListAdd(&SNESList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); 2221b2002411SLois Curfman McInnes PetscFunctionReturn(0); 2222b2002411SLois Curfman McInnes } 2223da9b6338SBarry Smith 2224da9b6338SBarry Smith #undef __FUNCT__ 2225da9b6338SBarry Smith #define __FUNCT__ "SNESTestLocalMin" 222663dd3a1aSKris Buschelman PetscErrorCode PETSCSNES_DLLEXPORT SNESTestLocalMin(SNES snes) 2227da9b6338SBarry Smith { 2228dfbe8321SBarry Smith PetscErrorCode ierr; 222977431f27SBarry Smith PetscInt N,i,j; 2230da9b6338SBarry Smith Vec u,uh,fh; 2231da9b6338SBarry Smith PetscScalar value; 2232da9b6338SBarry Smith PetscReal norm; 2233da9b6338SBarry Smith 2234da9b6338SBarry Smith PetscFunctionBegin; 2235da9b6338SBarry Smith ierr = SNESGetSolution(snes,&u);CHKERRQ(ierr); 2236da9b6338SBarry Smith ierr = VecDuplicate(u,&uh);CHKERRQ(ierr); 2237da9b6338SBarry Smith ierr = VecDuplicate(u,&fh);CHKERRQ(ierr); 2238da9b6338SBarry Smith 2239da9b6338SBarry Smith /* currently only works for sequential */ 2240da9b6338SBarry Smith ierr = PetscPrintf(PETSC_COMM_WORLD,"Testing FormFunction() for local min\n"); 2241da9b6338SBarry Smith ierr = VecGetSize(u,&N);CHKERRQ(ierr); 2242da9b6338SBarry Smith for (i=0; i<N; i++) { 2243da9b6338SBarry Smith ierr = VecCopy(u,uh);CHKERRQ(ierr); 224477431f27SBarry Smith ierr = PetscPrintf(PETSC_COMM_WORLD,"i = %D\n",i);CHKERRQ(ierr); 2245da9b6338SBarry Smith for (j=-10; j<11; j++) { 2246ccae9161SBarry Smith value = PetscSign(j)*exp(PetscAbs(j)-10.0); 2247da9b6338SBarry Smith ierr = VecSetValue(uh,i,value,ADD_VALUES);CHKERRQ(ierr); 22483ab0aad5SBarry Smith ierr = SNESComputeFunction(snes,uh,fh);CHKERRQ(ierr); 2249da9b6338SBarry Smith ierr = VecNorm(fh,NORM_2,&norm);CHKERRQ(ierr); 225077431f27SBarry Smith ierr = PetscPrintf(PETSC_COMM_WORLD," j norm %D %18.16e\n",j,norm);CHKERRQ(ierr); 2251da9b6338SBarry Smith value = -value; 2252da9b6338SBarry Smith ierr = VecSetValue(uh,i,value,ADD_VALUES);CHKERRQ(ierr); 2253da9b6338SBarry Smith } 2254da9b6338SBarry Smith } 2255da9b6338SBarry Smith ierr = VecDestroy(uh);CHKERRQ(ierr); 2256da9b6338SBarry Smith ierr = VecDestroy(fh);CHKERRQ(ierr); 2257da9b6338SBarry Smith PetscFunctionReturn(0); 2258da9b6338SBarry Smith } 225971f87433Sdalcinl 226071f87433Sdalcinl #undef __FUNCT__ 2261fa9f3622SBarry Smith #define __FUNCT__ "SNESKSPSetUseEW" 226271f87433Sdalcinl /*@ 2263fa9f3622SBarry Smith SNESKSPSetUseEW - Sets SNES use Eisenstat-Walker method for 226471f87433Sdalcinl computing relative tolerance for linear solvers within an inexact 226571f87433Sdalcinl Newton method. 226671f87433Sdalcinl 226771f87433Sdalcinl Collective on SNES 226871f87433Sdalcinl 226971f87433Sdalcinl Input Parameters: 227071f87433Sdalcinl + snes - SNES context 227171f87433Sdalcinl - flag - PETSC_TRUE or PETSC_FALSE 227271f87433Sdalcinl 227371f87433Sdalcinl Notes: 227471f87433Sdalcinl Currently, the default is to use a constant relative tolerance for 227571f87433Sdalcinl the inner linear solvers. Alternatively, one can use the 227671f87433Sdalcinl Eisenstat-Walker method, where the relative convergence tolerance 227771f87433Sdalcinl is reset at each Newton iteration according progress of the nonlinear 227871f87433Sdalcinl solver. 227971f87433Sdalcinl 228071f87433Sdalcinl Level: advanced 228171f87433Sdalcinl 228271f87433Sdalcinl Reference: 228371f87433Sdalcinl S. C. Eisenstat and H. F. Walker, "Choosing the forcing terms in an 228471f87433Sdalcinl inexact Newton method", SISC 17 (1), pp.16-32, 1996. 228571f87433Sdalcinl 228671f87433Sdalcinl .keywords: SNES, KSP, Eisenstat, Walker, convergence, test, inexact, Newton 228771f87433Sdalcinl 2288fa9f3622SBarry Smith .seealso: SNESKSPGetUseEW(), SNESKSPGetParametersEW(), SNESKSPSetParametersEW() 228971f87433Sdalcinl @*/ 2290fa9f3622SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESKSPSetUseEW(SNES snes,PetscTruth flag) 229171f87433Sdalcinl { 229271f87433Sdalcinl PetscFunctionBegin; 229371f87433Sdalcinl PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 229471f87433Sdalcinl snes->ksp_ewconv = flag; 229571f87433Sdalcinl PetscFunctionReturn(0); 229671f87433Sdalcinl } 229771f87433Sdalcinl 229871f87433Sdalcinl #undef __FUNCT__ 2299fa9f3622SBarry Smith #define __FUNCT__ "SNESKSPGetUseEW" 230071f87433Sdalcinl /*@ 2301fa9f3622SBarry Smith SNESKSPGetUseEW - Gets if SNES is using Eisenstat-Walker method 230271f87433Sdalcinl for computing relative tolerance for linear solvers within an 230371f87433Sdalcinl inexact Newton method. 230471f87433Sdalcinl 230571f87433Sdalcinl Not Collective 230671f87433Sdalcinl 230771f87433Sdalcinl Input Parameter: 230871f87433Sdalcinl . snes - SNES context 230971f87433Sdalcinl 231071f87433Sdalcinl Output Parameter: 231171f87433Sdalcinl . flag - PETSC_TRUE or PETSC_FALSE 231271f87433Sdalcinl 231371f87433Sdalcinl Notes: 231471f87433Sdalcinl Currently, the default is to use a constant relative tolerance for 231571f87433Sdalcinl the inner linear solvers. Alternatively, one can use the 231671f87433Sdalcinl Eisenstat-Walker method, where the relative convergence tolerance 231771f87433Sdalcinl is reset at each Newton iteration according progress of the nonlinear 231871f87433Sdalcinl solver. 231971f87433Sdalcinl 232071f87433Sdalcinl Level: advanced 232171f87433Sdalcinl 232271f87433Sdalcinl Reference: 232371f87433Sdalcinl S. C. Eisenstat and H. F. Walker, "Choosing the forcing terms in an 232471f87433Sdalcinl inexact Newton method", SISC 17 (1), pp.16-32, 1996. 232571f87433Sdalcinl 232671f87433Sdalcinl .keywords: SNES, KSP, Eisenstat, Walker, convergence, test, inexact, Newton 232771f87433Sdalcinl 2328fa9f3622SBarry Smith .seealso: SNESKSPSetUseEW(), SNESKSPGetParametersEW(), SNESKSPSetParametersEW() 232971f87433Sdalcinl @*/ 2330fa9f3622SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESKSPGetUseEW(SNES snes, PetscTruth *flag) 233171f87433Sdalcinl { 233271f87433Sdalcinl PetscFunctionBegin; 233371f87433Sdalcinl PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 233471f87433Sdalcinl PetscValidPointer(flag,2); 233571f87433Sdalcinl *flag = snes->ksp_ewconv; 233671f87433Sdalcinl PetscFunctionReturn(0); 233771f87433Sdalcinl } 233871f87433Sdalcinl 233971f87433Sdalcinl #undef __FUNCT__ 2340fa9f3622SBarry Smith #define __FUNCT__ "SNESKSPSetParametersEW" 234171f87433Sdalcinl /*@ 2342fa9f3622SBarry Smith SNESKSPSetParametersEW - Sets parameters for Eisenstat-Walker 234371f87433Sdalcinl convergence criteria for the linear solvers within an inexact 234471f87433Sdalcinl Newton method. 234571f87433Sdalcinl 234671f87433Sdalcinl Collective on SNES 234771f87433Sdalcinl 234871f87433Sdalcinl Input Parameters: 234971f87433Sdalcinl + snes - SNES context 235071f87433Sdalcinl . version - version 1, 2 (default is 2) or 3 235171f87433Sdalcinl . rtol_0 - initial relative tolerance (0 <= rtol_0 < 1) 235271f87433Sdalcinl . rtol_max - maximum relative tolerance (0 <= rtol_max < 1) 235371f87433Sdalcinl . gamma - multiplicative factor for version 2 rtol computation 235471f87433Sdalcinl (0 <= gamma2 <= 1) 235571f87433Sdalcinl . alpha - power for version 2 rtol computation (1 < alpha <= 2) 235671f87433Sdalcinl . alpha2 - power for safeguard 235771f87433Sdalcinl - threshold - threshold for imposing safeguard (0 < threshold < 1) 235871f87433Sdalcinl 235971f87433Sdalcinl Note: 236071f87433Sdalcinl Version 3 was contributed by Luis Chacon, June 2006. 236171f87433Sdalcinl 236271f87433Sdalcinl Use PETSC_DEFAULT to retain the default for any of the parameters. 236371f87433Sdalcinl 236471f87433Sdalcinl Level: advanced 236571f87433Sdalcinl 236671f87433Sdalcinl Reference: 236771f87433Sdalcinl S. C. Eisenstat and H. F. Walker, "Choosing the forcing terms in an 236871f87433Sdalcinl inexact Newton method", Utah State University Math. Stat. Dept. Res. 236971f87433Sdalcinl Report 6/94/75, June, 1994, to appear in SIAM J. Sci. Comput. 237071f87433Sdalcinl 237171f87433Sdalcinl .keywords: SNES, KSP, Eisenstat, Walker, set, parameters 237271f87433Sdalcinl 2373fa9f3622SBarry Smith .seealso: SNESKSPSetUseEW(), SNESKSPGetUseEW(), SNESKSPGetParametersEW() 237471f87433Sdalcinl @*/ 2375fa9f3622SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESKSPSetParametersEW(SNES snes,PetscInt version,PetscReal rtol_0,PetscReal rtol_max, 237671f87433Sdalcinl PetscReal gamma,PetscReal alpha,PetscReal alpha2,PetscReal threshold) 237771f87433Sdalcinl { 2378fa9f3622SBarry Smith SNESKSPEW *kctx; 237971f87433Sdalcinl PetscFunctionBegin; 238071f87433Sdalcinl PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 2381fa9f3622SBarry Smith kctx = (SNESKSPEW*)snes->kspconvctx; 238271f87433Sdalcinl if (!kctx) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"No Eisenstat-Walker context existing"); 238371f87433Sdalcinl 238471f87433Sdalcinl if (version != PETSC_DEFAULT) kctx->version = version; 238571f87433Sdalcinl if (rtol_0 != PETSC_DEFAULT) kctx->rtol_0 = rtol_0; 238671f87433Sdalcinl if (rtol_max != PETSC_DEFAULT) kctx->rtol_max = rtol_max; 238771f87433Sdalcinl if (gamma != PETSC_DEFAULT) kctx->gamma = gamma; 238871f87433Sdalcinl if (alpha != PETSC_DEFAULT) kctx->alpha = alpha; 238971f87433Sdalcinl if (alpha2 != PETSC_DEFAULT) kctx->alpha2 = alpha2; 239071f87433Sdalcinl if (threshold != PETSC_DEFAULT) kctx->threshold = threshold; 239171f87433Sdalcinl 239271f87433Sdalcinl if (kctx->version < 1 || kctx->version > 3) { 239371f87433Sdalcinl SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Only versions 1, 2 and 3 are supported: %D",kctx->version); 239471f87433Sdalcinl } 239571f87433Sdalcinl if (kctx->rtol_0 < 0.0 || kctx->rtol_0 >= 1.0) { 239671f87433Sdalcinl SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"0.0 <= rtol_0 < 1.0: %G",kctx->rtol_0); 239771f87433Sdalcinl } 239871f87433Sdalcinl if (kctx->rtol_max < 0.0 || kctx->rtol_max >= 1.0) { 239971f87433Sdalcinl SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"0.0 <= rtol_max (%G) < 1.0\n",kctx->rtol_max); 240071f87433Sdalcinl } 240171f87433Sdalcinl if (kctx->gamma < 0.0 || kctx->gamma > 1.0) { 240271f87433Sdalcinl SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"0.0 <= gamma (%G) <= 1.0\n",kctx->gamma); 240371f87433Sdalcinl } 240471f87433Sdalcinl if (kctx->alpha <= 1.0 || kctx->alpha > 2.0) { 240571f87433Sdalcinl SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"1.0 < alpha (%G) <= 2.0\n",kctx->alpha); 240671f87433Sdalcinl } 240771f87433Sdalcinl if (kctx->threshold <= 0.0 || kctx->threshold >= 1.0) { 240871f87433Sdalcinl SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"0.0 < threshold (%G) < 1.0\n",kctx->threshold); 240971f87433Sdalcinl } 241071f87433Sdalcinl PetscFunctionReturn(0); 241171f87433Sdalcinl } 241271f87433Sdalcinl 241371f87433Sdalcinl #undef __FUNCT__ 2414fa9f3622SBarry Smith #define __FUNCT__ "SNESKSPGetParametersEW" 241571f87433Sdalcinl /*@ 2416fa9f3622SBarry Smith SNESKSPGetParametersEW - Gets parameters for Eisenstat-Walker 241771f87433Sdalcinl convergence criteria for the linear solvers within an inexact 241871f87433Sdalcinl Newton method. 241971f87433Sdalcinl 242071f87433Sdalcinl Not Collective 242171f87433Sdalcinl 242271f87433Sdalcinl Input Parameters: 242371f87433Sdalcinl snes - SNES context 242471f87433Sdalcinl 242571f87433Sdalcinl Output Parameters: 242671f87433Sdalcinl + version - version 1, 2 (default is 2) or 3 242771f87433Sdalcinl . rtol_0 - initial relative tolerance (0 <= rtol_0 < 1) 242871f87433Sdalcinl . rtol_max - maximum relative tolerance (0 <= rtol_max < 1) 242971f87433Sdalcinl . gamma - multiplicative factor for version 2 rtol computation 243071f87433Sdalcinl (0 <= gamma2 <= 1) 243171f87433Sdalcinl . alpha - power for version 2 rtol computation (1 < alpha <= 2) 243271f87433Sdalcinl . alpha2 - power for safeguard 243371f87433Sdalcinl - threshold - threshold for imposing safeguard (0 < threshold < 1) 243471f87433Sdalcinl 243571f87433Sdalcinl Level: advanced 243671f87433Sdalcinl 243771f87433Sdalcinl .keywords: SNES, KSP, Eisenstat, Walker, get, parameters 243871f87433Sdalcinl 2439fa9f3622SBarry Smith .seealso: SNESKSPSetUseEW(), SNESKSPGetUseEW(), SNESKSPSetParametersEW() 244071f87433Sdalcinl @*/ 2441fa9f3622SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESKSPGetParametersEW(SNES snes,PetscInt *version,PetscReal *rtol_0,PetscReal *rtol_max, 244271f87433Sdalcinl PetscReal *gamma,PetscReal *alpha,PetscReal *alpha2,PetscReal *threshold) 244371f87433Sdalcinl { 2444fa9f3622SBarry Smith SNESKSPEW *kctx; 244571f87433Sdalcinl PetscFunctionBegin; 244671f87433Sdalcinl PetscValidHeaderSpecific(snes,SNES_COOKIE,1); 2447fa9f3622SBarry Smith kctx = (SNESKSPEW*)snes->kspconvctx; 244871f87433Sdalcinl if (!kctx) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"No Eisenstat-Walker context existing"); 244971f87433Sdalcinl if(version) *version = kctx->version; 245071f87433Sdalcinl if(rtol_0) *rtol_0 = kctx->rtol_0; 245171f87433Sdalcinl if(rtol_max) *rtol_max = kctx->rtol_max; 245271f87433Sdalcinl if(gamma) *gamma = kctx->gamma; 245371f87433Sdalcinl if(alpha) *alpha = kctx->alpha; 245471f87433Sdalcinl if(alpha2) *alpha2 = kctx->alpha2; 245571f87433Sdalcinl if(threshold) *threshold = kctx->threshold; 245671f87433Sdalcinl PetscFunctionReturn(0); 245771f87433Sdalcinl } 245871f87433Sdalcinl 245971f87433Sdalcinl #undef __FUNCT__ 2460fa9f3622SBarry Smith #define __FUNCT__ "SNESKSPEW_PreSolve" 2461fa9f3622SBarry Smith static PetscErrorCode SNESKSPEW_PreSolve(SNES snes, KSP ksp, Vec b, Vec x) 246271f87433Sdalcinl { 246371f87433Sdalcinl PetscErrorCode ierr; 2464fa9f3622SBarry Smith SNESKSPEW *kctx = (SNESKSPEW*)snes->kspconvctx; 246571f87433Sdalcinl PetscReal rtol=PETSC_DEFAULT,stol; 246671f87433Sdalcinl 246771f87433Sdalcinl PetscFunctionBegin; 246871f87433Sdalcinl if (!kctx) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"No Eisenstat-Walker context exists"); 246971f87433Sdalcinl if (!snes->iter) { /* first time in, so use the original user rtol */ 247071f87433Sdalcinl rtol = kctx->rtol_0; 247171f87433Sdalcinl } else { 247271f87433Sdalcinl if (kctx->version == 1) { 247371f87433Sdalcinl rtol = (snes->norm - kctx->lresid_last)/kctx->norm_last; 247471f87433Sdalcinl if (rtol < 0.0) rtol = -rtol; 247571f87433Sdalcinl stol = pow(kctx->rtol_last,kctx->alpha2); 247671f87433Sdalcinl if (stol > kctx->threshold) rtol = PetscMax(rtol,stol); 247771f87433Sdalcinl } else if (kctx->version == 2) { 247871f87433Sdalcinl rtol = kctx->gamma * pow(snes->norm/kctx->norm_last,kctx->alpha); 247971f87433Sdalcinl stol = kctx->gamma * pow(kctx->rtol_last,kctx->alpha); 248071f87433Sdalcinl if (stol > kctx->threshold) rtol = PetscMax(rtol,stol); 248171f87433Sdalcinl } else if (kctx->version == 3) {/* contributed by Luis Chacon, June 2006. */ 248271f87433Sdalcinl rtol = kctx->gamma * pow(snes->norm/kctx->norm_last,kctx->alpha); 248371f87433Sdalcinl /* safeguard: avoid sharp decrease of rtol */ 248471f87433Sdalcinl stol = kctx->gamma*pow(kctx->rtol_last,kctx->alpha); 248571f87433Sdalcinl stol = PetscMax(rtol,stol); 248671f87433Sdalcinl rtol = PetscMin(kctx->rtol_0,stol); 248771f87433Sdalcinl /* safeguard: avoid oversolving */ 248871f87433Sdalcinl stol = kctx->gamma*(snes->ttol)/snes->norm; 248971f87433Sdalcinl stol = PetscMax(rtol,stol); 249071f87433Sdalcinl rtol = PetscMin(kctx->rtol_0,stol); 249171f87433Sdalcinl } else SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Only versions 1, 2 or 3 are supported: %D",kctx->version); 249271f87433Sdalcinl } 249371f87433Sdalcinl /* safeguard: avoid rtol greater than one */ 249471f87433Sdalcinl rtol = PetscMin(rtol,kctx->rtol_max); 249571f87433Sdalcinl ierr = KSPSetTolerances(ksp,rtol,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_DEFAULT);CHKERRQ(ierr); 249671f87433Sdalcinl ierr = PetscInfo3(snes,"iter %D, Eisenstat-Walker (version %D) KSP rtol=%G\n",snes->iter,kctx->version,rtol);CHKERRQ(ierr); 249771f87433Sdalcinl PetscFunctionReturn(0); 249871f87433Sdalcinl } 249971f87433Sdalcinl 250071f87433Sdalcinl #undef __FUNCT__ 2501fa9f3622SBarry Smith #define __FUNCT__ "SNESKSPEW_PostSolve" 2502fa9f3622SBarry Smith static PetscErrorCode SNESKSPEW_PostSolve(SNES snes, KSP ksp, Vec b, Vec x) 250371f87433Sdalcinl { 250471f87433Sdalcinl PetscErrorCode ierr; 2505fa9f3622SBarry Smith SNESKSPEW *kctx = (SNESKSPEW*)snes->kspconvctx; 250671f87433Sdalcinl PCSide pcside; 250771f87433Sdalcinl Vec lres; 250871f87433Sdalcinl 250971f87433Sdalcinl PetscFunctionBegin; 251071f87433Sdalcinl if (!kctx) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"No Eisenstat-Walker context exists"); 251171f87433Sdalcinl ierr = KSPGetTolerances(ksp,&kctx->rtol_last,0,0,0);CHKERRQ(ierr); 251271f87433Sdalcinl ierr = SNESGetFunctionNorm(snes,&kctx->norm_last);CHKERRQ(ierr); 251371f87433Sdalcinl if (kctx->version == 1) { 251471f87433Sdalcinl ierr = KSPGetPreconditionerSide(ksp,&pcside);CHKERRQ(ierr); 251571f87433Sdalcinl if (pcside == PC_RIGHT) { /* XXX Should we also test KSP_UNPRECONDITIONED_NORM ? */ 251671f87433Sdalcinl /* KSP residual is true linear residual */ 251771f87433Sdalcinl ierr = KSPGetResidualNorm(ksp,&kctx->lresid_last);CHKERRQ(ierr); 251871f87433Sdalcinl } else { 251971f87433Sdalcinl /* KSP residual is preconditioned residual */ 252071f87433Sdalcinl /* compute true linear residual norm */ 252171f87433Sdalcinl ierr = VecDuplicate(b,&lres);CHKERRQ(ierr); 252271f87433Sdalcinl ierr = MatMult(snes->jacobian,x,lres);CHKERRQ(ierr); 252371f87433Sdalcinl ierr = VecAYPX(lres,-1.0,b);CHKERRQ(ierr); 252471f87433Sdalcinl ierr = VecNorm(lres,NORM_2,&kctx->lresid_last);CHKERRQ(ierr); 252571f87433Sdalcinl ierr = VecDestroy(lres);CHKERRQ(ierr); 252671f87433Sdalcinl } 252771f87433Sdalcinl } 252871f87433Sdalcinl PetscFunctionReturn(0); 252971f87433Sdalcinl } 253071f87433Sdalcinl 253171f87433Sdalcinl #undef __FUNCT__ 253271f87433Sdalcinl #define __FUNCT__ "SNES_KSPSolve" 253371f87433Sdalcinl PetscErrorCode SNES_KSPSolve(SNES snes, KSP ksp, Vec b, Vec x) 253471f87433Sdalcinl { 253571f87433Sdalcinl PetscErrorCode ierr; 253671f87433Sdalcinl 253771f87433Sdalcinl PetscFunctionBegin; 2538fa9f3622SBarry Smith if (snes->ksp_ewconv) { ierr = SNESKSPEW_PreSolve(snes,ksp,b,x);CHKERRQ(ierr); } 253971f87433Sdalcinl ierr = KSPSolve(ksp,b,x);CHKERRQ(ierr); 2540fa9f3622SBarry Smith if (snes->ksp_ewconv) { ierr = SNESKSPEW_PostSolve(snes,ksp,b,x);CHKERRQ(ierr); } 254171f87433Sdalcinl PetscFunctionReturn(0); 254271f87433Sdalcinl } 2543