1*3a7fca6bSBarry Smith /*$Id: snes.c,v 1.229 2001/04/10 19:36:48 bsmith Exp bsmith $*/ 29b94acceSBarry Smith 3e090d566SSatish Balay #include "src/snes/snesimpl.h" /*I "petscsnes.h" I*/ 49b94acceSBarry Smith 54c49b128SBarry Smith PetscTruth SNESRegisterAllCalled = PETSC_FALSE; 6b0a32e0cSBarry Smith PetscFList SNESList = 0; 782bf6240SBarry Smith 84a2ae208SSatish Balay #undef __FUNCT__ 94a2ae208SSatish Balay #define __FUNCT__ "SNESView" 107e2c5f70SBarry Smith /*@C 119b94acceSBarry Smith SNESView - Prints the SNES data structure. 129b94acceSBarry Smith 134c49b128SBarry Smith Collective on SNES 14fee21e36SBarry Smith 15c7afd0dbSLois Curfman McInnes Input Parameters: 16c7afd0dbSLois Curfman McInnes + SNES - the SNES context 17c7afd0dbSLois Curfman McInnes - viewer - visualization context 18c7afd0dbSLois Curfman McInnes 199b94acceSBarry Smith Options Database Key: 20c8a8ba5cSLois Curfman McInnes . -snes_view - Calls SNESView() at end of SNESSolve() 219b94acceSBarry Smith 229b94acceSBarry Smith Notes: 239b94acceSBarry Smith The available visualization contexts include 24b0a32e0cSBarry Smith + PETSC_VIEWER_STDOUT_SELF - standard output (default) 25b0a32e0cSBarry Smith - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 26c8a8ba5cSLois Curfman McInnes output where only the first processor opens 27c8a8ba5cSLois Curfman McInnes the file. All other processors send their 28c8a8ba5cSLois Curfman McInnes data to the first processor to print. 299b94acceSBarry Smith 303e081fefSLois Curfman McInnes The user can open an alternative visualization context with 31b0a32e0cSBarry Smith PetscViewerASCIIOpen() - output to a specified file. 329b94acceSBarry Smith 3336851e7fSLois Curfman McInnes Level: beginner 3436851e7fSLois Curfman McInnes 359b94acceSBarry Smith .keywords: SNES, view 369b94acceSBarry Smith 37b0a32e0cSBarry Smith .seealso: PetscViewerASCIIOpen() 389b94acceSBarry Smith @*/ 39b0a32e0cSBarry Smith int SNESView(SNES snes,PetscViewer viewer) 409b94acceSBarry Smith { 419b94acceSBarry Smith SNES_KSP_EW_ConvCtx *kctx; 429b94acceSBarry Smith int ierr; 439b94acceSBarry Smith SLES sles; 44454a90a3SBarry Smith char *type; 456831982aSBarry Smith PetscTruth isascii,isstring; 469b94acceSBarry Smith 473a40ed3dSBarry Smith PetscFunctionBegin; 4874679c65SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 49b0a32e0cSBarry Smith if (!viewer) viewer = PETSC_VIEWER_STDOUT_(snes->comm); 50b0a32e0cSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_COOKIE); 516831982aSBarry Smith PetscCheckSameComm(snes,viewer); 5274679c65SBarry Smith 53b0a32e0cSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);CHKERRQ(ierr); 54b0a32e0cSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_STRING,&isstring);CHKERRQ(ierr); 550f5bd95cSBarry Smith if (isascii) { 56*3a7fca6bSBarry Smith if (snes->prefix) { 57*3a7fca6bSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"SNES Object:(%s)\n",snes->prefix);CHKERRQ(ierr); 58*3a7fca6bSBarry Smith } else { 59b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"SNES Object:\n");CHKERRQ(ierr); 60*3a7fca6bSBarry Smith } 61454a90a3SBarry Smith ierr = SNESGetType(snes,&type);CHKERRQ(ierr); 62454a90a3SBarry Smith if (type) { 63b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," type: %s\n",type);CHKERRQ(ierr); 64184914b5SBarry Smith } else { 65b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," type: not set yet\n");CHKERRQ(ierr); 66184914b5SBarry Smith } 670ef38995SBarry Smith if (snes->view) { 68b0a32e0cSBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 690ef38995SBarry Smith ierr = (*snes->view)(snes,viewer);CHKERRQ(ierr); 70b0a32e0cSBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 710ef38995SBarry Smith } 72b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," maximum iterations=%d, maximum function evaluations=%d\n",snes->max_its,snes->max_funcs);CHKERRQ(ierr); 73b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," tolerances: relative=%g, absolute=%g, truncation=%g, solution=%g\n", 74d132466eSBarry Smith snes->rtol,snes->atol,snes->trunctol,snes->xtol);CHKERRQ(ierr); 75b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," total number of linear solver iterations=%d\n",snes->linear_its);CHKERRQ(ierr); 76b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," total number of function evaluations=%d\n",snes->nfuncs);CHKERRQ(ierr); 770ef38995SBarry Smith if (snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) { 78b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," min function tolerance=%g\n",snes->fmin);CHKERRQ(ierr); 790ef38995SBarry Smith } 809b94acceSBarry Smith if (snes->ksp_ewconv) { 819b94acceSBarry Smith kctx = (SNES_KSP_EW_ConvCtx *)snes->kspconvctx; 829b94acceSBarry Smith if (kctx) { 83b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Eisenstat-Walker computation of KSP relative tolerance (version %d)\n",kctx->version);CHKERRQ(ierr); 84b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," rtol_0=%g, rtol_max=%g, threshold=%g\n",kctx->rtol_0,kctx->rtol_max,kctx->threshold);CHKERRQ(ierr); 85b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," gamma=%g, alpha=%g, alpha2=%g\n",kctx->gamma,kctx->alpha,kctx->alpha2);CHKERRQ(ierr); 869b94acceSBarry Smith } 879b94acceSBarry Smith } 880f5bd95cSBarry Smith } else if (isstring) { 89454a90a3SBarry Smith ierr = SNESGetType(snes,&type);CHKERRQ(ierr); 90b0a32e0cSBarry Smith ierr = PetscViewerStringSPrintf(viewer," %-3.3s",type);CHKERRQ(ierr); 9119bcc07fSBarry Smith } 9277ed5343SBarry Smith ierr = SNESGetSLES(snes,&sles);CHKERRQ(ierr); 93b0a32e0cSBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 949b94acceSBarry Smith ierr = SLESView(sles,viewer);CHKERRQ(ierr); 95b0a32e0cSBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 963a40ed3dSBarry Smith PetscFunctionReturn(0); 979b94acceSBarry Smith } 989b94acceSBarry Smith 994a2ae208SSatish Balay #undef __FUNCT__ 1004a2ae208SSatish Balay #define __FUNCT__ "SNESSetFromOptions" 1019b94acceSBarry Smith /*@ 102682d7d0cSBarry Smith SNESSetFromOptions - Sets various SNES and SLES parameters from user options. 1039b94acceSBarry Smith 104c7afd0dbSLois Curfman McInnes Collective on SNES 105c7afd0dbSLois Curfman McInnes 1069b94acceSBarry Smith Input Parameter: 1079b94acceSBarry Smith . snes - the SNES context 1089b94acceSBarry Smith 10936851e7fSLois Curfman McInnes Options Database Keys: 1106831982aSBarry Smith + -snes_type <type> - ls, tr, umls, umtr, test 11182738288SBarry Smith . -snes_stol - convergence tolerance in terms of the norm 11282738288SBarry Smith of the change in the solution between steps 113b39c3a46SLois Curfman McInnes . -snes_atol <atol> - absolute tolerance of residual norm 114b39c3a46SLois Curfman McInnes . -snes_rtol <rtol> - relative decrease in tolerance norm from initial 115b39c3a46SLois Curfman McInnes . -snes_max_it <max_it> - maximum number of iterations 116b39c3a46SLois Curfman McInnes . -snes_max_funcs <max_funcs> - maximum number of function evaluations 117b39c3a46SLois Curfman McInnes . -snes_trtol <trtol> - trust region tolerance 11882738288SBarry Smith . -snes_no_convergence_test - skip convergence test in nonlinear or minimization 11982738288SBarry Smith solver; hence iterations will continue until max_it 1201fbbfb26SLois Curfman McInnes or some other criterion is reached. Saves expense 12182738288SBarry Smith of convergence test 12282738288SBarry Smith . -snes_monitor - prints residual norm at each iteration 123d132466eSBarry Smith . -snes_vecmonitor - plots solution at each iteration 124d132466eSBarry Smith . -snes_vecmonitor_update - plots update to solution at each iteration 12582738288SBarry Smith . -snes_xmonitor - plots residual norm at each iteration 126e24b481bSBarry Smith . -snes_fd - use finite differences to compute Jacobian; very slow, only for testing 12736851e7fSLois Curfman McInnes - -snes_mf_ksp_monitor - if using matrix-free multiply then print h at each KSP iteration 12882738288SBarry Smith 12982738288SBarry Smith Options Database for Eisenstat-Walker method: 13082738288SBarry Smith + -snes_ksp_eq_conv - use Eisenstat-Walker method for determining linear system convergence 13182738288SBarry Smith . -snes_ksp_eq_version ver - version of Eisenstat-Walker method 13236851e7fSLois Curfman McInnes . -snes_ksp_ew_rtol0 <rtol0> - Sets rtol0 13336851e7fSLois Curfman McInnes . -snes_ksp_ew_rtolmax <rtolmax> - Sets rtolmax 13436851e7fSLois Curfman McInnes . -snes_ksp_ew_gamma <gamma> - Sets gamma 13536851e7fSLois Curfman McInnes . -snes_ksp_ew_alpha <alpha> - Sets alpha 13636851e7fSLois Curfman McInnes . -snes_ksp_ew_alpha2 <alpha2> - Sets alpha2 13736851e7fSLois Curfman McInnes - -snes_ksp_ew_threshold <threshold> - Sets threshold 13882738288SBarry Smith 13911ca99fdSLois Curfman McInnes Notes: 14011ca99fdSLois Curfman McInnes To see all options, run your program with the -help option or consult 14111ca99fdSLois Curfman McInnes the users manual. 14283e2fdc7SBarry Smith 14336851e7fSLois Curfman McInnes Level: beginner 14436851e7fSLois Curfman McInnes 1459b94acceSBarry Smith .keywords: SNES, nonlinear, set, options, database 1469b94acceSBarry Smith 147186905e3SBarry Smith .seealso: SNESSetOptionsPrefix(), SNESSetTypeFromOptions() 1489b94acceSBarry Smith @*/ 1499b94acceSBarry Smith int SNESSetFromOptions(SNES snes) 1509b94acceSBarry Smith { 1519b94acceSBarry Smith SLES sles; 152186905e3SBarry Smith SNES_KSP_EW_ConvCtx *kctx = (SNES_KSP_EW_ConvCtx *)snes->kspconvctx; 153f1af5d2fSBarry Smith PetscTruth flg; 154186905e3SBarry Smith int ierr; 155186905e3SBarry Smith char *deft,type[256]; 1569b94acceSBarry Smith 1573a40ed3dSBarry Smith PetscFunctionBegin; 15877c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 159ca161407SBarry Smith 160b0a32e0cSBarry Smith ierr = PetscOptionsBegin(snes->comm,snes->prefix,"Nonlinear solver (SNES) options","SNES");CHKERRQ(ierr); 161186905e3SBarry Smith if (snes->type_name) { 162186905e3SBarry Smith deft = snes->type_name; 163186905e3SBarry Smith } else { 164186905e3SBarry Smith if (snes->method_class == SNES_NONLINEAR_EQUATIONS) { 165186905e3SBarry Smith deft = SNESEQLS; 166186905e3SBarry Smith } else { 167186905e3SBarry Smith deft = SNESUMTR; 168d64ed03dSBarry Smith } 169d64ed03dSBarry Smith } 1704bbc92c1SBarry Smith 171186905e3SBarry Smith if (!SNESRegisterAllCalled) {ierr = SNESRegisterAll(PETSC_NULL);CHKERRQ(ierr);} 172b0a32e0cSBarry Smith ierr = PetscOptionsList("-snes_type","Nonlinear solver method","SNESSetType",SNESList,deft,type,256,&flg);CHKERRQ(ierr); 173d64ed03dSBarry Smith if (flg) { 174186905e3SBarry Smith ierr = SNESSetType(snes,type);CHKERRQ(ierr); 175186905e3SBarry Smith } else if (!snes->type_name) { 176186905e3SBarry Smith ierr = SNESSetType(snes,deft);CHKERRQ(ierr); 177d64ed03dSBarry Smith } 17893c39befSBarry Smith 179b0a32e0cSBarry Smith ierr = PetscOptionsDouble("-snes_stol","Stop if step length less then","SNESSetTolerances",snes->xtol,&snes->xtol,0);CHKERRQ(ierr); 180b0a32e0cSBarry Smith ierr = PetscOptionsDouble("-snes_atol","Stop if function norm less then","SNESSetTolerances",snes->atol,&snes->atol,0);CHKERRQ(ierr); 181186905e3SBarry Smith 182b0a32e0cSBarry Smith ierr = PetscOptionsDouble("-snes_rtol","Stop if decrease in function norm less then","SNESSetTolerances",snes->rtol,&snes->rtol,0);CHKERRQ(ierr); 183b0a32e0cSBarry Smith ierr = PetscOptionsInt("-snes_max_it","Maximum iterations","SNESSetTolerances",snes->max_its,&snes->max_its,PETSC_NULL);CHKERRQ(ierr); 184b0a32e0cSBarry Smith ierr = PetscOptionsInt("-snes_max_funcs","Maximum function evaluations","SNESSetTolerances",snes->max_funcs,&snes->max_funcs,PETSC_NULL);CHKERRQ(ierr); 185b0a32e0cSBarry Smith ierr = PetscOptionsDouble("-snes_fmin","Minimization function tolerance","SNESSetMinimizationFunctionTolerance",snes->fmin,&snes->fmin,0);CHKERRQ(ierr); 186186905e3SBarry Smith 187b0a32e0cSBarry Smith ierr = PetscOptionsName("-snes_ksp_ew_conv","Use Eisentat-Walker linear system convergence test","SNES_KSP_SetParametersEW",&snes->ksp_ewconv);CHKERRQ(ierr); 188186905e3SBarry Smith 189b0a32e0cSBarry Smith ierr = PetscOptionsInt("-snes_ksp_ew_version","Version 1 or 2","SNES_KSP_SetParametersEW",kctx->version,&kctx->version,0);CHKERRQ(ierr); 190b0a32e0cSBarry Smith ierr = PetscOptionsDouble("-snes_ksp_ew_rtol0","0 <= rtol0 < 1","SNES_KSP_SetParametersEW",kctx->rtol_0,&kctx->rtol_0,0);CHKERRQ(ierr); 191b0a32e0cSBarry Smith ierr = PetscOptionsDouble("-snes_ksp_ew_rtolmax","0 <= rtolmax < 1","SNES_KSP_SetParametersEW",kctx->rtol_max,&kctx->rtol_max,0);CHKERRQ(ierr); 192b0a32e0cSBarry Smith ierr = PetscOptionsDouble("-snes_ksp_ew_gamma","0 <= gamma <= 1","SNES_KSP_SetParametersEW",kctx->gamma,&kctx->gamma,0);CHKERRQ(ierr); 193b0a32e0cSBarry Smith ierr = PetscOptionsDouble("-snes_ksp_ew_alpha","1 < alpha <= 2","SNES_KSP_SetParametersEW",kctx->alpha,&kctx->alpha,0);CHKERRQ(ierr); 194b0a32e0cSBarry Smith ierr = PetscOptionsDouble("-snes_ksp_ew_alpha2","alpha2","SNES_KSP_SetParametersEW",kctx->alpha2,&kctx->alpha2,0);CHKERRQ(ierr); 195b0a32e0cSBarry Smith ierr = PetscOptionsDouble("-snes_ksp_ew_threshold","0 < threshold < 1","SNES_KSP_SetParametersEW",kctx->threshold,&kctx->threshold,0);CHKERRQ(ierr); 196186905e3SBarry Smith 197b0a32e0cSBarry Smith ierr = PetscOptionsName("-snes_no_convergence_test","Don't test for convergence","None",&flg);CHKERRQ(ierr); 19893c39befSBarry Smith if (flg) {snes->converged = 0;} 199b0a32e0cSBarry Smith ierr = PetscOptionsName("-snes_cancelmonitors","Remove all monitors","SNESClearMonitor",&flg);CHKERRQ(ierr); 2005cd90555SBarry Smith if (flg) {ierr = SNESClearMonitor(snes);CHKERRQ(ierr);} 201b0a32e0cSBarry Smith ierr = PetscOptionsName("-snes_monitor","Monitor norm of function","SNESDefaultMonitor",&flg);CHKERRQ(ierr); 202b8a78c4aSBarry Smith if (flg) {ierr = SNESSetMonitor(snes,SNESDefaultMonitor,0,0);CHKERRQ(ierr);} 203*3a7fca6bSBarry Smith ierr = PetscOptionsName("-snes_ratiomonitor","Monitor norm of function","SNESSetRatioMonitor",&flg);CHKERRQ(ierr); 204*3a7fca6bSBarry Smith if (flg) {ierr = SNESSetRatioMonitor(snes);CHKERRQ(ierr);} 205b0a32e0cSBarry Smith ierr = PetscOptionsName("-snes_smonitor","Monitor norm of function (fewer digits)","SNESDefaultSMonitor",&flg);CHKERRQ(ierr); 206b8a78c4aSBarry Smith if (flg) {ierr = SNESSetMonitor(snes,SNESDefaultSMonitor,0,0);CHKERRQ(ierr);} 207b0a32e0cSBarry Smith ierr = PetscOptionsName("-snes_vecmonitor","Plot solution at each iteration","SNESVecViewMonitor",&flg);CHKERRQ(ierr); 208b8a78c4aSBarry Smith if (flg) {ierr = SNESSetMonitor(snes,SNESVecViewMonitor,0,0);CHKERRQ(ierr);} 209b0a32e0cSBarry Smith ierr = PetscOptionsName("-snes_vecmonitor_update","Plot correction at each iteration","SNESVecViewUpdateMonitor",&flg);CHKERRQ(ierr); 2107c922b88SBarry Smith if (flg) {ierr = SNESSetMonitor(snes,SNESVecViewUpdateMonitor,0,0);CHKERRQ(ierr);} 211b0a32e0cSBarry Smith ierr = PetscOptionsName("-snes_xmonitor","Plot function norm at each iteration","SNESLGMonitor",&flg);CHKERRQ(ierr); 212186905e3SBarry Smith if (flg) {ierr = SNESSetMonitor(snes,SNESLGMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);} 213e24b481bSBarry Smith 214b0a32e0cSBarry Smith ierr = PetscOptionsName("-snes_fd","Use finite differences (slow) to compute Jacobian","SNESDefaultComputeJacobian",&flg);CHKERRQ(ierr); 2153c7409f5SSatish Balay if (flg && snes->method_class == SNES_NONLINEAR_EQUATIONS) { 216186905e3SBarry Smith ierr = SNESSetJacobian(snes,snes->jacobian,snes->jacobian_pre,SNESDefaultComputeJacobian,snes->funP);CHKERRQ(ierr); 217b0a32e0cSBarry Smith PetscLogInfo(snes,"SNESSetFromOptions: Setting default finite difference Jacobian matrix\n"); 218981c4779SBarry Smith } else if (flg && snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) { 219186905e3SBarry Smith ierr = SNESSetHessian(snes,snes->jacobian,snes->jacobian_pre,SNESDefaultComputeHessian,snes->funP);CHKERRQ(ierr); 220b0a32e0cSBarry Smith PetscLogInfo(snes,"SNESSetFromOptions: Setting default finite difference Hessian matrix\n"); 2219b94acceSBarry Smith } 222639f9d9dSBarry Smith 223186905e3SBarry Smith if (snes->setfromoptions) { 224186905e3SBarry Smith ierr = (*snes->setfromoptions)(snes);CHKERRQ(ierr); 225639f9d9dSBarry Smith } 226639f9d9dSBarry Smith 227b0a32e0cSBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 2284bbc92c1SBarry Smith 2299b94acceSBarry Smith ierr = SNESGetSLES(snes,&sles);CHKERRQ(ierr); 2309b94acceSBarry Smith ierr = SLESSetFromOptions(sles);CHKERRQ(ierr); 23193993e2dSLois Curfman McInnes 2323a40ed3dSBarry Smith PetscFunctionReturn(0); 2339b94acceSBarry Smith } 2349b94acceSBarry Smith 235a847f771SSatish Balay 2364a2ae208SSatish Balay #undef __FUNCT__ 2374a2ae208SSatish Balay #define __FUNCT__ "SNESSetApplicationContext" 2389b94acceSBarry Smith /*@ 2399b94acceSBarry Smith SNESSetApplicationContext - Sets the optional user-defined context for 2409b94acceSBarry Smith the nonlinear solvers. 2419b94acceSBarry Smith 242fee21e36SBarry Smith Collective on SNES 243fee21e36SBarry Smith 244c7afd0dbSLois Curfman McInnes Input Parameters: 245c7afd0dbSLois Curfman McInnes + snes - the SNES context 246c7afd0dbSLois Curfman McInnes - usrP - optional user context 247c7afd0dbSLois Curfman McInnes 24836851e7fSLois Curfman McInnes Level: intermediate 24936851e7fSLois Curfman McInnes 2509b94acceSBarry Smith .keywords: SNES, nonlinear, set, application, context 2519b94acceSBarry Smith 2529b94acceSBarry Smith .seealso: SNESGetApplicationContext() 2539b94acceSBarry Smith @*/ 2549b94acceSBarry Smith int SNESSetApplicationContext(SNES snes,void *usrP) 2559b94acceSBarry Smith { 2563a40ed3dSBarry Smith PetscFunctionBegin; 25777c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2589b94acceSBarry Smith snes->user = usrP; 2593a40ed3dSBarry Smith PetscFunctionReturn(0); 2609b94acceSBarry Smith } 26174679c65SBarry Smith 2624a2ae208SSatish Balay #undef __FUNCT__ 2634a2ae208SSatish Balay #define __FUNCT__ "SNESGetApplicationContext" 2649b94acceSBarry Smith /*@C 2659b94acceSBarry Smith SNESGetApplicationContext - Gets the user-defined context for the 2669b94acceSBarry Smith nonlinear solvers. 2679b94acceSBarry Smith 268c7afd0dbSLois Curfman McInnes Not Collective 269c7afd0dbSLois Curfman McInnes 2709b94acceSBarry Smith Input Parameter: 2719b94acceSBarry Smith . snes - SNES context 2729b94acceSBarry Smith 2739b94acceSBarry Smith Output Parameter: 2749b94acceSBarry Smith . usrP - user context 2759b94acceSBarry Smith 27636851e7fSLois Curfman McInnes Level: intermediate 27736851e7fSLois Curfman McInnes 2789b94acceSBarry Smith .keywords: SNES, nonlinear, get, application, context 2799b94acceSBarry Smith 2809b94acceSBarry Smith .seealso: SNESSetApplicationContext() 2819b94acceSBarry Smith @*/ 2829b94acceSBarry Smith int SNESGetApplicationContext(SNES snes,void **usrP) 2839b94acceSBarry Smith { 2843a40ed3dSBarry Smith PetscFunctionBegin; 28577c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2869b94acceSBarry Smith *usrP = snes->user; 2873a40ed3dSBarry Smith PetscFunctionReturn(0); 2889b94acceSBarry Smith } 28974679c65SBarry Smith 2904a2ae208SSatish Balay #undef __FUNCT__ 2914a2ae208SSatish Balay #define __FUNCT__ "SNESGetIterationNumber" 2929b94acceSBarry Smith /*@ 293c8228a4eSBarry Smith SNESGetIterationNumber - Gets the number of nonlinear iterations completed 294c8228a4eSBarry Smith at this time. 2959b94acceSBarry Smith 296c7afd0dbSLois Curfman McInnes Not Collective 297c7afd0dbSLois Curfman McInnes 2989b94acceSBarry Smith Input Parameter: 2999b94acceSBarry Smith . snes - SNES context 3009b94acceSBarry Smith 3019b94acceSBarry Smith Output Parameter: 3029b94acceSBarry Smith . iter - iteration number 3039b94acceSBarry Smith 304c8228a4eSBarry Smith Notes: 305c8228a4eSBarry Smith For example, during the computation of iteration 2 this would return 1. 306c8228a4eSBarry Smith 307c8228a4eSBarry Smith This is useful for using lagged Jacobians (where one does not recompute the 30808405cd6SLois Curfman McInnes Jacobian at each SNES iteration). For example, the code 30908405cd6SLois Curfman McInnes .vb 31008405cd6SLois Curfman McInnes ierr = SNESGetIterationNumber(snes,&it); 31108405cd6SLois Curfman McInnes if (!(it % 2)) { 31208405cd6SLois Curfman McInnes [compute Jacobian here] 31308405cd6SLois Curfman McInnes } 31408405cd6SLois Curfman McInnes .ve 315c8228a4eSBarry Smith can be used in your ComputeJacobian() function to cause the Jacobian to be 31608405cd6SLois Curfman McInnes recomputed every second SNES iteration. 317c8228a4eSBarry Smith 31836851e7fSLois Curfman McInnes Level: intermediate 31936851e7fSLois Curfman McInnes 3209b94acceSBarry Smith .keywords: SNES, nonlinear, get, iteration, number 3219b94acceSBarry Smith @*/ 3229b94acceSBarry Smith int SNESGetIterationNumber(SNES snes,int* iter) 3239b94acceSBarry Smith { 3243a40ed3dSBarry Smith PetscFunctionBegin; 32577c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 32674679c65SBarry Smith PetscValidIntPointer(iter); 3279b94acceSBarry Smith *iter = snes->iter; 3283a40ed3dSBarry Smith PetscFunctionReturn(0); 3299b94acceSBarry Smith } 33074679c65SBarry Smith 3314a2ae208SSatish Balay #undef __FUNCT__ 3324a2ae208SSatish Balay #define __FUNCT__ "SNESGetFunctionNorm" 3339b94acceSBarry Smith /*@ 3349b94acceSBarry Smith SNESGetFunctionNorm - Gets the norm of the current function that was set 3359b94acceSBarry Smith with SNESSSetFunction(). 3369b94acceSBarry Smith 337c7afd0dbSLois Curfman McInnes Collective on SNES 338c7afd0dbSLois Curfman McInnes 3399b94acceSBarry Smith Input Parameter: 3409b94acceSBarry Smith . snes - SNES context 3419b94acceSBarry Smith 3429b94acceSBarry Smith Output Parameter: 3439b94acceSBarry Smith . fnorm - 2-norm of function 3449b94acceSBarry Smith 3459b94acceSBarry Smith Note: 3469b94acceSBarry Smith SNESGetFunctionNorm() is valid for SNES_NONLINEAR_EQUATIONS methods only. 347a86d99e1SLois Curfman McInnes A related routine for SNES_UNCONSTRAINED_MINIMIZATION methods is 348a86d99e1SLois Curfman McInnes SNESGetGradientNorm(). 3499b94acceSBarry Smith 35036851e7fSLois Curfman McInnes Level: intermediate 35136851e7fSLois Curfman McInnes 3529b94acceSBarry Smith .keywords: SNES, nonlinear, get, function, norm 353a86d99e1SLois Curfman McInnes 35408405cd6SLois Curfman McInnes .seealso: SNESGetFunction() 3559b94acceSBarry Smith @*/ 3569b94acceSBarry Smith int SNESGetFunctionNorm(SNES snes,Scalar *fnorm) 3579b94acceSBarry Smith { 3583a40ed3dSBarry Smith PetscFunctionBegin; 35977c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 36074679c65SBarry Smith PetscValidScalarPointer(fnorm); 36174679c65SBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 36229bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"For SNES_NONLINEAR_EQUATIONS only"); 36374679c65SBarry Smith } 3649b94acceSBarry Smith *fnorm = snes->norm; 3653a40ed3dSBarry Smith PetscFunctionReturn(0); 3669b94acceSBarry Smith } 36774679c65SBarry Smith 3684a2ae208SSatish Balay #undef __FUNCT__ 3694a2ae208SSatish Balay #define __FUNCT__ "SNESGetGradientNorm" 3709b94acceSBarry Smith /*@ 3719b94acceSBarry Smith SNESGetGradientNorm - Gets the norm of the current gradient that was set 3729b94acceSBarry Smith with SNESSSetGradient(). 3739b94acceSBarry Smith 374c7afd0dbSLois Curfman McInnes Collective on SNES 375c7afd0dbSLois Curfman McInnes 3769b94acceSBarry Smith Input Parameter: 3779b94acceSBarry Smith . snes - SNES context 3789b94acceSBarry Smith 3799b94acceSBarry Smith Output Parameter: 3809b94acceSBarry Smith . fnorm - 2-norm of gradient 3819b94acceSBarry Smith 3829b94acceSBarry Smith Note: 3839b94acceSBarry Smith SNESGetGradientNorm() is valid for SNES_UNCONSTRAINED_MINIMIZATION 384a86d99e1SLois Curfman McInnes methods only. A related routine for SNES_NONLINEAR_EQUATIONS methods 385a86d99e1SLois Curfman McInnes is SNESGetFunctionNorm(). 3869b94acceSBarry Smith 38736851e7fSLois Curfman McInnes Level: intermediate 38836851e7fSLois Curfman McInnes 3899b94acceSBarry Smith .keywords: SNES, nonlinear, get, gradient, norm 390a86d99e1SLois Curfman McInnes 391a86d99e1SLois Curfman McInnes .seelso: SNESSetGradient() 3929b94acceSBarry Smith @*/ 3939b94acceSBarry Smith int SNESGetGradientNorm(SNES snes,Scalar *gnorm) 3949b94acceSBarry Smith { 3953a40ed3dSBarry Smith PetscFunctionBegin; 39677c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 39774679c65SBarry Smith PetscValidScalarPointer(gnorm); 39874679c65SBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 39929bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 40074679c65SBarry Smith } 4019b94acceSBarry Smith *gnorm = snes->norm; 4023a40ed3dSBarry Smith PetscFunctionReturn(0); 4039b94acceSBarry Smith } 40474679c65SBarry Smith 4054a2ae208SSatish Balay #undef __FUNCT__ 4064a2ae208SSatish Balay #define __FUNCT__ "SNESGetNumberUnsuccessfulSteps" 4079b94acceSBarry Smith /*@ 4089b94acceSBarry Smith SNESGetNumberUnsuccessfulSteps - Gets the number of unsuccessful steps 4099b94acceSBarry Smith attempted by the nonlinear solver. 4109b94acceSBarry Smith 411c7afd0dbSLois Curfman McInnes Not Collective 412c7afd0dbSLois Curfman McInnes 4139b94acceSBarry Smith Input Parameter: 4149b94acceSBarry Smith . snes - SNES context 4159b94acceSBarry Smith 4169b94acceSBarry Smith Output Parameter: 4179b94acceSBarry Smith . nfails - number of unsuccessful steps attempted 4189b94acceSBarry Smith 419c96a6f78SLois Curfman McInnes Notes: 420c96a6f78SLois Curfman McInnes This counter is reset to zero for each successive call to SNESSolve(). 421c96a6f78SLois Curfman McInnes 42236851e7fSLois Curfman McInnes Level: intermediate 42336851e7fSLois Curfman McInnes 4249b94acceSBarry Smith .keywords: SNES, nonlinear, get, number, unsuccessful, steps 4259b94acceSBarry Smith @*/ 4269b94acceSBarry Smith int SNESGetNumberUnsuccessfulSteps(SNES snes,int* nfails) 4279b94acceSBarry Smith { 4283a40ed3dSBarry Smith PetscFunctionBegin; 42977c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 43074679c65SBarry Smith PetscValidIntPointer(nfails); 4319b94acceSBarry Smith *nfails = snes->nfailures; 4323a40ed3dSBarry Smith PetscFunctionReturn(0); 4339b94acceSBarry Smith } 434a847f771SSatish Balay 4354a2ae208SSatish Balay #undef __FUNCT__ 4364a2ae208SSatish Balay #define __FUNCT__ "SNESGetNumberLinearIterations" 437c96a6f78SLois Curfman McInnes /*@ 438c96a6f78SLois Curfman McInnes SNESGetNumberLinearIterations - Gets the total number of linear iterations 439c96a6f78SLois Curfman McInnes used by the nonlinear solver. 440c96a6f78SLois Curfman McInnes 441c7afd0dbSLois Curfman McInnes Not Collective 442c7afd0dbSLois Curfman McInnes 443c96a6f78SLois Curfman McInnes Input Parameter: 444c96a6f78SLois Curfman McInnes . snes - SNES context 445c96a6f78SLois Curfman McInnes 446c96a6f78SLois Curfman McInnes Output Parameter: 447c96a6f78SLois Curfman McInnes . lits - number of linear iterations 448c96a6f78SLois Curfman McInnes 449c96a6f78SLois Curfman McInnes Notes: 450c96a6f78SLois Curfman McInnes This counter is reset to zero for each successive call to SNESSolve(). 451c96a6f78SLois Curfman McInnes 45236851e7fSLois Curfman McInnes Level: intermediate 45336851e7fSLois Curfman McInnes 454c96a6f78SLois Curfman McInnes .keywords: SNES, nonlinear, get, number, linear, iterations 455c96a6f78SLois Curfman McInnes @*/ 45686bddb7dSBarry Smith int SNESGetNumberLinearIterations(SNES snes,int* lits) 457c96a6f78SLois Curfman McInnes { 4583a40ed3dSBarry Smith PetscFunctionBegin; 459c96a6f78SLois Curfman McInnes PetscValidHeaderSpecific(snes,SNES_COOKIE); 460c96a6f78SLois Curfman McInnes PetscValidIntPointer(lits); 461c96a6f78SLois Curfman McInnes *lits = snes->linear_its; 4623a40ed3dSBarry Smith PetscFunctionReturn(0); 463c96a6f78SLois Curfman McInnes } 464c96a6f78SLois Curfman McInnes 4654a2ae208SSatish Balay #undef __FUNCT__ 4664a2ae208SSatish Balay #define __FUNCT__ "SNESGetSLES" 4679b94acceSBarry Smith /*@C 4689b94acceSBarry Smith SNESGetSLES - Returns the SLES context for a SNES solver. 4699b94acceSBarry Smith 470c7afd0dbSLois Curfman McInnes Not Collective, but if SNES object is parallel, then SLES object is parallel 471c7afd0dbSLois Curfman McInnes 4729b94acceSBarry Smith Input Parameter: 4739b94acceSBarry Smith . snes - the SNES context 4749b94acceSBarry Smith 4759b94acceSBarry Smith Output Parameter: 4769b94acceSBarry Smith . sles - the SLES context 4779b94acceSBarry Smith 4789b94acceSBarry Smith Notes: 4799b94acceSBarry Smith The user can then directly manipulate the SLES context to set various 4809b94acceSBarry Smith options, etc. Likewise, the user can then extract and manipulate the 4819b94acceSBarry Smith KSP and PC contexts as well. 4829b94acceSBarry Smith 48336851e7fSLois Curfman McInnes Level: beginner 48436851e7fSLois Curfman McInnes 4859b94acceSBarry Smith .keywords: SNES, nonlinear, get, SLES, context 4869b94acceSBarry Smith 4879b94acceSBarry Smith .seealso: SLESGetPC(), SLESGetKSP() 4889b94acceSBarry Smith @*/ 4899b94acceSBarry Smith int SNESGetSLES(SNES snes,SLES *sles) 4909b94acceSBarry Smith { 4913a40ed3dSBarry Smith PetscFunctionBegin; 49277c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 4939b94acceSBarry Smith *sles = snes->sles; 4943a40ed3dSBarry Smith PetscFunctionReturn(0); 4959b94acceSBarry Smith } 49682bf6240SBarry Smith 4974a2ae208SSatish Balay #undef __FUNCT__ 4984a2ae208SSatish Balay #define __FUNCT__ "SNESPublish_Petsc" 499454a90a3SBarry Smith static int SNESPublish_Petsc(PetscObject obj) 500e24b481bSBarry Smith { 501aa482453SBarry Smith #if defined(PETSC_HAVE_AMS) 502454a90a3SBarry Smith SNES v = (SNES) obj; 503e24b481bSBarry Smith int ierr; 50443d6d2cbSBarry Smith #endif 505e24b481bSBarry Smith 506e24b481bSBarry Smith PetscFunctionBegin; 507e24b481bSBarry Smith 50843d6d2cbSBarry Smith #if defined(PETSC_HAVE_AMS) 509e24b481bSBarry Smith /* if it is already published then return */ 510e24b481bSBarry Smith if (v->amem >=0) PetscFunctionReturn(0); 511e24b481bSBarry Smith 512454a90a3SBarry Smith ierr = PetscObjectPublishBaseBegin(obj);CHKERRQ(ierr); 513e24b481bSBarry Smith ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Iteration",&v->iter,1,AMS_INT,AMS_READ, 514e24b481bSBarry Smith AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 515e24b481bSBarry Smith ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Residual",&v->norm,1,AMS_DOUBLE,AMS_READ, 516e24b481bSBarry Smith AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 517454a90a3SBarry Smith ierr = PetscObjectPublishBaseEnd(obj);CHKERRQ(ierr); 518433994e6SBarry Smith #endif 519e24b481bSBarry Smith PetscFunctionReturn(0); 520e24b481bSBarry Smith } 521e24b481bSBarry Smith 5229b94acceSBarry Smith /* -----------------------------------------------------------*/ 5234a2ae208SSatish Balay #undef __FUNCT__ 5244a2ae208SSatish Balay #define __FUNCT__ "SNESCreate" 5259b94acceSBarry Smith /*@C 5269b94acceSBarry Smith SNESCreate - Creates a nonlinear solver context. 5279b94acceSBarry Smith 528c7afd0dbSLois Curfman McInnes Collective on MPI_Comm 529c7afd0dbSLois Curfman McInnes 530c7afd0dbSLois Curfman McInnes Input Parameters: 531c7afd0dbSLois Curfman McInnes + comm - MPI communicator 532c7afd0dbSLois Curfman McInnes - type - type of method, either 533c7afd0dbSLois Curfman McInnes SNES_NONLINEAR_EQUATIONS (for systems of nonlinear equations) 534c7afd0dbSLois Curfman McInnes or SNES_UNCONSTRAINED_MINIMIZATION (for unconstrained minimization) 5359b94acceSBarry Smith 5369b94acceSBarry Smith Output Parameter: 5379b94acceSBarry Smith . outsnes - the new SNES context 5389b94acceSBarry Smith 539c7afd0dbSLois Curfman McInnes Options Database Keys: 540c7afd0dbSLois Curfman McInnes + -snes_mf - Activates default matrix-free Jacobian-vector products, 541c7afd0dbSLois Curfman McInnes and no preconditioning matrix 542c7afd0dbSLois Curfman McInnes . -snes_mf_operator - Activates default matrix-free Jacobian-vector 543c7afd0dbSLois Curfman McInnes products, and a user-provided preconditioning matrix 544c7afd0dbSLois Curfman McInnes as set by SNESSetJacobian() 545c7afd0dbSLois Curfman McInnes - -snes_fd - Uses (slow!) finite differences to compute Jacobian 546c1f60f51SBarry Smith 54736851e7fSLois Curfman McInnes Level: beginner 54836851e7fSLois Curfman McInnes 5499b94acceSBarry Smith .keywords: SNES, nonlinear, create, context 5509b94acceSBarry Smith 551435da068SBarry Smith .seealso: SNESSolve(), SNESDestroy(), SNESProblemType, SNES 5529b94acceSBarry Smith @*/ 5534b0e389bSBarry Smith int SNESCreate(MPI_Comm comm,SNESProblemType type,SNES *outsnes) 5549b94acceSBarry Smith { 5559b94acceSBarry Smith int ierr; 5569b94acceSBarry Smith SNES snes; 5579b94acceSBarry Smith SNES_KSP_EW_ConvCtx *kctx; 55837fcc0dbSBarry Smith 5593a40ed3dSBarry Smith PetscFunctionBegin; 5609b94acceSBarry Smith *outsnes = 0; 561d64ed03dSBarry Smith if (type != SNES_UNCONSTRAINED_MINIMIZATION && type != SNES_NONLINEAR_EQUATIONS){ 56229bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"incorrect method type"); 563d64ed03dSBarry Smith } 5643f1db9ecSBarry Smith PetscHeaderCreate(snes,_p_SNES,int,SNES_COOKIE,0,"SNES",comm,SNESDestroy,SNESView); 565b0a32e0cSBarry Smith PetscLogObjectCreate(snes); 566e24b481bSBarry Smith snes->bops->publish = SNESPublish_Petsc; 5679b94acceSBarry Smith snes->max_its = 50; 5689750a799SBarry Smith snes->max_funcs = 10000; 5699b94acceSBarry Smith snes->norm = 0.0; 5705a2d0531SBarry Smith if (type == SNES_UNCONSTRAINED_MINIMIZATION) { 571b18e04deSLois Curfman McInnes snes->rtol = 1.e-8; 572b18e04deSLois Curfman McInnes snes->ttol = 0.0; 5739b94acceSBarry Smith snes->atol = 1.e-10; 574d64ed03dSBarry Smith } else { 575b4874afaSBarry Smith snes->rtol = 1.e-8; 576b4874afaSBarry Smith snes->ttol = 0.0; 577b4874afaSBarry Smith snes->atol = 1.e-50; 578b4874afaSBarry Smith } 5799b94acceSBarry Smith snes->xtol = 1.e-8; 580b18e04deSLois Curfman McInnes snes->trunctol = 1.e-12; /* no longer used */ 5819b94acceSBarry Smith snes->nfuncs = 0; 5829b94acceSBarry Smith snes->nfailures = 0; 5837a00f4a9SLois Curfman McInnes snes->linear_its = 0; 584639f9d9dSBarry Smith snes->numbermonitors = 0; 5859b94acceSBarry Smith snes->data = 0; 5869b94acceSBarry Smith snes->view = 0; 5879b94acceSBarry Smith snes->computeumfunction = 0; 5889b94acceSBarry Smith snes->umfunP = 0; 5899b94acceSBarry Smith snes->fc = 0; 5909b94acceSBarry Smith snes->deltatol = 1.e-12; 5919b94acceSBarry Smith snes->fmin = -1.e30; 5929b94acceSBarry Smith snes->method_class = type; 5939b94acceSBarry Smith snes->set_method_called = 0; 59482bf6240SBarry Smith snes->setupcalled = 0; 595186905e3SBarry Smith snes->ksp_ewconv = PETSC_FALSE; 5966f24a144SLois Curfman McInnes snes->vwork = 0; 5976f24a144SLois Curfman McInnes snes->nwork = 0; 598758f92a0SBarry Smith snes->conv_hist_len = 0; 599758f92a0SBarry Smith snes->conv_hist_max = 0; 600758f92a0SBarry Smith snes->conv_hist = PETSC_NULL; 601758f92a0SBarry Smith snes->conv_hist_its = PETSC_NULL; 602758f92a0SBarry Smith snes->conv_hist_reset = PETSC_TRUE; 603184914b5SBarry Smith snes->reason = SNES_CONVERGED_ITERATING; 6049b94acceSBarry Smith 6059b94acceSBarry Smith /* Create context to compute Eisenstat-Walker relative tolerance for KSP */ 606b0a32e0cSBarry Smith ierr = PetscNew(SNES_KSP_EW_ConvCtx,&kctx);CHKERRQ(ierr); 607b0a32e0cSBarry Smith PetscLogObjectMemory(snes,sizeof(SNES_KSP_EW_ConvCtx)); 6089b94acceSBarry Smith snes->kspconvctx = (void*)kctx; 6099b94acceSBarry Smith kctx->version = 2; 6109b94acceSBarry Smith kctx->rtol_0 = .3; /* Eisenstat and Walker suggest rtol_0=.5, but 6119b94acceSBarry Smith this was too large for some test cases */ 6129b94acceSBarry Smith kctx->rtol_last = 0; 6139b94acceSBarry Smith kctx->rtol_max = .9; 6149b94acceSBarry Smith kctx->gamma = 1.0; 6159b94acceSBarry Smith kctx->alpha2 = .5*(1.0 + sqrt(5.0)); 6169b94acceSBarry Smith kctx->alpha = kctx->alpha2; 6179b94acceSBarry Smith kctx->threshold = .1; 6189b94acceSBarry Smith kctx->lresid_last = 0; 6199b94acceSBarry Smith kctx->norm_last = 0; 6209b94acceSBarry Smith 6219b94acceSBarry Smith ierr = SLESCreate(comm,&snes->sles);CHKERRQ(ierr); 622b0a32e0cSBarry Smith PetscLogObjectParent(snes,snes->sles) 6235334005bSBarry Smith 6249b94acceSBarry Smith *outsnes = snes; 62500036973SBarry Smith ierr = PetscPublishAll(snes);CHKERRQ(ierr); 6263a40ed3dSBarry Smith PetscFunctionReturn(0); 6279b94acceSBarry Smith } 6289b94acceSBarry Smith 6299b94acceSBarry Smith /* --------------------------------------------------------------- */ 6304a2ae208SSatish Balay #undef __FUNCT__ 6314a2ae208SSatish Balay #define __FUNCT__ "SNESSetFunction" 6329b94acceSBarry Smith /*@C 6339b94acceSBarry Smith SNESSetFunction - Sets the function evaluation routine and function 6349b94acceSBarry Smith vector for use by the SNES routines in solving systems of nonlinear 6359b94acceSBarry Smith equations. 6369b94acceSBarry Smith 637fee21e36SBarry Smith Collective on SNES 638fee21e36SBarry Smith 639c7afd0dbSLois Curfman McInnes Input Parameters: 640c7afd0dbSLois Curfman McInnes + snes - the SNES context 641c7afd0dbSLois Curfman McInnes . func - function evaluation routine 642c7afd0dbSLois Curfman McInnes . r - vector to store function value 643c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined context for private data for the 644c7afd0dbSLois Curfman McInnes function evaluation routine (may be PETSC_NULL) 6459b94acceSBarry Smith 646c7afd0dbSLois Curfman McInnes Calling sequence of func: 6478d76a1e5SLois Curfman McInnes $ func (SNES snes,Vec x,Vec f,void *ctx); 648c7afd0dbSLois Curfman McInnes 649313e4042SLois Curfman McInnes . f - function vector 650c7afd0dbSLois Curfman McInnes - ctx - optional user-defined function context 6519b94acceSBarry Smith 6529b94acceSBarry Smith Notes: 6539b94acceSBarry Smith The Newton-like methods typically solve linear systems of the form 6549b94acceSBarry Smith $ f'(x) x = -f(x), 655c7afd0dbSLois Curfman McInnes where f'(x) denotes the Jacobian matrix and f(x) is the function. 6569b94acceSBarry Smith 6579b94acceSBarry Smith SNESSetFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only. 6589b94acceSBarry Smith Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are 6599b94acceSBarry Smith SNESSetMinimizationFunction() and SNESSetGradient(); 6609b94acceSBarry Smith 66136851e7fSLois Curfman McInnes Level: beginner 66236851e7fSLois Curfman McInnes 6639b94acceSBarry Smith .keywords: SNES, nonlinear, set, function 6649b94acceSBarry Smith 665a86d99e1SLois Curfman McInnes .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian() 6669b94acceSBarry Smith @*/ 6675334005bSBarry Smith int SNESSetFunction(SNES snes,Vec r,int (*func)(SNES,Vec,Vec,void*),void *ctx) 6689b94acceSBarry Smith { 6693a40ed3dSBarry Smith PetscFunctionBegin; 67077c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 671184914b5SBarry Smith PetscValidHeaderSpecific(r,VEC_COOKIE); 672184914b5SBarry Smith PetscCheckSameComm(snes,r); 673a8c6a408SBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 67429bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only"); 675a8c6a408SBarry Smith } 676184914b5SBarry Smith 6779b94acceSBarry Smith snes->computefunction = func; 6789b94acceSBarry Smith snes->vec_func = snes->vec_func_always = r; 6799b94acceSBarry Smith snes->funP = ctx; 6803a40ed3dSBarry Smith PetscFunctionReturn(0); 6819b94acceSBarry Smith } 6829b94acceSBarry Smith 6834a2ae208SSatish Balay #undef __FUNCT__ 6844a2ae208SSatish Balay #define __FUNCT__ "SNESComputeFunction" 6859b94acceSBarry Smith /*@ 68636851e7fSLois Curfman McInnes SNESComputeFunction - Calls the function that has been set with 6879b94acceSBarry Smith SNESSetFunction(). 6889b94acceSBarry Smith 689c7afd0dbSLois Curfman McInnes Collective on SNES 690c7afd0dbSLois Curfman McInnes 6919b94acceSBarry Smith Input Parameters: 692c7afd0dbSLois Curfman McInnes + snes - the SNES context 693c7afd0dbSLois Curfman McInnes - x - input vector 6949b94acceSBarry Smith 6959b94acceSBarry Smith Output Parameter: 6963638b69dSLois Curfman McInnes . y - function vector, as set by SNESSetFunction() 6979b94acceSBarry Smith 6981bffabb2SLois Curfman McInnes Notes: 6999b94acceSBarry Smith SNESComputeFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only. 7009b94acceSBarry Smith Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are 7019b94acceSBarry Smith SNESComputeMinimizationFunction() and SNESComputeGradient(); 7029b94acceSBarry Smith 70336851e7fSLois Curfman McInnes SNESComputeFunction() is typically used within nonlinear solvers 70436851e7fSLois Curfman McInnes implementations, so most users would not generally call this routine 70536851e7fSLois Curfman McInnes themselves. 70636851e7fSLois Curfman McInnes 70736851e7fSLois Curfman McInnes Level: developer 70836851e7fSLois Curfman McInnes 7099b94acceSBarry Smith .keywords: SNES, nonlinear, compute, function 7109b94acceSBarry Smith 711a86d99e1SLois Curfman McInnes .seealso: SNESSetFunction(), SNESGetFunction() 7129b94acceSBarry Smith @*/ 7139b94acceSBarry Smith int SNESComputeFunction(SNES snes,Vec x,Vec y) 7149b94acceSBarry Smith { 7159b94acceSBarry Smith int ierr; 7169b94acceSBarry Smith 7173a40ed3dSBarry Smith PetscFunctionBegin; 718184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 719184914b5SBarry Smith PetscValidHeaderSpecific(x,VEC_COOKIE); 720184914b5SBarry Smith PetscValidHeaderSpecific(y,VEC_COOKIE); 721184914b5SBarry Smith PetscCheckSameComm(snes,x); 722184914b5SBarry Smith PetscCheckSameComm(snes,y); 723d4bb536fSBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 72429bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only"); 725d4bb536fSBarry Smith } 726184914b5SBarry Smith 727b0a32e0cSBarry Smith ierr = PetscLogEventBegin(SNES_FunctionEval,snes,x,y,0);CHKERRQ(ierr); 728d64ed03dSBarry Smith PetscStackPush("SNES user function"); 7299b94acceSBarry Smith ierr = (*snes->computefunction)(snes,x,y,snes->funP);CHKERRQ(ierr); 730d64ed03dSBarry Smith PetscStackPop; 731ae3c334cSLois Curfman McInnes snes->nfuncs++; 732b0a32e0cSBarry Smith ierr = PetscLogEventEnd(SNES_FunctionEval,snes,x,y,0);CHKERRQ(ierr); 7333a40ed3dSBarry Smith PetscFunctionReturn(0); 7349b94acceSBarry Smith } 7359b94acceSBarry Smith 7364a2ae208SSatish Balay #undef __FUNCT__ 7374a2ae208SSatish Balay #define __FUNCT__ "SNESSetMinimizationFunction" 7389b94acceSBarry Smith /*@C 7399b94acceSBarry Smith SNESSetMinimizationFunction - Sets the function evaluation routine for 7409b94acceSBarry Smith unconstrained minimization. 7419b94acceSBarry Smith 742fee21e36SBarry Smith Collective on SNES 743fee21e36SBarry Smith 744c7afd0dbSLois Curfman McInnes Input Parameters: 745c7afd0dbSLois Curfman McInnes + snes - the SNES context 746c7afd0dbSLois Curfman McInnes . func - function evaluation routine 747c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined context for private data for the 748c7afd0dbSLois Curfman McInnes function evaluation routine (may be PETSC_NULL) 7499b94acceSBarry Smith 750c7afd0dbSLois Curfman McInnes Calling sequence of func: 751329f5518SBarry Smith $ func (SNES snes,Vec x,PetscReal *f,void *ctx); 752c7afd0dbSLois Curfman McInnes 753c7afd0dbSLois Curfman McInnes + x - input vector 7549b94acceSBarry Smith . f - function 755c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined function context 7569b94acceSBarry Smith 75736851e7fSLois Curfman McInnes Level: beginner 75836851e7fSLois Curfman McInnes 7599b94acceSBarry Smith Notes: 7609b94acceSBarry Smith SNESSetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION 7619b94acceSBarry Smith methods only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is 7629b94acceSBarry Smith SNESSetFunction(). 7639b94acceSBarry Smith 7649b94acceSBarry Smith .keywords: SNES, nonlinear, set, minimization, function 7659b94acceSBarry Smith 766a86d99e1SLois Curfman McInnes .seealso: SNESGetMinimizationFunction(), SNESComputeMinimizationFunction(), 767a86d99e1SLois Curfman McInnes SNESSetHessian(), SNESSetGradient() 7689b94acceSBarry Smith @*/ 769329f5518SBarry Smith int SNESSetMinimizationFunction(SNES snes,int (*func)(SNES,Vec,PetscReal*,void*),void *ctx) 7709b94acceSBarry Smith { 7713a40ed3dSBarry Smith PetscFunctionBegin; 77277c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 773a8c6a408SBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 77429bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"Only for SNES_UNCONSTRAINED_MINIMIZATION"); 775a8c6a408SBarry Smith } 7769b94acceSBarry Smith snes->computeumfunction = func; 7779b94acceSBarry Smith snes->umfunP = ctx; 7783a40ed3dSBarry Smith PetscFunctionReturn(0); 7799b94acceSBarry Smith } 7809b94acceSBarry Smith 7814a2ae208SSatish Balay #undef __FUNCT__ 7824a2ae208SSatish Balay #define __FUNCT__ "SNESComputeMinimizationFunction" 7839b94acceSBarry Smith /*@ 7849b94acceSBarry Smith SNESComputeMinimizationFunction - Computes the function that has been 7859b94acceSBarry Smith set with SNESSetMinimizationFunction(). 7869b94acceSBarry Smith 787c7afd0dbSLois Curfman McInnes Collective on SNES 788c7afd0dbSLois Curfman McInnes 7899b94acceSBarry Smith Input Parameters: 790c7afd0dbSLois Curfman McInnes + snes - the SNES context 791c7afd0dbSLois Curfman McInnes - x - input vector 7929b94acceSBarry Smith 7939b94acceSBarry Smith Output Parameter: 7949b94acceSBarry Smith . y - function value 7959b94acceSBarry Smith 7969b94acceSBarry Smith Notes: 7979b94acceSBarry Smith SNESComputeMinimizationFunction() is valid only for 7989b94acceSBarry Smith SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for 7999b94acceSBarry Smith SNES_NONLINEAR_EQUATIONS methods is SNESComputeFunction(). 800a86d99e1SLois Curfman McInnes 80136851e7fSLois Curfman McInnes SNESComputeMinimizationFunction() is typically used within minimization 80236851e7fSLois Curfman McInnes implementations, so most users would not generally call this routine 80336851e7fSLois Curfman McInnes themselves. 80436851e7fSLois Curfman McInnes 80536851e7fSLois Curfman McInnes Level: developer 80636851e7fSLois Curfman McInnes 807a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, compute, minimization, function 808a86d99e1SLois Curfman McInnes 809a86d99e1SLois Curfman McInnes .seealso: SNESSetMinimizationFunction(), SNESGetMinimizationFunction(), 810a86d99e1SLois Curfman McInnes SNESComputeGradient(), SNESComputeHessian() 8119b94acceSBarry Smith @*/ 812329f5518SBarry Smith int SNESComputeMinimizationFunction(SNES snes,Vec x,PetscReal *y) 8139b94acceSBarry Smith { 8149b94acceSBarry Smith int ierr; 8153a40ed3dSBarry Smith 8163a40ed3dSBarry Smith PetscFunctionBegin; 817184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 818184914b5SBarry Smith PetscValidHeaderSpecific(x,VEC_COOKIE); 819184914b5SBarry Smith PetscCheckSameComm(snes,x); 820a8c6a408SBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 82129bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"Only for SNES_UNCONSTRAINED_MINIMIZATION"); 822a8c6a408SBarry Smith } 823184914b5SBarry Smith 824b0a32e0cSBarry Smith ierr = PetscLogEventBegin(SNES_MinimizationFunctionEval,snes,x,y,0);CHKERRQ(ierr); 825d64ed03dSBarry Smith PetscStackPush("SNES user minimzation function"); 8269b94acceSBarry Smith ierr = (*snes->computeumfunction)(snes,x,y,snes->umfunP);CHKERRQ(ierr); 827d64ed03dSBarry Smith PetscStackPop; 828ae3c334cSLois Curfman McInnes snes->nfuncs++; 829b0a32e0cSBarry Smith ierr = PetscLogEventEnd(SNES_MinimizationFunctionEval,snes,x,y,0);CHKERRQ(ierr); 8303a40ed3dSBarry Smith PetscFunctionReturn(0); 8319b94acceSBarry Smith } 8329b94acceSBarry Smith 8334a2ae208SSatish Balay #undef __FUNCT__ 8344a2ae208SSatish Balay #define __FUNCT__ "SNESSetGradient" 8359b94acceSBarry Smith /*@C 8369b94acceSBarry Smith SNESSetGradient - Sets the gradient evaluation routine and gradient 8379b94acceSBarry Smith vector for use by the SNES routines. 8389b94acceSBarry Smith 839c7afd0dbSLois Curfman McInnes Collective on SNES 840c7afd0dbSLois Curfman McInnes 8419b94acceSBarry Smith Input Parameters: 842c7afd0dbSLois Curfman McInnes + snes - the SNES context 8439b94acceSBarry Smith . func - function evaluation routine 844044dda88SLois Curfman McInnes . ctx - optional user-defined context for private data for the 845044dda88SLois Curfman McInnes gradient evaluation routine (may be PETSC_NULL) 846c7afd0dbSLois Curfman McInnes - r - vector to store gradient value 847fee21e36SBarry Smith 8489b94acceSBarry Smith Calling sequence of func: 8498d76a1e5SLois Curfman McInnes $ func (SNES, Vec x, Vec g, void *ctx); 8509b94acceSBarry Smith 851c7afd0dbSLois Curfman McInnes + x - input vector 8529b94acceSBarry Smith . g - gradient vector 853c7afd0dbSLois Curfman McInnes - ctx - optional user-defined gradient context 8549b94acceSBarry Smith 8559b94acceSBarry Smith Notes: 8569b94acceSBarry Smith SNESSetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION 8579b94acceSBarry Smith methods only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is 8589b94acceSBarry Smith SNESSetFunction(). 8599b94acceSBarry Smith 86036851e7fSLois Curfman McInnes Level: beginner 86136851e7fSLois Curfman McInnes 8629b94acceSBarry Smith .keywords: SNES, nonlinear, set, function 8639b94acceSBarry Smith 864a86d99e1SLois Curfman McInnes .seealso: SNESGetGradient(), SNESComputeGradient(), SNESSetHessian(), 865a86d99e1SLois Curfman McInnes SNESSetMinimizationFunction(), 8669b94acceSBarry Smith @*/ 86774679c65SBarry Smith int SNESSetGradient(SNES snes,Vec r,int (*func)(SNES,Vec,Vec,void*),void *ctx) 8689b94acceSBarry Smith { 8693a40ed3dSBarry Smith PetscFunctionBegin; 87077c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 871184914b5SBarry Smith PetscValidHeaderSpecific(r,VEC_COOKIE); 872184914b5SBarry Smith PetscCheckSameComm(snes,r); 873a8c6a408SBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 87429bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 875a8c6a408SBarry Smith } 8769b94acceSBarry Smith snes->computefunction = func; 8779b94acceSBarry Smith snes->vec_func = snes->vec_func_always = r; 8789b94acceSBarry Smith snes->funP = ctx; 8793a40ed3dSBarry Smith PetscFunctionReturn(0); 8809b94acceSBarry Smith } 8819b94acceSBarry Smith 8824a2ae208SSatish Balay #undef __FUNCT__ 8834a2ae208SSatish Balay #define __FUNCT__ "SNESComputeGradient" 8849b94acceSBarry Smith /*@ 885a86d99e1SLois Curfman McInnes SNESComputeGradient - Computes the gradient that has been set with 886a86d99e1SLois Curfman McInnes SNESSetGradient(). 8879b94acceSBarry Smith 888c7afd0dbSLois Curfman McInnes Collective on SNES 889c7afd0dbSLois Curfman McInnes 8909b94acceSBarry Smith Input Parameters: 891c7afd0dbSLois Curfman McInnes + snes - the SNES context 892c7afd0dbSLois Curfman McInnes - x - input vector 8939b94acceSBarry Smith 8949b94acceSBarry Smith Output Parameter: 8959b94acceSBarry Smith . y - gradient vector 8969b94acceSBarry Smith 8979b94acceSBarry Smith Notes: 8989b94acceSBarry Smith SNESComputeGradient() is valid only for 8999b94acceSBarry Smith SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for 9009b94acceSBarry Smith SNES_NONLINEAR_EQUATIONS methods is SNESComputeFunction(). 901a86d99e1SLois Curfman McInnes 90236851e7fSLois Curfman McInnes SNESComputeGradient() is typically used within minimization 90336851e7fSLois Curfman McInnes implementations, so most users would not generally call this routine 90436851e7fSLois Curfman McInnes themselves. 90536851e7fSLois Curfman McInnes 90636851e7fSLois Curfman McInnes Level: developer 90736851e7fSLois Curfman McInnes 908a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, compute, gradient 909a86d99e1SLois Curfman McInnes 910a86d99e1SLois Curfman McInnes .seealso: SNESSetGradient(), SNESGetGradient(), 911a86d99e1SLois Curfman McInnes SNESComputeMinimizationFunction(), SNESComputeHessian() 9129b94acceSBarry Smith @*/ 9139b94acceSBarry Smith int SNESComputeGradient(SNES snes,Vec x,Vec y) 9149b94acceSBarry Smith { 9159b94acceSBarry Smith int ierr; 9163a40ed3dSBarry Smith 9173a40ed3dSBarry Smith PetscFunctionBegin; 918184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 919184914b5SBarry Smith PetscValidHeaderSpecific(x,VEC_COOKIE); 920184914b5SBarry Smith PetscValidHeaderSpecific(y,VEC_COOKIE); 921184914b5SBarry Smith PetscCheckSameComm(snes,x); 922184914b5SBarry Smith PetscCheckSameComm(snes,y); 9233a40ed3dSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 92429bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 9253a40ed3dSBarry Smith } 926b0a32e0cSBarry Smith ierr = PetscLogEventBegin(SNES_GradientEval,snes,x,y,0);CHKERRQ(ierr); 927d64ed03dSBarry Smith PetscStackPush("SNES user gradient function"); 9289b94acceSBarry Smith ierr = (*snes->computefunction)(snes,x,y,snes->funP);CHKERRQ(ierr); 929d64ed03dSBarry Smith PetscStackPop; 930b0a32e0cSBarry Smith ierr = PetscLogEventEnd(SNES_GradientEval,snes,x,y,0);CHKERRQ(ierr); 9313a40ed3dSBarry Smith PetscFunctionReturn(0); 9329b94acceSBarry Smith } 9339b94acceSBarry Smith 9344a2ae208SSatish Balay #undef __FUNCT__ 9354a2ae208SSatish Balay #define __FUNCT__ "SNESComputeJacobian" 93662fef451SLois Curfman McInnes /*@ 93762fef451SLois Curfman McInnes SNESComputeJacobian - Computes the Jacobian matrix that has been 93862fef451SLois Curfman McInnes set with SNESSetJacobian(). 93962fef451SLois Curfman McInnes 940c7afd0dbSLois Curfman McInnes Collective on SNES and Mat 941c7afd0dbSLois Curfman McInnes 94262fef451SLois Curfman McInnes Input Parameters: 943c7afd0dbSLois Curfman McInnes + snes - the SNES context 944c7afd0dbSLois Curfman McInnes - x - input vector 94562fef451SLois Curfman McInnes 94662fef451SLois Curfman McInnes Output Parameters: 947c7afd0dbSLois Curfman McInnes + A - Jacobian matrix 94862fef451SLois Curfman McInnes . B - optional preconditioning matrix 949c7afd0dbSLois Curfman McInnes - flag - flag indicating matrix structure 950fee21e36SBarry Smith 95162fef451SLois Curfman McInnes Notes: 95262fef451SLois Curfman McInnes Most users should not need to explicitly call this routine, as it 95362fef451SLois Curfman McInnes is used internally within the nonlinear solvers. 95462fef451SLois Curfman McInnes 955dc5a77f8SLois Curfman McInnes See SLESSetOperators() for important information about setting the 956dc5a77f8SLois Curfman McInnes flag parameter. 95762fef451SLois Curfman McInnes 95862fef451SLois Curfman McInnes SNESComputeJacobian() is valid only for SNES_NONLINEAR_EQUATIONS 95962fef451SLois Curfman McInnes methods. An analogous routine for SNES_UNCONSTRAINED_MINIMIZATION 960005c665bSBarry Smith methods is SNESComputeHessian(). 96162fef451SLois Curfman McInnes 96236851e7fSLois Curfman McInnes Level: developer 96336851e7fSLois Curfman McInnes 96462fef451SLois Curfman McInnes .keywords: SNES, compute, Jacobian, matrix 96562fef451SLois Curfman McInnes 96662fef451SLois Curfman McInnes .seealso: SNESSetJacobian(), SLESSetOperators() 96762fef451SLois Curfman McInnes @*/ 9689b94acceSBarry Smith int SNESComputeJacobian(SNES snes,Vec X,Mat *A,Mat *B,MatStructure *flg) 9699b94acceSBarry Smith { 9709b94acceSBarry Smith int ierr; 9713a40ed3dSBarry Smith 9723a40ed3dSBarry Smith PetscFunctionBegin; 973184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 974184914b5SBarry Smith PetscValidHeaderSpecific(X,VEC_COOKIE); 975184914b5SBarry Smith PetscCheckSameComm(snes,X); 9763a40ed3dSBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 97729bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only"); 9783a40ed3dSBarry Smith } 9793a40ed3dSBarry Smith if (!snes->computejacobian) PetscFunctionReturn(0); 980b0a32e0cSBarry Smith ierr = PetscLogEventBegin(SNES_JacobianEval,snes,X,*A,*B);CHKERRQ(ierr); 981c4fc05e7SBarry Smith *flg = DIFFERENT_NONZERO_PATTERN; 982d64ed03dSBarry Smith PetscStackPush("SNES user Jacobian function"); 9839b94acceSBarry Smith ierr = (*snes->computejacobian)(snes,X,A,B,flg,snes->jacP);CHKERRQ(ierr); 984d64ed03dSBarry Smith PetscStackPop; 985b0a32e0cSBarry Smith ierr = PetscLogEventEnd(SNES_JacobianEval,snes,X,*A,*B);CHKERRQ(ierr); 9866d84be18SBarry Smith /* make sure user returned a correct Jacobian and preconditioner */ 98777c4ece6SBarry Smith PetscValidHeaderSpecific(*A,MAT_COOKIE); 98877c4ece6SBarry Smith PetscValidHeaderSpecific(*B,MAT_COOKIE); 9893a40ed3dSBarry Smith PetscFunctionReturn(0); 9909b94acceSBarry Smith } 9919b94acceSBarry Smith 9924a2ae208SSatish Balay #undef __FUNCT__ 9934a2ae208SSatish Balay #define __FUNCT__ "SNESComputeHessian" 99462fef451SLois Curfman McInnes /*@ 99562fef451SLois Curfman McInnes SNESComputeHessian - Computes the Hessian matrix that has been 99662fef451SLois Curfman McInnes set with SNESSetHessian(). 99762fef451SLois Curfman McInnes 998c7afd0dbSLois Curfman McInnes Collective on SNES and Mat 999c7afd0dbSLois Curfman McInnes 100062fef451SLois Curfman McInnes Input Parameters: 1001c7afd0dbSLois Curfman McInnes + snes - the SNES context 1002c7afd0dbSLois Curfman McInnes - x - input vector 100362fef451SLois Curfman McInnes 100462fef451SLois Curfman McInnes Output Parameters: 1005c7afd0dbSLois Curfman McInnes + A - Hessian matrix 100662fef451SLois Curfman McInnes . B - optional preconditioning matrix 1007c7afd0dbSLois Curfman McInnes - flag - flag indicating matrix structure 1008fee21e36SBarry Smith 100962fef451SLois Curfman McInnes Notes: 101062fef451SLois Curfman McInnes Most users should not need to explicitly call this routine, as it 101162fef451SLois Curfman McInnes is used internally within the nonlinear solvers. 101262fef451SLois Curfman McInnes 1013dc5a77f8SLois Curfman McInnes See SLESSetOperators() for important information about setting the 1014dc5a77f8SLois Curfman McInnes flag parameter. 101562fef451SLois Curfman McInnes 101662fef451SLois Curfman McInnes SNESComputeHessian() is valid only for 101762fef451SLois Curfman McInnes SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for 101862fef451SLois Curfman McInnes SNES_NONLINEAR_EQUATIONS methods is SNESComputeJacobian(). 101962fef451SLois Curfman McInnes 102036851e7fSLois Curfman McInnes SNESComputeHessian() is typically used within minimization 102136851e7fSLois Curfman McInnes implementations, so most users would not generally call this routine 102236851e7fSLois Curfman McInnes themselves. 102336851e7fSLois Curfman McInnes 102436851e7fSLois Curfman McInnes Level: developer 102536851e7fSLois Curfman McInnes 102662fef451SLois Curfman McInnes .keywords: SNES, compute, Hessian, matrix 102762fef451SLois Curfman McInnes 1028a86d99e1SLois Curfman McInnes .seealso: SNESSetHessian(), SLESSetOperators(), SNESComputeGradient(), 1029a86d99e1SLois Curfman McInnes SNESComputeMinimizationFunction() 103062fef451SLois Curfman McInnes @*/ 103162fef451SLois Curfman McInnes int SNESComputeHessian(SNES snes,Vec x,Mat *A,Mat *B,MatStructure *flag) 10329b94acceSBarry Smith { 10339b94acceSBarry Smith int ierr; 10343a40ed3dSBarry Smith 10353a40ed3dSBarry Smith PetscFunctionBegin; 1036184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1037184914b5SBarry Smith PetscValidHeaderSpecific(x,VEC_COOKIE); 1038184914b5SBarry Smith PetscCheckSameComm(snes,x); 10393a40ed3dSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 104029bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 10413a40ed3dSBarry Smith } 10423a40ed3dSBarry Smith if (!snes->computejacobian) PetscFunctionReturn(0); 1043b0a32e0cSBarry Smith ierr = PetscLogEventBegin(SNES_HessianEval,snes,x,*A,*B);CHKERRQ(ierr); 10440f4a323eSLois Curfman McInnes *flag = DIFFERENT_NONZERO_PATTERN; 1045d64ed03dSBarry Smith PetscStackPush("SNES user Hessian function"); 104662fef451SLois Curfman McInnes ierr = (*snes->computejacobian)(snes,x,A,B,flag,snes->jacP);CHKERRQ(ierr); 1047d64ed03dSBarry Smith PetscStackPop; 1048b0a32e0cSBarry Smith ierr = PetscLogEventEnd(SNES_HessianEval,snes,x,*A,*B);CHKERRQ(ierr); 10490f4a323eSLois Curfman McInnes /* make sure user returned a correct Jacobian and preconditioner */ 105077c4ece6SBarry Smith PetscValidHeaderSpecific(*A,MAT_COOKIE); 105177c4ece6SBarry Smith PetscValidHeaderSpecific(*B,MAT_COOKIE); 10523a40ed3dSBarry Smith PetscFunctionReturn(0); 10539b94acceSBarry Smith } 10549b94acceSBarry Smith 10554a2ae208SSatish Balay #undef __FUNCT__ 10564a2ae208SSatish Balay #define __FUNCT__ "SNESSetJacobian" 10579b94acceSBarry Smith /*@C 10589b94acceSBarry Smith SNESSetJacobian - Sets the function to compute Jacobian as well as the 1059044dda88SLois Curfman McInnes location to store the matrix. 10609b94acceSBarry Smith 1061c7afd0dbSLois Curfman McInnes Collective on SNES and Mat 1062c7afd0dbSLois Curfman McInnes 10639b94acceSBarry Smith Input Parameters: 1064c7afd0dbSLois Curfman McInnes + snes - the SNES context 10659b94acceSBarry Smith . A - Jacobian matrix 10669b94acceSBarry Smith . B - preconditioner matrix (usually same as the Jacobian) 10679b94acceSBarry Smith . func - Jacobian evaluation routine 1068c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined context for private data for the 10692cd2dfdcSLois Curfman McInnes Jacobian evaluation routine (may be PETSC_NULL) 10709b94acceSBarry Smith 10719b94acceSBarry Smith Calling sequence of func: 10728d76a1e5SLois Curfman McInnes $ func (SNES snes,Vec x,Mat *A,Mat *B,int *flag,void *ctx); 10739b94acceSBarry Smith 1074c7afd0dbSLois Curfman McInnes + x - input vector 10759b94acceSBarry Smith . A - Jacobian matrix 10769b94acceSBarry Smith . B - preconditioner matrix, usually the same as A 1077ac21db08SLois Curfman McInnes . flag - flag indicating information about the preconditioner matrix 1078ac21db08SLois Curfman McInnes structure (same as flag in SLESSetOperators()) 1079c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined Jacobian context 10809b94acceSBarry Smith 10819b94acceSBarry Smith Notes: 1082dc5a77f8SLois Curfman McInnes See SLESSetOperators() for important information about setting the flag 10832cd2dfdcSLois Curfman McInnes output parameter in the routine func(). Be sure to read this information! 1084ac21db08SLois Curfman McInnes 1085ac21db08SLois Curfman McInnes The routine func() takes Mat * as the matrix arguments rather than Mat. 10869b94acceSBarry Smith This allows the Jacobian evaluation routine to replace A and/or B with a 10879b94acceSBarry Smith completely new new matrix structure (not just different matrix elements) 10889b94acceSBarry Smith when appropriate, for instance, if the nonzero structure is changing 10899b94acceSBarry Smith throughout the global iterations. 10909b94acceSBarry Smith 109136851e7fSLois Curfman McInnes Level: beginner 109236851e7fSLois Curfman McInnes 10939b94acceSBarry Smith .keywords: SNES, nonlinear, set, Jacobian, matrix 10949b94acceSBarry Smith 1095ac21db08SLois Curfman McInnes .seealso: SLESSetOperators(), SNESSetFunction() 10969b94acceSBarry Smith @*/ 1097454a90a3SBarry Smith int SNESSetJacobian(SNES snes,Mat A,Mat B,int (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx) 10989b94acceSBarry Smith { 1099*3a7fca6bSBarry Smith int ierr; 1100*3a7fca6bSBarry Smith 11013a40ed3dSBarry Smith PetscFunctionBegin; 110277c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 110300036973SBarry Smith if (A) PetscValidHeaderSpecific(A,MAT_COOKIE); 110400036973SBarry Smith if (B) PetscValidHeaderSpecific(B,MAT_COOKIE); 110500036973SBarry Smith if (A) PetscCheckSameComm(snes,A); 110600036973SBarry Smith if (B) PetscCheckSameComm(snes,B); 1107a8c6a408SBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 110829bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only"); 1109a8c6a408SBarry Smith } 1110184914b5SBarry Smith 1111*3a7fca6bSBarry Smith if (func) snes->computejacobian = func; 1112*3a7fca6bSBarry Smith if (ctx) snes->jacP = ctx; 1113*3a7fca6bSBarry Smith if (A) { 1114*3a7fca6bSBarry Smith if (snes->jacobian) {ierr = MatDestroy(snes->jacobian);CHKERRQ(ierr);} 11159b94acceSBarry Smith snes->jacobian = A; 1116*3a7fca6bSBarry Smith ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); 1117*3a7fca6bSBarry Smith } 1118*3a7fca6bSBarry Smith if (B) { 1119*3a7fca6bSBarry Smith if (snes->jacobian_pre) {ierr = MatDestroy(snes->jacobian_pre);CHKERRQ(ierr);} 11209b94acceSBarry Smith snes->jacobian_pre = B; 1121*3a7fca6bSBarry Smith ierr = PetscObjectReference((PetscObject)B);CHKERRQ(ierr); 1122*3a7fca6bSBarry Smith } 11233a40ed3dSBarry Smith PetscFunctionReturn(0); 11249b94acceSBarry Smith } 112562fef451SLois Curfman McInnes 11264a2ae208SSatish Balay #undef __FUNCT__ 11274a2ae208SSatish Balay #define __FUNCT__ "SNESGetJacobian" 1128c2aafc4cSSatish Balay /*@C 1129b4fd4287SBarry Smith SNESGetJacobian - Returns the Jacobian matrix and optionally the user 1130b4fd4287SBarry Smith provided context for evaluating the Jacobian. 1131b4fd4287SBarry Smith 1132c7afd0dbSLois Curfman McInnes Not Collective, but Mat object will be parallel if SNES object is 1133c7afd0dbSLois Curfman McInnes 1134b4fd4287SBarry Smith Input Parameter: 1135b4fd4287SBarry Smith . snes - the nonlinear solver context 1136b4fd4287SBarry Smith 1137b4fd4287SBarry Smith Output Parameters: 1138c7afd0dbSLois Curfman McInnes + A - location to stash Jacobian matrix (or PETSC_NULL) 1139b4fd4287SBarry Smith . B - location to stash preconditioner matrix (or PETSC_NULL) 114000036973SBarry Smith . ctx - location to stash Jacobian ctx (or PETSC_NULL) 114100036973SBarry Smith - func - location to put Jacobian function (or PETSC_NULL) 1142fee21e36SBarry Smith 114336851e7fSLois Curfman McInnes Level: advanced 114436851e7fSLois Curfman McInnes 1145b4fd4287SBarry Smith .seealso: SNESSetJacobian(), SNESComputeJacobian() 1146b4fd4287SBarry Smith @*/ 114700036973SBarry Smith int SNESGetJacobian(SNES snes,Mat *A,Mat *B,void **ctx,int (**func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*)) 1148b4fd4287SBarry Smith { 11493a40ed3dSBarry Smith PetscFunctionBegin; 1150184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 11513a40ed3dSBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 115229bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only"); 11533a40ed3dSBarry Smith } 1154b4fd4287SBarry Smith if (A) *A = snes->jacobian; 1155b4fd4287SBarry Smith if (B) *B = snes->jacobian_pre; 1156b4fd4287SBarry Smith if (ctx) *ctx = snes->jacP; 115700036973SBarry Smith if (func) *func = snes->computejacobian; 11583a40ed3dSBarry Smith PetscFunctionReturn(0); 1159b4fd4287SBarry Smith } 1160b4fd4287SBarry Smith 11614a2ae208SSatish Balay #undef __FUNCT__ 11624a2ae208SSatish Balay #define __FUNCT__ "SNESSetHessian" 11639b94acceSBarry Smith /*@C 11649b94acceSBarry Smith SNESSetHessian - Sets the function to compute Hessian as well as the 1165044dda88SLois Curfman McInnes location to store the matrix. 11669b94acceSBarry Smith 1167c7afd0dbSLois Curfman McInnes Collective on SNES and Mat 1168c7afd0dbSLois Curfman McInnes 11699b94acceSBarry Smith Input Parameters: 1170c7afd0dbSLois Curfman McInnes + snes - the SNES context 11719b94acceSBarry Smith . A - Hessian matrix 11729b94acceSBarry Smith . B - preconditioner matrix (usually same as the Hessian) 11739b94acceSBarry Smith . func - Jacobian evaluation routine 1174c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined context for private data for the 1175313e4042SLois Curfman McInnes Hessian evaluation routine (may be PETSC_NULL) 11769b94acceSBarry Smith 11779b94acceSBarry Smith Calling sequence of func: 11788d76a1e5SLois Curfman McInnes $ func (SNES snes,Vec x,Mat *A,Mat *B,int *flag,void *ctx); 11799b94acceSBarry Smith 1180c7afd0dbSLois Curfman McInnes + x - input vector 11819b94acceSBarry Smith . A - Hessian matrix 11829b94acceSBarry Smith . B - preconditioner matrix, usually the same as A 1183ac21db08SLois Curfman McInnes . flag - flag indicating information about the preconditioner matrix 1184ac21db08SLois Curfman McInnes structure (same as flag in SLESSetOperators()) 1185c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined Hessian context 11869b94acceSBarry Smith 11879b94acceSBarry Smith Notes: 1188dc5a77f8SLois Curfman McInnes See SLESSetOperators() for important information about setting the flag 11892cd2dfdcSLois Curfman McInnes output parameter in the routine func(). Be sure to read this information! 1190ac21db08SLois Curfman McInnes 11919b94acceSBarry Smith The function func() takes Mat * as the matrix arguments rather than Mat. 11929b94acceSBarry Smith This allows the Hessian evaluation routine to replace A and/or B with a 11939b94acceSBarry Smith completely new new matrix structure (not just different matrix elements) 11949b94acceSBarry Smith when appropriate, for instance, if the nonzero structure is changing 11959b94acceSBarry Smith throughout the global iterations. 11969b94acceSBarry Smith 119736851e7fSLois Curfman McInnes Level: beginner 119836851e7fSLois Curfman McInnes 11999b94acceSBarry Smith .keywords: SNES, nonlinear, set, Hessian, matrix 12009b94acceSBarry Smith 1201ac21db08SLois Curfman McInnes .seealso: SNESSetMinimizationFunction(), SNESSetGradient(), SLESSetOperators() 12029b94acceSBarry Smith @*/ 1203454a90a3SBarry Smith int SNESSetHessian(SNES snes,Mat A,Mat B,int (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx) 12049b94acceSBarry Smith { 1205*3a7fca6bSBarry Smith int ierr; 1206*3a7fca6bSBarry Smith 12073a40ed3dSBarry Smith PetscFunctionBegin; 120877c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1209184914b5SBarry Smith PetscValidHeaderSpecific(A,MAT_COOKIE); 1210184914b5SBarry Smith PetscValidHeaderSpecific(B,MAT_COOKIE); 1211184914b5SBarry Smith PetscCheckSameComm(snes,A); 1212184914b5SBarry Smith PetscCheckSameComm(snes,B); 1213d4bb536fSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 121429bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 1215d4bb536fSBarry Smith } 1216*3a7fca6bSBarry Smith if (func) snes->computejacobian = func; 1217*3a7fca6bSBarry Smith if (ctx) snes->jacP = ctx; 1218*3a7fca6bSBarry Smith if (A) { 1219*3a7fca6bSBarry Smith if (snes->jacobian) {ierr = MatDestroy(snes->jacobian);CHKERRQ(ierr);} 12209b94acceSBarry Smith snes->jacobian = A; 1221*3a7fca6bSBarry Smith ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); 1222*3a7fca6bSBarry Smith } 1223*3a7fca6bSBarry Smith if (B) { 1224*3a7fca6bSBarry Smith if (snes->jacobian_pre) {ierr = MatDestroy(snes->jacobian_pre);CHKERRQ(ierr);} 12259b94acceSBarry Smith snes->jacobian_pre = B; 1226*3a7fca6bSBarry Smith ierr = PetscObjectReference((PetscObject)B);CHKERRQ(ierr); 1227*3a7fca6bSBarry Smith } 12283a40ed3dSBarry Smith PetscFunctionReturn(0); 12299b94acceSBarry Smith } 12309b94acceSBarry Smith 12314a2ae208SSatish Balay #undef __FUNCT__ 12324a2ae208SSatish Balay #define __FUNCT__ "SNESGetHessian" 123362fef451SLois Curfman McInnes /*@ 123462fef451SLois Curfman McInnes SNESGetHessian - Returns the Hessian matrix and optionally the user 123562fef451SLois Curfman McInnes provided context for evaluating the Hessian. 123662fef451SLois Curfman McInnes 1237c7afd0dbSLois Curfman McInnes Not Collective, but Mat object is parallel if SNES object is parallel 1238c7afd0dbSLois Curfman McInnes 123962fef451SLois Curfman McInnes Input Parameter: 124062fef451SLois Curfman McInnes . snes - the nonlinear solver context 124162fef451SLois Curfman McInnes 124262fef451SLois Curfman McInnes Output Parameters: 1243c7afd0dbSLois Curfman McInnes + A - location to stash Hessian matrix (or PETSC_NULL) 124462fef451SLois Curfman McInnes . B - location to stash preconditioner matrix (or PETSC_NULL) 1245c7afd0dbSLois Curfman McInnes - ctx - location to stash Hessian ctx (or PETSC_NULL) 1246fee21e36SBarry Smith 124736851e7fSLois Curfman McInnes Level: advanced 124836851e7fSLois Curfman McInnes 124962fef451SLois Curfman McInnes .seealso: SNESSetHessian(), SNESComputeHessian() 1250c7afd0dbSLois Curfman McInnes 1251c7afd0dbSLois Curfman McInnes .keywords: SNES, get, Hessian 125262fef451SLois Curfman McInnes @*/ 125362fef451SLois Curfman McInnes int SNESGetHessian(SNES snes,Mat *A,Mat *B,void **ctx) 125462fef451SLois Curfman McInnes { 12553a40ed3dSBarry Smith PetscFunctionBegin; 1256184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 12573a40ed3dSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION){ 125829bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 12593a40ed3dSBarry Smith } 126062fef451SLois Curfman McInnes if (A) *A = snes->jacobian; 126162fef451SLois Curfman McInnes if (B) *B = snes->jacobian_pre; 126262fef451SLois Curfman McInnes if (ctx) *ctx = snes->jacP; 12633a40ed3dSBarry Smith PetscFunctionReturn(0); 126462fef451SLois Curfman McInnes } 126562fef451SLois Curfman McInnes 12669b94acceSBarry Smith /* ----- Routines to initialize and destroy a nonlinear solver ---- */ 12679b94acceSBarry Smith 12684a2ae208SSatish Balay #undef __FUNCT__ 12694a2ae208SSatish Balay #define __FUNCT__ "SNESSetUp" 12709b94acceSBarry Smith /*@ 12719b94acceSBarry Smith SNESSetUp - Sets up the internal data structures for the later use 1272272ac6f2SLois Curfman McInnes of a nonlinear solver. 12739b94acceSBarry Smith 1274fee21e36SBarry Smith Collective on SNES 1275fee21e36SBarry Smith 1276c7afd0dbSLois Curfman McInnes Input Parameters: 1277c7afd0dbSLois Curfman McInnes + snes - the SNES context 1278c7afd0dbSLois Curfman McInnes - x - the solution vector 1279c7afd0dbSLois Curfman McInnes 1280272ac6f2SLois Curfman McInnes Notes: 1281272ac6f2SLois Curfman McInnes For basic use of the SNES solvers the user need not explicitly call 1282272ac6f2SLois Curfman McInnes SNESSetUp(), since these actions will automatically occur during 1283272ac6f2SLois Curfman McInnes the call to SNESSolve(). However, if one wishes to control this 1284272ac6f2SLois Curfman McInnes phase separately, SNESSetUp() should be called after SNESCreate() 1285272ac6f2SLois Curfman McInnes and optional routines of the form SNESSetXXX(), but before SNESSolve(). 1286272ac6f2SLois Curfman McInnes 128736851e7fSLois Curfman McInnes Level: advanced 128836851e7fSLois Curfman McInnes 12899b94acceSBarry Smith .keywords: SNES, nonlinear, setup 12909b94acceSBarry Smith 12919b94acceSBarry Smith .seealso: SNESCreate(), SNESSolve(), SNESDestroy() 12929b94acceSBarry Smith @*/ 12938ddd3da0SLois Curfman McInnes int SNESSetUp(SNES snes,Vec x) 12949b94acceSBarry Smith { 1295f1af5d2fSBarry Smith int ierr; 1296f1af5d2fSBarry Smith PetscTruth flg; 12973a40ed3dSBarry Smith 12983a40ed3dSBarry Smith PetscFunctionBegin; 129977c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 130077c4ece6SBarry Smith PetscValidHeaderSpecific(x,VEC_COOKIE); 1301184914b5SBarry Smith PetscCheckSameComm(snes,x); 13028ddd3da0SLois Curfman McInnes snes->vec_sol = snes->vec_sol_always = x; 13039b94acceSBarry Smith 1304b0a32e0cSBarry Smith ierr = PetscOptionsHasName(snes->prefix,"-snes_mf_operator",&flg);CHKERRQ(ierr); 1305c1f60f51SBarry Smith /* 1306c1f60f51SBarry Smith This version replaces the user provided Jacobian matrix with a 1307dfa02198SLois Curfman McInnes matrix-free version but still employs the user-provided preconditioner matrix 1308c1f60f51SBarry Smith */ 1309c1f60f51SBarry Smith if (flg) { 1310c1f60f51SBarry Smith Mat J; 13115a655dc6SBarry Smith ierr = MatCreateSNESMF(snes,snes->vec_sol,&J);CHKERRQ(ierr); 13125a655dc6SBarry Smith ierr = MatSNESMFSetFromOptions(J);CHKERRQ(ierr); 1313*3a7fca6bSBarry Smith PetscLogInfo(snes,"SNESSetUp: Setting default matrix-free operator routines\n"); 1314*3a7fca6bSBarry Smith ierr = SNESSetJacobian(snes,J,0,0,0);CHKERRQ(ierr); 1315*3a7fca6bSBarry Smith ierr = MatDestroy(J);CHKERRQ(ierr); 1316c1f60f51SBarry Smith } 1317b0a32e0cSBarry Smith ierr = PetscOptionsHasName(snes->prefix,"-snes_mf",&flg);CHKERRQ(ierr); 1318c1f60f51SBarry Smith /* 1319dfa02198SLois Curfman McInnes This version replaces both the user-provided Jacobian and the user- 1320c1f60f51SBarry Smith provided preconditioner matrix with the default matrix free version. 1321c1f60f51SBarry Smith */ 132231615d04SLois Curfman McInnes if (flg) { 1323272ac6f2SLois Curfman McInnes Mat J; 1324f3ef73ceSBarry Smith SLES sles; 1325f3ef73ceSBarry Smith PC pc; 1326f3ef73ceSBarry Smith 13275a655dc6SBarry Smith ierr = MatCreateSNESMF(snes,snes->vec_sol,&J);CHKERRQ(ierr); 1328*3a7fca6bSBarry Smith ierr = MatSNESMFSetFromOptions(J);CHKERRQ(ierr); 132993b98531SBarry Smith PetscLogInfo(snes,"SNESSetUp: Setting default matrix-free operator and preconditioner routines\n"); 133083e56afdSLois Curfman McInnes if (snes->method_class == SNES_NONLINEAR_EQUATIONS) { 1331*3a7fca6bSBarry Smith ierr = SNESSetJacobian(snes,J,J,MatSNESMFComputeJacobian,snes->funP);CHKERRQ(ierr); 1332d64ed03dSBarry Smith } else if (snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) { 1333*3a7fca6bSBarry Smith ierr = SNESSetHessian(snes,J,J,MatSNESMFComputeJacobian,snes->funP);CHKERRQ(ierr); 1334d4bb536fSBarry Smith } else { 133529bbc08cSBarry Smith SETERRQ(PETSC_ERR_SUP,"Method class doesn't support matrix-free option"); 1336d4bb536fSBarry Smith } 1337*3a7fca6bSBarry Smith ierr = MatDestroy(J);CHKERRQ(ierr); 1338*3a7fca6bSBarry Smith 1339f3ef73ceSBarry Smith /* force no preconditioner */ 1340f3ef73ceSBarry Smith ierr = SNESGetSLES(snes,&sles);CHKERRQ(ierr); 1341f3ef73ceSBarry Smith ierr = SLESGetPC(sles,&pc);CHKERRQ(ierr); 1342f3ef73ceSBarry Smith ierr = PCSetType(pc,PCNONE);CHKERRQ(ierr); 1343272ac6f2SLois Curfman McInnes } 1344f3ef73ceSBarry Smith 13459b94acceSBarry Smith if ((snes->method_class == SNES_NONLINEAR_EQUATIONS)) { 13466831982aSBarry Smith PetscTruth iseqtr; 13476831982aSBarry Smith 134829bbc08cSBarry Smith if (!snes->vec_func) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetFunction() first"); 134929bbc08cSBarry Smith if (!snes->computefunction) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetFunction() first"); 135029bbc08cSBarry Smith if (!snes->jacobian) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetJacobian() first \n or use -snes_mf option"); 1351a8c6a408SBarry Smith if (snes->vec_func == snes->vec_sol) { 135229bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_IDN,"Solution vector cannot be function vector"); 1353a8c6a408SBarry Smith } 1354a703fe33SLois Curfman McInnes 1355a703fe33SLois Curfman McInnes /* Set the KSP stopping criterion to use the Eisenstat-Walker method */ 13566831982aSBarry Smith ierr = PetscTypeCompare((PetscObject)snes,SNESEQTR,&iseqtr);CHKERRQ(ierr); 13576831982aSBarry Smith if (snes->ksp_ewconv && !iseqtr) { 1358a703fe33SLois Curfman McInnes SLES sles; KSP ksp; 1359a703fe33SLois Curfman McInnes ierr = SNESGetSLES(snes,&sles);CHKERRQ(ierr); 1360a703fe33SLois Curfman McInnes ierr = SLESGetKSP(sles,&ksp);CHKERRQ(ierr); 1361186905e3SBarry Smith ierr = KSPSetConvergenceTest(ksp,SNES_KSP_EW_Converged_Private,snes);CHKERRQ(ierr); 1362a703fe33SLois Curfman McInnes } 13639b94acceSBarry Smith } else if ((snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION)) { 136429bbc08cSBarry Smith if (!snes->vec_func) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetGradient() first"); 136529bbc08cSBarry Smith if (!snes->computefunction) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetGradient() first"); 1366a8c6a408SBarry Smith if (!snes->computeumfunction) { 136729bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetMinimizationFunction() first"); 1368a8c6a408SBarry Smith } 136929bbc08cSBarry Smith if (!snes->jacobian) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetHessian()"); 1370d4bb536fSBarry Smith } else { 137129bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Unknown method class"); 1372d4bb536fSBarry Smith } 1373a703fe33SLois Curfman McInnes if (snes->setup) {ierr = (*snes->setup)(snes);CHKERRQ(ierr);} 137482bf6240SBarry Smith snes->setupcalled = 1; 13753a40ed3dSBarry Smith PetscFunctionReturn(0); 13769b94acceSBarry Smith } 13779b94acceSBarry Smith 13784a2ae208SSatish Balay #undef __FUNCT__ 13794a2ae208SSatish Balay #define __FUNCT__ "SNESDestroy" 13809b94acceSBarry Smith /*@C 13819b94acceSBarry Smith SNESDestroy - Destroys the nonlinear solver context that was created 13829b94acceSBarry Smith with SNESCreate(). 13839b94acceSBarry Smith 1384c7afd0dbSLois Curfman McInnes Collective on SNES 1385c7afd0dbSLois Curfman McInnes 13869b94acceSBarry Smith Input Parameter: 13879b94acceSBarry Smith . snes - the SNES context 13889b94acceSBarry Smith 138936851e7fSLois Curfman McInnes Level: beginner 139036851e7fSLois Curfman McInnes 13919b94acceSBarry Smith .keywords: SNES, nonlinear, destroy 13929b94acceSBarry Smith 139363a78c88SLois Curfman McInnes .seealso: SNESCreate(), SNESSolve() 13949b94acceSBarry Smith @*/ 13959b94acceSBarry Smith int SNESDestroy(SNES snes) 13969b94acceSBarry Smith { 1397b8a78c4aSBarry Smith int i,ierr; 13983a40ed3dSBarry Smith 13993a40ed3dSBarry Smith PetscFunctionBegin; 140077c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 14013a40ed3dSBarry Smith if (--snes->refct > 0) PetscFunctionReturn(0); 1402d4bb536fSBarry Smith 1403be0abb6dSBarry Smith /* if memory was published with AMS then destroy it */ 14040f5bd95cSBarry Smith ierr = PetscObjectDepublish(snes);CHKERRQ(ierr); 1405be0abb6dSBarry Smith 1406e1311b90SBarry Smith if (snes->destroy) {ierr = (*(snes)->destroy)(snes);CHKERRQ(ierr);} 1407606d414cSSatish Balay if (snes->kspconvctx) {ierr = PetscFree(snes->kspconvctx);CHKERRQ(ierr);} 1408*3a7fca6bSBarry Smith if (snes->jacobian) {ierr = MatDestroy(snes->jacobian);CHKERRQ(ierr);} 1409*3a7fca6bSBarry Smith if (snes->jacobian_pre) {ierr = MatDestroy(snes->jacobian_pre);CHKERRQ(ierr);} 14109b94acceSBarry Smith ierr = SLESDestroy(snes->sles);CHKERRQ(ierr); 1411522c5e43SBarry Smith if (snes->vwork) {ierr = VecDestroyVecs(snes->vwork,snes->nvwork);CHKERRQ(ierr);} 1412b8a78c4aSBarry Smith for (i=0; i<snes->numbermonitors; i++) { 1413b8a78c4aSBarry Smith if (snes->monitordestroy[i]) { 1414b8a78c4aSBarry Smith ierr = (*snes->monitordestroy[i])(snes->monitorcontext[i]);CHKERRQ(ierr); 1415b8a78c4aSBarry Smith } 1416b8a78c4aSBarry Smith } 1417b0a32e0cSBarry Smith PetscLogObjectDestroy((PetscObject)snes); 14180452661fSBarry Smith PetscHeaderDestroy((PetscObject)snes); 14193a40ed3dSBarry Smith PetscFunctionReturn(0); 14209b94acceSBarry Smith } 14219b94acceSBarry Smith 14229b94acceSBarry Smith /* ----------- Routines to set solver parameters ---------- */ 14239b94acceSBarry Smith 14244a2ae208SSatish Balay #undef __FUNCT__ 14254a2ae208SSatish Balay #define __FUNCT__ "SNESSetTolerances" 14269b94acceSBarry Smith /*@ 1427d7a720efSLois Curfman McInnes SNESSetTolerances - Sets various parameters used in convergence tests. 14289b94acceSBarry Smith 1429c7afd0dbSLois Curfman McInnes Collective on SNES 1430c7afd0dbSLois Curfman McInnes 14319b94acceSBarry Smith Input Parameters: 1432c7afd0dbSLois Curfman McInnes + snes - the SNES context 143333174efeSLois Curfman McInnes . atol - absolute convergence tolerance 143433174efeSLois Curfman McInnes . rtol - relative convergence tolerance 143533174efeSLois Curfman McInnes . stol - convergence tolerance in terms of the norm 143633174efeSLois Curfman McInnes of the change in the solution between steps 143733174efeSLois Curfman McInnes . maxit - maximum number of iterations 1438c7afd0dbSLois Curfman McInnes - maxf - maximum number of function evaluations 1439fee21e36SBarry Smith 144033174efeSLois Curfman McInnes Options Database Keys: 1441c7afd0dbSLois Curfman McInnes + -snes_atol <atol> - Sets atol 1442c7afd0dbSLois Curfman McInnes . -snes_rtol <rtol> - Sets rtol 1443c7afd0dbSLois Curfman McInnes . -snes_stol <stol> - Sets stol 1444c7afd0dbSLois Curfman McInnes . -snes_max_it <maxit> - Sets maxit 1445c7afd0dbSLois Curfman McInnes - -snes_max_funcs <maxf> - Sets maxf 14469b94acceSBarry Smith 1447d7a720efSLois Curfman McInnes Notes: 14489b94acceSBarry Smith The default maximum number of iterations is 50. 14499b94acceSBarry Smith The default maximum number of function evaluations is 1000. 14509b94acceSBarry Smith 145136851e7fSLois Curfman McInnes Level: intermediate 145236851e7fSLois Curfman McInnes 145333174efeSLois Curfman McInnes .keywords: SNES, nonlinear, set, convergence, tolerances 14549b94acceSBarry Smith 1455d7a720efSLois Curfman McInnes .seealso: SNESSetTrustRegionTolerance(), SNESSetMinimizationFunctionTolerance() 14569b94acceSBarry Smith @*/ 1457329f5518SBarry Smith int SNESSetTolerances(SNES snes,PetscReal atol,PetscReal rtol,PetscReal stol,int maxit,int maxf) 14589b94acceSBarry Smith { 14593a40ed3dSBarry Smith PetscFunctionBegin; 146077c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1461d7a720efSLois Curfman McInnes if (atol != PETSC_DEFAULT) snes->atol = atol; 1462d7a720efSLois Curfman McInnes if (rtol != PETSC_DEFAULT) snes->rtol = rtol; 1463d7a720efSLois Curfman McInnes if (stol != PETSC_DEFAULT) snes->xtol = stol; 1464d7a720efSLois Curfman McInnes if (maxit != PETSC_DEFAULT) snes->max_its = maxit; 1465d7a720efSLois Curfman McInnes if (maxf != PETSC_DEFAULT) snes->max_funcs = maxf; 14663a40ed3dSBarry Smith PetscFunctionReturn(0); 14679b94acceSBarry Smith } 14689b94acceSBarry Smith 14694a2ae208SSatish Balay #undef __FUNCT__ 14704a2ae208SSatish Balay #define __FUNCT__ "SNESGetTolerances" 14719b94acceSBarry Smith /*@ 147233174efeSLois Curfman McInnes SNESGetTolerances - Gets various parameters used in convergence tests. 147333174efeSLois Curfman McInnes 1474c7afd0dbSLois Curfman McInnes Not Collective 1475c7afd0dbSLois Curfman McInnes 147633174efeSLois Curfman McInnes Input Parameters: 1477c7afd0dbSLois Curfman McInnes + snes - the SNES context 147833174efeSLois Curfman McInnes . atol - absolute convergence tolerance 147933174efeSLois Curfman McInnes . rtol - relative convergence tolerance 148033174efeSLois Curfman McInnes . stol - convergence tolerance in terms of the norm 148133174efeSLois Curfman McInnes of the change in the solution between steps 148233174efeSLois Curfman McInnes . maxit - maximum number of iterations 1483c7afd0dbSLois Curfman McInnes - maxf - maximum number of function evaluations 1484fee21e36SBarry Smith 148533174efeSLois Curfman McInnes Notes: 148633174efeSLois Curfman McInnes The user can specify PETSC_NULL for any parameter that is not needed. 148733174efeSLois Curfman McInnes 148836851e7fSLois Curfman McInnes Level: intermediate 148936851e7fSLois Curfman McInnes 149033174efeSLois Curfman McInnes .keywords: SNES, nonlinear, get, convergence, tolerances 149133174efeSLois Curfman McInnes 149233174efeSLois Curfman McInnes .seealso: SNESSetTolerances() 149333174efeSLois Curfman McInnes @*/ 1494329f5518SBarry Smith int SNESGetTolerances(SNES snes,PetscReal *atol,PetscReal *rtol,PetscReal *stol,int *maxit,int *maxf) 149533174efeSLois Curfman McInnes { 14963a40ed3dSBarry Smith PetscFunctionBegin; 149733174efeSLois Curfman McInnes PetscValidHeaderSpecific(snes,SNES_COOKIE); 149833174efeSLois Curfman McInnes if (atol) *atol = snes->atol; 149933174efeSLois Curfman McInnes if (rtol) *rtol = snes->rtol; 150033174efeSLois Curfman McInnes if (stol) *stol = snes->xtol; 150133174efeSLois Curfman McInnes if (maxit) *maxit = snes->max_its; 150233174efeSLois Curfman McInnes if (maxf) *maxf = snes->max_funcs; 15033a40ed3dSBarry Smith PetscFunctionReturn(0); 150433174efeSLois Curfman McInnes } 150533174efeSLois Curfman McInnes 15064a2ae208SSatish Balay #undef __FUNCT__ 15074a2ae208SSatish Balay #define __FUNCT__ "SNESSetTrustRegionTolerance" 150833174efeSLois Curfman McInnes /*@ 15099b94acceSBarry Smith SNESSetTrustRegionTolerance - Sets the trust region parameter tolerance. 15109b94acceSBarry Smith 1511fee21e36SBarry Smith Collective on SNES 1512fee21e36SBarry Smith 1513c7afd0dbSLois Curfman McInnes Input Parameters: 1514c7afd0dbSLois Curfman McInnes + snes - the SNES context 1515c7afd0dbSLois Curfman McInnes - tol - tolerance 1516c7afd0dbSLois Curfman McInnes 15179b94acceSBarry Smith Options Database Key: 1518c7afd0dbSLois Curfman McInnes . -snes_trtol <tol> - Sets tol 15199b94acceSBarry Smith 152036851e7fSLois Curfman McInnes Level: intermediate 152136851e7fSLois Curfman McInnes 15229b94acceSBarry Smith .keywords: SNES, nonlinear, set, trust region, tolerance 15239b94acceSBarry Smith 1524d7a720efSLois Curfman McInnes .seealso: SNESSetTolerances(), SNESSetMinimizationFunctionTolerance() 15259b94acceSBarry Smith @*/ 1526329f5518SBarry Smith int SNESSetTrustRegionTolerance(SNES snes,PetscReal tol) 15279b94acceSBarry Smith { 15283a40ed3dSBarry Smith PetscFunctionBegin; 152977c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 15309b94acceSBarry Smith snes->deltatol = tol; 15313a40ed3dSBarry Smith PetscFunctionReturn(0); 15329b94acceSBarry Smith } 15339b94acceSBarry Smith 15344a2ae208SSatish Balay #undef __FUNCT__ 15354a2ae208SSatish Balay #define __FUNCT__ "SNESSetMinimizationFunctionTolerance" 15369b94acceSBarry Smith /*@ 153777c4ece6SBarry Smith SNESSetMinimizationFunctionTolerance - Sets the minimum allowable function tolerance 15389b94acceSBarry Smith for unconstrained minimization solvers. 15399b94acceSBarry Smith 1540fee21e36SBarry Smith Collective on SNES 1541fee21e36SBarry Smith 1542c7afd0dbSLois Curfman McInnes Input Parameters: 1543c7afd0dbSLois Curfman McInnes + snes - the SNES context 1544c7afd0dbSLois Curfman McInnes - ftol - minimum function tolerance 1545c7afd0dbSLois Curfman McInnes 15469b94acceSBarry Smith Options Database Key: 1547c7afd0dbSLois Curfman McInnes . -snes_fmin <ftol> - Sets ftol 15489b94acceSBarry Smith 15499b94acceSBarry Smith Note: 155077c4ece6SBarry Smith SNESSetMinimizationFunctionTolerance() is valid for SNES_UNCONSTRAINED_MINIMIZATION 15519b94acceSBarry Smith methods only. 15529b94acceSBarry Smith 155336851e7fSLois Curfman McInnes Level: intermediate 155436851e7fSLois Curfman McInnes 15559b94acceSBarry Smith .keywords: SNES, nonlinear, set, minimum, convergence, function, tolerance 15569b94acceSBarry Smith 1557d7a720efSLois Curfman McInnes .seealso: SNESSetTolerances(), SNESSetTrustRegionTolerance() 15589b94acceSBarry Smith @*/ 1559329f5518SBarry Smith int SNESSetMinimizationFunctionTolerance(SNES snes,PetscReal ftol) 15609b94acceSBarry Smith { 15613a40ed3dSBarry Smith PetscFunctionBegin; 156277c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 15639b94acceSBarry Smith snes->fmin = ftol; 15643a40ed3dSBarry Smith PetscFunctionReturn(0); 15659b94acceSBarry Smith } 1566df9fa365SBarry Smith /* 1567df9fa365SBarry Smith Duplicate the lg monitors for SNES from KSP; for some reason with 1568df9fa365SBarry Smith dynamic libraries things don't work under Sun4 if we just use 1569df9fa365SBarry Smith macros instead of functions 1570df9fa365SBarry Smith */ 15714a2ae208SSatish Balay #undef __FUNCT__ 15724a2ae208SSatish Balay #define __FUNCT__ "SNESLGMonitor" 1573329f5518SBarry Smith int SNESLGMonitor(SNES snes,int it,PetscReal norm,void *ctx) 1574ce1608b8SBarry Smith { 1575ce1608b8SBarry Smith int ierr; 1576ce1608b8SBarry Smith 1577ce1608b8SBarry Smith PetscFunctionBegin; 1578184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1579ce1608b8SBarry Smith ierr = KSPLGMonitor((KSP)snes,it,norm,ctx);CHKERRQ(ierr); 1580ce1608b8SBarry Smith PetscFunctionReturn(0); 1581ce1608b8SBarry Smith } 1582ce1608b8SBarry Smith 15834a2ae208SSatish Balay #undef __FUNCT__ 15844a2ae208SSatish Balay #define __FUNCT__ "SNESLGMonitorCreate" 1585b0a32e0cSBarry Smith int SNESLGMonitorCreate(char *host,char *label,int x,int y,int m,int n,PetscDrawLG *draw) 1586df9fa365SBarry Smith { 1587df9fa365SBarry Smith int ierr; 1588df9fa365SBarry Smith 1589df9fa365SBarry Smith PetscFunctionBegin; 1590df9fa365SBarry Smith ierr = KSPLGMonitorCreate(host,label,x,y,m,n,draw);CHKERRQ(ierr); 1591df9fa365SBarry Smith PetscFunctionReturn(0); 1592df9fa365SBarry Smith } 1593df9fa365SBarry Smith 15944a2ae208SSatish Balay #undef __FUNCT__ 15954a2ae208SSatish Balay #define __FUNCT__ "SNESLGMonitorDestroy" 1596b0a32e0cSBarry Smith int SNESLGMonitorDestroy(PetscDrawLG draw) 1597df9fa365SBarry Smith { 1598df9fa365SBarry Smith int ierr; 1599df9fa365SBarry Smith 1600df9fa365SBarry Smith PetscFunctionBegin; 1601df9fa365SBarry Smith ierr = KSPLGMonitorDestroy(draw);CHKERRQ(ierr); 1602df9fa365SBarry Smith PetscFunctionReturn(0); 1603df9fa365SBarry Smith } 1604df9fa365SBarry Smith 16059b94acceSBarry Smith /* ------------ Routines to set performance monitoring options ----------- */ 16069b94acceSBarry Smith 16074a2ae208SSatish Balay #undef __FUNCT__ 16084a2ae208SSatish Balay #define __FUNCT__ "SNESSetMonitor" 16099b94acceSBarry Smith /*@C 16105cd90555SBarry Smith SNESSetMonitor - Sets an ADDITIONAL function that is to be used at every 16119b94acceSBarry Smith iteration of the nonlinear solver to display the iteration's 16129b94acceSBarry Smith progress. 16139b94acceSBarry Smith 1614fee21e36SBarry Smith Collective on SNES 1615fee21e36SBarry Smith 1616c7afd0dbSLois Curfman McInnes Input Parameters: 1617c7afd0dbSLois Curfman McInnes + snes - the SNES context 1618c7afd0dbSLois Curfman McInnes . func - monitoring routine 1619b8a78c4aSBarry Smith . mctx - [optional] user-defined context for private data for the 1620b3006f0bSLois Curfman McInnes monitor routine (use PETSC_NULL if no context is desitre) 1621b3006f0bSLois Curfman McInnes - monitordestroy - [optional] routine that frees monitor context 1622b3006f0bSLois Curfman McInnes (may be PETSC_NULL) 16239b94acceSBarry Smith 1624c7afd0dbSLois Curfman McInnes Calling sequence of func: 1625329f5518SBarry Smith $ int func(SNES snes,int its, PetscReal norm,void *mctx) 1626c7afd0dbSLois Curfman McInnes 1627c7afd0dbSLois Curfman McInnes + snes - the SNES context 1628c7afd0dbSLois Curfman McInnes . its - iteration number 1629c7afd0dbSLois Curfman McInnes . norm - 2-norm function value (may be estimated) 1630c7afd0dbSLois Curfman McInnes for SNES_NONLINEAR_EQUATIONS methods 163140a0c1c6SLois Curfman McInnes . norm - 2-norm gradient value (may be estimated) 1632c7afd0dbSLois Curfman McInnes for SNES_UNCONSTRAINED_MINIMIZATION methods 163340a0c1c6SLois Curfman McInnes - mctx - [optional] monitoring context 16349b94acceSBarry Smith 16359665c990SLois Curfman McInnes Options Database Keys: 1636c7afd0dbSLois Curfman McInnes + -snes_monitor - sets SNESDefaultMonitor() 1637c7afd0dbSLois Curfman McInnes . -snes_xmonitor - sets line graph monitor, 1638c7afd0dbSLois Curfman McInnes uses SNESLGMonitorCreate() 1639c7afd0dbSLois Curfman McInnes _ -snes_cancelmonitors - cancels all monitors that have 1640c7afd0dbSLois Curfman McInnes been hardwired into a code by 1641c7afd0dbSLois Curfman McInnes calls to SNESSetMonitor(), but 1642c7afd0dbSLois Curfman McInnes does not cancel those set via 1643c7afd0dbSLois Curfman McInnes the options database. 16449665c990SLois Curfman McInnes 1645639f9d9dSBarry Smith Notes: 16466bc08f3fSLois Curfman McInnes Several different monitoring routines may be set by calling 16476bc08f3fSLois Curfman McInnes SNESSetMonitor() multiple times; all will be called in the 16486bc08f3fSLois Curfman McInnes order in which they were set. 1649639f9d9dSBarry Smith 165036851e7fSLois Curfman McInnes Level: intermediate 165136851e7fSLois Curfman McInnes 16529b94acceSBarry Smith .keywords: SNES, nonlinear, set, monitor 16539b94acceSBarry Smith 16545cd90555SBarry Smith .seealso: SNESDefaultMonitor(), SNESClearMonitor() 16559b94acceSBarry Smith @*/ 1656329f5518SBarry Smith int SNESSetMonitor(SNES snes,int (*func)(SNES,int,PetscReal,void*),void *mctx,int (*monitordestroy)(void *)) 16579b94acceSBarry Smith { 16583a40ed3dSBarry Smith PetscFunctionBegin; 1659184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1660639f9d9dSBarry Smith if (snes->numbermonitors >= MAXSNESMONITORS) { 166129bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Too many monitors set"); 1662639f9d9dSBarry Smith } 1663639f9d9dSBarry Smith 1664639f9d9dSBarry Smith snes->monitor[snes->numbermonitors] = func; 1665b8a78c4aSBarry Smith snes->monitordestroy[snes->numbermonitors] = monitordestroy; 1666639f9d9dSBarry Smith snes->monitorcontext[snes->numbermonitors++] = (void*)mctx; 16673a40ed3dSBarry Smith PetscFunctionReturn(0); 16689b94acceSBarry Smith } 16699b94acceSBarry Smith 16704a2ae208SSatish Balay #undef __FUNCT__ 16714a2ae208SSatish Balay #define __FUNCT__ "SNESClearMonitor" 16725cd90555SBarry Smith /*@C 16735cd90555SBarry Smith SNESClearMonitor - Clears all the monitor functions for a SNES object. 16745cd90555SBarry Smith 1675c7afd0dbSLois Curfman McInnes Collective on SNES 1676c7afd0dbSLois Curfman McInnes 16775cd90555SBarry Smith Input Parameters: 16785cd90555SBarry Smith . snes - the SNES context 16795cd90555SBarry Smith 16805cd90555SBarry Smith Options Database: 1681c7afd0dbSLois Curfman McInnes . -snes_cancelmonitors - cancels all monitors that have been hardwired 1682c7afd0dbSLois Curfman McInnes into a code by calls to SNESSetMonitor(), but does not cancel those 1683c7afd0dbSLois Curfman McInnes set via the options database 16845cd90555SBarry Smith 16855cd90555SBarry Smith Notes: 16865cd90555SBarry Smith There is no way to clear one specific monitor from a SNES object. 16875cd90555SBarry Smith 168836851e7fSLois Curfman McInnes Level: intermediate 168936851e7fSLois Curfman McInnes 16905cd90555SBarry Smith .keywords: SNES, nonlinear, set, monitor 16915cd90555SBarry Smith 16925cd90555SBarry Smith .seealso: SNESDefaultMonitor(), SNESSetMonitor() 16935cd90555SBarry Smith @*/ 16945cd90555SBarry Smith int SNESClearMonitor(SNES snes) 16955cd90555SBarry Smith { 16965cd90555SBarry Smith PetscFunctionBegin; 1697184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 16985cd90555SBarry Smith snes->numbermonitors = 0; 16995cd90555SBarry Smith PetscFunctionReturn(0); 17005cd90555SBarry Smith } 17015cd90555SBarry Smith 17024a2ae208SSatish Balay #undef __FUNCT__ 17034a2ae208SSatish Balay #define __FUNCT__ "SNESSetConvergenceTest" 17049b94acceSBarry Smith /*@C 17059b94acceSBarry Smith SNESSetConvergenceTest - Sets the function that is to be used 17069b94acceSBarry Smith to test for convergence of the nonlinear iterative solution. 17079b94acceSBarry Smith 1708fee21e36SBarry Smith Collective on SNES 1709fee21e36SBarry Smith 1710c7afd0dbSLois Curfman McInnes Input Parameters: 1711c7afd0dbSLois Curfman McInnes + snes - the SNES context 1712c7afd0dbSLois Curfman McInnes . func - routine to test for convergence 1713c7afd0dbSLois Curfman McInnes - cctx - [optional] context for private data for the convergence routine 1714c7afd0dbSLois Curfman McInnes (may be PETSC_NULL) 17159b94acceSBarry Smith 1716c7afd0dbSLois Curfman McInnes Calling sequence of func: 1717329f5518SBarry Smith $ int func (SNES snes,PetscReal xnorm,PetscReal gnorm,PetscReal f,SNESConvergedReason *reason,void *cctx) 1718c7afd0dbSLois Curfman McInnes 1719c7afd0dbSLois Curfman McInnes + snes - the SNES context 1720c7afd0dbSLois Curfman McInnes . cctx - [optional] convergence context 1721184914b5SBarry Smith . reason - reason for convergence/divergence 1722c7afd0dbSLois Curfman McInnes . xnorm - 2-norm of current iterate 1723c7afd0dbSLois Curfman McInnes . gnorm - 2-norm of current step (SNES_NONLINEAR_EQUATIONS methods) 1724c7afd0dbSLois Curfman McInnes . f - 2-norm of function (SNES_NONLINEAR_EQUATIONS methods) 1725c7afd0dbSLois Curfman McInnes . gnorm - 2-norm of current gradient (SNES_UNCONSTRAINED_MINIMIZATION methods) 1726c7afd0dbSLois Curfman McInnes - f - function value (SNES_UNCONSTRAINED_MINIMIZATION methods) 17279b94acceSBarry Smith 172836851e7fSLois Curfman McInnes Level: advanced 172936851e7fSLois Curfman McInnes 17309b94acceSBarry Smith .keywords: SNES, nonlinear, set, convergence, test 17319b94acceSBarry Smith 173240191667SLois Curfman McInnes .seealso: SNESConverged_EQ_LS(), SNESConverged_EQ_TR(), 173340191667SLois Curfman McInnes SNESConverged_UM_LS(), SNESConverged_UM_TR() 17349b94acceSBarry Smith @*/ 1735329f5518SBarry Smith int SNESSetConvergenceTest(SNES snes,int (*func)(SNES,PetscReal,PetscReal,PetscReal,SNESConvergedReason*,void*),void *cctx) 17369b94acceSBarry Smith { 17373a40ed3dSBarry Smith PetscFunctionBegin; 1738184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 17399b94acceSBarry Smith (snes)->converged = func; 17409b94acceSBarry Smith (snes)->cnvP = cctx; 17413a40ed3dSBarry Smith PetscFunctionReturn(0); 17429b94acceSBarry Smith } 17439b94acceSBarry Smith 17444a2ae208SSatish Balay #undef __FUNCT__ 17454a2ae208SSatish Balay #define __FUNCT__ "SNESGetConvergedReason" 1746184914b5SBarry Smith /*@C 1747184914b5SBarry Smith SNESGetConvergedReason - Gets the reason the SNES iteration was stopped. 1748184914b5SBarry Smith 1749184914b5SBarry Smith Not Collective 1750184914b5SBarry Smith 1751184914b5SBarry Smith Input Parameter: 1752184914b5SBarry Smith . snes - the SNES context 1753184914b5SBarry Smith 1754184914b5SBarry Smith Output Parameter: 1755e090d566SSatish Balay . reason - negative value indicates diverged, positive value converged, see petscsnes.h or the 1756184914b5SBarry Smith manual pages for the individual convergence tests for complete lists 1757184914b5SBarry Smith 1758184914b5SBarry Smith Level: intermediate 1759184914b5SBarry Smith 1760184914b5SBarry Smith Notes: Can only be called after the call the SNESSolve() is complete. 1761184914b5SBarry Smith 1762184914b5SBarry Smith .keywords: SNES, nonlinear, set, convergence, test 1763184914b5SBarry Smith 1764184914b5SBarry Smith .seealso: SNESSetConvergenceTest(), SNESConverged_EQ_LS(), SNESConverged_EQ_TR(), 1765435da068SBarry Smith SNESConverged_UM_LS(), SNESConverged_UM_TR(), SNESConvergedReason 1766184914b5SBarry Smith @*/ 1767184914b5SBarry Smith int SNESGetConvergedReason(SNES snes,SNESConvergedReason *reason) 1768184914b5SBarry Smith { 1769184914b5SBarry Smith PetscFunctionBegin; 1770184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1771184914b5SBarry Smith *reason = snes->reason; 1772184914b5SBarry Smith PetscFunctionReturn(0); 1773184914b5SBarry Smith } 1774184914b5SBarry Smith 17754a2ae208SSatish Balay #undef __FUNCT__ 17764a2ae208SSatish Balay #define __FUNCT__ "SNESSetConvergenceHistory" 1777c9005455SLois Curfman McInnes /*@ 1778c9005455SLois Curfman McInnes SNESSetConvergenceHistory - Sets the array used to hold the convergence history. 1779c9005455SLois Curfman McInnes 1780fee21e36SBarry Smith Collective on SNES 1781fee21e36SBarry Smith 1782c7afd0dbSLois Curfman McInnes Input Parameters: 1783c7afd0dbSLois Curfman McInnes + snes - iterative context obtained from SNESCreate() 1784c7afd0dbSLois Curfman McInnes . a - array to hold history 1785cd5578b5SBarry Smith . its - integer array holds the number of linear iterations for each solve. 1786758f92a0SBarry Smith . na - size of a and its 178764731454SLois Curfman McInnes - reset - PETSC_TRUE indicates each new nonlinear solve resets the history counter to zero, 1788758f92a0SBarry Smith else it continues storing new values for new nonlinear solves after the old ones 1789c7afd0dbSLois Curfman McInnes 1790c9005455SLois Curfman McInnes Notes: 1791c9005455SLois Curfman McInnes If set, this array will contain the function norms (for 1792c9005455SLois Curfman McInnes SNES_NONLINEAR_EQUATIONS methods) or gradient norms 1793c9005455SLois Curfman McInnes (for SNES_UNCONSTRAINED_MINIMIZATION methods) computed 1794c9005455SLois Curfman McInnes at each step. 1795c9005455SLois Curfman McInnes 1796c9005455SLois Curfman McInnes This routine is useful, e.g., when running a code for purposes 1797c9005455SLois Curfman McInnes of accurate performance monitoring, when no I/O should be done 1798c9005455SLois Curfman McInnes during the section of code that is being timed. 1799c9005455SLois Curfman McInnes 180036851e7fSLois Curfman McInnes Level: intermediate 180136851e7fSLois Curfman McInnes 1802c9005455SLois Curfman McInnes .keywords: SNES, set, convergence, history 1803758f92a0SBarry Smith 180408405cd6SLois Curfman McInnes .seealso: SNESGetConvergenceHistory() 1805758f92a0SBarry Smith 1806c9005455SLois Curfman McInnes @*/ 1807329f5518SBarry Smith int SNESSetConvergenceHistory(SNES snes,PetscReal *a,int *its,int na,PetscTruth reset) 1808c9005455SLois Curfman McInnes { 18093a40ed3dSBarry Smith PetscFunctionBegin; 1810c9005455SLois Curfman McInnes PetscValidHeaderSpecific(snes,SNES_COOKIE); 1811c9005455SLois Curfman McInnes if (na) PetscValidScalarPointer(a); 1812c9005455SLois Curfman McInnes snes->conv_hist = a; 1813758f92a0SBarry Smith snes->conv_hist_its = its; 1814758f92a0SBarry Smith snes->conv_hist_max = na; 1815758f92a0SBarry Smith snes->conv_hist_reset = reset; 1816758f92a0SBarry Smith PetscFunctionReturn(0); 1817758f92a0SBarry Smith } 1818758f92a0SBarry Smith 18194a2ae208SSatish Balay #undef __FUNCT__ 18204a2ae208SSatish Balay #define __FUNCT__ "SNESGetConvergenceHistory" 18210c4c9dddSBarry Smith /*@C 1822758f92a0SBarry Smith SNESGetConvergenceHistory - Gets the array used to hold the convergence history. 1823758f92a0SBarry Smith 1824758f92a0SBarry Smith Collective on SNES 1825758f92a0SBarry Smith 1826758f92a0SBarry Smith Input Parameter: 1827758f92a0SBarry Smith . snes - iterative context obtained from SNESCreate() 1828758f92a0SBarry Smith 1829758f92a0SBarry Smith Output Parameters: 1830758f92a0SBarry Smith . a - array to hold history 1831758f92a0SBarry Smith . its - integer array holds the number of linear iterations (or 1832758f92a0SBarry Smith negative if not converged) for each solve. 1833758f92a0SBarry Smith - na - size of a and its 1834758f92a0SBarry Smith 1835758f92a0SBarry Smith Notes: 1836758f92a0SBarry Smith The calling sequence for this routine in Fortran is 1837758f92a0SBarry Smith $ call SNESGetConvergenceHistory(SNES snes, integer na, integer ierr) 1838758f92a0SBarry Smith 1839758f92a0SBarry Smith This routine is useful, e.g., when running a code for purposes 1840758f92a0SBarry Smith of accurate performance monitoring, when no I/O should be done 1841758f92a0SBarry Smith during the section of code that is being timed. 1842758f92a0SBarry Smith 1843758f92a0SBarry Smith Level: intermediate 1844758f92a0SBarry Smith 1845758f92a0SBarry Smith .keywords: SNES, get, convergence, history 1846758f92a0SBarry Smith 1847758f92a0SBarry Smith .seealso: SNESSetConvergencHistory() 1848758f92a0SBarry Smith 1849758f92a0SBarry Smith @*/ 1850329f5518SBarry Smith int SNESGetConvergenceHistory(SNES snes,PetscReal **a,int **its,int *na) 1851758f92a0SBarry Smith { 1852758f92a0SBarry Smith PetscFunctionBegin; 1853758f92a0SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1854758f92a0SBarry Smith if (a) *a = snes->conv_hist; 1855758f92a0SBarry Smith if (its) *its = snes->conv_hist_its; 1856758f92a0SBarry Smith if (na) *na = snes->conv_hist_len; 18573a40ed3dSBarry Smith PetscFunctionReturn(0); 1858c9005455SLois Curfman McInnes } 1859c9005455SLois Curfman McInnes 18604a2ae208SSatish Balay #undef __FUNCT__ 18614a2ae208SSatish Balay #define __FUNCT__ "SNESScaleStep_Private" 18629b94acceSBarry Smith /* 18639b94acceSBarry Smith SNESScaleStep_Private - Scales a step so that its length is less than the 18649b94acceSBarry Smith positive parameter delta. 18659b94acceSBarry Smith 18669b94acceSBarry Smith Input Parameters: 1867c7afd0dbSLois Curfman McInnes + snes - the SNES context 18689b94acceSBarry Smith . y - approximate solution of linear system 18699b94acceSBarry Smith . fnorm - 2-norm of current function 1870c7afd0dbSLois Curfman McInnes - delta - trust region size 18719b94acceSBarry Smith 18729b94acceSBarry Smith Output Parameters: 1873c7afd0dbSLois Curfman McInnes + gpnorm - predicted function norm at the new point, assuming local 18749b94acceSBarry Smith linearization. The value is zero if the step lies within the trust 18759b94acceSBarry Smith region, and exceeds zero otherwise. 1876c7afd0dbSLois Curfman McInnes - ynorm - 2-norm of the step 18779b94acceSBarry Smith 18789b94acceSBarry Smith Note: 18796831982aSBarry Smith For non-trust region methods such as SNESEQLS, the parameter delta 18809b94acceSBarry Smith is set to be the maximum allowable step size. 18819b94acceSBarry Smith 18829b94acceSBarry Smith .keywords: SNES, nonlinear, scale, step 18839b94acceSBarry Smith */ 1884329f5518SBarry Smith int SNESScaleStep_Private(SNES snes,Vec y,PetscReal *fnorm,PetscReal *delta, 1885329f5518SBarry Smith PetscReal *gpnorm,PetscReal *ynorm) 18869b94acceSBarry Smith { 1887329f5518SBarry Smith PetscReal norm; 18889b94acceSBarry Smith Scalar cnorm; 18893a40ed3dSBarry Smith int ierr; 18903a40ed3dSBarry Smith 18913a40ed3dSBarry Smith PetscFunctionBegin; 1892184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1893184914b5SBarry Smith PetscValidHeaderSpecific(y,VEC_COOKIE); 1894184914b5SBarry Smith PetscCheckSameComm(snes,y); 1895184914b5SBarry Smith 18963a40ed3dSBarry Smith ierr = VecNorm(y,NORM_2,&norm);CHKERRQ(ierr); 18979b94acceSBarry Smith if (norm > *delta) { 18989b94acceSBarry Smith norm = *delta/norm; 18999b94acceSBarry Smith *gpnorm = (1.0 - norm)*(*fnorm); 19009b94acceSBarry Smith cnorm = norm; 1901329f5518SBarry Smith ierr = VecScale(&cnorm,y);CHKERRQ(ierr); 19029b94acceSBarry Smith *ynorm = *delta; 19039b94acceSBarry Smith } else { 19049b94acceSBarry Smith *gpnorm = 0.0; 19059b94acceSBarry Smith *ynorm = norm; 19069b94acceSBarry Smith } 19073a40ed3dSBarry Smith PetscFunctionReturn(0); 19089b94acceSBarry Smith } 19099b94acceSBarry Smith 19104a2ae208SSatish Balay #undef __FUNCT__ 19114a2ae208SSatish Balay #define __FUNCT__ "SNESSolve" 19129b94acceSBarry Smith /*@ 19139b94acceSBarry Smith SNESSolve - Solves a nonlinear system. Call SNESSolve after calling 191463a78c88SLois Curfman McInnes SNESCreate() and optional routines of the form SNESSetXXX(). 19159b94acceSBarry Smith 1916c7afd0dbSLois Curfman McInnes Collective on SNES 1917c7afd0dbSLois Curfman McInnes 1918b2002411SLois Curfman McInnes Input Parameters: 1919c7afd0dbSLois Curfman McInnes + snes - the SNES context 1920c7afd0dbSLois Curfman McInnes - x - the solution vector 19219b94acceSBarry Smith 19229b94acceSBarry Smith Output Parameter: 1923b2002411SLois Curfman McInnes . its - number of iterations until termination 19249b94acceSBarry Smith 1925b2002411SLois Curfman McInnes Notes: 19268ddd3da0SLois Curfman McInnes The user should initialize the vector,x, with the initial guess 19278ddd3da0SLois Curfman McInnes for the nonlinear solve prior to calling SNESSolve. In particular, 19288ddd3da0SLois Curfman McInnes to employ an initial guess of zero, the user should explicitly set 19298ddd3da0SLois Curfman McInnes this vector to zero by calling VecSet(). 19308ddd3da0SLois Curfman McInnes 193136851e7fSLois Curfman McInnes Level: beginner 193236851e7fSLois Curfman McInnes 19339b94acceSBarry Smith .keywords: SNES, nonlinear, solve 19349b94acceSBarry Smith 193563a78c88SLois Curfman McInnes .seealso: SNESCreate(), SNESDestroy() 19369b94acceSBarry Smith @*/ 19378ddd3da0SLois Curfman McInnes int SNESSolve(SNES snes,Vec x,int *its) 19389b94acceSBarry Smith { 1939f1af5d2fSBarry Smith int ierr; 1940f1af5d2fSBarry Smith PetscTruth flg; 1941052efed2SBarry Smith 19423a40ed3dSBarry Smith PetscFunctionBegin; 194377c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1944184914b5SBarry Smith PetscValidHeaderSpecific(x,VEC_COOKIE); 1945184914b5SBarry Smith PetscCheckSameComm(snes,x); 194674679c65SBarry Smith PetscValidIntPointer(its); 194729bbc08cSBarry Smith if (!snes->solve) SETERRQ(1,"SNESSetType() or SNESSetFromOptions() must be called before SNESSolve()"); 194874637425SBarry Smith 194982bf6240SBarry Smith if (!snes->setupcalled) {ierr = SNESSetUp(snes,x);CHKERRQ(ierr);} 1950c4fc05e7SBarry Smith else {snes->vec_sol = snes->vec_sol_always = x;} 1951758f92a0SBarry Smith if (snes->conv_hist_reset == PETSC_TRUE) snes->conv_hist_len = 0; 1952b0a32e0cSBarry Smith ierr = PetscLogEventBegin(SNES_Solve,snes,0,0,0);CHKERRQ(ierr); 1953c96a6f78SLois Curfman McInnes snes->nfuncs = 0; snes->linear_its = 0; snes->nfailures = 0; 19549b94acceSBarry Smith ierr = (*(snes)->solve)(snes,its);CHKERRQ(ierr); 1955b0a32e0cSBarry Smith ierr = PetscLogEventEnd(SNES_Solve,snes,0,0,0);CHKERRQ(ierr); 1956b0a32e0cSBarry Smith ierr = PetscOptionsHasName(snes->prefix,"-snes_view",&flg);CHKERRQ(ierr); 195793b98531SBarry Smith if (flg && !PetscPreLoadingOn) { ierr = SNESView(snes,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); } 19583a40ed3dSBarry Smith PetscFunctionReturn(0); 19599b94acceSBarry Smith } 19609b94acceSBarry Smith 19619b94acceSBarry Smith /* --------- Internal routines for SNES Package --------- */ 19629b94acceSBarry Smith 19634a2ae208SSatish Balay #undef __FUNCT__ 19644a2ae208SSatish Balay #define __FUNCT__ "SNESSetType" 196582bf6240SBarry Smith /*@C 19664b0e389bSBarry Smith SNESSetType - Sets the method for the nonlinear solver. 19679b94acceSBarry Smith 1968fee21e36SBarry Smith Collective on SNES 1969fee21e36SBarry Smith 1970c7afd0dbSLois Curfman McInnes Input Parameters: 1971c7afd0dbSLois Curfman McInnes + snes - the SNES context 1972454a90a3SBarry Smith - type - a known method 1973c7afd0dbSLois Curfman McInnes 1974c7afd0dbSLois Curfman McInnes Options Database Key: 1975454a90a3SBarry Smith . -snes_type <type> - Sets the method; use -help for a list 1976c7afd0dbSLois Curfman McInnes of available methods (for instance, ls or tr) 1977ae12b187SLois Curfman McInnes 19789b94acceSBarry Smith Notes: 1979e090d566SSatish Balay See "petsc/include/petscsnes.h" for available methods (for instance) 19806831982aSBarry Smith + SNESEQLS - Newton's method with line search 1981c7afd0dbSLois Curfman McInnes (systems of nonlinear equations) 19826831982aSBarry Smith . SNESEQTR - Newton's method with trust region 1983c7afd0dbSLois Curfman McInnes (systems of nonlinear equations) 19846831982aSBarry Smith . SNESUMTR - Newton's method with trust region 1985c7afd0dbSLois Curfman McInnes (unconstrained minimization) 19866831982aSBarry Smith - SNESUMLS - Newton's method with line search 1987c7afd0dbSLois Curfman McInnes (unconstrained minimization) 19889b94acceSBarry Smith 1989ae12b187SLois Curfman McInnes Normally, it is best to use the SNESSetFromOptions() command and then 1990ae12b187SLois Curfman McInnes set the SNES solver type from the options database rather than by using 1991ae12b187SLois Curfman McInnes this routine. Using the options database provides the user with 1992ae12b187SLois Curfman McInnes maximum flexibility in evaluating the many nonlinear solvers. 1993ae12b187SLois Curfman McInnes The SNESSetType() routine is provided for those situations where it 1994ae12b187SLois Curfman McInnes is necessary to set the nonlinear solver independently of the command 1995ae12b187SLois Curfman McInnes line or options database. This might be the case, for example, when 1996ae12b187SLois Curfman McInnes the choice of solver changes during the execution of the program, 1997ae12b187SLois Curfman McInnes and the user's application is taking responsibility for choosing the 1998b0a32e0cSBarry Smith appropriate method. 199936851e7fSLois Curfman McInnes 200036851e7fSLois Curfman McInnes Level: intermediate 2001a703fe33SLois Curfman McInnes 2002454a90a3SBarry Smith .keywords: SNES, set, type 2003435da068SBarry Smith 2004435da068SBarry Smith .seealso: SNESType, SNESCreate() 2005435da068SBarry Smith 20069b94acceSBarry Smith @*/ 2007454a90a3SBarry Smith int SNESSetType(SNES snes,SNESType type) 20089b94acceSBarry Smith { 20090f5bd95cSBarry Smith int ierr,(*r)(SNES); 20106831982aSBarry Smith PetscTruth match; 20113a40ed3dSBarry Smith 20123a40ed3dSBarry Smith PetscFunctionBegin; 201377c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 20140f5bd95cSBarry Smith PetscValidCharPointer(type); 201582bf6240SBarry Smith 20166831982aSBarry Smith ierr = PetscTypeCompare((PetscObject)snes,type,&match);CHKERRQ(ierr); 20170f5bd95cSBarry Smith if (match) PetscFunctionReturn(0); 201882bf6240SBarry Smith 201982bf6240SBarry Smith if (snes->setupcalled) { 2020e1311b90SBarry Smith ierr = (*(snes)->destroy)(snes);CHKERRQ(ierr); 202182bf6240SBarry Smith snes->data = 0; 202282bf6240SBarry Smith } 20237d1a2b2bSBarry Smith 20249b94acceSBarry Smith /* Get the function pointers for the iterative method requested */ 202582bf6240SBarry Smith if (!SNESRegisterAllCalled) {ierr = SNESRegisterAll(PETSC_NULL);CHKERRQ(ierr);} 202682bf6240SBarry Smith 2027b9617806SBarry Smith ierr = PetscFListFind(snes->comm,SNESList,type,(void (**)(void)) &r);CHKERRQ(ierr); 202882bf6240SBarry Smith 202929bbc08cSBarry Smith if (!r) SETERRQ1(1,"Unable to find requested SNES type %s",type); 20301548b14aSBarry Smith 2031606d414cSSatish Balay if (snes->data) {ierr = PetscFree(snes->data);CHKERRQ(ierr);} 203282bf6240SBarry Smith snes->data = 0; 20333a40ed3dSBarry Smith ierr = (*r)(snes);CHKERRQ(ierr); 203482bf6240SBarry Smith 2035454a90a3SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)snes,type);CHKERRQ(ierr); 203682bf6240SBarry Smith snes->set_method_called = 1; 203782bf6240SBarry Smith 20383a40ed3dSBarry Smith PetscFunctionReturn(0); 20399b94acceSBarry Smith } 20409b94acceSBarry Smith 2041a847f771SSatish Balay 20429b94acceSBarry Smith /* --------------------------------------------------------------------- */ 20434a2ae208SSatish Balay #undef __FUNCT__ 20444a2ae208SSatish Balay #define __FUNCT__ "SNESRegisterDestroy" 20459b94acceSBarry Smith /*@C 20469b94acceSBarry Smith SNESRegisterDestroy - Frees the list of nonlinear solvers that were 2047f1af5d2fSBarry Smith registered by SNESRegisterDynamic(). 20489b94acceSBarry Smith 2049fee21e36SBarry Smith Not Collective 2050fee21e36SBarry Smith 205136851e7fSLois Curfman McInnes Level: advanced 205236851e7fSLois Curfman McInnes 20539b94acceSBarry Smith .keywords: SNES, nonlinear, register, destroy 20549b94acceSBarry Smith 20559b94acceSBarry Smith .seealso: SNESRegisterAll(), SNESRegisterAll() 20569b94acceSBarry Smith @*/ 2057cf256101SBarry Smith int SNESRegisterDestroy(void) 20589b94acceSBarry Smith { 205982bf6240SBarry Smith int ierr; 206082bf6240SBarry Smith 20613a40ed3dSBarry Smith PetscFunctionBegin; 206282bf6240SBarry Smith if (SNESList) { 2063b0a32e0cSBarry Smith ierr = PetscFListDestroy(&SNESList);CHKERRQ(ierr); 206482bf6240SBarry Smith SNESList = 0; 20659b94acceSBarry Smith } 20664c49b128SBarry Smith SNESRegisterAllCalled = PETSC_FALSE; 20673a40ed3dSBarry Smith PetscFunctionReturn(0); 20689b94acceSBarry Smith } 20699b94acceSBarry Smith 20704a2ae208SSatish Balay #undef __FUNCT__ 20714a2ae208SSatish Balay #define __FUNCT__ "SNESGetType" 20729b94acceSBarry Smith /*@C 20739a28b0a6SLois Curfman McInnes SNESGetType - Gets the SNES method type and name (as a string). 20749b94acceSBarry Smith 2075c7afd0dbSLois Curfman McInnes Not Collective 2076c7afd0dbSLois Curfman McInnes 20779b94acceSBarry Smith Input Parameter: 20784b0e389bSBarry Smith . snes - nonlinear solver context 20799b94acceSBarry Smith 20809b94acceSBarry Smith Output Parameter: 2081*3a7fca6bSBarry Smith . type - SNES method (a character string) 20829b94acceSBarry Smith 208336851e7fSLois Curfman McInnes Level: intermediate 208436851e7fSLois Curfman McInnes 2085454a90a3SBarry Smith .keywords: SNES, nonlinear, get, type, name 20869b94acceSBarry Smith @*/ 2087454a90a3SBarry Smith int SNESGetType(SNES snes,SNESType *type) 20889b94acceSBarry Smith { 20893a40ed3dSBarry Smith PetscFunctionBegin; 2090184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2091454a90a3SBarry Smith *type = snes->type_name; 20923a40ed3dSBarry Smith PetscFunctionReturn(0); 20939b94acceSBarry Smith } 20949b94acceSBarry Smith 20954a2ae208SSatish Balay #undef __FUNCT__ 20964a2ae208SSatish Balay #define __FUNCT__ "SNESGetSolution" 20979b94acceSBarry Smith /*@C 20989b94acceSBarry Smith SNESGetSolution - Returns the vector where the approximate solution is 20999b94acceSBarry Smith stored. 21009b94acceSBarry Smith 2101c7afd0dbSLois Curfman McInnes Not Collective, but Vec is parallel if SNES is parallel 2102c7afd0dbSLois Curfman McInnes 21039b94acceSBarry Smith Input Parameter: 21049b94acceSBarry Smith . snes - the SNES context 21059b94acceSBarry Smith 21069b94acceSBarry Smith Output Parameter: 21079b94acceSBarry Smith . x - the solution 21089b94acceSBarry Smith 210936851e7fSLois Curfman McInnes Level: advanced 211036851e7fSLois Curfman McInnes 21119b94acceSBarry Smith .keywords: SNES, nonlinear, get, solution 21129b94acceSBarry Smith 2113a86d99e1SLois Curfman McInnes .seealso: SNESGetFunction(), SNESGetGradient(), SNESGetSolutionUpdate() 21149b94acceSBarry Smith @*/ 21159b94acceSBarry Smith int SNESGetSolution(SNES snes,Vec *x) 21169b94acceSBarry Smith { 21173a40ed3dSBarry Smith PetscFunctionBegin; 211877c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 21199b94acceSBarry Smith *x = snes->vec_sol_always; 21203a40ed3dSBarry Smith PetscFunctionReturn(0); 21219b94acceSBarry Smith } 21229b94acceSBarry Smith 21234a2ae208SSatish Balay #undef __FUNCT__ 21244a2ae208SSatish Balay #define __FUNCT__ "SNESGetSolutionUpdate" 21259b94acceSBarry Smith /*@C 21269b94acceSBarry Smith SNESGetSolutionUpdate - Returns the vector where the solution update is 21279b94acceSBarry Smith stored. 21289b94acceSBarry Smith 2129c7afd0dbSLois Curfman McInnes Not Collective, but Vec is parallel if SNES is parallel 2130c7afd0dbSLois Curfman McInnes 21319b94acceSBarry Smith Input Parameter: 21329b94acceSBarry Smith . snes - the SNES context 21339b94acceSBarry Smith 21349b94acceSBarry Smith Output Parameter: 21359b94acceSBarry Smith . x - the solution update 21369b94acceSBarry Smith 213736851e7fSLois Curfman McInnes Level: advanced 213836851e7fSLois Curfman McInnes 21399b94acceSBarry Smith .keywords: SNES, nonlinear, get, solution, update 21409b94acceSBarry Smith 21419b94acceSBarry Smith .seealso: SNESGetSolution(), SNESGetFunction 21429b94acceSBarry Smith @*/ 21439b94acceSBarry Smith int SNESGetSolutionUpdate(SNES snes,Vec *x) 21449b94acceSBarry Smith { 21453a40ed3dSBarry Smith PetscFunctionBegin; 214677c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 21479b94acceSBarry Smith *x = snes->vec_sol_update_always; 21483a40ed3dSBarry Smith PetscFunctionReturn(0); 21499b94acceSBarry Smith } 21509b94acceSBarry Smith 21514a2ae208SSatish Balay #undef __FUNCT__ 21524a2ae208SSatish Balay #define __FUNCT__ "SNESGetFunction" 21539b94acceSBarry Smith /*@C 21543638b69dSLois Curfman McInnes SNESGetFunction - Returns the vector where the function is stored. 21559b94acceSBarry Smith 2156c7afd0dbSLois Curfman McInnes Not Collective, but Vec is parallel if SNES is parallel 2157c7afd0dbSLois Curfman McInnes 21589b94acceSBarry Smith Input Parameter: 21599b94acceSBarry Smith . snes - the SNES context 21609b94acceSBarry Smith 21619b94acceSBarry Smith Output Parameter: 21627bf4e008SBarry Smith + r - the function (or PETSC_NULL) 216300036973SBarry Smith . ctx - the function context (or PETSC_NULL) 216400036973SBarry Smith - func - the function (or PETSC_NULL) 21659b94acceSBarry Smith 21669b94acceSBarry Smith Notes: 21679b94acceSBarry Smith SNESGetFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only 21689b94acceSBarry Smith Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are 21699b94acceSBarry Smith SNESGetMinimizationFunction() and SNESGetGradient(); 21709b94acceSBarry Smith 217136851e7fSLois Curfman McInnes Level: advanced 217236851e7fSLois Curfman McInnes 2173a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, get, function 21749b94acceSBarry Smith 217531615d04SLois Curfman McInnes .seealso: SNESSetFunction(), SNESGetSolution(), SNESGetMinimizationFunction(), 217631615d04SLois Curfman McInnes SNESGetGradient() 21777bf4e008SBarry Smith 21789b94acceSBarry Smith @*/ 217900036973SBarry Smith int SNESGetFunction(SNES snes,Vec *r,void **ctx,int (**func)(SNES,Vec,Vec,void*)) 21809b94acceSBarry Smith { 21813a40ed3dSBarry Smith PetscFunctionBegin; 218277c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2183a8c6a408SBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 218429bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only"); 2185a8c6a408SBarry Smith } 21867bf4e008SBarry Smith if (r) *r = snes->vec_func_always; 21877bf4e008SBarry Smith if (ctx) *ctx = snes->funP; 218800036973SBarry Smith if (func) *func = snes->computefunction; 21893a40ed3dSBarry Smith PetscFunctionReturn(0); 21909b94acceSBarry Smith } 21919b94acceSBarry Smith 21924a2ae208SSatish Balay #undef __FUNCT__ 21934a2ae208SSatish Balay #define __FUNCT__ "SNESGetGradient" 21949b94acceSBarry Smith /*@C 21953638b69dSLois Curfman McInnes SNESGetGradient - Returns the vector where the gradient is stored. 21969b94acceSBarry Smith 2197c7afd0dbSLois Curfman McInnes Not Collective, but Vec is parallel if SNES is parallel 2198c7afd0dbSLois Curfman McInnes 21999b94acceSBarry Smith Input Parameter: 22009b94acceSBarry Smith . snes - the SNES context 22019b94acceSBarry Smith 22029b94acceSBarry Smith Output Parameter: 22037bf4e008SBarry Smith + r - the gradient (or PETSC_NULL) 22047bf4e008SBarry Smith - ctx - the gradient context (or PETSC_NULL) 22059b94acceSBarry Smith 22069b94acceSBarry Smith Notes: 22079b94acceSBarry Smith SNESGetGradient() is valid for SNES_UNCONSTRAINED_MINIMIZATION methods 22089b94acceSBarry Smith only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is 22099b94acceSBarry Smith SNESGetFunction(). 22109b94acceSBarry Smith 221136851e7fSLois Curfman McInnes Level: advanced 221236851e7fSLois Curfman McInnes 22139b94acceSBarry Smith .keywords: SNES, nonlinear, get, gradient 22149b94acceSBarry Smith 22157bf4e008SBarry Smith .seealso: SNESGetMinimizationFunction(), SNESGetSolution(), SNESGetFunction(), 22167bf4e008SBarry Smith SNESSetGradient(), SNESSetFunction() 22177bf4e008SBarry Smith 22189b94acceSBarry Smith @*/ 22197bf4e008SBarry Smith int SNESGetGradient(SNES snes,Vec *r,void **ctx) 22209b94acceSBarry Smith { 22213a40ed3dSBarry Smith PetscFunctionBegin; 222277c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 22233a40ed3dSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 222429bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 22253a40ed3dSBarry Smith } 22267bf4e008SBarry Smith if (r) *r = snes->vec_func_always; 22277bf4e008SBarry Smith if (ctx) *ctx = snes->funP; 22283a40ed3dSBarry Smith PetscFunctionReturn(0); 22299b94acceSBarry Smith } 22309b94acceSBarry Smith 22314a2ae208SSatish Balay #undef __FUNCT__ 22324a2ae208SSatish Balay #define __FUNCT__ "SNESGetMinimizationFunction" 22337bf4e008SBarry Smith /*@C 22349b94acceSBarry Smith SNESGetMinimizationFunction - Returns the scalar function value for 22359b94acceSBarry Smith unconstrained minimization problems. 22369b94acceSBarry Smith 2237c7afd0dbSLois Curfman McInnes Not Collective 2238c7afd0dbSLois Curfman McInnes 22399b94acceSBarry Smith Input Parameter: 22409b94acceSBarry Smith . snes - the SNES context 22419b94acceSBarry Smith 22429b94acceSBarry Smith Output Parameter: 22437bf4e008SBarry Smith + r - the function (or PETSC_NULL) 22447bf4e008SBarry Smith - ctx - the function context (or PETSC_NULL) 22459b94acceSBarry Smith 22469b94acceSBarry Smith Notes: 22479b94acceSBarry Smith SNESGetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION 22489b94acceSBarry Smith methods only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is 22499b94acceSBarry Smith SNESGetFunction(). 22509b94acceSBarry Smith 225136851e7fSLois Curfman McInnes Level: advanced 225236851e7fSLois Curfman McInnes 22539b94acceSBarry Smith .keywords: SNES, nonlinear, get, function 22549b94acceSBarry Smith 22557bf4e008SBarry Smith .seealso: SNESGetGradient(), SNESGetSolution(), SNESGetFunction(), SNESSetFunction() 22567bf4e008SBarry Smith 22579b94acceSBarry Smith @*/ 2258329f5518SBarry Smith int SNESGetMinimizationFunction(SNES snes,PetscReal *r,void **ctx) 22599b94acceSBarry Smith { 22603a40ed3dSBarry Smith PetscFunctionBegin; 226177c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 226274679c65SBarry Smith PetscValidScalarPointer(r); 22633a40ed3dSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 226429bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 22653a40ed3dSBarry Smith } 22667bf4e008SBarry Smith if (r) *r = snes->fc; 22677bf4e008SBarry Smith if (ctx) *ctx = snes->umfunP; 22683a40ed3dSBarry Smith PetscFunctionReturn(0); 22699b94acceSBarry Smith } 22709b94acceSBarry Smith 22714a2ae208SSatish Balay #undef __FUNCT__ 22724a2ae208SSatish Balay #define __FUNCT__ "SNESSetOptionsPrefix" 22733c7409f5SSatish Balay /*@C 22743c7409f5SSatish Balay SNESSetOptionsPrefix - Sets the prefix used for searching for all 2275d850072dSLois Curfman McInnes SNES options in the database. 22763c7409f5SSatish Balay 2277fee21e36SBarry Smith Collective on SNES 2278fee21e36SBarry Smith 2279c7afd0dbSLois Curfman McInnes Input Parameter: 2280c7afd0dbSLois Curfman McInnes + snes - the SNES context 2281c7afd0dbSLois Curfman McInnes - prefix - the prefix to prepend to all option names 2282c7afd0dbSLois Curfman McInnes 2283d850072dSLois Curfman McInnes Notes: 2284a83b1b31SSatish Balay A hyphen (-) must NOT be given at the beginning of the prefix name. 2285c7afd0dbSLois Curfman McInnes The first character of all runtime options is AUTOMATICALLY the hyphen. 2286d850072dSLois Curfman McInnes 228736851e7fSLois Curfman McInnes Level: advanced 228836851e7fSLois Curfman McInnes 22893c7409f5SSatish Balay .keywords: SNES, set, options, prefix, database 2290a86d99e1SLois Curfman McInnes 2291a86d99e1SLois Curfman McInnes .seealso: SNESSetFromOptions() 22923c7409f5SSatish Balay @*/ 22933c7409f5SSatish Balay int SNESSetOptionsPrefix(SNES snes,char *prefix) 22943c7409f5SSatish Balay { 22953c7409f5SSatish Balay int ierr; 22963c7409f5SSatish Balay 22973a40ed3dSBarry Smith PetscFunctionBegin; 229877c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2299639f9d9dSBarry Smith ierr = PetscObjectSetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr); 23003c7409f5SSatish Balay ierr = SLESSetOptionsPrefix(snes->sles,prefix);CHKERRQ(ierr); 23013a40ed3dSBarry Smith PetscFunctionReturn(0); 23023c7409f5SSatish Balay } 23033c7409f5SSatish Balay 23044a2ae208SSatish Balay #undef __FUNCT__ 23054a2ae208SSatish Balay #define __FUNCT__ "SNESAppendOptionsPrefix" 23063c7409f5SSatish Balay /*@C 2307f525115eSLois Curfman McInnes SNESAppendOptionsPrefix - Appends to the prefix used for searching for all 2308d850072dSLois Curfman McInnes SNES options in the database. 23093c7409f5SSatish Balay 2310fee21e36SBarry Smith Collective on SNES 2311fee21e36SBarry Smith 2312c7afd0dbSLois Curfman McInnes Input Parameters: 2313c7afd0dbSLois Curfman McInnes + snes - the SNES context 2314c7afd0dbSLois Curfman McInnes - prefix - the prefix to prepend to all option names 2315c7afd0dbSLois Curfman McInnes 2316d850072dSLois Curfman McInnes Notes: 2317a83b1b31SSatish Balay A hyphen (-) must NOT be given at the beginning of the prefix name. 2318c7afd0dbSLois Curfman McInnes The first character of all runtime options is AUTOMATICALLY the hyphen. 2319d850072dSLois Curfman McInnes 232036851e7fSLois Curfman McInnes Level: advanced 232136851e7fSLois Curfman McInnes 23223c7409f5SSatish Balay .keywords: SNES, append, options, prefix, database 2323a86d99e1SLois Curfman McInnes 2324a86d99e1SLois Curfman McInnes .seealso: SNESGetOptionsPrefix() 23253c7409f5SSatish Balay @*/ 23263c7409f5SSatish Balay int SNESAppendOptionsPrefix(SNES snes,char *prefix) 23273c7409f5SSatish Balay { 23283c7409f5SSatish Balay int ierr; 23293c7409f5SSatish Balay 23303a40ed3dSBarry Smith PetscFunctionBegin; 233177c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2332639f9d9dSBarry Smith ierr = PetscObjectAppendOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr); 23333c7409f5SSatish Balay ierr = SLESAppendOptionsPrefix(snes->sles,prefix);CHKERRQ(ierr); 23343a40ed3dSBarry Smith PetscFunctionReturn(0); 23353c7409f5SSatish Balay } 23363c7409f5SSatish Balay 23374a2ae208SSatish Balay #undef __FUNCT__ 23384a2ae208SSatish Balay #define __FUNCT__ "SNESGetOptionsPrefix" 23399ab63eb5SSatish Balay /*@C 23403c7409f5SSatish Balay SNESGetOptionsPrefix - Sets the prefix used for searching for all 23413c7409f5SSatish Balay SNES options in the database. 23423c7409f5SSatish Balay 2343c7afd0dbSLois Curfman McInnes Not Collective 2344c7afd0dbSLois Curfman McInnes 23453c7409f5SSatish Balay Input Parameter: 23463c7409f5SSatish Balay . snes - the SNES context 23473c7409f5SSatish Balay 23483c7409f5SSatish Balay Output Parameter: 23493c7409f5SSatish Balay . prefix - pointer to the prefix string used 23503c7409f5SSatish Balay 23519ab63eb5SSatish Balay Notes: On the fortran side, the user should pass in a string 'prifix' of 23529ab63eb5SSatish Balay sufficient length to hold the prefix. 23539ab63eb5SSatish Balay 235436851e7fSLois Curfman McInnes Level: advanced 235536851e7fSLois Curfman McInnes 23563c7409f5SSatish Balay .keywords: SNES, get, options, prefix, database 2357a86d99e1SLois Curfman McInnes 2358a86d99e1SLois Curfman McInnes .seealso: SNESAppendOptionsPrefix() 23593c7409f5SSatish Balay @*/ 23603c7409f5SSatish Balay int SNESGetOptionsPrefix(SNES snes,char **prefix) 23613c7409f5SSatish Balay { 23623c7409f5SSatish Balay int ierr; 23633c7409f5SSatish Balay 23643a40ed3dSBarry Smith PetscFunctionBegin; 236577c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2366639f9d9dSBarry Smith ierr = PetscObjectGetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr); 23673a40ed3dSBarry Smith PetscFunctionReturn(0); 23683c7409f5SSatish Balay } 23693c7409f5SSatish Balay 2370acb85ae6SSatish Balay /*MC 2371f1af5d2fSBarry Smith SNESRegisterDynamic - Adds a method to the nonlinear solver package. 23729b94acceSBarry Smith 2373b2002411SLois Curfman McInnes Synopsis: 2374*3a7fca6bSBarry Smith int SNESRegisterDynamic(char *name_solver,char *path,char *name_create,int (*routine_create)(SNES)) 23759b94acceSBarry Smith 23768d76a1e5SLois Curfman McInnes Not collective 23778d76a1e5SLois Curfman McInnes 2378b2002411SLois Curfman McInnes Input Parameters: 2379c7afd0dbSLois Curfman McInnes + name_solver - name of a new user-defined solver 2380b2002411SLois Curfman McInnes . path - path (either absolute or relative) the library containing this solver 2381b2002411SLois Curfman McInnes . name_create - name of routine to create method context 2382c7afd0dbSLois Curfman McInnes - routine_create - routine to create method context 23839b94acceSBarry Smith 2384b2002411SLois Curfman McInnes Notes: 2385f1af5d2fSBarry Smith SNESRegisterDynamic() may be called multiple times to add several user-defined solvers. 23863a40ed3dSBarry Smith 2387b2002411SLois Curfman McInnes If dynamic libraries are used, then the fourth input argument (routine_create) 2388b2002411SLois Curfman McInnes is ignored. 2389b2002411SLois Curfman McInnes 2390b9617806SBarry Smith Environmental variables such as ${PETSC_ARCH}, ${PETSC_DIR}, ${PETSC_LIB_DIR}, ${BOPT}, 23915ba88a07SLois Curfman McInnes and others of the form ${any_environmental_variable} occuring in pathname will be 23925ba88a07SLois Curfman McInnes replaced with appropriate values. 23935ba88a07SLois Curfman McInnes 2394b2002411SLois Curfman McInnes Sample usage: 239569225d78SLois Curfman McInnes .vb 2396f1af5d2fSBarry Smith SNESRegisterDynamic("my_solver",/home/username/my_lib/lib/libg/solaris/mylib.a, 2397b2002411SLois Curfman McInnes "MySolverCreate",MySolverCreate); 239869225d78SLois Curfman McInnes .ve 2399b2002411SLois Curfman McInnes 2400b2002411SLois Curfman McInnes Then, your solver can be chosen with the procedural interface via 2401b2002411SLois Curfman McInnes $ SNESSetType(snes,"my_solver") 2402b2002411SLois Curfman McInnes or at runtime via the option 2403b2002411SLois Curfman McInnes $ -snes_type my_solver 2404b2002411SLois Curfman McInnes 240536851e7fSLois Curfman McInnes Level: advanced 240636851e7fSLois Curfman McInnes 2407b2002411SLois Curfman McInnes .keywords: SNES, nonlinear, register 2408b2002411SLois Curfman McInnes 2409b2002411SLois Curfman McInnes .seealso: SNESRegisterAll(), SNESRegisterDestroy() 2410b2002411SLois Curfman McInnes M*/ 2411b2002411SLois Curfman McInnes 24124a2ae208SSatish Balay #undef __FUNCT__ 24134a2ae208SSatish Balay #define __FUNCT__ "SNESRegister" 2414f1af5d2fSBarry Smith int SNESRegister(char *sname,char *path,char *name,int (*function)(SNES)) 2415b2002411SLois Curfman McInnes { 2416b2002411SLois Curfman McInnes char fullname[256]; 2417b2002411SLois Curfman McInnes int ierr; 2418b2002411SLois Curfman McInnes 2419b2002411SLois Curfman McInnes PetscFunctionBegin; 2420b0a32e0cSBarry Smith ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr); 2421b9617806SBarry Smith ierr = PetscFListAdd(&SNESList,sname,fullname,(void (*)())function);CHKERRQ(ierr); 2422b2002411SLois Curfman McInnes PetscFunctionReturn(0); 2423b2002411SLois Curfman McInnes } 2424