1*77d8c4bbSBarry Smith /*$Id: snes.c,v 1.234 2001/08/07 03:04:08 balay 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__ 9a09944afSBarry Smith #define __FUNCT__ "SNESGetProblemType" 10a09944afSBarry Smith /*@C 11a09944afSBarry Smith SNESGetProblemType -Indicates if SNES is solving a nonlinear system or a minimization 12a09944afSBarry Smith 13a09944afSBarry Smith Not Collective 14a09944afSBarry Smith 15a09944afSBarry Smith Input Parameter: 16a09944afSBarry Smith . SNES - the SNES context 17a09944afSBarry Smith 18a09944afSBarry Smith Output Parameter: 19a09944afSBarry Smith . type - SNES_NONLINEAR_EQUATIONS (for systems of nonlinear equations) 20a09944afSBarry Smith or SNES_UNCONSTRAINED_MINIMIZATION (for unconstrained minimization) 21a09944afSBarry Smith 22a09944afSBarry Smith Level: intermediate 23a09944afSBarry Smith 24a09944afSBarry Smith .keywords: SNES, problem type 25a09944afSBarry Smith 26a09944afSBarry Smith .seealso: SNESCreate() 27a09944afSBarry Smith @*/ 28a09944afSBarry Smith int SNESGetProblemType(SNES snes,SNESProblemType *type) 29a09944afSBarry Smith { 30a09944afSBarry Smith PetscFunctionBegin; 31a09944afSBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 32a09944afSBarry Smith *type = snes->method_class; 33a09944afSBarry Smith PetscFunctionReturn(0); 34a09944afSBarry Smith } 35a09944afSBarry Smith 36a09944afSBarry Smith #undef __FUNCT__ 374a2ae208SSatish Balay #define __FUNCT__ "SNESView" 387e2c5f70SBarry Smith /*@C 399b94acceSBarry Smith SNESView - Prints the SNES data structure. 409b94acceSBarry Smith 414c49b128SBarry Smith Collective on SNES 42fee21e36SBarry Smith 43c7afd0dbSLois Curfman McInnes Input Parameters: 44c7afd0dbSLois Curfman McInnes + SNES - the SNES context 45c7afd0dbSLois Curfman McInnes - viewer - visualization context 46c7afd0dbSLois Curfman McInnes 479b94acceSBarry Smith Options Database Key: 48c8a8ba5cSLois Curfman McInnes . -snes_view - Calls SNESView() at end of SNESSolve() 499b94acceSBarry Smith 509b94acceSBarry Smith Notes: 519b94acceSBarry Smith The available visualization contexts include 52b0a32e0cSBarry Smith + PETSC_VIEWER_STDOUT_SELF - standard output (default) 53b0a32e0cSBarry Smith - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 54c8a8ba5cSLois Curfman McInnes output where only the first processor opens 55c8a8ba5cSLois Curfman McInnes the file. All other processors send their 56c8a8ba5cSLois Curfman McInnes data to the first processor to print. 579b94acceSBarry Smith 583e081fefSLois Curfman McInnes The user can open an alternative visualization context with 59b0a32e0cSBarry Smith PetscViewerASCIIOpen() - output to a specified file. 609b94acceSBarry Smith 6136851e7fSLois Curfman McInnes Level: beginner 6236851e7fSLois Curfman McInnes 639b94acceSBarry Smith .keywords: SNES, view 649b94acceSBarry Smith 65b0a32e0cSBarry Smith .seealso: PetscViewerASCIIOpen() 669b94acceSBarry Smith @*/ 67b0a32e0cSBarry Smith int SNESView(SNES snes,PetscViewer viewer) 689b94acceSBarry Smith { 699b94acceSBarry Smith SNES_KSP_EW_ConvCtx *kctx; 709b94acceSBarry Smith int ierr; 719b94acceSBarry Smith SLES sles; 72454a90a3SBarry Smith char *type; 736831982aSBarry Smith PetscTruth isascii,isstring; 749b94acceSBarry Smith 753a40ed3dSBarry Smith PetscFunctionBegin; 7674679c65SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 77b0a32e0cSBarry Smith if (!viewer) viewer = PETSC_VIEWER_STDOUT_(snes->comm); 78b0a32e0cSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_COOKIE); 796831982aSBarry Smith PetscCheckSameComm(snes,viewer); 8074679c65SBarry Smith 81b0a32e0cSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);CHKERRQ(ierr); 82b0a32e0cSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_STRING,&isstring);CHKERRQ(ierr); 830f5bd95cSBarry Smith if (isascii) { 843a7fca6bSBarry Smith if (snes->prefix) { 853a7fca6bSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"SNES Object:(%s)\n",snes->prefix);CHKERRQ(ierr); 863a7fca6bSBarry Smith } else { 87b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"SNES Object:\n");CHKERRQ(ierr); 883a7fca6bSBarry Smith } 89454a90a3SBarry Smith ierr = SNESGetType(snes,&type);CHKERRQ(ierr); 90454a90a3SBarry Smith if (type) { 91b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," type: %s\n",type);CHKERRQ(ierr); 92184914b5SBarry Smith } else { 93b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," type: not set yet\n");CHKERRQ(ierr); 94184914b5SBarry Smith } 950ef38995SBarry Smith if (snes->view) { 96b0a32e0cSBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 970ef38995SBarry Smith ierr = (*snes->view)(snes,viewer);CHKERRQ(ierr); 98b0a32e0cSBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 990ef38995SBarry Smith } 100b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," maximum iterations=%d, maximum function evaluations=%d\n",snes->max_its,snes->max_funcs);CHKERRQ(ierr); 101*77d8c4bbSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," tolerances: relative=%g, absolute=%g, solution=%g\n", 102*77d8c4bbSBarry Smith snes->rtol,snes->atol,snes->xtol);CHKERRQ(ierr); 103b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," total number of linear solver iterations=%d\n",snes->linear_its);CHKERRQ(ierr); 104b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," total number of function evaluations=%d\n",snes->nfuncs);CHKERRQ(ierr); 1050ef38995SBarry Smith if (snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) { 106b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," min function tolerance=%g\n",snes->fmin);CHKERRQ(ierr); 1070ef38995SBarry Smith } 1089b94acceSBarry Smith if (snes->ksp_ewconv) { 1099b94acceSBarry Smith kctx = (SNES_KSP_EW_ConvCtx *)snes->kspconvctx; 1109b94acceSBarry Smith if (kctx) { 111b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Eisenstat-Walker computation of KSP relative tolerance (version %d)\n",kctx->version);CHKERRQ(ierr); 112b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," rtol_0=%g, rtol_max=%g, threshold=%g\n",kctx->rtol_0,kctx->rtol_max,kctx->threshold);CHKERRQ(ierr); 113b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," gamma=%g, alpha=%g, alpha2=%g\n",kctx->gamma,kctx->alpha,kctx->alpha2);CHKERRQ(ierr); 1149b94acceSBarry Smith } 1159b94acceSBarry Smith } 1160f5bd95cSBarry Smith } else if (isstring) { 117454a90a3SBarry Smith ierr = SNESGetType(snes,&type);CHKERRQ(ierr); 118b0a32e0cSBarry Smith ierr = PetscViewerStringSPrintf(viewer," %-3.3s",type);CHKERRQ(ierr); 11919bcc07fSBarry Smith } 12077ed5343SBarry Smith ierr = SNESGetSLES(snes,&sles);CHKERRQ(ierr); 121b0a32e0cSBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1229b94acceSBarry Smith ierr = SLESView(sles,viewer);CHKERRQ(ierr); 123b0a32e0cSBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1243a40ed3dSBarry Smith PetscFunctionReturn(0); 1259b94acceSBarry Smith } 1269b94acceSBarry Smith 1274a2ae208SSatish Balay #undef __FUNCT__ 1284a2ae208SSatish Balay #define __FUNCT__ "SNESSetFromOptions" 1299b94acceSBarry Smith /*@ 130682d7d0cSBarry Smith SNESSetFromOptions - Sets various SNES and SLES parameters from user options. 1319b94acceSBarry Smith 132c7afd0dbSLois Curfman McInnes Collective on SNES 133c7afd0dbSLois Curfman McInnes 1349b94acceSBarry Smith Input Parameter: 1359b94acceSBarry Smith . snes - the SNES context 1369b94acceSBarry Smith 13736851e7fSLois Curfman McInnes Options Database Keys: 1386831982aSBarry Smith + -snes_type <type> - ls, tr, umls, umtr, test 13982738288SBarry Smith . -snes_stol - convergence tolerance in terms of the norm 14082738288SBarry Smith of the change in the solution between steps 141b39c3a46SLois Curfman McInnes . -snes_atol <atol> - absolute tolerance of residual norm 142b39c3a46SLois Curfman McInnes . -snes_rtol <rtol> - relative decrease in tolerance norm from initial 143b39c3a46SLois Curfman McInnes . -snes_max_it <max_it> - maximum number of iterations 144b39c3a46SLois Curfman McInnes . -snes_max_funcs <max_funcs> - maximum number of function evaluations 145b39c3a46SLois Curfman McInnes . -snes_trtol <trtol> - trust region tolerance 14682738288SBarry Smith . -snes_no_convergence_test - skip convergence test in nonlinear or minimization 14782738288SBarry Smith solver; hence iterations will continue until max_it 1481fbbfb26SLois Curfman McInnes or some other criterion is reached. Saves expense 14982738288SBarry Smith of convergence test 15082738288SBarry Smith . -snes_monitor - prints residual norm at each iteration 151d132466eSBarry Smith . -snes_vecmonitor - plots solution at each iteration 152d132466eSBarry Smith . -snes_vecmonitor_update - plots update to solution at each iteration 15382738288SBarry Smith . -snes_xmonitor - plots residual norm at each iteration 154e24b481bSBarry Smith . -snes_fd - use finite differences to compute Jacobian; very slow, only for testing 15536851e7fSLois Curfman McInnes - -snes_mf_ksp_monitor - if using matrix-free multiply then print h at each KSP iteration 15682738288SBarry Smith 15782738288SBarry Smith Options Database for Eisenstat-Walker method: 15882738288SBarry Smith + -snes_ksp_eq_conv - use Eisenstat-Walker method for determining linear system convergence 15982738288SBarry Smith . -snes_ksp_eq_version ver - version of Eisenstat-Walker method 16036851e7fSLois Curfman McInnes . -snes_ksp_ew_rtol0 <rtol0> - Sets rtol0 16136851e7fSLois Curfman McInnes . -snes_ksp_ew_rtolmax <rtolmax> - Sets rtolmax 16236851e7fSLois Curfman McInnes . -snes_ksp_ew_gamma <gamma> - Sets gamma 16336851e7fSLois Curfman McInnes . -snes_ksp_ew_alpha <alpha> - Sets alpha 16436851e7fSLois Curfman McInnes . -snes_ksp_ew_alpha2 <alpha2> - Sets alpha2 16536851e7fSLois Curfman McInnes - -snes_ksp_ew_threshold <threshold> - Sets threshold 16682738288SBarry Smith 16711ca99fdSLois Curfman McInnes Notes: 16811ca99fdSLois Curfman McInnes To see all options, run your program with the -help option or consult 16911ca99fdSLois Curfman McInnes the users manual. 17083e2fdc7SBarry Smith 17136851e7fSLois Curfman McInnes Level: beginner 17236851e7fSLois Curfman McInnes 1739b94acceSBarry Smith .keywords: SNES, nonlinear, set, options, database 1749b94acceSBarry Smith 17569ed319cSSatish Balay .seealso: SNESSetOptionsPrefix() 1769b94acceSBarry Smith @*/ 1779b94acceSBarry Smith int SNESSetFromOptions(SNES snes) 1789b94acceSBarry Smith { 1799b94acceSBarry Smith SLES sles; 180186905e3SBarry Smith SNES_KSP_EW_ConvCtx *kctx = (SNES_KSP_EW_ConvCtx *)snes->kspconvctx; 181f1af5d2fSBarry Smith PetscTruth flg; 182186905e3SBarry Smith int ierr; 183186905e3SBarry Smith char *deft,type[256]; 1849b94acceSBarry Smith 1853a40ed3dSBarry Smith PetscFunctionBegin; 18677c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 187ca161407SBarry Smith 188b0a32e0cSBarry Smith ierr = PetscOptionsBegin(snes->comm,snes->prefix,"Nonlinear solver (SNES) options","SNES");CHKERRQ(ierr); 189186905e3SBarry Smith if (snes->type_name) { 190186905e3SBarry Smith deft = snes->type_name; 191186905e3SBarry Smith } else { 192186905e3SBarry Smith if (snes->method_class == SNES_NONLINEAR_EQUATIONS) { 193186905e3SBarry Smith deft = SNESEQLS; 194186905e3SBarry Smith } else { 195186905e3SBarry Smith deft = SNESUMTR; 196d64ed03dSBarry Smith } 197d64ed03dSBarry Smith } 1984bbc92c1SBarry Smith 199186905e3SBarry Smith if (!SNESRegisterAllCalled) {ierr = SNESRegisterAll(PETSC_NULL);CHKERRQ(ierr);} 200b0a32e0cSBarry Smith ierr = PetscOptionsList("-snes_type","Nonlinear solver method","SNESSetType",SNESList,deft,type,256,&flg);CHKERRQ(ierr); 201d64ed03dSBarry Smith if (flg) { 202186905e3SBarry Smith ierr = SNESSetType(snes,type);CHKERRQ(ierr); 203186905e3SBarry Smith } else if (!snes->type_name) { 204186905e3SBarry Smith ierr = SNESSetType(snes,deft);CHKERRQ(ierr); 205d64ed03dSBarry Smith } 20693c39befSBarry Smith 20787828ca2SBarry Smith ierr = PetscOptionsReal("-snes_stol","Stop if step length less then","SNESSetTolerances",snes->xtol,&snes->xtol,0);CHKERRQ(ierr); 20887828ca2SBarry Smith ierr = PetscOptionsReal("-snes_atol","Stop if function norm less then","SNESSetTolerances",snes->atol,&snes->atol,0);CHKERRQ(ierr); 209186905e3SBarry Smith 21087828ca2SBarry Smith ierr = PetscOptionsReal("-snes_rtol","Stop if decrease in function norm less then","SNESSetTolerances",snes->rtol,&snes->rtol,0);CHKERRQ(ierr); 211b0a32e0cSBarry Smith ierr = PetscOptionsInt("-snes_max_it","Maximum iterations","SNESSetTolerances",snes->max_its,&snes->max_its,PETSC_NULL);CHKERRQ(ierr); 212b0a32e0cSBarry Smith ierr = PetscOptionsInt("-snes_max_funcs","Maximum function evaluations","SNESSetTolerances",snes->max_funcs,&snes->max_funcs,PETSC_NULL);CHKERRQ(ierr); 21387828ca2SBarry Smith ierr = PetscOptionsReal("-snes_fmin","Minimization function tolerance","SNESSetMinimizationFunctionTolerance",snes->fmin,&snes->fmin,0);CHKERRQ(ierr); 214186905e3SBarry Smith 215b0a32e0cSBarry Smith ierr = PetscOptionsName("-snes_ksp_ew_conv","Use Eisentat-Walker linear system convergence test","SNES_KSP_SetParametersEW",&snes->ksp_ewconv);CHKERRQ(ierr); 216186905e3SBarry Smith 217b0a32e0cSBarry Smith ierr = PetscOptionsInt("-snes_ksp_ew_version","Version 1 or 2","SNES_KSP_SetParametersEW",kctx->version,&kctx->version,0);CHKERRQ(ierr); 21887828ca2SBarry Smith ierr = PetscOptionsReal("-snes_ksp_ew_rtol0","0 <= rtol0 < 1","SNES_KSP_SetParametersEW",kctx->rtol_0,&kctx->rtol_0,0);CHKERRQ(ierr); 21987828ca2SBarry Smith ierr = PetscOptionsReal("-snes_ksp_ew_rtolmax","0 <= rtolmax < 1","SNES_KSP_SetParametersEW",kctx->rtol_max,&kctx->rtol_max,0);CHKERRQ(ierr); 22087828ca2SBarry Smith ierr = PetscOptionsReal("-snes_ksp_ew_gamma","0 <= gamma <= 1","SNES_KSP_SetParametersEW",kctx->gamma,&kctx->gamma,0);CHKERRQ(ierr); 22187828ca2SBarry Smith ierr = PetscOptionsReal("-snes_ksp_ew_alpha","1 < alpha <= 2","SNES_KSP_SetParametersEW",kctx->alpha,&kctx->alpha,0);CHKERRQ(ierr); 22287828ca2SBarry Smith ierr = PetscOptionsReal("-snes_ksp_ew_alpha2","alpha2","SNES_KSP_SetParametersEW",kctx->alpha2,&kctx->alpha2,0);CHKERRQ(ierr); 22387828ca2SBarry Smith ierr = PetscOptionsReal("-snes_ksp_ew_threshold","0 < threshold < 1","SNES_KSP_SetParametersEW",kctx->threshold,&kctx->threshold,0);CHKERRQ(ierr); 224186905e3SBarry Smith 225b0a32e0cSBarry Smith ierr = PetscOptionsName("-snes_no_convergence_test","Don't test for convergence","None",&flg);CHKERRQ(ierr); 22693c39befSBarry Smith if (flg) {snes->converged = 0;} 227b0a32e0cSBarry Smith ierr = PetscOptionsName("-snes_cancelmonitors","Remove all monitors","SNESClearMonitor",&flg);CHKERRQ(ierr); 2285cd90555SBarry Smith if (flg) {ierr = SNESClearMonitor(snes);CHKERRQ(ierr);} 229b0a32e0cSBarry Smith ierr = PetscOptionsName("-snes_monitor","Monitor norm of function","SNESDefaultMonitor",&flg);CHKERRQ(ierr); 230b8a78c4aSBarry Smith if (flg) {ierr = SNESSetMonitor(snes,SNESDefaultMonitor,0,0);CHKERRQ(ierr);} 2313a7fca6bSBarry Smith ierr = PetscOptionsName("-snes_ratiomonitor","Monitor norm of function","SNESSetRatioMonitor",&flg);CHKERRQ(ierr); 2323a7fca6bSBarry Smith if (flg) {ierr = SNESSetRatioMonitor(snes);CHKERRQ(ierr);} 233b0a32e0cSBarry Smith ierr = PetscOptionsName("-snes_smonitor","Monitor norm of function (fewer digits)","SNESDefaultSMonitor",&flg);CHKERRQ(ierr); 234b8a78c4aSBarry Smith if (flg) {ierr = SNESSetMonitor(snes,SNESDefaultSMonitor,0,0);CHKERRQ(ierr);} 235b0a32e0cSBarry Smith ierr = PetscOptionsName("-snes_vecmonitor","Plot solution at each iteration","SNESVecViewMonitor",&flg);CHKERRQ(ierr); 236b8a78c4aSBarry Smith if (flg) {ierr = SNESSetMonitor(snes,SNESVecViewMonitor,0,0);CHKERRQ(ierr);} 237b0a32e0cSBarry Smith ierr = PetscOptionsName("-snes_vecmonitor_update","Plot correction at each iteration","SNESVecViewUpdateMonitor",&flg);CHKERRQ(ierr); 2387c922b88SBarry Smith if (flg) {ierr = SNESSetMonitor(snes,SNESVecViewUpdateMonitor,0,0);CHKERRQ(ierr);} 239b0a32e0cSBarry Smith ierr = PetscOptionsName("-snes_xmonitor","Plot function norm at each iteration","SNESLGMonitor",&flg);CHKERRQ(ierr); 240186905e3SBarry Smith if (flg) {ierr = SNESSetMonitor(snes,SNESLGMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);} 241e24b481bSBarry Smith 242b0a32e0cSBarry Smith ierr = PetscOptionsName("-snes_fd","Use finite differences (slow) to compute Jacobian","SNESDefaultComputeJacobian",&flg);CHKERRQ(ierr); 2433c7409f5SSatish Balay if (flg && snes->method_class == SNES_NONLINEAR_EQUATIONS) { 244186905e3SBarry Smith ierr = SNESSetJacobian(snes,snes->jacobian,snes->jacobian_pre,SNESDefaultComputeJacobian,snes->funP);CHKERRQ(ierr); 245b0a32e0cSBarry Smith PetscLogInfo(snes,"SNESSetFromOptions: Setting default finite difference Jacobian matrix\n"); 246981c4779SBarry Smith } else if (flg && snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) { 247186905e3SBarry Smith ierr = SNESSetHessian(snes,snes->jacobian,snes->jacobian_pre,SNESDefaultComputeHessian,snes->funP);CHKERRQ(ierr); 248b0a32e0cSBarry Smith PetscLogInfo(snes,"SNESSetFromOptions: Setting default finite difference Hessian matrix\n"); 2499b94acceSBarry Smith } 250639f9d9dSBarry Smith 251186905e3SBarry Smith if (snes->setfromoptions) { 252186905e3SBarry Smith ierr = (*snes->setfromoptions)(snes);CHKERRQ(ierr); 253639f9d9dSBarry Smith } 254639f9d9dSBarry Smith 255b0a32e0cSBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 2564bbc92c1SBarry Smith 2579b94acceSBarry Smith ierr = SNESGetSLES(snes,&sles);CHKERRQ(ierr); 2589b94acceSBarry Smith ierr = SLESSetFromOptions(sles);CHKERRQ(ierr); 25993993e2dSLois Curfman McInnes 2603a40ed3dSBarry Smith PetscFunctionReturn(0); 2619b94acceSBarry Smith } 2629b94acceSBarry Smith 263a847f771SSatish Balay 2644a2ae208SSatish Balay #undef __FUNCT__ 2654a2ae208SSatish Balay #define __FUNCT__ "SNESSetApplicationContext" 2669b94acceSBarry Smith /*@ 2679b94acceSBarry Smith SNESSetApplicationContext - Sets the optional user-defined context for 2689b94acceSBarry Smith the nonlinear solvers. 2699b94acceSBarry Smith 270fee21e36SBarry Smith Collective on SNES 271fee21e36SBarry Smith 272c7afd0dbSLois Curfman McInnes Input Parameters: 273c7afd0dbSLois Curfman McInnes + snes - the SNES context 274c7afd0dbSLois Curfman McInnes - usrP - optional user context 275c7afd0dbSLois Curfman McInnes 27636851e7fSLois Curfman McInnes Level: intermediate 27736851e7fSLois Curfman McInnes 2789b94acceSBarry Smith .keywords: SNES, nonlinear, set, application, context 2799b94acceSBarry Smith 2809b94acceSBarry Smith .seealso: SNESGetApplicationContext() 2819b94acceSBarry Smith @*/ 2829b94acceSBarry Smith int SNESSetApplicationContext(SNES snes,void *usrP) 2839b94acceSBarry Smith { 2843a40ed3dSBarry Smith PetscFunctionBegin; 28577c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2869b94acceSBarry Smith snes->user = usrP; 2873a40ed3dSBarry Smith PetscFunctionReturn(0); 2889b94acceSBarry Smith } 28974679c65SBarry Smith 2904a2ae208SSatish Balay #undef __FUNCT__ 2914a2ae208SSatish Balay #define __FUNCT__ "SNESGetApplicationContext" 2929b94acceSBarry Smith /*@C 2939b94acceSBarry Smith SNESGetApplicationContext - Gets the user-defined context for the 2949b94acceSBarry Smith nonlinear solvers. 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 . usrP - user context 3039b94acceSBarry Smith 30436851e7fSLois Curfman McInnes Level: intermediate 30536851e7fSLois Curfman McInnes 3069b94acceSBarry Smith .keywords: SNES, nonlinear, get, application, context 3079b94acceSBarry Smith 3089b94acceSBarry Smith .seealso: SNESSetApplicationContext() 3099b94acceSBarry Smith @*/ 3109b94acceSBarry Smith int SNESGetApplicationContext(SNES snes,void **usrP) 3119b94acceSBarry Smith { 3123a40ed3dSBarry Smith PetscFunctionBegin; 31377c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 3149b94acceSBarry Smith *usrP = snes->user; 3153a40ed3dSBarry Smith PetscFunctionReturn(0); 3169b94acceSBarry Smith } 31774679c65SBarry Smith 3184a2ae208SSatish Balay #undef __FUNCT__ 3194a2ae208SSatish Balay #define __FUNCT__ "SNESGetIterationNumber" 3209b94acceSBarry Smith /*@ 321c8228a4eSBarry Smith SNESGetIterationNumber - Gets the number of nonlinear iterations completed 322c8228a4eSBarry Smith at this time. 3239b94acceSBarry Smith 324c7afd0dbSLois Curfman McInnes Not Collective 325c7afd0dbSLois Curfman McInnes 3269b94acceSBarry Smith Input Parameter: 3279b94acceSBarry Smith . snes - SNES context 3289b94acceSBarry Smith 3299b94acceSBarry Smith Output Parameter: 3309b94acceSBarry Smith . iter - iteration number 3319b94acceSBarry Smith 332c8228a4eSBarry Smith Notes: 333c8228a4eSBarry Smith For example, during the computation of iteration 2 this would return 1. 334c8228a4eSBarry Smith 335c8228a4eSBarry Smith This is useful for using lagged Jacobians (where one does not recompute the 33608405cd6SLois Curfman McInnes Jacobian at each SNES iteration). For example, the code 33708405cd6SLois Curfman McInnes .vb 33808405cd6SLois Curfman McInnes ierr = SNESGetIterationNumber(snes,&it); 33908405cd6SLois Curfman McInnes if (!(it % 2)) { 34008405cd6SLois Curfman McInnes [compute Jacobian here] 34108405cd6SLois Curfman McInnes } 34208405cd6SLois Curfman McInnes .ve 343c8228a4eSBarry Smith can be used in your ComputeJacobian() function to cause the Jacobian to be 34408405cd6SLois Curfman McInnes recomputed every second SNES iteration. 345c8228a4eSBarry Smith 34636851e7fSLois Curfman McInnes Level: intermediate 34736851e7fSLois Curfman McInnes 3489b94acceSBarry Smith .keywords: SNES, nonlinear, get, iteration, number 3499b94acceSBarry Smith @*/ 3509b94acceSBarry Smith int SNESGetIterationNumber(SNES snes,int* iter) 3519b94acceSBarry Smith { 3523a40ed3dSBarry Smith PetscFunctionBegin; 35377c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 35474679c65SBarry Smith PetscValidIntPointer(iter); 3559b94acceSBarry Smith *iter = snes->iter; 3563a40ed3dSBarry Smith PetscFunctionReturn(0); 3579b94acceSBarry Smith } 35874679c65SBarry Smith 3594a2ae208SSatish Balay #undef __FUNCT__ 3604a2ae208SSatish Balay #define __FUNCT__ "SNESGetFunctionNorm" 3619b94acceSBarry Smith /*@ 3629b94acceSBarry Smith SNESGetFunctionNorm - Gets the norm of the current function that was set 3639b94acceSBarry Smith with SNESSSetFunction(). 3649b94acceSBarry Smith 365c7afd0dbSLois Curfman McInnes Collective on SNES 366c7afd0dbSLois Curfman McInnes 3679b94acceSBarry Smith Input Parameter: 3689b94acceSBarry Smith . snes - SNES context 3699b94acceSBarry Smith 3709b94acceSBarry Smith Output Parameter: 3719b94acceSBarry Smith . fnorm - 2-norm of function 3729b94acceSBarry Smith 3739b94acceSBarry Smith Note: 3749b94acceSBarry Smith SNESGetFunctionNorm() is valid for SNES_NONLINEAR_EQUATIONS methods only. 375a86d99e1SLois Curfman McInnes A related routine for SNES_UNCONSTRAINED_MINIMIZATION methods is 376a86d99e1SLois Curfman McInnes SNESGetGradientNorm(). 3779b94acceSBarry Smith 37836851e7fSLois Curfman McInnes Level: intermediate 37936851e7fSLois Curfman McInnes 3809b94acceSBarry Smith .keywords: SNES, nonlinear, get, function, norm 381a86d99e1SLois Curfman McInnes 38208405cd6SLois Curfman McInnes .seealso: SNESGetFunction() 3839b94acceSBarry Smith @*/ 38487828ca2SBarry Smith int SNESGetFunctionNorm(SNES snes,PetscScalar *fnorm) 3859b94acceSBarry Smith { 3863a40ed3dSBarry Smith PetscFunctionBegin; 38777c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 38874679c65SBarry Smith PetscValidScalarPointer(fnorm); 38974679c65SBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 39029bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"For SNES_NONLINEAR_EQUATIONS only"); 39174679c65SBarry Smith } 3929b94acceSBarry Smith *fnorm = snes->norm; 3933a40ed3dSBarry Smith PetscFunctionReturn(0); 3949b94acceSBarry Smith } 39574679c65SBarry Smith 3964a2ae208SSatish Balay #undef __FUNCT__ 3974a2ae208SSatish Balay #define __FUNCT__ "SNESGetGradientNorm" 3989b94acceSBarry Smith /*@ 3999b94acceSBarry Smith SNESGetGradientNorm - Gets the norm of the current gradient that was set 4009b94acceSBarry Smith with SNESSSetGradient(). 4019b94acceSBarry Smith 402c7afd0dbSLois Curfman McInnes Collective on SNES 403c7afd0dbSLois Curfman McInnes 4049b94acceSBarry Smith Input Parameter: 4059b94acceSBarry Smith . snes - SNES context 4069b94acceSBarry Smith 4079b94acceSBarry Smith Output Parameter: 4089b94acceSBarry Smith . fnorm - 2-norm of gradient 4099b94acceSBarry Smith 4109b94acceSBarry Smith Note: 4119b94acceSBarry Smith SNESGetGradientNorm() is valid for SNES_UNCONSTRAINED_MINIMIZATION 412a86d99e1SLois Curfman McInnes methods only. A related routine for SNES_NONLINEAR_EQUATIONS methods 413a86d99e1SLois Curfman McInnes is SNESGetFunctionNorm(). 4149b94acceSBarry Smith 41536851e7fSLois Curfman McInnes Level: intermediate 41636851e7fSLois Curfman McInnes 4179b94acceSBarry Smith .keywords: SNES, nonlinear, get, gradient, norm 418a86d99e1SLois Curfman McInnes 419a86d99e1SLois Curfman McInnes .seelso: SNESSetGradient() 4209b94acceSBarry Smith @*/ 42187828ca2SBarry Smith int SNESGetGradientNorm(SNES snes,PetscScalar *gnorm) 4229b94acceSBarry Smith { 4233a40ed3dSBarry Smith PetscFunctionBegin; 42477c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 42574679c65SBarry Smith PetscValidScalarPointer(gnorm); 42674679c65SBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 42729bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 42874679c65SBarry Smith } 4299b94acceSBarry Smith *gnorm = snes->norm; 4303a40ed3dSBarry Smith PetscFunctionReturn(0); 4319b94acceSBarry Smith } 43274679c65SBarry Smith 4334a2ae208SSatish Balay #undef __FUNCT__ 4344a2ae208SSatish Balay #define __FUNCT__ "SNESGetNumberUnsuccessfulSteps" 4359b94acceSBarry Smith /*@ 4369b94acceSBarry Smith SNESGetNumberUnsuccessfulSteps - Gets the number of unsuccessful steps 4379b94acceSBarry Smith attempted by the nonlinear solver. 4389b94acceSBarry Smith 439c7afd0dbSLois Curfman McInnes Not Collective 440c7afd0dbSLois Curfman McInnes 4419b94acceSBarry Smith Input Parameter: 4429b94acceSBarry Smith . snes - SNES context 4439b94acceSBarry Smith 4449b94acceSBarry Smith Output Parameter: 4459b94acceSBarry Smith . nfails - number of unsuccessful steps attempted 4469b94acceSBarry Smith 447c96a6f78SLois Curfman McInnes Notes: 448c96a6f78SLois Curfman McInnes This counter is reset to zero for each successive call to SNESSolve(). 449c96a6f78SLois Curfman McInnes 45036851e7fSLois Curfman McInnes Level: intermediate 45136851e7fSLois Curfman McInnes 4529b94acceSBarry Smith .keywords: SNES, nonlinear, get, number, unsuccessful, steps 4539b94acceSBarry Smith @*/ 4549b94acceSBarry Smith int SNESGetNumberUnsuccessfulSteps(SNES snes,int* nfails) 4559b94acceSBarry Smith { 4563a40ed3dSBarry Smith PetscFunctionBegin; 45777c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 45874679c65SBarry Smith PetscValidIntPointer(nfails); 4599b94acceSBarry Smith *nfails = snes->nfailures; 4603a40ed3dSBarry Smith PetscFunctionReturn(0); 4619b94acceSBarry Smith } 462a847f771SSatish Balay 4634a2ae208SSatish Balay #undef __FUNCT__ 4644a2ae208SSatish Balay #define __FUNCT__ "SNESGetNumberLinearIterations" 465c96a6f78SLois Curfman McInnes /*@ 466c96a6f78SLois Curfman McInnes SNESGetNumberLinearIterations - Gets the total number of linear iterations 467c96a6f78SLois Curfman McInnes used by the nonlinear solver. 468c96a6f78SLois Curfman McInnes 469c7afd0dbSLois Curfman McInnes Not Collective 470c7afd0dbSLois Curfman McInnes 471c96a6f78SLois Curfman McInnes Input Parameter: 472c96a6f78SLois Curfman McInnes . snes - SNES context 473c96a6f78SLois Curfman McInnes 474c96a6f78SLois Curfman McInnes Output Parameter: 475c96a6f78SLois Curfman McInnes . lits - number of linear iterations 476c96a6f78SLois Curfman McInnes 477c96a6f78SLois Curfman McInnes Notes: 478c96a6f78SLois Curfman McInnes This counter is reset to zero for each successive call to SNESSolve(). 479c96a6f78SLois Curfman McInnes 48036851e7fSLois Curfman McInnes Level: intermediate 48136851e7fSLois Curfman McInnes 482c96a6f78SLois Curfman McInnes .keywords: SNES, nonlinear, get, number, linear, iterations 483c96a6f78SLois Curfman McInnes @*/ 48486bddb7dSBarry Smith int SNESGetNumberLinearIterations(SNES snes,int* lits) 485c96a6f78SLois Curfman McInnes { 4863a40ed3dSBarry Smith PetscFunctionBegin; 487c96a6f78SLois Curfman McInnes PetscValidHeaderSpecific(snes,SNES_COOKIE); 488c96a6f78SLois Curfman McInnes PetscValidIntPointer(lits); 489c96a6f78SLois Curfman McInnes *lits = snes->linear_its; 4903a40ed3dSBarry Smith PetscFunctionReturn(0); 491c96a6f78SLois Curfman McInnes } 492c96a6f78SLois Curfman McInnes 4934a2ae208SSatish Balay #undef __FUNCT__ 4944a2ae208SSatish Balay #define __FUNCT__ "SNESGetSLES" 4959b94acceSBarry Smith /*@C 4969b94acceSBarry Smith SNESGetSLES - Returns the SLES context for a SNES solver. 4979b94acceSBarry Smith 498c7afd0dbSLois Curfman McInnes Not Collective, but if SNES object is parallel, then SLES object is parallel 499c7afd0dbSLois Curfman McInnes 5009b94acceSBarry Smith Input Parameter: 5019b94acceSBarry Smith . snes - the SNES context 5029b94acceSBarry Smith 5039b94acceSBarry Smith Output Parameter: 5049b94acceSBarry Smith . sles - the SLES context 5059b94acceSBarry Smith 5069b94acceSBarry Smith Notes: 5079b94acceSBarry Smith The user can then directly manipulate the SLES context to set various 5089b94acceSBarry Smith options, etc. Likewise, the user can then extract and manipulate the 5099b94acceSBarry Smith KSP and PC contexts as well. 5109b94acceSBarry Smith 51136851e7fSLois Curfman McInnes Level: beginner 51236851e7fSLois Curfman McInnes 5139b94acceSBarry Smith .keywords: SNES, nonlinear, get, SLES, context 5149b94acceSBarry Smith 5159b94acceSBarry Smith .seealso: SLESGetPC(), SLESGetKSP() 5169b94acceSBarry Smith @*/ 5179b94acceSBarry Smith int SNESGetSLES(SNES snes,SLES *sles) 5189b94acceSBarry Smith { 5193a40ed3dSBarry Smith PetscFunctionBegin; 52077c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 5219b94acceSBarry Smith *sles = snes->sles; 5223a40ed3dSBarry Smith PetscFunctionReturn(0); 5239b94acceSBarry Smith } 52482bf6240SBarry Smith 5254a2ae208SSatish Balay #undef __FUNCT__ 5264a2ae208SSatish Balay #define __FUNCT__ "SNESPublish_Petsc" 527454a90a3SBarry Smith static int SNESPublish_Petsc(PetscObject obj) 528e24b481bSBarry Smith { 529aa482453SBarry Smith #if defined(PETSC_HAVE_AMS) 530454a90a3SBarry Smith SNES v = (SNES) obj; 531e24b481bSBarry Smith int ierr; 53243d6d2cbSBarry Smith #endif 533e24b481bSBarry Smith 534e24b481bSBarry Smith PetscFunctionBegin; 535e24b481bSBarry Smith 53643d6d2cbSBarry Smith #if defined(PETSC_HAVE_AMS) 537e24b481bSBarry Smith /* if it is already published then return */ 538e24b481bSBarry Smith if (v->amem >=0) PetscFunctionReturn(0); 539e24b481bSBarry Smith 540454a90a3SBarry Smith ierr = PetscObjectPublishBaseBegin(obj);CHKERRQ(ierr); 541e24b481bSBarry Smith ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Iteration",&v->iter,1,AMS_INT,AMS_READ, 542e24b481bSBarry Smith AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 543e24b481bSBarry Smith ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Residual",&v->norm,1,AMS_DOUBLE,AMS_READ, 544e24b481bSBarry Smith AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 545454a90a3SBarry Smith ierr = PetscObjectPublishBaseEnd(obj);CHKERRQ(ierr); 546433994e6SBarry Smith #endif 547e24b481bSBarry Smith PetscFunctionReturn(0); 548e24b481bSBarry Smith } 549e24b481bSBarry Smith 5509b94acceSBarry Smith /* -----------------------------------------------------------*/ 5514a2ae208SSatish Balay #undef __FUNCT__ 5524a2ae208SSatish Balay #define __FUNCT__ "SNESCreate" 5539b94acceSBarry Smith /*@C 5549b94acceSBarry Smith SNESCreate - Creates a nonlinear solver context. 5559b94acceSBarry Smith 556c7afd0dbSLois Curfman McInnes Collective on MPI_Comm 557c7afd0dbSLois Curfman McInnes 558c7afd0dbSLois Curfman McInnes Input Parameters: 559c7afd0dbSLois Curfman McInnes + comm - MPI communicator 560c7afd0dbSLois Curfman McInnes - type - type of method, either 561c7afd0dbSLois Curfman McInnes SNES_NONLINEAR_EQUATIONS (for systems of nonlinear equations) 562c7afd0dbSLois Curfman McInnes or SNES_UNCONSTRAINED_MINIMIZATION (for unconstrained minimization) 5639b94acceSBarry Smith 5649b94acceSBarry Smith Output Parameter: 5659b94acceSBarry Smith . outsnes - the new SNES context 5669b94acceSBarry Smith 567c7afd0dbSLois Curfman McInnes Options Database Keys: 568c7afd0dbSLois Curfman McInnes + -snes_mf - Activates default matrix-free Jacobian-vector products, 569c7afd0dbSLois Curfman McInnes and no preconditioning matrix 570c7afd0dbSLois Curfman McInnes . -snes_mf_operator - Activates default matrix-free Jacobian-vector 571c7afd0dbSLois Curfman McInnes products, and a user-provided preconditioning matrix 572c7afd0dbSLois Curfman McInnes as set by SNESSetJacobian() 573c7afd0dbSLois Curfman McInnes - -snes_fd - Uses (slow!) finite differences to compute Jacobian 574c1f60f51SBarry Smith 57536851e7fSLois Curfman McInnes Level: beginner 57636851e7fSLois Curfman McInnes 5779b94acceSBarry Smith .keywords: SNES, nonlinear, create, context 5789b94acceSBarry Smith 579435da068SBarry Smith .seealso: SNESSolve(), SNESDestroy(), SNESProblemType, SNES 5809b94acceSBarry Smith @*/ 5814b0e389bSBarry Smith int SNESCreate(MPI_Comm comm,SNESProblemType type,SNES *outsnes) 5829b94acceSBarry Smith { 5839b94acceSBarry Smith int ierr; 5849b94acceSBarry Smith SNES snes; 5859b94acceSBarry Smith SNES_KSP_EW_ConvCtx *kctx; 58637fcc0dbSBarry Smith 5873a40ed3dSBarry Smith PetscFunctionBegin; 5889b94acceSBarry Smith *outsnes = 0; 589d64ed03dSBarry Smith if (type != SNES_UNCONSTRAINED_MINIMIZATION && type != SNES_NONLINEAR_EQUATIONS){ 59029bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"incorrect method type"); 591d64ed03dSBarry Smith } 5923f1db9ecSBarry Smith PetscHeaderCreate(snes,_p_SNES,int,SNES_COOKIE,0,"SNES",comm,SNESDestroy,SNESView); 593b0a32e0cSBarry Smith PetscLogObjectCreate(snes); 594e24b481bSBarry Smith snes->bops->publish = SNESPublish_Petsc; 5959b94acceSBarry Smith snes->max_its = 50; 5969750a799SBarry Smith snes->max_funcs = 10000; 5979b94acceSBarry Smith snes->norm = 0.0; 5985a2d0531SBarry Smith if (type == SNES_UNCONSTRAINED_MINIMIZATION) { 599b18e04deSLois Curfman McInnes snes->rtol = 1.e-8; 600b18e04deSLois Curfman McInnes snes->ttol = 0.0; 6019b94acceSBarry Smith snes->atol = 1.e-10; 602d64ed03dSBarry Smith } else { 603b4874afaSBarry Smith snes->rtol = 1.e-8; 604b4874afaSBarry Smith snes->ttol = 0.0; 605b4874afaSBarry Smith snes->atol = 1.e-50; 606b4874afaSBarry Smith } 6079b94acceSBarry Smith snes->xtol = 1.e-8; 6089b94acceSBarry Smith snes->nfuncs = 0; 6099b94acceSBarry Smith snes->nfailures = 0; 6107a00f4a9SLois Curfman McInnes snes->linear_its = 0; 611639f9d9dSBarry Smith snes->numbermonitors = 0; 6129b94acceSBarry Smith snes->data = 0; 6139b94acceSBarry Smith snes->view = 0; 6149b94acceSBarry Smith snes->computeumfunction = 0; 6159b94acceSBarry Smith snes->umfunP = 0; 6169b94acceSBarry Smith snes->fc = 0; 6179b94acceSBarry Smith snes->deltatol = 1.e-12; 6189b94acceSBarry Smith snes->fmin = -1.e30; 6199b94acceSBarry Smith snes->method_class = type; 6209b94acceSBarry Smith snes->set_method_called = 0; 62182bf6240SBarry Smith snes->setupcalled = 0; 622186905e3SBarry Smith snes->ksp_ewconv = PETSC_FALSE; 6236f24a144SLois Curfman McInnes snes->vwork = 0; 6246f24a144SLois Curfman McInnes snes->nwork = 0; 625758f92a0SBarry Smith snes->conv_hist_len = 0; 626758f92a0SBarry Smith snes->conv_hist_max = 0; 627758f92a0SBarry Smith snes->conv_hist = PETSC_NULL; 628758f92a0SBarry Smith snes->conv_hist_its = PETSC_NULL; 629758f92a0SBarry Smith snes->conv_hist_reset = PETSC_TRUE; 630184914b5SBarry Smith snes->reason = SNES_CONVERGED_ITERATING; 6319b94acceSBarry Smith 6329b94acceSBarry Smith /* Create context to compute Eisenstat-Walker relative tolerance for KSP */ 633b0a32e0cSBarry Smith ierr = PetscNew(SNES_KSP_EW_ConvCtx,&kctx);CHKERRQ(ierr); 634b0a32e0cSBarry Smith PetscLogObjectMemory(snes,sizeof(SNES_KSP_EW_ConvCtx)); 6359b94acceSBarry Smith snes->kspconvctx = (void*)kctx; 6369b94acceSBarry Smith kctx->version = 2; 6379b94acceSBarry Smith kctx->rtol_0 = .3; /* Eisenstat and Walker suggest rtol_0=.5, but 6389b94acceSBarry Smith this was too large for some test cases */ 6399b94acceSBarry Smith kctx->rtol_last = 0; 6409b94acceSBarry Smith kctx->rtol_max = .9; 6419b94acceSBarry Smith kctx->gamma = 1.0; 6429b94acceSBarry Smith kctx->alpha2 = .5*(1.0 + sqrt(5.0)); 6439b94acceSBarry Smith kctx->alpha = kctx->alpha2; 6449b94acceSBarry Smith kctx->threshold = .1; 6459b94acceSBarry Smith kctx->lresid_last = 0; 6469b94acceSBarry Smith kctx->norm_last = 0; 6479b94acceSBarry Smith 6489b94acceSBarry Smith ierr = SLESCreate(comm,&snes->sles);CHKERRQ(ierr); 649b0a32e0cSBarry Smith PetscLogObjectParent(snes,snes->sles) 6505334005bSBarry Smith 6519b94acceSBarry Smith *outsnes = snes; 65200036973SBarry Smith ierr = PetscPublishAll(snes);CHKERRQ(ierr); 6533a40ed3dSBarry Smith PetscFunctionReturn(0); 6549b94acceSBarry Smith } 6559b94acceSBarry Smith 6569b94acceSBarry Smith /* --------------------------------------------------------------- */ 6574a2ae208SSatish Balay #undef __FUNCT__ 6584a2ae208SSatish Balay #define __FUNCT__ "SNESSetFunction" 6599b94acceSBarry Smith /*@C 6609b94acceSBarry Smith SNESSetFunction - Sets the function evaluation routine and function 6619b94acceSBarry Smith vector for use by the SNES routines in solving systems of nonlinear 6629b94acceSBarry Smith equations. 6639b94acceSBarry Smith 664fee21e36SBarry Smith Collective on SNES 665fee21e36SBarry Smith 666c7afd0dbSLois Curfman McInnes Input Parameters: 667c7afd0dbSLois Curfman McInnes + snes - the SNES context 668c7afd0dbSLois Curfman McInnes . func - function evaluation routine 669c7afd0dbSLois Curfman McInnes . r - vector to store function value 670c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined context for private data for the 671c7afd0dbSLois Curfman McInnes function evaluation routine (may be PETSC_NULL) 6729b94acceSBarry Smith 673c7afd0dbSLois Curfman McInnes Calling sequence of func: 6748d76a1e5SLois Curfman McInnes $ func (SNES snes,Vec x,Vec f,void *ctx); 675c7afd0dbSLois Curfman McInnes 676313e4042SLois Curfman McInnes . f - function vector 677c7afd0dbSLois Curfman McInnes - ctx - optional user-defined function context 6789b94acceSBarry Smith 6799b94acceSBarry Smith Notes: 6809b94acceSBarry Smith The Newton-like methods typically solve linear systems of the form 6819b94acceSBarry Smith $ f'(x) x = -f(x), 682c7afd0dbSLois Curfman McInnes where f'(x) denotes the Jacobian matrix and f(x) is the function. 6839b94acceSBarry Smith 6849b94acceSBarry Smith SNESSetFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only. 6859b94acceSBarry Smith Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are 6869b94acceSBarry Smith SNESSetMinimizationFunction() and SNESSetGradient(); 6879b94acceSBarry Smith 68836851e7fSLois Curfman McInnes Level: beginner 68936851e7fSLois Curfman McInnes 6909b94acceSBarry Smith .keywords: SNES, nonlinear, set, function 6919b94acceSBarry Smith 692a86d99e1SLois Curfman McInnes .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian() 6939b94acceSBarry Smith @*/ 6945334005bSBarry Smith int SNESSetFunction(SNES snes,Vec r,int (*func)(SNES,Vec,Vec,void*),void *ctx) 6959b94acceSBarry Smith { 6963a40ed3dSBarry Smith PetscFunctionBegin; 69777c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 698184914b5SBarry Smith PetscValidHeaderSpecific(r,VEC_COOKIE); 699184914b5SBarry Smith PetscCheckSameComm(snes,r); 700a8c6a408SBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 70129bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only"); 702a8c6a408SBarry Smith } 703184914b5SBarry Smith 7049b94acceSBarry Smith snes->computefunction = func; 7059b94acceSBarry Smith snes->vec_func = snes->vec_func_always = r; 7069b94acceSBarry Smith snes->funP = ctx; 7073a40ed3dSBarry Smith PetscFunctionReturn(0); 7089b94acceSBarry Smith } 7099b94acceSBarry Smith 7104a2ae208SSatish Balay #undef __FUNCT__ 7114a2ae208SSatish Balay #define __FUNCT__ "SNESComputeFunction" 7129b94acceSBarry Smith /*@ 71336851e7fSLois Curfman McInnes SNESComputeFunction - Calls the function that has been set with 7149b94acceSBarry Smith SNESSetFunction(). 7159b94acceSBarry Smith 716c7afd0dbSLois Curfman McInnes Collective on SNES 717c7afd0dbSLois Curfman McInnes 7189b94acceSBarry Smith Input Parameters: 719c7afd0dbSLois Curfman McInnes + snes - the SNES context 720c7afd0dbSLois Curfman McInnes - x - input vector 7219b94acceSBarry Smith 7229b94acceSBarry Smith Output Parameter: 7233638b69dSLois Curfman McInnes . y - function vector, as set by SNESSetFunction() 7249b94acceSBarry Smith 7251bffabb2SLois Curfman McInnes Notes: 7269b94acceSBarry Smith SNESComputeFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only. 7279b94acceSBarry Smith Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are 7289b94acceSBarry Smith SNESComputeMinimizationFunction() and SNESComputeGradient(); 7299b94acceSBarry Smith 73036851e7fSLois Curfman McInnes SNESComputeFunction() is typically used within nonlinear solvers 73136851e7fSLois Curfman McInnes implementations, so most users would not generally call this routine 73236851e7fSLois Curfman McInnes themselves. 73336851e7fSLois Curfman McInnes 73436851e7fSLois Curfman McInnes Level: developer 73536851e7fSLois Curfman McInnes 7369b94acceSBarry Smith .keywords: SNES, nonlinear, compute, function 7379b94acceSBarry Smith 738a86d99e1SLois Curfman McInnes .seealso: SNESSetFunction(), SNESGetFunction() 7399b94acceSBarry Smith @*/ 7409b94acceSBarry Smith int SNESComputeFunction(SNES snes,Vec x,Vec y) 7419b94acceSBarry Smith { 7429b94acceSBarry Smith int ierr; 7439b94acceSBarry Smith 7443a40ed3dSBarry Smith PetscFunctionBegin; 745184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 746184914b5SBarry Smith PetscValidHeaderSpecific(x,VEC_COOKIE); 747184914b5SBarry Smith PetscValidHeaderSpecific(y,VEC_COOKIE); 748184914b5SBarry Smith PetscCheckSameComm(snes,x); 749184914b5SBarry Smith PetscCheckSameComm(snes,y); 750d4bb536fSBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 75129bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only"); 752d4bb536fSBarry Smith } 753184914b5SBarry Smith 754b0a32e0cSBarry Smith ierr = PetscLogEventBegin(SNES_FunctionEval,snes,x,y,0);CHKERRQ(ierr); 755d64ed03dSBarry Smith PetscStackPush("SNES user function"); 7569b94acceSBarry Smith ierr = (*snes->computefunction)(snes,x,y,snes->funP);CHKERRQ(ierr); 757d64ed03dSBarry Smith PetscStackPop; 758ae3c334cSLois Curfman McInnes snes->nfuncs++; 759b0a32e0cSBarry Smith ierr = PetscLogEventEnd(SNES_FunctionEval,snes,x,y,0);CHKERRQ(ierr); 7603a40ed3dSBarry Smith PetscFunctionReturn(0); 7619b94acceSBarry Smith } 7629b94acceSBarry Smith 7634a2ae208SSatish Balay #undef __FUNCT__ 7644a2ae208SSatish Balay #define __FUNCT__ "SNESSetMinimizationFunction" 7659b94acceSBarry Smith /*@C 7669b94acceSBarry Smith SNESSetMinimizationFunction - Sets the function evaluation routine for 7679b94acceSBarry Smith unconstrained minimization. 7689b94acceSBarry Smith 769fee21e36SBarry Smith Collective on SNES 770fee21e36SBarry Smith 771c7afd0dbSLois Curfman McInnes Input Parameters: 772c7afd0dbSLois Curfman McInnes + snes - the SNES context 773c7afd0dbSLois Curfman McInnes . func - function evaluation routine 774c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined context for private data for the 775c7afd0dbSLois Curfman McInnes function evaluation routine (may be PETSC_NULL) 7769b94acceSBarry Smith 777c7afd0dbSLois Curfman McInnes Calling sequence of func: 778329f5518SBarry Smith $ func (SNES snes,Vec x,PetscReal *f,void *ctx); 779c7afd0dbSLois Curfman McInnes 780c7afd0dbSLois Curfman McInnes + x - input vector 7819b94acceSBarry Smith . f - function 782c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined function context 7839b94acceSBarry Smith 78436851e7fSLois Curfman McInnes Level: beginner 78536851e7fSLois Curfman McInnes 7869b94acceSBarry Smith Notes: 7879b94acceSBarry Smith SNESSetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION 7889b94acceSBarry Smith methods only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is 7899b94acceSBarry Smith SNESSetFunction(). 7909b94acceSBarry Smith 7919b94acceSBarry Smith .keywords: SNES, nonlinear, set, minimization, function 7929b94acceSBarry Smith 793a86d99e1SLois Curfman McInnes .seealso: SNESGetMinimizationFunction(), SNESComputeMinimizationFunction(), 794a86d99e1SLois Curfman McInnes SNESSetHessian(), SNESSetGradient() 7959b94acceSBarry Smith @*/ 796329f5518SBarry Smith int SNESSetMinimizationFunction(SNES snes,int (*func)(SNES,Vec,PetscReal*,void*),void *ctx) 7979b94acceSBarry Smith { 7983a40ed3dSBarry Smith PetscFunctionBegin; 79977c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 800a8c6a408SBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 80129bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"Only for SNES_UNCONSTRAINED_MINIMIZATION"); 802a8c6a408SBarry Smith } 8039b94acceSBarry Smith snes->computeumfunction = func; 8049b94acceSBarry Smith snes->umfunP = ctx; 8053a40ed3dSBarry Smith PetscFunctionReturn(0); 8069b94acceSBarry Smith } 8079b94acceSBarry Smith 8084a2ae208SSatish Balay #undef __FUNCT__ 8094a2ae208SSatish Balay #define __FUNCT__ "SNESComputeMinimizationFunction" 8109b94acceSBarry Smith /*@ 8119b94acceSBarry Smith SNESComputeMinimizationFunction - Computes the function that has been 8129b94acceSBarry Smith set with SNESSetMinimizationFunction(). 8139b94acceSBarry Smith 814c7afd0dbSLois Curfman McInnes Collective on SNES 815c7afd0dbSLois Curfman McInnes 8169b94acceSBarry Smith Input Parameters: 817c7afd0dbSLois Curfman McInnes + snes - the SNES context 818c7afd0dbSLois Curfman McInnes - x - input vector 8199b94acceSBarry Smith 8209b94acceSBarry Smith Output Parameter: 8219b94acceSBarry Smith . y - function value 8229b94acceSBarry Smith 8239b94acceSBarry Smith Notes: 8249b94acceSBarry Smith SNESComputeMinimizationFunction() is valid only for 8259b94acceSBarry Smith SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for 8269b94acceSBarry Smith SNES_NONLINEAR_EQUATIONS methods is SNESComputeFunction(). 827a86d99e1SLois Curfman McInnes 82836851e7fSLois Curfman McInnes SNESComputeMinimizationFunction() is typically used within minimization 82936851e7fSLois Curfman McInnes implementations, so most users would not generally call this routine 83036851e7fSLois Curfman McInnes themselves. 83136851e7fSLois Curfman McInnes 83236851e7fSLois Curfman McInnes Level: developer 83336851e7fSLois Curfman McInnes 834a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, compute, minimization, function 835a86d99e1SLois Curfman McInnes 836a86d99e1SLois Curfman McInnes .seealso: SNESSetMinimizationFunction(), SNESGetMinimizationFunction(), 837a86d99e1SLois Curfman McInnes SNESComputeGradient(), SNESComputeHessian() 8389b94acceSBarry Smith @*/ 839329f5518SBarry Smith int SNESComputeMinimizationFunction(SNES snes,Vec x,PetscReal *y) 8409b94acceSBarry Smith { 8419b94acceSBarry Smith int ierr; 8423a40ed3dSBarry Smith 8433a40ed3dSBarry Smith PetscFunctionBegin; 844184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 845184914b5SBarry Smith PetscValidHeaderSpecific(x,VEC_COOKIE); 846184914b5SBarry Smith PetscCheckSameComm(snes,x); 847a8c6a408SBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 84829bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"Only for SNES_UNCONSTRAINED_MINIMIZATION"); 849a8c6a408SBarry Smith } 850184914b5SBarry Smith 851b0a32e0cSBarry Smith ierr = PetscLogEventBegin(SNES_MinimizationFunctionEval,snes,x,y,0);CHKERRQ(ierr); 852d64ed03dSBarry Smith PetscStackPush("SNES user minimzation function"); 8539b94acceSBarry Smith ierr = (*snes->computeumfunction)(snes,x,y,snes->umfunP);CHKERRQ(ierr); 854d64ed03dSBarry Smith PetscStackPop; 855ae3c334cSLois Curfman McInnes snes->nfuncs++; 856b0a32e0cSBarry Smith ierr = PetscLogEventEnd(SNES_MinimizationFunctionEval,snes,x,y,0);CHKERRQ(ierr); 8573a40ed3dSBarry Smith PetscFunctionReturn(0); 8589b94acceSBarry Smith } 8599b94acceSBarry Smith 8604a2ae208SSatish Balay #undef __FUNCT__ 8614a2ae208SSatish Balay #define __FUNCT__ "SNESSetGradient" 8629b94acceSBarry Smith /*@C 8639b94acceSBarry Smith SNESSetGradient - Sets the gradient evaluation routine and gradient 8649b94acceSBarry Smith vector for use by the SNES routines. 8659b94acceSBarry Smith 866c7afd0dbSLois Curfman McInnes Collective on SNES 867c7afd0dbSLois Curfman McInnes 8689b94acceSBarry Smith Input Parameters: 869c7afd0dbSLois Curfman McInnes + snes - the SNES context 8709b94acceSBarry Smith . func - function evaluation routine 871044dda88SLois Curfman McInnes . ctx - optional user-defined context for private data for the 872044dda88SLois Curfman McInnes gradient evaluation routine (may be PETSC_NULL) 873c7afd0dbSLois Curfman McInnes - r - vector to store gradient value 874fee21e36SBarry Smith 8759b94acceSBarry Smith Calling sequence of func: 8768d76a1e5SLois Curfman McInnes $ func (SNES, Vec x, Vec g, void *ctx); 8779b94acceSBarry Smith 878c7afd0dbSLois Curfman McInnes + x - input vector 8799b94acceSBarry Smith . g - gradient vector 880c7afd0dbSLois Curfman McInnes - ctx - optional user-defined gradient context 8819b94acceSBarry Smith 8829b94acceSBarry Smith Notes: 8839b94acceSBarry Smith SNESSetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION 8849b94acceSBarry Smith methods only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is 8859b94acceSBarry Smith SNESSetFunction(). 8869b94acceSBarry Smith 88736851e7fSLois Curfman McInnes Level: beginner 88836851e7fSLois Curfman McInnes 8899b94acceSBarry Smith .keywords: SNES, nonlinear, set, function 8909b94acceSBarry Smith 891a86d99e1SLois Curfman McInnes .seealso: SNESGetGradient(), SNESComputeGradient(), SNESSetHessian(), 892a86d99e1SLois Curfman McInnes SNESSetMinimizationFunction(), 8939b94acceSBarry Smith @*/ 89474679c65SBarry Smith int SNESSetGradient(SNES snes,Vec r,int (*func)(SNES,Vec,Vec,void*),void *ctx) 8959b94acceSBarry Smith { 8963a40ed3dSBarry Smith PetscFunctionBegin; 89777c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 898184914b5SBarry Smith PetscValidHeaderSpecific(r,VEC_COOKIE); 899184914b5SBarry Smith PetscCheckSameComm(snes,r); 900a8c6a408SBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 90129bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 902a8c6a408SBarry Smith } 9039b94acceSBarry Smith snes->computefunction = func; 9049b94acceSBarry Smith snes->vec_func = snes->vec_func_always = r; 9059b94acceSBarry Smith snes->funP = ctx; 9063a40ed3dSBarry Smith PetscFunctionReturn(0); 9079b94acceSBarry Smith } 9089b94acceSBarry Smith 9094a2ae208SSatish Balay #undef __FUNCT__ 9104a2ae208SSatish Balay #define __FUNCT__ "SNESComputeGradient" 9119b94acceSBarry Smith /*@ 912a86d99e1SLois Curfman McInnes SNESComputeGradient - Computes the gradient that has been set with 913a86d99e1SLois Curfman McInnes SNESSetGradient(). 9149b94acceSBarry Smith 915c7afd0dbSLois Curfman McInnes Collective on SNES 916c7afd0dbSLois Curfman McInnes 9179b94acceSBarry Smith Input Parameters: 918c7afd0dbSLois Curfman McInnes + snes - the SNES context 919c7afd0dbSLois Curfman McInnes - x - input vector 9209b94acceSBarry Smith 9219b94acceSBarry Smith Output Parameter: 9229b94acceSBarry Smith . y - gradient vector 9239b94acceSBarry Smith 9249b94acceSBarry Smith Notes: 9259b94acceSBarry Smith SNESComputeGradient() is valid only for 9269b94acceSBarry Smith SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for 9279b94acceSBarry Smith SNES_NONLINEAR_EQUATIONS methods is SNESComputeFunction(). 928a86d99e1SLois Curfman McInnes 92936851e7fSLois Curfman McInnes SNESComputeGradient() is typically used within minimization 93036851e7fSLois Curfman McInnes implementations, so most users would not generally call this routine 93136851e7fSLois Curfman McInnes themselves. 93236851e7fSLois Curfman McInnes 93336851e7fSLois Curfman McInnes Level: developer 93436851e7fSLois Curfman McInnes 935a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, compute, gradient 936a86d99e1SLois Curfman McInnes 937a86d99e1SLois Curfman McInnes .seealso: SNESSetGradient(), SNESGetGradient(), 938a86d99e1SLois Curfman McInnes SNESComputeMinimizationFunction(), SNESComputeHessian() 9399b94acceSBarry Smith @*/ 9409b94acceSBarry Smith int SNESComputeGradient(SNES snes,Vec x,Vec y) 9419b94acceSBarry Smith { 9429b94acceSBarry Smith int ierr; 9433a40ed3dSBarry Smith 9443a40ed3dSBarry Smith PetscFunctionBegin; 945184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 946184914b5SBarry Smith PetscValidHeaderSpecific(x,VEC_COOKIE); 947184914b5SBarry Smith PetscValidHeaderSpecific(y,VEC_COOKIE); 948184914b5SBarry Smith PetscCheckSameComm(snes,x); 949184914b5SBarry Smith PetscCheckSameComm(snes,y); 9503a40ed3dSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 95129bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 9523a40ed3dSBarry Smith } 953b0a32e0cSBarry Smith ierr = PetscLogEventBegin(SNES_GradientEval,snes,x,y,0);CHKERRQ(ierr); 954d64ed03dSBarry Smith PetscStackPush("SNES user gradient function"); 9559b94acceSBarry Smith ierr = (*snes->computefunction)(snes,x,y,snes->funP);CHKERRQ(ierr); 956d64ed03dSBarry Smith PetscStackPop; 957b0a32e0cSBarry Smith ierr = PetscLogEventEnd(SNES_GradientEval,snes,x,y,0);CHKERRQ(ierr); 9583a40ed3dSBarry Smith PetscFunctionReturn(0); 9599b94acceSBarry Smith } 9609b94acceSBarry Smith 9614a2ae208SSatish Balay #undef __FUNCT__ 9624a2ae208SSatish Balay #define __FUNCT__ "SNESComputeJacobian" 96362fef451SLois Curfman McInnes /*@ 96462fef451SLois Curfman McInnes SNESComputeJacobian - Computes the Jacobian matrix that has been 96562fef451SLois Curfman McInnes set with SNESSetJacobian(). 96662fef451SLois Curfman McInnes 967c7afd0dbSLois Curfman McInnes Collective on SNES and Mat 968c7afd0dbSLois Curfman McInnes 96962fef451SLois Curfman McInnes Input Parameters: 970c7afd0dbSLois Curfman McInnes + snes - the SNES context 971c7afd0dbSLois Curfman McInnes - x - input vector 97262fef451SLois Curfman McInnes 97362fef451SLois Curfman McInnes Output Parameters: 974c7afd0dbSLois Curfman McInnes + A - Jacobian matrix 97562fef451SLois Curfman McInnes . B - optional preconditioning matrix 976c7afd0dbSLois Curfman McInnes - flag - flag indicating matrix structure 977fee21e36SBarry Smith 97862fef451SLois Curfman McInnes Notes: 97962fef451SLois Curfman McInnes Most users should not need to explicitly call this routine, as it 98062fef451SLois Curfman McInnes is used internally within the nonlinear solvers. 98162fef451SLois Curfman McInnes 982dc5a77f8SLois Curfman McInnes See SLESSetOperators() for important information about setting the 983dc5a77f8SLois Curfman McInnes flag parameter. 98462fef451SLois Curfman McInnes 98562fef451SLois Curfman McInnes SNESComputeJacobian() is valid only for SNES_NONLINEAR_EQUATIONS 98662fef451SLois Curfman McInnes methods. An analogous routine for SNES_UNCONSTRAINED_MINIMIZATION 987005c665bSBarry Smith methods is SNESComputeHessian(). 98862fef451SLois Curfman McInnes 98936851e7fSLois Curfman McInnes Level: developer 99036851e7fSLois Curfman McInnes 99162fef451SLois Curfman McInnes .keywords: SNES, compute, Jacobian, matrix 99262fef451SLois Curfman McInnes 99362fef451SLois Curfman McInnes .seealso: SNESSetJacobian(), SLESSetOperators() 99462fef451SLois Curfman McInnes @*/ 9959b94acceSBarry Smith int SNESComputeJacobian(SNES snes,Vec X,Mat *A,Mat *B,MatStructure *flg) 9969b94acceSBarry Smith { 9979b94acceSBarry Smith int ierr; 9983a40ed3dSBarry Smith 9993a40ed3dSBarry Smith PetscFunctionBegin; 1000184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1001184914b5SBarry Smith PetscValidHeaderSpecific(X,VEC_COOKIE); 1002184914b5SBarry Smith PetscCheckSameComm(snes,X); 10033a40ed3dSBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 100429bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only"); 10053a40ed3dSBarry Smith } 10063a40ed3dSBarry Smith if (!snes->computejacobian) PetscFunctionReturn(0); 1007b0a32e0cSBarry Smith ierr = PetscLogEventBegin(SNES_JacobianEval,snes,X,*A,*B);CHKERRQ(ierr); 1008c4fc05e7SBarry Smith *flg = DIFFERENT_NONZERO_PATTERN; 1009d64ed03dSBarry Smith PetscStackPush("SNES user Jacobian function"); 10109b94acceSBarry Smith ierr = (*snes->computejacobian)(snes,X,A,B,flg,snes->jacP);CHKERRQ(ierr); 1011d64ed03dSBarry Smith PetscStackPop; 1012b0a32e0cSBarry Smith ierr = PetscLogEventEnd(SNES_JacobianEval,snes,X,*A,*B);CHKERRQ(ierr); 10136d84be18SBarry Smith /* make sure user returned a correct Jacobian and preconditioner */ 101477c4ece6SBarry Smith PetscValidHeaderSpecific(*A,MAT_COOKIE); 101577c4ece6SBarry Smith PetscValidHeaderSpecific(*B,MAT_COOKIE); 10163a40ed3dSBarry Smith PetscFunctionReturn(0); 10179b94acceSBarry Smith } 10189b94acceSBarry Smith 10194a2ae208SSatish Balay #undef __FUNCT__ 10204a2ae208SSatish Balay #define __FUNCT__ "SNESComputeHessian" 102162fef451SLois Curfman McInnes /*@ 102262fef451SLois Curfman McInnes SNESComputeHessian - Computes the Hessian matrix that has been 102362fef451SLois Curfman McInnes set with SNESSetHessian(). 102462fef451SLois Curfman McInnes 1025c7afd0dbSLois Curfman McInnes Collective on SNES and Mat 1026c7afd0dbSLois Curfman McInnes 102762fef451SLois Curfman McInnes Input Parameters: 1028c7afd0dbSLois Curfman McInnes + snes - the SNES context 1029c7afd0dbSLois Curfman McInnes - x - input vector 103062fef451SLois Curfman McInnes 103162fef451SLois Curfman McInnes Output Parameters: 1032c7afd0dbSLois Curfman McInnes + A - Hessian matrix 103362fef451SLois Curfman McInnes . B - optional preconditioning matrix 1034c7afd0dbSLois Curfman McInnes - flag - flag indicating matrix structure 1035fee21e36SBarry Smith 103662fef451SLois Curfman McInnes Notes: 103762fef451SLois Curfman McInnes Most users should not need to explicitly call this routine, as it 103862fef451SLois Curfman McInnes is used internally within the nonlinear solvers. 103962fef451SLois Curfman McInnes 1040dc5a77f8SLois Curfman McInnes See SLESSetOperators() for important information about setting the 1041dc5a77f8SLois Curfman McInnes flag parameter. 104262fef451SLois Curfman McInnes 104362fef451SLois Curfman McInnes SNESComputeHessian() is valid only for 104462fef451SLois Curfman McInnes SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for 104562fef451SLois Curfman McInnes SNES_NONLINEAR_EQUATIONS methods is SNESComputeJacobian(). 104662fef451SLois Curfman McInnes 104736851e7fSLois Curfman McInnes SNESComputeHessian() is typically used within minimization 104836851e7fSLois Curfman McInnes implementations, so most users would not generally call this routine 104936851e7fSLois Curfman McInnes themselves. 105036851e7fSLois Curfman McInnes 105136851e7fSLois Curfman McInnes Level: developer 105236851e7fSLois Curfman McInnes 105362fef451SLois Curfman McInnes .keywords: SNES, compute, Hessian, matrix 105462fef451SLois Curfman McInnes 1055a86d99e1SLois Curfman McInnes .seealso: SNESSetHessian(), SLESSetOperators(), SNESComputeGradient(), 1056a86d99e1SLois Curfman McInnes SNESComputeMinimizationFunction() 105762fef451SLois Curfman McInnes @*/ 105862fef451SLois Curfman McInnes int SNESComputeHessian(SNES snes,Vec x,Mat *A,Mat *B,MatStructure *flag) 10599b94acceSBarry Smith { 10609b94acceSBarry Smith int ierr; 10613a40ed3dSBarry Smith 10623a40ed3dSBarry Smith PetscFunctionBegin; 1063184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1064184914b5SBarry Smith PetscValidHeaderSpecific(x,VEC_COOKIE); 1065184914b5SBarry Smith PetscCheckSameComm(snes,x); 10663a40ed3dSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 106729bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 10683a40ed3dSBarry Smith } 10693a40ed3dSBarry Smith if (!snes->computejacobian) PetscFunctionReturn(0); 1070b0a32e0cSBarry Smith ierr = PetscLogEventBegin(SNES_HessianEval,snes,x,*A,*B);CHKERRQ(ierr); 10710f4a323eSLois Curfman McInnes *flag = DIFFERENT_NONZERO_PATTERN; 1072d64ed03dSBarry Smith PetscStackPush("SNES user Hessian function"); 107362fef451SLois Curfman McInnes ierr = (*snes->computejacobian)(snes,x,A,B,flag,snes->jacP);CHKERRQ(ierr); 1074d64ed03dSBarry Smith PetscStackPop; 1075b0a32e0cSBarry Smith ierr = PetscLogEventEnd(SNES_HessianEval,snes,x,*A,*B);CHKERRQ(ierr); 10760f4a323eSLois Curfman McInnes /* make sure user returned a correct Jacobian and preconditioner */ 107777c4ece6SBarry Smith PetscValidHeaderSpecific(*A,MAT_COOKIE); 107877c4ece6SBarry Smith PetscValidHeaderSpecific(*B,MAT_COOKIE); 10793a40ed3dSBarry Smith PetscFunctionReturn(0); 10809b94acceSBarry Smith } 10819b94acceSBarry Smith 10824a2ae208SSatish Balay #undef __FUNCT__ 10834a2ae208SSatish Balay #define __FUNCT__ "SNESSetJacobian" 10849b94acceSBarry Smith /*@C 10859b94acceSBarry Smith SNESSetJacobian - Sets the function to compute Jacobian as well as the 1086044dda88SLois Curfman McInnes location to store the matrix. 10879b94acceSBarry Smith 1088c7afd0dbSLois Curfman McInnes Collective on SNES and Mat 1089c7afd0dbSLois Curfman McInnes 10909b94acceSBarry Smith Input Parameters: 1091c7afd0dbSLois Curfman McInnes + snes - the SNES context 10929b94acceSBarry Smith . A - Jacobian matrix 10939b94acceSBarry Smith . B - preconditioner matrix (usually same as the Jacobian) 10949b94acceSBarry Smith . func - Jacobian evaluation routine 1095c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined context for private data for the 10962cd2dfdcSLois Curfman McInnes Jacobian evaluation routine (may be PETSC_NULL) 10979b94acceSBarry Smith 10989b94acceSBarry Smith Calling sequence of func: 10998d76a1e5SLois Curfman McInnes $ func (SNES snes,Vec x,Mat *A,Mat *B,int *flag,void *ctx); 11009b94acceSBarry Smith 1101c7afd0dbSLois Curfman McInnes + x - input vector 11029b94acceSBarry Smith . A - Jacobian matrix 11039b94acceSBarry Smith . B - preconditioner matrix, usually the same as A 1104ac21db08SLois Curfman McInnes . flag - flag indicating information about the preconditioner matrix 1105ac21db08SLois Curfman McInnes structure (same as flag in SLESSetOperators()) 1106c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined Jacobian context 11079b94acceSBarry Smith 11089b94acceSBarry Smith Notes: 1109dc5a77f8SLois Curfman McInnes See SLESSetOperators() for important information about setting the flag 11102cd2dfdcSLois Curfman McInnes output parameter in the routine func(). Be sure to read this information! 1111ac21db08SLois Curfman McInnes 1112ac21db08SLois Curfman McInnes The routine func() takes Mat * as the matrix arguments rather than Mat. 11139b94acceSBarry Smith This allows the Jacobian evaluation routine to replace A and/or B with a 11149b94acceSBarry Smith completely new new matrix structure (not just different matrix elements) 11159b94acceSBarry Smith when appropriate, for instance, if the nonzero structure is changing 11169b94acceSBarry Smith throughout the global iterations. 11179b94acceSBarry Smith 111836851e7fSLois Curfman McInnes Level: beginner 111936851e7fSLois Curfman McInnes 11209b94acceSBarry Smith .keywords: SNES, nonlinear, set, Jacobian, matrix 11219b94acceSBarry Smith 1122ac21db08SLois Curfman McInnes .seealso: SLESSetOperators(), SNESSetFunction() 11239b94acceSBarry Smith @*/ 1124454a90a3SBarry Smith int SNESSetJacobian(SNES snes,Mat A,Mat B,int (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx) 11259b94acceSBarry Smith { 11263a7fca6bSBarry Smith int ierr; 11273a7fca6bSBarry Smith 11283a40ed3dSBarry Smith PetscFunctionBegin; 112977c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 113000036973SBarry Smith if (A) PetscValidHeaderSpecific(A,MAT_COOKIE); 113100036973SBarry Smith if (B) PetscValidHeaderSpecific(B,MAT_COOKIE); 113200036973SBarry Smith if (A) PetscCheckSameComm(snes,A); 113300036973SBarry Smith if (B) PetscCheckSameComm(snes,B); 1134a8c6a408SBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 113529bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only"); 1136a8c6a408SBarry Smith } 1137184914b5SBarry Smith 11383a7fca6bSBarry Smith if (func) snes->computejacobian = func; 11393a7fca6bSBarry Smith if (ctx) snes->jacP = ctx; 11403a7fca6bSBarry Smith if (A) { 11413a7fca6bSBarry Smith if (snes->jacobian) {ierr = MatDestroy(snes->jacobian);CHKERRQ(ierr);} 11429b94acceSBarry Smith snes->jacobian = A; 11433a7fca6bSBarry Smith ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); 11443a7fca6bSBarry Smith } 11453a7fca6bSBarry Smith if (B) { 11463a7fca6bSBarry Smith if (snes->jacobian_pre) {ierr = MatDestroy(snes->jacobian_pre);CHKERRQ(ierr);} 11479b94acceSBarry Smith snes->jacobian_pre = B; 11483a7fca6bSBarry Smith ierr = PetscObjectReference((PetscObject)B);CHKERRQ(ierr); 11493a7fca6bSBarry Smith } 11503a40ed3dSBarry Smith PetscFunctionReturn(0); 11519b94acceSBarry Smith } 115262fef451SLois Curfman McInnes 11534a2ae208SSatish Balay #undef __FUNCT__ 11544a2ae208SSatish Balay #define __FUNCT__ "SNESGetJacobian" 1155c2aafc4cSSatish Balay /*@C 1156b4fd4287SBarry Smith SNESGetJacobian - Returns the Jacobian matrix and optionally the user 1157b4fd4287SBarry Smith provided context for evaluating the Jacobian. 1158b4fd4287SBarry Smith 1159c7afd0dbSLois Curfman McInnes Not Collective, but Mat object will be parallel if SNES object is 1160c7afd0dbSLois Curfman McInnes 1161b4fd4287SBarry Smith Input Parameter: 1162b4fd4287SBarry Smith . snes - the nonlinear solver context 1163b4fd4287SBarry Smith 1164b4fd4287SBarry Smith Output Parameters: 1165c7afd0dbSLois Curfman McInnes + A - location to stash Jacobian matrix (or PETSC_NULL) 1166b4fd4287SBarry Smith . B - location to stash preconditioner matrix (or PETSC_NULL) 116700036973SBarry Smith . ctx - location to stash Jacobian ctx (or PETSC_NULL) 116800036973SBarry Smith - func - location to put Jacobian function (or PETSC_NULL) 1169fee21e36SBarry Smith 117036851e7fSLois Curfman McInnes Level: advanced 117136851e7fSLois Curfman McInnes 1172b4fd4287SBarry Smith .seealso: SNESSetJacobian(), SNESComputeJacobian() 1173b4fd4287SBarry Smith @*/ 117400036973SBarry Smith int SNESGetJacobian(SNES snes,Mat *A,Mat *B,void **ctx,int (**func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*)) 1175b4fd4287SBarry Smith { 11763a40ed3dSBarry Smith PetscFunctionBegin; 1177184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 11783a40ed3dSBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 117929bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only"); 11803a40ed3dSBarry Smith } 1181b4fd4287SBarry Smith if (A) *A = snes->jacobian; 1182b4fd4287SBarry Smith if (B) *B = snes->jacobian_pre; 1183b4fd4287SBarry Smith if (ctx) *ctx = snes->jacP; 118400036973SBarry Smith if (func) *func = snes->computejacobian; 11853a40ed3dSBarry Smith PetscFunctionReturn(0); 1186b4fd4287SBarry Smith } 1187b4fd4287SBarry Smith 11884a2ae208SSatish Balay #undef __FUNCT__ 11894a2ae208SSatish Balay #define __FUNCT__ "SNESSetHessian" 11909b94acceSBarry Smith /*@C 11919b94acceSBarry Smith SNESSetHessian - Sets the function to compute Hessian as well as the 1192044dda88SLois Curfman McInnes location to store the matrix. 11939b94acceSBarry Smith 1194c7afd0dbSLois Curfman McInnes Collective on SNES and Mat 1195c7afd0dbSLois Curfman McInnes 11969b94acceSBarry Smith Input Parameters: 1197c7afd0dbSLois Curfman McInnes + snes - the SNES context 11989b94acceSBarry Smith . A - Hessian matrix 11999b94acceSBarry Smith . B - preconditioner matrix (usually same as the Hessian) 12009b94acceSBarry Smith . func - Jacobian evaluation routine 1201c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined context for private data for the 1202313e4042SLois Curfman McInnes Hessian evaluation routine (may be PETSC_NULL) 12039b94acceSBarry Smith 12049b94acceSBarry Smith Calling sequence of func: 12058d76a1e5SLois Curfman McInnes $ func (SNES snes,Vec x,Mat *A,Mat *B,int *flag,void *ctx); 12069b94acceSBarry Smith 1207c7afd0dbSLois Curfman McInnes + x - input vector 12089b94acceSBarry Smith . A - Hessian matrix 12099b94acceSBarry Smith . B - preconditioner matrix, usually the same as A 1210ac21db08SLois Curfman McInnes . flag - flag indicating information about the preconditioner matrix 1211ac21db08SLois Curfman McInnes structure (same as flag in SLESSetOperators()) 1212c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined Hessian context 12139b94acceSBarry Smith 12149b94acceSBarry Smith Notes: 1215dc5a77f8SLois Curfman McInnes See SLESSetOperators() for important information about setting the flag 12162cd2dfdcSLois Curfman McInnes output parameter in the routine func(). Be sure to read this information! 1217ac21db08SLois Curfman McInnes 12189b94acceSBarry Smith The function func() takes Mat * as the matrix arguments rather than Mat. 12199b94acceSBarry Smith This allows the Hessian evaluation routine to replace A and/or B with a 12209b94acceSBarry Smith completely new new matrix structure (not just different matrix elements) 12219b94acceSBarry Smith when appropriate, for instance, if the nonzero structure is changing 12229b94acceSBarry Smith throughout the global iterations. 12239b94acceSBarry Smith 122436851e7fSLois Curfman McInnes Level: beginner 122536851e7fSLois Curfman McInnes 12269b94acceSBarry Smith .keywords: SNES, nonlinear, set, Hessian, matrix 12279b94acceSBarry Smith 1228ac21db08SLois Curfman McInnes .seealso: SNESSetMinimizationFunction(), SNESSetGradient(), SLESSetOperators() 12299b94acceSBarry Smith @*/ 1230454a90a3SBarry Smith int SNESSetHessian(SNES snes,Mat A,Mat B,int (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx) 12319b94acceSBarry Smith { 12323a7fca6bSBarry Smith int ierr; 12333a7fca6bSBarry Smith 12343a40ed3dSBarry Smith PetscFunctionBegin; 123577c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1236184914b5SBarry Smith PetscValidHeaderSpecific(A,MAT_COOKIE); 1237184914b5SBarry Smith PetscValidHeaderSpecific(B,MAT_COOKIE); 1238184914b5SBarry Smith PetscCheckSameComm(snes,A); 1239184914b5SBarry Smith PetscCheckSameComm(snes,B); 1240d4bb536fSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 124129bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 1242d4bb536fSBarry Smith } 12433a7fca6bSBarry Smith if (func) snes->computejacobian = func; 12443a7fca6bSBarry Smith if (ctx) snes->jacP = ctx; 12453a7fca6bSBarry Smith if (A) { 12463a7fca6bSBarry Smith if (snes->jacobian) {ierr = MatDestroy(snes->jacobian);CHKERRQ(ierr);} 12479b94acceSBarry Smith snes->jacobian = A; 12483a7fca6bSBarry Smith ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); 12493a7fca6bSBarry Smith } 12503a7fca6bSBarry Smith if (B) { 12513a7fca6bSBarry Smith if (snes->jacobian_pre) {ierr = MatDestroy(snes->jacobian_pre);CHKERRQ(ierr);} 12529b94acceSBarry Smith snes->jacobian_pre = B; 12533a7fca6bSBarry Smith ierr = PetscObjectReference((PetscObject)B);CHKERRQ(ierr); 12543a7fca6bSBarry Smith } 12553a40ed3dSBarry Smith PetscFunctionReturn(0); 12569b94acceSBarry Smith } 12579b94acceSBarry Smith 12584a2ae208SSatish Balay #undef __FUNCT__ 12594a2ae208SSatish Balay #define __FUNCT__ "SNESGetHessian" 126062fef451SLois Curfman McInnes /*@ 126162fef451SLois Curfman McInnes SNESGetHessian - Returns the Hessian matrix and optionally the user 126262fef451SLois Curfman McInnes provided context for evaluating the Hessian. 126362fef451SLois Curfman McInnes 1264c7afd0dbSLois Curfman McInnes Not Collective, but Mat object is parallel if SNES object is parallel 1265c7afd0dbSLois Curfman McInnes 126662fef451SLois Curfman McInnes Input Parameter: 126762fef451SLois Curfman McInnes . snes - the nonlinear solver context 126862fef451SLois Curfman McInnes 126962fef451SLois Curfman McInnes Output Parameters: 1270c7afd0dbSLois Curfman McInnes + A - location to stash Hessian matrix (or PETSC_NULL) 127162fef451SLois Curfman McInnes . B - location to stash preconditioner matrix (or PETSC_NULL) 1272c7afd0dbSLois Curfman McInnes - ctx - location to stash Hessian ctx (or PETSC_NULL) 1273fee21e36SBarry Smith 127436851e7fSLois Curfman McInnes Level: advanced 127536851e7fSLois Curfman McInnes 127662fef451SLois Curfman McInnes .seealso: SNESSetHessian(), SNESComputeHessian() 1277c7afd0dbSLois Curfman McInnes 1278c7afd0dbSLois Curfman McInnes .keywords: SNES, get, Hessian 127962fef451SLois Curfman McInnes @*/ 128062fef451SLois Curfman McInnes int SNESGetHessian(SNES snes,Mat *A,Mat *B,void **ctx) 128162fef451SLois Curfman McInnes { 12823a40ed3dSBarry Smith PetscFunctionBegin; 1283184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 12843a40ed3dSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION){ 128529bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 12863a40ed3dSBarry Smith } 128762fef451SLois Curfman McInnes if (A) *A = snes->jacobian; 128862fef451SLois Curfman McInnes if (B) *B = snes->jacobian_pre; 128962fef451SLois Curfman McInnes if (ctx) *ctx = snes->jacP; 12903a40ed3dSBarry Smith PetscFunctionReturn(0); 129162fef451SLois Curfman McInnes } 129262fef451SLois Curfman McInnes 12939b94acceSBarry Smith /* ----- Routines to initialize and destroy a nonlinear solver ---- */ 12949b94acceSBarry Smith 12954a2ae208SSatish Balay #undef __FUNCT__ 12964a2ae208SSatish Balay #define __FUNCT__ "SNESSetUp" 12979b94acceSBarry Smith /*@ 12989b94acceSBarry Smith SNESSetUp - Sets up the internal data structures for the later use 1299272ac6f2SLois Curfman McInnes of a nonlinear solver. 13009b94acceSBarry Smith 1301fee21e36SBarry Smith Collective on SNES 1302fee21e36SBarry Smith 1303c7afd0dbSLois Curfman McInnes Input Parameters: 1304c7afd0dbSLois Curfman McInnes + snes - the SNES context 1305c7afd0dbSLois Curfman McInnes - x - the solution vector 1306c7afd0dbSLois Curfman McInnes 1307272ac6f2SLois Curfman McInnes Notes: 1308272ac6f2SLois Curfman McInnes For basic use of the SNES solvers the user need not explicitly call 1309272ac6f2SLois Curfman McInnes SNESSetUp(), since these actions will automatically occur during 1310272ac6f2SLois Curfman McInnes the call to SNESSolve(). However, if one wishes to control this 1311272ac6f2SLois Curfman McInnes phase separately, SNESSetUp() should be called after SNESCreate() 1312272ac6f2SLois Curfman McInnes and optional routines of the form SNESSetXXX(), but before SNESSolve(). 1313272ac6f2SLois Curfman McInnes 131436851e7fSLois Curfman McInnes Level: advanced 131536851e7fSLois Curfman McInnes 13169b94acceSBarry Smith .keywords: SNES, nonlinear, setup 13179b94acceSBarry Smith 13189b94acceSBarry Smith .seealso: SNESCreate(), SNESSolve(), SNESDestroy() 13199b94acceSBarry Smith @*/ 13208ddd3da0SLois Curfman McInnes int SNESSetUp(SNES snes,Vec x) 13219b94acceSBarry Smith { 1322f1af5d2fSBarry Smith int ierr; 1323f1af5d2fSBarry Smith PetscTruth flg; 13243a40ed3dSBarry Smith 13253a40ed3dSBarry Smith PetscFunctionBegin; 132677c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 132777c4ece6SBarry Smith PetscValidHeaderSpecific(x,VEC_COOKIE); 1328184914b5SBarry Smith PetscCheckSameComm(snes,x); 13298ddd3da0SLois Curfman McInnes snes->vec_sol = snes->vec_sol_always = x; 13309b94acceSBarry Smith 1331b0a32e0cSBarry Smith ierr = PetscOptionsHasName(snes->prefix,"-snes_mf_operator",&flg);CHKERRQ(ierr); 1332c1f60f51SBarry Smith /* 1333c1f60f51SBarry Smith This version replaces the user provided Jacobian matrix with a 1334dfa02198SLois Curfman McInnes matrix-free version but still employs the user-provided preconditioner matrix 1335c1f60f51SBarry Smith */ 1336c1f60f51SBarry Smith if (flg) { 1337c1f60f51SBarry Smith Mat J; 13385a655dc6SBarry Smith ierr = MatCreateSNESMF(snes,snes->vec_sol,&J);CHKERRQ(ierr); 13395a655dc6SBarry Smith ierr = MatSNESMFSetFromOptions(J);CHKERRQ(ierr); 13403a7fca6bSBarry Smith PetscLogInfo(snes,"SNESSetUp: Setting default matrix-free operator routines\n"); 13413a7fca6bSBarry Smith ierr = SNESSetJacobian(snes,J,0,0,0);CHKERRQ(ierr); 13423a7fca6bSBarry Smith ierr = MatDestroy(J);CHKERRQ(ierr); 1343c1f60f51SBarry Smith } 1344b0a32e0cSBarry Smith ierr = PetscOptionsHasName(snes->prefix,"-snes_mf",&flg);CHKERRQ(ierr); 1345c1f60f51SBarry Smith /* 1346dfa02198SLois Curfman McInnes This version replaces both the user-provided Jacobian and the user- 1347c1f60f51SBarry Smith provided preconditioner matrix with the default matrix free version. 1348c1f60f51SBarry Smith */ 134931615d04SLois Curfman McInnes if (flg) { 1350272ac6f2SLois Curfman McInnes Mat J; 1351f3ef73ceSBarry Smith SLES sles; 1352f3ef73ceSBarry Smith PC pc; 1353f3ef73ceSBarry Smith 13545a655dc6SBarry Smith ierr = MatCreateSNESMF(snes,snes->vec_sol,&J);CHKERRQ(ierr); 13553a7fca6bSBarry Smith ierr = MatSNESMFSetFromOptions(J);CHKERRQ(ierr); 135693b98531SBarry Smith PetscLogInfo(snes,"SNESSetUp: Setting default matrix-free operator and preconditioner routines\n"); 135783e56afdSLois Curfman McInnes if (snes->method_class == SNES_NONLINEAR_EQUATIONS) { 13583a7fca6bSBarry Smith ierr = SNESSetJacobian(snes,J,J,MatSNESMFComputeJacobian,snes->funP);CHKERRQ(ierr); 1359d64ed03dSBarry Smith } else if (snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) { 13603a7fca6bSBarry Smith ierr = SNESSetHessian(snes,J,J,MatSNESMFComputeJacobian,snes->funP);CHKERRQ(ierr); 1361d4bb536fSBarry Smith } else { 136229bbc08cSBarry Smith SETERRQ(PETSC_ERR_SUP,"Method class doesn't support matrix-free option"); 1363d4bb536fSBarry Smith } 13643a7fca6bSBarry Smith ierr = MatDestroy(J);CHKERRQ(ierr); 13653a7fca6bSBarry Smith 1366f3ef73ceSBarry Smith /* force no preconditioner */ 1367f3ef73ceSBarry Smith ierr = SNESGetSLES(snes,&sles);CHKERRQ(ierr); 1368f3ef73ceSBarry Smith ierr = SLESGetPC(sles,&pc);CHKERRQ(ierr); 1369f3ef73ceSBarry Smith ierr = PCSetType(pc,PCNONE);CHKERRQ(ierr); 1370272ac6f2SLois Curfman McInnes } 1371f3ef73ceSBarry Smith 13729b94acceSBarry Smith if ((snes->method_class == SNES_NONLINEAR_EQUATIONS)) { 13736831982aSBarry Smith PetscTruth iseqtr; 13746831982aSBarry Smith 137529bbc08cSBarry Smith if (!snes->vec_func) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetFunction() first"); 137629bbc08cSBarry Smith if (!snes->computefunction) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetFunction() first"); 137729bbc08cSBarry Smith if (!snes->jacobian) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetJacobian() first \n or use -snes_mf option"); 1378a8c6a408SBarry Smith if (snes->vec_func == snes->vec_sol) { 137929bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_IDN,"Solution vector cannot be function vector"); 1380a8c6a408SBarry Smith } 1381a703fe33SLois Curfman McInnes 1382a703fe33SLois Curfman McInnes /* Set the KSP stopping criterion to use the Eisenstat-Walker method */ 13836831982aSBarry Smith ierr = PetscTypeCompare((PetscObject)snes,SNESEQTR,&iseqtr);CHKERRQ(ierr); 13846831982aSBarry Smith if (snes->ksp_ewconv && !iseqtr) { 1385a703fe33SLois Curfman McInnes SLES sles; KSP ksp; 1386a703fe33SLois Curfman McInnes ierr = SNESGetSLES(snes,&sles);CHKERRQ(ierr); 1387a703fe33SLois Curfman McInnes ierr = SLESGetKSP(sles,&ksp);CHKERRQ(ierr); 1388186905e3SBarry Smith ierr = KSPSetConvergenceTest(ksp,SNES_KSP_EW_Converged_Private,snes);CHKERRQ(ierr); 1389a703fe33SLois Curfman McInnes } 13909b94acceSBarry Smith } else if ((snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION)) { 139129bbc08cSBarry Smith if (!snes->vec_func) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetGradient() first"); 139229bbc08cSBarry Smith if (!snes->computefunction) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetGradient() first"); 1393a8c6a408SBarry Smith if (!snes->computeumfunction) { 139429bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetMinimizationFunction() first"); 1395a8c6a408SBarry Smith } 139629bbc08cSBarry Smith if (!snes->jacobian) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetHessian()"); 1397d4bb536fSBarry Smith } else { 139829bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Unknown method class"); 1399d4bb536fSBarry Smith } 1400a703fe33SLois Curfman McInnes if (snes->setup) {ierr = (*snes->setup)(snes);CHKERRQ(ierr);} 140182bf6240SBarry Smith snes->setupcalled = 1; 14023a40ed3dSBarry Smith PetscFunctionReturn(0); 14039b94acceSBarry Smith } 14049b94acceSBarry Smith 14054a2ae208SSatish Balay #undef __FUNCT__ 14064a2ae208SSatish Balay #define __FUNCT__ "SNESDestroy" 14079b94acceSBarry Smith /*@C 14089b94acceSBarry Smith SNESDestroy - Destroys the nonlinear solver context that was created 14099b94acceSBarry Smith with SNESCreate(). 14109b94acceSBarry Smith 1411c7afd0dbSLois Curfman McInnes Collective on SNES 1412c7afd0dbSLois Curfman McInnes 14139b94acceSBarry Smith Input Parameter: 14149b94acceSBarry Smith . snes - the SNES context 14159b94acceSBarry Smith 141636851e7fSLois Curfman McInnes Level: beginner 141736851e7fSLois Curfman McInnes 14189b94acceSBarry Smith .keywords: SNES, nonlinear, destroy 14199b94acceSBarry Smith 142063a78c88SLois Curfman McInnes .seealso: SNESCreate(), SNESSolve() 14219b94acceSBarry Smith @*/ 14229b94acceSBarry Smith int SNESDestroy(SNES snes) 14239b94acceSBarry Smith { 1424b8a78c4aSBarry Smith int i,ierr; 14253a40ed3dSBarry Smith 14263a40ed3dSBarry Smith PetscFunctionBegin; 142777c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 14283a40ed3dSBarry Smith if (--snes->refct > 0) PetscFunctionReturn(0); 1429d4bb536fSBarry Smith 1430be0abb6dSBarry Smith /* if memory was published with AMS then destroy it */ 14310f5bd95cSBarry Smith ierr = PetscObjectDepublish(snes);CHKERRQ(ierr); 1432be0abb6dSBarry Smith 1433e1311b90SBarry Smith if (snes->destroy) {ierr = (*(snes)->destroy)(snes);CHKERRQ(ierr);} 1434606d414cSSatish Balay if (snes->kspconvctx) {ierr = PetscFree(snes->kspconvctx);CHKERRQ(ierr);} 14353a7fca6bSBarry Smith if (snes->jacobian) {ierr = MatDestroy(snes->jacobian);CHKERRQ(ierr);} 14363a7fca6bSBarry Smith if (snes->jacobian_pre) {ierr = MatDestroy(snes->jacobian_pre);CHKERRQ(ierr);} 14379b94acceSBarry Smith ierr = SLESDestroy(snes->sles);CHKERRQ(ierr); 1438522c5e43SBarry Smith if (snes->vwork) {ierr = VecDestroyVecs(snes->vwork,snes->nvwork);CHKERRQ(ierr);} 1439b8a78c4aSBarry Smith for (i=0; i<snes->numbermonitors; i++) { 1440b8a78c4aSBarry Smith if (snes->monitordestroy[i]) { 1441b8a78c4aSBarry Smith ierr = (*snes->monitordestroy[i])(snes->monitorcontext[i]);CHKERRQ(ierr); 1442b8a78c4aSBarry Smith } 1443b8a78c4aSBarry Smith } 1444b0a32e0cSBarry Smith PetscLogObjectDestroy((PetscObject)snes); 14450452661fSBarry Smith PetscHeaderDestroy((PetscObject)snes); 14463a40ed3dSBarry Smith PetscFunctionReturn(0); 14479b94acceSBarry Smith } 14489b94acceSBarry Smith 14499b94acceSBarry Smith /* ----------- Routines to set solver parameters ---------- */ 14509b94acceSBarry Smith 14514a2ae208SSatish Balay #undef __FUNCT__ 14524a2ae208SSatish Balay #define __FUNCT__ "SNESSetTolerances" 14539b94acceSBarry Smith /*@ 1454d7a720efSLois Curfman McInnes SNESSetTolerances - Sets various parameters used in convergence tests. 14559b94acceSBarry Smith 1456c7afd0dbSLois Curfman McInnes Collective on SNES 1457c7afd0dbSLois Curfman McInnes 14589b94acceSBarry Smith Input Parameters: 1459c7afd0dbSLois Curfman McInnes + snes - the SNES context 146033174efeSLois Curfman McInnes . atol - absolute convergence tolerance 146133174efeSLois Curfman McInnes . rtol - relative convergence tolerance 146233174efeSLois Curfman McInnes . stol - convergence tolerance in terms of the norm 146333174efeSLois Curfman McInnes of the change in the solution between steps 146433174efeSLois Curfman McInnes . maxit - maximum number of iterations 1465c7afd0dbSLois Curfman McInnes - maxf - maximum number of function evaluations 1466fee21e36SBarry Smith 146733174efeSLois Curfman McInnes Options Database Keys: 1468c7afd0dbSLois Curfman McInnes + -snes_atol <atol> - Sets atol 1469c7afd0dbSLois Curfman McInnes . -snes_rtol <rtol> - Sets rtol 1470c7afd0dbSLois Curfman McInnes . -snes_stol <stol> - Sets stol 1471c7afd0dbSLois Curfman McInnes . -snes_max_it <maxit> - Sets maxit 1472c7afd0dbSLois Curfman McInnes - -snes_max_funcs <maxf> - Sets maxf 14739b94acceSBarry Smith 1474d7a720efSLois Curfman McInnes Notes: 14759b94acceSBarry Smith The default maximum number of iterations is 50. 14769b94acceSBarry Smith The default maximum number of function evaluations is 1000. 14779b94acceSBarry Smith 147836851e7fSLois Curfman McInnes Level: intermediate 147936851e7fSLois Curfman McInnes 148033174efeSLois Curfman McInnes .keywords: SNES, nonlinear, set, convergence, tolerances 14819b94acceSBarry Smith 1482d7a720efSLois Curfman McInnes .seealso: SNESSetTrustRegionTolerance(), SNESSetMinimizationFunctionTolerance() 14839b94acceSBarry Smith @*/ 1484329f5518SBarry Smith int SNESSetTolerances(SNES snes,PetscReal atol,PetscReal rtol,PetscReal stol,int maxit,int maxf) 14859b94acceSBarry Smith { 14863a40ed3dSBarry Smith PetscFunctionBegin; 148777c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1488d7a720efSLois Curfman McInnes if (atol != PETSC_DEFAULT) snes->atol = atol; 1489d7a720efSLois Curfman McInnes if (rtol != PETSC_DEFAULT) snes->rtol = rtol; 1490d7a720efSLois Curfman McInnes if (stol != PETSC_DEFAULT) snes->xtol = stol; 1491d7a720efSLois Curfman McInnes if (maxit != PETSC_DEFAULT) snes->max_its = maxit; 1492d7a720efSLois Curfman McInnes if (maxf != PETSC_DEFAULT) snes->max_funcs = maxf; 14933a40ed3dSBarry Smith PetscFunctionReturn(0); 14949b94acceSBarry Smith } 14959b94acceSBarry Smith 14964a2ae208SSatish Balay #undef __FUNCT__ 14974a2ae208SSatish Balay #define __FUNCT__ "SNESGetTolerances" 14989b94acceSBarry Smith /*@ 149933174efeSLois Curfman McInnes SNESGetTolerances - Gets various parameters used in convergence tests. 150033174efeSLois Curfman McInnes 1501c7afd0dbSLois Curfman McInnes Not Collective 1502c7afd0dbSLois Curfman McInnes 150333174efeSLois Curfman McInnes Input Parameters: 1504c7afd0dbSLois Curfman McInnes + snes - the SNES context 150533174efeSLois Curfman McInnes . atol - absolute convergence tolerance 150633174efeSLois Curfman McInnes . rtol - relative convergence tolerance 150733174efeSLois Curfman McInnes . stol - convergence tolerance in terms of the norm 150833174efeSLois Curfman McInnes of the change in the solution between steps 150933174efeSLois Curfman McInnes . maxit - maximum number of iterations 1510c7afd0dbSLois Curfman McInnes - maxf - maximum number of function evaluations 1511fee21e36SBarry Smith 151233174efeSLois Curfman McInnes Notes: 151333174efeSLois Curfman McInnes The user can specify PETSC_NULL for any parameter that is not needed. 151433174efeSLois Curfman McInnes 151536851e7fSLois Curfman McInnes Level: intermediate 151636851e7fSLois Curfman McInnes 151733174efeSLois Curfman McInnes .keywords: SNES, nonlinear, get, convergence, tolerances 151833174efeSLois Curfman McInnes 151933174efeSLois Curfman McInnes .seealso: SNESSetTolerances() 152033174efeSLois Curfman McInnes @*/ 1521329f5518SBarry Smith int SNESGetTolerances(SNES snes,PetscReal *atol,PetscReal *rtol,PetscReal *stol,int *maxit,int *maxf) 152233174efeSLois Curfman McInnes { 15233a40ed3dSBarry Smith PetscFunctionBegin; 152433174efeSLois Curfman McInnes PetscValidHeaderSpecific(snes,SNES_COOKIE); 152533174efeSLois Curfman McInnes if (atol) *atol = snes->atol; 152633174efeSLois Curfman McInnes if (rtol) *rtol = snes->rtol; 152733174efeSLois Curfman McInnes if (stol) *stol = snes->xtol; 152833174efeSLois Curfman McInnes if (maxit) *maxit = snes->max_its; 152933174efeSLois Curfman McInnes if (maxf) *maxf = snes->max_funcs; 15303a40ed3dSBarry Smith PetscFunctionReturn(0); 153133174efeSLois Curfman McInnes } 153233174efeSLois Curfman McInnes 15334a2ae208SSatish Balay #undef __FUNCT__ 15344a2ae208SSatish Balay #define __FUNCT__ "SNESSetTrustRegionTolerance" 153533174efeSLois Curfman McInnes /*@ 15369b94acceSBarry Smith SNESSetTrustRegionTolerance - Sets the trust region parameter tolerance. 15379b94acceSBarry Smith 1538fee21e36SBarry Smith Collective on SNES 1539fee21e36SBarry Smith 1540c7afd0dbSLois Curfman McInnes Input Parameters: 1541c7afd0dbSLois Curfman McInnes + snes - the SNES context 1542c7afd0dbSLois Curfman McInnes - tol - tolerance 1543c7afd0dbSLois Curfman McInnes 15449b94acceSBarry Smith Options Database Key: 1545c7afd0dbSLois Curfman McInnes . -snes_trtol <tol> - Sets tol 15469b94acceSBarry Smith 154736851e7fSLois Curfman McInnes Level: intermediate 154836851e7fSLois Curfman McInnes 15499b94acceSBarry Smith .keywords: SNES, nonlinear, set, trust region, tolerance 15509b94acceSBarry Smith 1551d7a720efSLois Curfman McInnes .seealso: SNESSetTolerances(), SNESSetMinimizationFunctionTolerance() 15529b94acceSBarry Smith @*/ 1553329f5518SBarry Smith int SNESSetTrustRegionTolerance(SNES snes,PetscReal tol) 15549b94acceSBarry Smith { 15553a40ed3dSBarry Smith PetscFunctionBegin; 155677c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 15579b94acceSBarry Smith snes->deltatol = tol; 15583a40ed3dSBarry Smith PetscFunctionReturn(0); 15599b94acceSBarry Smith } 15609b94acceSBarry Smith 15614a2ae208SSatish Balay #undef __FUNCT__ 15624a2ae208SSatish Balay #define __FUNCT__ "SNESSetMinimizationFunctionTolerance" 15639b94acceSBarry Smith /*@ 156477c4ece6SBarry Smith SNESSetMinimizationFunctionTolerance - Sets the minimum allowable function tolerance 15659b94acceSBarry Smith for unconstrained minimization solvers. 15669b94acceSBarry Smith 1567fee21e36SBarry Smith Collective on SNES 1568fee21e36SBarry Smith 1569c7afd0dbSLois Curfman McInnes Input Parameters: 1570c7afd0dbSLois Curfman McInnes + snes - the SNES context 1571c7afd0dbSLois Curfman McInnes - ftol - minimum function tolerance 1572c7afd0dbSLois Curfman McInnes 15739b94acceSBarry Smith Options Database Key: 1574c7afd0dbSLois Curfman McInnes . -snes_fmin <ftol> - Sets ftol 15759b94acceSBarry Smith 15769b94acceSBarry Smith Note: 157777c4ece6SBarry Smith SNESSetMinimizationFunctionTolerance() is valid for SNES_UNCONSTRAINED_MINIMIZATION 15789b94acceSBarry Smith methods only. 15799b94acceSBarry Smith 158036851e7fSLois Curfman McInnes Level: intermediate 158136851e7fSLois Curfman McInnes 15829b94acceSBarry Smith .keywords: SNES, nonlinear, set, minimum, convergence, function, tolerance 15839b94acceSBarry Smith 1584d7a720efSLois Curfman McInnes .seealso: SNESSetTolerances(), SNESSetTrustRegionTolerance() 15859b94acceSBarry Smith @*/ 1586329f5518SBarry Smith int SNESSetMinimizationFunctionTolerance(SNES snes,PetscReal ftol) 15879b94acceSBarry Smith { 15883a40ed3dSBarry Smith PetscFunctionBegin; 158977c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 15909b94acceSBarry Smith snes->fmin = ftol; 15913a40ed3dSBarry Smith PetscFunctionReturn(0); 15929b94acceSBarry Smith } 1593df9fa365SBarry Smith /* 1594df9fa365SBarry Smith Duplicate the lg monitors for SNES from KSP; for some reason with 1595df9fa365SBarry Smith dynamic libraries things don't work under Sun4 if we just use 1596df9fa365SBarry Smith macros instead of functions 1597df9fa365SBarry Smith */ 15984a2ae208SSatish Balay #undef __FUNCT__ 15994a2ae208SSatish Balay #define __FUNCT__ "SNESLGMonitor" 1600329f5518SBarry Smith int SNESLGMonitor(SNES snes,int it,PetscReal norm,void *ctx) 1601ce1608b8SBarry Smith { 1602ce1608b8SBarry Smith int ierr; 1603ce1608b8SBarry Smith 1604ce1608b8SBarry Smith PetscFunctionBegin; 1605184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1606ce1608b8SBarry Smith ierr = KSPLGMonitor((KSP)snes,it,norm,ctx);CHKERRQ(ierr); 1607ce1608b8SBarry Smith PetscFunctionReturn(0); 1608ce1608b8SBarry Smith } 1609ce1608b8SBarry Smith 16104a2ae208SSatish Balay #undef __FUNCT__ 16114a2ae208SSatish Balay #define __FUNCT__ "SNESLGMonitorCreate" 1612b0a32e0cSBarry Smith int SNESLGMonitorCreate(char *host,char *label,int x,int y,int m,int n,PetscDrawLG *draw) 1613df9fa365SBarry Smith { 1614df9fa365SBarry Smith int ierr; 1615df9fa365SBarry Smith 1616df9fa365SBarry Smith PetscFunctionBegin; 1617df9fa365SBarry Smith ierr = KSPLGMonitorCreate(host,label,x,y,m,n,draw);CHKERRQ(ierr); 1618df9fa365SBarry Smith PetscFunctionReturn(0); 1619df9fa365SBarry Smith } 1620df9fa365SBarry Smith 16214a2ae208SSatish Balay #undef __FUNCT__ 16224a2ae208SSatish Balay #define __FUNCT__ "SNESLGMonitorDestroy" 1623b0a32e0cSBarry Smith int SNESLGMonitorDestroy(PetscDrawLG draw) 1624df9fa365SBarry Smith { 1625df9fa365SBarry Smith int ierr; 1626df9fa365SBarry Smith 1627df9fa365SBarry Smith PetscFunctionBegin; 1628df9fa365SBarry Smith ierr = KSPLGMonitorDestroy(draw);CHKERRQ(ierr); 1629df9fa365SBarry Smith PetscFunctionReturn(0); 1630df9fa365SBarry Smith } 1631df9fa365SBarry Smith 16329b94acceSBarry Smith /* ------------ Routines to set performance monitoring options ----------- */ 16339b94acceSBarry Smith 16344a2ae208SSatish Balay #undef __FUNCT__ 16354a2ae208SSatish Balay #define __FUNCT__ "SNESSetMonitor" 16369b94acceSBarry Smith /*@C 16375cd90555SBarry Smith SNESSetMonitor - Sets an ADDITIONAL function that is to be used at every 16389b94acceSBarry Smith iteration of the nonlinear solver to display the iteration's 16399b94acceSBarry Smith progress. 16409b94acceSBarry Smith 1641fee21e36SBarry Smith Collective on SNES 1642fee21e36SBarry Smith 1643c7afd0dbSLois Curfman McInnes Input Parameters: 1644c7afd0dbSLois Curfman McInnes + snes - the SNES context 1645c7afd0dbSLois Curfman McInnes . func - monitoring routine 1646b8a78c4aSBarry Smith . mctx - [optional] user-defined context for private data for the 1647b3006f0bSLois Curfman McInnes monitor routine (use PETSC_NULL if no context is desitre) 1648b3006f0bSLois Curfman McInnes - monitordestroy - [optional] routine that frees monitor context 1649b3006f0bSLois Curfman McInnes (may be PETSC_NULL) 16509b94acceSBarry Smith 1651c7afd0dbSLois Curfman McInnes Calling sequence of func: 1652329f5518SBarry Smith $ int func(SNES snes,int its, PetscReal norm,void *mctx) 1653c7afd0dbSLois Curfman McInnes 1654c7afd0dbSLois Curfman McInnes + snes - the SNES context 1655c7afd0dbSLois Curfman McInnes . its - iteration number 1656c7afd0dbSLois Curfman McInnes . norm - 2-norm function value (may be estimated) 1657c7afd0dbSLois Curfman McInnes for SNES_NONLINEAR_EQUATIONS methods 165840a0c1c6SLois Curfman McInnes . norm - 2-norm gradient value (may be estimated) 1659c7afd0dbSLois Curfman McInnes for SNES_UNCONSTRAINED_MINIMIZATION methods 166040a0c1c6SLois Curfman McInnes - mctx - [optional] monitoring context 16619b94acceSBarry Smith 16629665c990SLois Curfman McInnes Options Database Keys: 1663c7afd0dbSLois Curfman McInnes + -snes_monitor - sets SNESDefaultMonitor() 1664c7afd0dbSLois Curfman McInnes . -snes_xmonitor - sets line graph monitor, 1665c7afd0dbSLois Curfman McInnes uses SNESLGMonitorCreate() 1666c7afd0dbSLois Curfman McInnes _ -snes_cancelmonitors - cancels all monitors that have 1667c7afd0dbSLois Curfman McInnes been hardwired into a code by 1668c7afd0dbSLois Curfman McInnes calls to SNESSetMonitor(), but 1669c7afd0dbSLois Curfman McInnes does not cancel those set via 1670c7afd0dbSLois Curfman McInnes the options database. 16719665c990SLois Curfman McInnes 1672639f9d9dSBarry Smith Notes: 16736bc08f3fSLois Curfman McInnes Several different monitoring routines may be set by calling 16746bc08f3fSLois Curfman McInnes SNESSetMonitor() multiple times; all will be called in the 16756bc08f3fSLois Curfman McInnes order in which they were set. 1676639f9d9dSBarry Smith 167736851e7fSLois Curfman McInnes Level: intermediate 167836851e7fSLois Curfman McInnes 16799b94acceSBarry Smith .keywords: SNES, nonlinear, set, monitor 16809b94acceSBarry Smith 16815cd90555SBarry Smith .seealso: SNESDefaultMonitor(), SNESClearMonitor() 16829b94acceSBarry Smith @*/ 1683329f5518SBarry Smith int SNESSetMonitor(SNES snes,int (*func)(SNES,int,PetscReal,void*),void *mctx,int (*monitordestroy)(void *)) 16849b94acceSBarry Smith { 16853a40ed3dSBarry Smith PetscFunctionBegin; 1686184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1687639f9d9dSBarry Smith if (snes->numbermonitors >= MAXSNESMONITORS) { 168829bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Too many monitors set"); 1689639f9d9dSBarry Smith } 1690639f9d9dSBarry Smith 1691639f9d9dSBarry Smith snes->monitor[snes->numbermonitors] = func; 1692b8a78c4aSBarry Smith snes->monitordestroy[snes->numbermonitors] = monitordestroy; 1693639f9d9dSBarry Smith snes->monitorcontext[snes->numbermonitors++] = (void*)mctx; 16943a40ed3dSBarry Smith PetscFunctionReturn(0); 16959b94acceSBarry Smith } 16969b94acceSBarry Smith 16974a2ae208SSatish Balay #undef __FUNCT__ 16984a2ae208SSatish Balay #define __FUNCT__ "SNESClearMonitor" 16995cd90555SBarry Smith /*@C 17005cd90555SBarry Smith SNESClearMonitor - Clears all the monitor functions for a SNES object. 17015cd90555SBarry Smith 1702c7afd0dbSLois Curfman McInnes Collective on SNES 1703c7afd0dbSLois Curfman McInnes 17045cd90555SBarry Smith Input Parameters: 17055cd90555SBarry Smith . snes - the SNES context 17065cd90555SBarry Smith 17075cd90555SBarry Smith Options Database: 1708c7afd0dbSLois Curfman McInnes . -snes_cancelmonitors - cancels all monitors that have been hardwired 1709c7afd0dbSLois Curfman McInnes into a code by calls to SNESSetMonitor(), but does not cancel those 1710c7afd0dbSLois Curfman McInnes set via the options database 17115cd90555SBarry Smith 17125cd90555SBarry Smith Notes: 17135cd90555SBarry Smith There is no way to clear one specific monitor from a SNES object. 17145cd90555SBarry Smith 171536851e7fSLois Curfman McInnes Level: intermediate 171636851e7fSLois Curfman McInnes 17175cd90555SBarry Smith .keywords: SNES, nonlinear, set, monitor 17185cd90555SBarry Smith 17195cd90555SBarry Smith .seealso: SNESDefaultMonitor(), SNESSetMonitor() 17205cd90555SBarry Smith @*/ 17215cd90555SBarry Smith int SNESClearMonitor(SNES snes) 17225cd90555SBarry Smith { 17235cd90555SBarry Smith PetscFunctionBegin; 1724184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 17255cd90555SBarry Smith snes->numbermonitors = 0; 17265cd90555SBarry Smith PetscFunctionReturn(0); 17275cd90555SBarry Smith } 17285cd90555SBarry Smith 17294a2ae208SSatish Balay #undef __FUNCT__ 17304a2ae208SSatish Balay #define __FUNCT__ "SNESSetConvergenceTest" 17319b94acceSBarry Smith /*@C 17329b94acceSBarry Smith SNESSetConvergenceTest - Sets the function that is to be used 17339b94acceSBarry Smith to test for convergence of the nonlinear iterative solution. 17349b94acceSBarry Smith 1735fee21e36SBarry Smith Collective on SNES 1736fee21e36SBarry Smith 1737c7afd0dbSLois Curfman McInnes Input Parameters: 1738c7afd0dbSLois Curfman McInnes + snes - the SNES context 1739c7afd0dbSLois Curfman McInnes . func - routine to test for convergence 1740c7afd0dbSLois Curfman McInnes - cctx - [optional] context for private data for the convergence routine 1741c7afd0dbSLois Curfman McInnes (may be PETSC_NULL) 17429b94acceSBarry Smith 1743c7afd0dbSLois Curfman McInnes Calling sequence of func: 1744329f5518SBarry Smith $ int func (SNES snes,PetscReal xnorm,PetscReal gnorm,PetscReal f,SNESConvergedReason *reason,void *cctx) 1745c7afd0dbSLois Curfman McInnes 1746c7afd0dbSLois Curfman McInnes + snes - the SNES context 1747c7afd0dbSLois Curfman McInnes . cctx - [optional] convergence context 1748184914b5SBarry Smith . reason - reason for convergence/divergence 1749c7afd0dbSLois Curfman McInnes . xnorm - 2-norm of current iterate 1750c7afd0dbSLois Curfman McInnes . gnorm - 2-norm of current step (SNES_NONLINEAR_EQUATIONS methods) 1751c7afd0dbSLois Curfman McInnes . f - 2-norm of function (SNES_NONLINEAR_EQUATIONS methods) 1752c7afd0dbSLois Curfman McInnes . gnorm - 2-norm of current gradient (SNES_UNCONSTRAINED_MINIMIZATION methods) 1753c7afd0dbSLois Curfman McInnes - f - function value (SNES_UNCONSTRAINED_MINIMIZATION methods) 17549b94acceSBarry Smith 175536851e7fSLois Curfman McInnes Level: advanced 175636851e7fSLois Curfman McInnes 17579b94acceSBarry Smith .keywords: SNES, nonlinear, set, convergence, test 17589b94acceSBarry Smith 175940191667SLois Curfman McInnes .seealso: SNESConverged_EQ_LS(), SNESConverged_EQ_TR(), 176040191667SLois Curfman McInnes SNESConverged_UM_LS(), SNESConverged_UM_TR() 17619b94acceSBarry Smith @*/ 1762329f5518SBarry Smith int SNESSetConvergenceTest(SNES snes,int (*func)(SNES,PetscReal,PetscReal,PetscReal,SNESConvergedReason*,void*),void *cctx) 17639b94acceSBarry Smith { 17643a40ed3dSBarry Smith PetscFunctionBegin; 1765184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 17669b94acceSBarry Smith (snes)->converged = func; 17679b94acceSBarry Smith (snes)->cnvP = cctx; 17683a40ed3dSBarry Smith PetscFunctionReturn(0); 17699b94acceSBarry Smith } 17709b94acceSBarry Smith 17714a2ae208SSatish Balay #undef __FUNCT__ 17724a2ae208SSatish Balay #define __FUNCT__ "SNESGetConvergedReason" 1773184914b5SBarry Smith /*@C 1774184914b5SBarry Smith SNESGetConvergedReason - Gets the reason the SNES iteration was stopped. 1775184914b5SBarry Smith 1776184914b5SBarry Smith Not Collective 1777184914b5SBarry Smith 1778184914b5SBarry Smith Input Parameter: 1779184914b5SBarry Smith . snes - the SNES context 1780184914b5SBarry Smith 1781184914b5SBarry Smith Output Parameter: 1782e090d566SSatish Balay . reason - negative value indicates diverged, positive value converged, see petscsnes.h or the 1783184914b5SBarry Smith manual pages for the individual convergence tests for complete lists 1784184914b5SBarry Smith 1785184914b5SBarry Smith Level: intermediate 1786184914b5SBarry Smith 1787184914b5SBarry Smith Notes: Can only be called after the call the SNESSolve() is complete. 1788184914b5SBarry Smith 1789184914b5SBarry Smith .keywords: SNES, nonlinear, set, convergence, test 1790184914b5SBarry Smith 1791184914b5SBarry Smith .seealso: SNESSetConvergenceTest(), SNESConverged_EQ_LS(), SNESConverged_EQ_TR(), 1792435da068SBarry Smith SNESConverged_UM_LS(), SNESConverged_UM_TR(), SNESConvergedReason 1793184914b5SBarry Smith @*/ 1794184914b5SBarry Smith int SNESGetConvergedReason(SNES snes,SNESConvergedReason *reason) 1795184914b5SBarry Smith { 1796184914b5SBarry Smith PetscFunctionBegin; 1797184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1798184914b5SBarry Smith *reason = snes->reason; 1799184914b5SBarry Smith PetscFunctionReturn(0); 1800184914b5SBarry Smith } 1801184914b5SBarry Smith 18024a2ae208SSatish Balay #undef __FUNCT__ 18034a2ae208SSatish Balay #define __FUNCT__ "SNESSetConvergenceHistory" 1804c9005455SLois Curfman McInnes /*@ 1805c9005455SLois Curfman McInnes SNESSetConvergenceHistory - Sets the array used to hold the convergence history. 1806c9005455SLois Curfman McInnes 1807fee21e36SBarry Smith Collective on SNES 1808fee21e36SBarry Smith 1809c7afd0dbSLois Curfman McInnes Input Parameters: 1810c7afd0dbSLois Curfman McInnes + snes - iterative context obtained from SNESCreate() 1811c7afd0dbSLois Curfman McInnes . a - array to hold history 1812cd5578b5SBarry Smith . its - integer array holds the number of linear iterations for each solve. 1813758f92a0SBarry Smith . na - size of a and its 181464731454SLois Curfman McInnes - reset - PETSC_TRUE indicates each new nonlinear solve resets the history counter to zero, 1815758f92a0SBarry Smith else it continues storing new values for new nonlinear solves after the old ones 1816c7afd0dbSLois Curfman McInnes 1817c9005455SLois Curfman McInnes Notes: 1818c9005455SLois Curfman McInnes If set, this array will contain the function norms (for 1819c9005455SLois Curfman McInnes SNES_NONLINEAR_EQUATIONS methods) or gradient norms 1820c9005455SLois Curfman McInnes (for SNES_UNCONSTRAINED_MINIMIZATION methods) computed 1821c9005455SLois Curfman McInnes at each step. 1822c9005455SLois Curfman McInnes 1823c9005455SLois Curfman McInnes This routine is useful, e.g., when running a code for purposes 1824c9005455SLois Curfman McInnes of accurate performance monitoring, when no I/O should be done 1825c9005455SLois Curfman McInnes during the section of code that is being timed. 1826c9005455SLois Curfman McInnes 182736851e7fSLois Curfman McInnes Level: intermediate 182836851e7fSLois Curfman McInnes 1829c9005455SLois Curfman McInnes .keywords: SNES, set, convergence, history 1830758f92a0SBarry Smith 183108405cd6SLois Curfman McInnes .seealso: SNESGetConvergenceHistory() 1832758f92a0SBarry Smith 1833c9005455SLois Curfman McInnes @*/ 1834329f5518SBarry Smith int SNESSetConvergenceHistory(SNES snes,PetscReal *a,int *its,int na,PetscTruth reset) 1835c9005455SLois Curfman McInnes { 18363a40ed3dSBarry Smith PetscFunctionBegin; 1837c9005455SLois Curfman McInnes PetscValidHeaderSpecific(snes,SNES_COOKIE); 1838c9005455SLois Curfman McInnes if (na) PetscValidScalarPointer(a); 1839c9005455SLois Curfman McInnes snes->conv_hist = a; 1840758f92a0SBarry Smith snes->conv_hist_its = its; 1841758f92a0SBarry Smith snes->conv_hist_max = na; 1842758f92a0SBarry Smith snes->conv_hist_reset = reset; 1843758f92a0SBarry Smith PetscFunctionReturn(0); 1844758f92a0SBarry Smith } 1845758f92a0SBarry Smith 18464a2ae208SSatish Balay #undef __FUNCT__ 18474a2ae208SSatish Balay #define __FUNCT__ "SNESGetConvergenceHistory" 18480c4c9dddSBarry Smith /*@C 1849758f92a0SBarry Smith SNESGetConvergenceHistory - Gets the array used to hold the convergence history. 1850758f92a0SBarry Smith 1851758f92a0SBarry Smith Collective on SNES 1852758f92a0SBarry Smith 1853758f92a0SBarry Smith Input Parameter: 1854758f92a0SBarry Smith . snes - iterative context obtained from SNESCreate() 1855758f92a0SBarry Smith 1856758f92a0SBarry Smith Output Parameters: 1857758f92a0SBarry Smith . a - array to hold history 1858758f92a0SBarry Smith . its - integer array holds the number of linear iterations (or 1859758f92a0SBarry Smith negative if not converged) for each solve. 1860758f92a0SBarry Smith - na - size of a and its 1861758f92a0SBarry Smith 1862758f92a0SBarry Smith Notes: 1863758f92a0SBarry Smith The calling sequence for this routine in Fortran is 1864758f92a0SBarry Smith $ call SNESGetConvergenceHistory(SNES snes, integer na, integer ierr) 1865758f92a0SBarry Smith 1866758f92a0SBarry Smith This routine is useful, e.g., when running a code for purposes 1867758f92a0SBarry Smith of accurate performance monitoring, when no I/O should be done 1868758f92a0SBarry Smith during the section of code that is being timed. 1869758f92a0SBarry Smith 1870758f92a0SBarry Smith Level: intermediate 1871758f92a0SBarry Smith 1872758f92a0SBarry Smith .keywords: SNES, get, convergence, history 1873758f92a0SBarry Smith 1874758f92a0SBarry Smith .seealso: SNESSetConvergencHistory() 1875758f92a0SBarry Smith 1876758f92a0SBarry Smith @*/ 1877329f5518SBarry Smith int SNESGetConvergenceHistory(SNES snes,PetscReal **a,int **its,int *na) 1878758f92a0SBarry Smith { 1879758f92a0SBarry Smith PetscFunctionBegin; 1880758f92a0SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1881758f92a0SBarry Smith if (a) *a = snes->conv_hist; 1882758f92a0SBarry Smith if (its) *its = snes->conv_hist_its; 1883758f92a0SBarry Smith if (na) *na = snes->conv_hist_len; 18843a40ed3dSBarry Smith PetscFunctionReturn(0); 1885c9005455SLois Curfman McInnes } 1886c9005455SLois Curfman McInnes 18874a2ae208SSatish Balay #undef __FUNCT__ 18884a2ae208SSatish Balay #define __FUNCT__ "SNESScaleStep_Private" 18899b94acceSBarry Smith /* 18909b94acceSBarry Smith SNESScaleStep_Private - Scales a step so that its length is less than the 18919b94acceSBarry Smith positive parameter delta. 18929b94acceSBarry Smith 18939b94acceSBarry Smith Input Parameters: 1894c7afd0dbSLois Curfman McInnes + snes - the SNES context 18959b94acceSBarry Smith . y - approximate solution of linear system 18969b94acceSBarry Smith . fnorm - 2-norm of current function 1897c7afd0dbSLois Curfman McInnes - delta - trust region size 18989b94acceSBarry Smith 18999b94acceSBarry Smith Output Parameters: 1900c7afd0dbSLois Curfman McInnes + gpnorm - predicted function norm at the new point, assuming local 19019b94acceSBarry Smith linearization. The value is zero if the step lies within the trust 19029b94acceSBarry Smith region, and exceeds zero otherwise. 1903c7afd0dbSLois Curfman McInnes - ynorm - 2-norm of the step 19049b94acceSBarry Smith 19059b94acceSBarry Smith Note: 19066831982aSBarry Smith For non-trust region methods such as SNESEQLS, the parameter delta 19079b94acceSBarry Smith is set to be the maximum allowable step size. 19089b94acceSBarry Smith 19099b94acceSBarry Smith .keywords: SNES, nonlinear, scale, step 19109b94acceSBarry Smith */ 1911329f5518SBarry Smith int SNESScaleStep_Private(SNES snes,Vec y,PetscReal *fnorm,PetscReal *delta, 1912329f5518SBarry Smith PetscReal *gpnorm,PetscReal *ynorm) 19139b94acceSBarry Smith { 1914329f5518SBarry Smith PetscReal norm; 1915ea709b57SSatish Balay PetscScalar cnorm; 19163a40ed3dSBarry Smith int ierr; 19173a40ed3dSBarry Smith 19183a40ed3dSBarry Smith PetscFunctionBegin; 1919184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1920184914b5SBarry Smith PetscValidHeaderSpecific(y,VEC_COOKIE); 1921184914b5SBarry Smith PetscCheckSameComm(snes,y); 1922184914b5SBarry Smith 19233a40ed3dSBarry Smith ierr = VecNorm(y,NORM_2,&norm);CHKERRQ(ierr); 19249b94acceSBarry Smith if (norm > *delta) { 19259b94acceSBarry Smith norm = *delta/norm; 19269b94acceSBarry Smith *gpnorm = (1.0 - norm)*(*fnorm); 19279b94acceSBarry Smith cnorm = norm; 1928329f5518SBarry Smith ierr = VecScale(&cnorm,y);CHKERRQ(ierr); 19299b94acceSBarry Smith *ynorm = *delta; 19309b94acceSBarry Smith } else { 19319b94acceSBarry Smith *gpnorm = 0.0; 19329b94acceSBarry Smith *ynorm = norm; 19339b94acceSBarry Smith } 19343a40ed3dSBarry Smith PetscFunctionReturn(0); 19359b94acceSBarry Smith } 19369b94acceSBarry Smith 19374a2ae208SSatish Balay #undef __FUNCT__ 19384a2ae208SSatish Balay #define __FUNCT__ "SNESSolve" 19399b94acceSBarry Smith /*@ 19409b94acceSBarry Smith SNESSolve - Solves a nonlinear system. Call SNESSolve after calling 194163a78c88SLois Curfman McInnes SNESCreate() and optional routines of the form SNESSetXXX(). 19429b94acceSBarry Smith 1943c7afd0dbSLois Curfman McInnes Collective on SNES 1944c7afd0dbSLois Curfman McInnes 1945b2002411SLois Curfman McInnes Input Parameters: 1946c7afd0dbSLois Curfman McInnes + snes - the SNES context 1947c7afd0dbSLois Curfman McInnes - x - the solution vector 19489b94acceSBarry Smith 19499b94acceSBarry Smith Output Parameter: 1950b2002411SLois Curfman McInnes . its - number of iterations until termination 19519b94acceSBarry Smith 1952b2002411SLois Curfman McInnes Notes: 19538ddd3da0SLois Curfman McInnes The user should initialize the vector,x, with the initial guess 19548ddd3da0SLois Curfman McInnes for the nonlinear solve prior to calling SNESSolve. In particular, 19558ddd3da0SLois Curfman McInnes to employ an initial guess of zero, the user should explicitly set 19568ddd3da0SLois Curfman McInnes this vector to zero by calling VecSet(). 19578ddd3da0SLois Curfman McInnes 195836851e7fSLois Curfman McInnes Level: beginner 195936851e7fSLois Curfman McInnes 19609b94acceSBarry Smith .keywords: SNES, nonlinear, solve 19619b94acceSBarry Smith 196263a78c88SLois Curfman McInnes .seealso: SNESCreate(), SNESDestroy() 19639b94acceSBarry Smith @*/ 19648ddd3da0SLois Curfman McInnes int SNESSolve(SNES snes,Vec x,int *its) 19659b94acceSBarry Smith { 1966f1af5d2fSBarry Smith int ierr; 1967f1af5d2fSBarry Smith PetscTruth flg; 1968052efed2SBarry Smith 19693a40ed3dSBarry Smith PetscFunctionBegin; 197077c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1971184914b5SBarry Smith PetscValidHeaderSpecific(x,VEC_COOKIE); 1972184914b5SBarry Smith PetscCheckSameComm(snes,x); 197374679c65SBarry Smith PetscValidIntPointer(its); 197429bbc08cSBarry Smith if (!snes->solve) SETERRQ(1,"SNESSetType() or SNESSetFromOptions() must be called before SNESSolve()"); 197574637425SBarry Smith 197682bf6240SBarry Smith if (!snes->setupcalled) {ierr = SNESSetUp(snes,x);CHKERRQ(ierr);} 1977c4fc05e7SBarry Smith else {snes->vec_sol = snes->vec_sol_always = x;} 1978758f92a0SBarry Smith if (snes->conv_hist_reset == PETSC_TRUE) snes->conv_hist_len = 0; 1979b0a32e0cSBarry Smith ierr = PetscLogEventBegin(SNES_Solve,snes,0,0,0);CHKERRQ(ierr); 1980c96a6f78SLois Curfman McInnes snes->nfuncs = 0; snes->linear_its = 0; snes->nfailures = 0; 19819b94acceSBarry Smith ierr = (*(snes)->solve)(snes,its);CHKERRQ(ierr); 1982b0a32e0cSBarry Smith ierr = PetscLogEventEnd(SNES_Solve,snes,0,0,0);CHKERRQ(ierr); 1983b0a32e0cSBarry Smith ierr = PetscOptionsHasName(snes->prefix,"-snes_view",&flg);CHKERRQ(ierr); 198493b98531SBarry Smith if (flg && !PetscPreLoadingOn) { ierr = SNESView(snes,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); } 19853a40ed3dSBarry Smith PetscFunctionReturn(0); 19869b94acceSBarry Smith } 19879b94acceSBarry Smith 19889b94acceSBarry Smith /* --------- Internal routines for SNES Package --------- */ 19899b94acceSBarry Smith 19904a2ae208SSatish Balay #undef __FUNCT__ 19914a2ae208SSatish Balay #define __FUNCT__ "SNESSetType" 199282bf6240SBarry Smith /*@C 19934b0e389bSBarry Smith SNESSetType - Sets the method for the nonlinear solver. 19949b94acceSBarry Smith 1995fee21e36SBarry Smith Collective on SNES 1996fee21e36SBarry Smith 1997c7afd0dbSLois Curfman McInnes Input Parameters: 1998c7afd0dbSLois Curfman McInnes + snes - the SNES context 1999454a90a3SBarry Smith - type - a known method 2000c7afd0dbSLois Curfman McInnes 2001c7afd0dbSLois Curfman McInnes Options Database Key: 2002454a90a3SBarry Smith . -snes_type <type> - Sets the method; use -help for a list 2003c7afd0dbSLois Curfman McInnes of available methods (for instance, ls or tr) 2004ae12b187SLois Curfman McInnes 20059b94acceSBarry Smith Notes: 2006e090d566SSatish Balay See "petsc/include/petscsnes.h" for available methods (for instance) 20076831982aSBarry Smith + SNESEQLS - Newton's method with line search 2008c7afd0dbSLois Curfman McInnes (systems of nonlinear equations) 20096831982aSBarry Smith . SNESEQTR - Newton's method with trust region 2010c7afd0dbSLois Curfman McInnes (systems of nonlinear equations) 20116831982aSBarry Smith . SNESUMTR - Newton's method with trust region 2012c7afd0dbSLois Curfman McInnes (unconstrained minimization) 20136831982aSBarry Smith - SNESUMLS - Newton's method with line search 2014c7afd0dbSLois Curfman McInnes (unconstrained minimization) 20159b94acceSBarry Smith 2016ae12b187SLois Curfman McInnes Normally, it is best to use the SNESSetFromOptions() command and then 2017ae12b187SLois Curfman McInnes set the SNES solver type from the options database rather than by using 2018ae12b187SLois Curfman McInnes this routine. Using the options database provides the user with 2019ae12b187SLois Curfman McInnes maximum flexibility in evaluating the many nonlinear solvers. 2020ae12b187SLois Curfman McInnes The SNESSetType() routine is provided for those situations where it 2021ae12b187SLois Curfman McInnes is necessary to set the nonlinear solver independently of the command 2022ae12b187SLois Curfman McInnes line or options database. This might be the case, for example, when 2023ae12b187SLois Curfman McInnes the choice of solver changes during the execution of the program, 2024ae12b187SLois Curfman McInnes and the user's application is taking responsibility for choosing the 2025b0a32e0cSBarry Smith appropriate method. 202636851e7fSLois Curfman McInnes 202736851e7fSLois Curfman McInnes Level: intermediate 2028a703fe33SLois Curfman McInnes 2029454a90a3SBarry Smith .keywords: SNES, set, type 2030435da068SBarry Smith 2031435da068SBarry Smith .seealso: SNESType, SNESCreate() 2032435da068SBarry Smith 20339b94acceSBarry Smith @*/ 2034454a90a3SBarry Smith int SNESSetType(SNES snes,SNESType type) 20359b94acceSBarry Smith { 20360f5bd95cSBarry Smith int ierr,(*r)(SNES); 20376831982aSBarry Smith PetscTruth match; 20383a40ed3dSBarry Smith 20393a40ed3dSBarry Smith PetscFunctionBegin; 204077c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 20410f5bd95cSBarry Smith PetscValidCharPointer(type); 204282bf6240SBarry Smith 20436831982aSBarry Smith ierr = PetscTypeCompare((PetscObject)snes,type,&match);CHKERRQ(ierr); 20440f5bd95cSBarry Smith if (match) PetscFunctionReturn(0); 204582bf6240SBarry Smith 204682bf6240SBarry Smith if (snes->setupcalled) { 2047e1311b90SBarry Smith ierr = (*(snes)->destroy)(snes);CHKERRQ(ierr); 204882bf6240SBarry Smith snes->data = 0; 204982bf6240SBarry Smith } 20507d1a2b2bSBarry Smith 20519b94acceSBarry Smith /* Get the function pointers for the iterative method requested */ 205282bf6240SBarry Smith if (!SNESRegisterAllCalled) {ierr = SNESRegisterAll(PETSC_NULL);CHKERRQ(ierr);} 205382bf6240SBarry Smith 2054b9617806SBarry Smith ierr = PetscFListFind(snes->comm,SNESList,type,(void (**)(void)) &r);CHKERRQ(ierr); 205582bf6240SBarry Smith 205629bbc08cSBarry Smith if (!r) SETERRQ1(1,"Unable to find requested SNES type %s",type); 20571548b14aSBarry Smith 2058606d414cSSatish Balay if (snes->data) {ierr = PetscFree(snes->data);CHKERRQ(ierr);} 205982bf6240SBarry Smith snes->data = 0; 20603a40ed3dSBarry Smith ierr = (*r)(snes);CHKERRQ(ierr); 206182bf6240SBarry Smith 2062454a90a3SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)snes,type);CHKERRQ(ierr); 206382bf6240SBarry Smith snes->set_method_called = 1; 206482bf6240SBarry Smith 20653a40ed3dSBarry Smith PetscFunctionReturn(0); 20669b94acceSBarry Smith } 20679b94acceSBarry Smith 2068a847f771SSatish Balay 20699b94acceSBarry Smith /* --------------------------------------------------------------------- */ 20704a2ae208SSatish Balay #undef __FUNCT__ 20714a2ae208SSatish Balay #define __FUNCT__ "SNESRegisterDestroy" 20729b94acceSBarry Smith /*@C 20739b94acceSBarry Smith SNESRegisterDestroy - Frees the list of nonlinear solvers that were 2074f1af5d2fSBarry Smith registered by SNESRegisterDynamic(). 20759b94acceSBarry Smith 2076fee21e36SBarry Smith Not Collective 2077fee21e36SBarry Smith 207836851e7fSLois Curfman McInnes Level: advanced 207936851e7fSLois Curfman McInnes 20809b94acceSBarry Smith .keywords: SNES, nonlinear, register, destroy 20819b94acceSBarry Smith 20829b94acceSBarry Smith .seealso: SNESRegisterAll(), SNESRegisterAll() 20839b94acceSBarry Smith @*/ 2084cf256101SBarry Smith int SNESRegisterDestroy(void) 20859b94acceSBarry Smith { 208682bf6240SBarry Smith int ierr; 208782bf6240SBarry Smith 20883a40ed3dSBarry Smith PetscFunctionBegin; 208982bf6240SBarry Smith if (SNESList) { 2090b0a32e0cSBarry Smith ierr = PetscFListDestroy(&SNESList);CHKERRQ(ierr); 209182bf6240SBarry Smith SNESList = 0; 20929b94acceSBarry Smith } 20934c49b128SBarry Smith SNESRegisterAllCalled = PETSC_FALSE; 20943a40ed3dSBarry Smith PetscFunctionReturn(0); 20959b94acceSBarry Smith } 20969b94acceSBarry Smith 20974a2ae208SSatish Balay #undef __FUNCT__ 20984a2ae208SSatish Balay #define __FUNCT__ "SNESGetType" 20999b94acceSBarry Smith /*@C 21009a28b0a6SLois Curfman McInnes SNESGetType - Gets the SNES method type and name (as a string). 21019b94acceSBarry Smith 2102c7afd0dbSLois Curfman McInnes Not Collective 2103c7afd0dbSLois Curfman McInnes 21049b94acceSBarry Smith Input Parameter: 21054b0e389bSBarry Smith . snes - nonlinear solver context 21069b94acceSBarry Smith 21079b94acceSBarry Smith Output Parameter: 21083a7fca6bSBarry Smith . type - SNES method (a character string) 21099b94acceSBarry Smith 211036851e7fSLois Curfman McInnes Level: intermediate 211136851e7fSLois Curfman McInnes 2112454a90a3SBarry Smith .keywords: SNES, nonlinear, get, type, name 21139b94acceSBarry Smith @*/ 2114454a90a3SBarry Smith int SNESGetType(SNES snes,SNESType *type) 21159b94acceSBarry Smith { 21163a40ed3dSBarry Smith PetscFunctionBegin; 2117184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2118454a90a3SBarry Smith *type = snes->type_name; 21193a40ed3dSBarry Smith PetscFunctionReturn(0); 21209b94acceSBarry Smith } 21219b94acceSBarry Smith 21224a2ae208SSatish Balay #undef __FUNCT__ 21234a2ae208SSatish Balay #define __FUNCT__ "SNESGetSolution" 21249b94acceSBarry Smith /*@C 21259b94acceSBarry Smith SNESGetSolution - Returns the vector where the approximate solution is 21269b94acceSBarry Smith stored. 21279b94acceSBarry Smith 2128c7afd0dbSLois Curfman McInnes Not Collective, but Vec is parallel if SNES is parallel 2129c7afd0dbSLois Curfman McInnes 21309b94acceSBarry Smith Input Parameter: 21319b94acceSBarry Smith . snes - the SNES context 21329b94acceSBarry Smith 21339b94acceSBarry Smith Output Parameter: 21349b94acceSBarry Smith . x - the solution 21359b94acceSBarry Smith 213636851e7fSLois Curfman McInnes Level: advanced 213736851e7fSLois Curfman McInnes 21389b94acceSBarry Smith .keywords: SNES, nonlinear, get, solution 21399b94acceSBarry Smith 2140a86d99e1SLois Curfman McInnes .seealso: SNESGetFunction(), SNESGetGradient(), SNESGetSolutionUpdate() 21419b94acceSBarry Smith @*/ 21429b94acceSBarry Smith int SNESGetSolution(SNES snes,Vec *x) 21439b94acceSBarry Smith { 21443a40ed3dSBarry Smith PetscFunctionBegin; 214577c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 21469b94acceSBarry Smith *x = snes->vec_sol_always; 21473a40ed3dSBarry Smith PetscFunctionReturn(0); 21489b94acceSBarry Smith } 21499b94acceSBarry Smith 21504a2ae208SSatish Balay #undef __FUNCT__ 21514a2ae208SSatish Balay #define __FUNCT__ "SNESGetSolutionUpdate" 21529b94acceSBarry Smith /*@C 21539b94acceSBarry Smith SNESGetSolutionUpdate - Returns the vector where the solution update is 21549b94acceSBarry Smith 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: 21629b94acceSBarry Smith . x - the solution update 21639b94acceSBarry Smith 216436851e7fSLois Curfman McInnes Level: advanced 216536851e7fSLois Curfman McInnes 21669b94acceSBarry Smith .keywords: SNES, nonlinear, get, solution, update 21679b94acceSBarry Smith 21689b94acceSBarry Smith .seealso: SNESGetSolution(), SNESGetFunction 21699b94acceSBarry Smith @*/ 21709b94acceSBarry Smith int SNESGetSolutionUpdate(SNES snes,Vec *x) 21719b94acceSBarry Smith { 21723a40ed3dSBarry Smith PetscFunctionBegin; 217377c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 21749b94acceSBarry Smith *x = snes->vec_sol_update_always; 21753a40ed3dSBarry Smith PetscFunctionReturn(0); 21769b94acceSBarry Smith } 21779b94acceSBarry Smith 21784a2ae208SSatish Balay #undef __FUNCT__ 21794a2ae208SSatish Balay #define __FUNCT__ "SNESGetFunction" 21809b94acceSBarry Smith /*@C 21813638b69dSLois Curfman McInnes SNESGetFunction - Returns the vector where the function is stored. 21829b94acceSBarry Smith 2183c7afd0dbSLois Curfman McInnes Not Collective, but Vec is parallel if SNES is parallel 2184c7afd0dbSLois Curfman McInnes 21859b94acceSBarry Smith Input Parameter: 21869b94acceSBarry Smith . snes - the SNES context 21879b94acceSBarry Smith 21889b94acceSBarry Smith Output Parameter: 21897bf4e008SBarry Smith + r - the function (or PETSC_NULL) 219000036973SBarry Smith . ctx - the function context (or PETSC_NULL) 219100036973SBarry Smith - func - the function (or PETSC_NULL) 21929b94acceSBarry Smith 21939b94acceSBarry Smith Notes: 21949b94acceSBarry Smith SNESGetFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only 21959b94acceSBarry Smith Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are 21969b94acceSBarry Smith SNESGetMinimizationFunction() and SNESGetGradient(); 21979b94acceSBarry Smith 219836851e7fSLois Curfman McInnes Level: advanced 219936851e7fSLois Curfman McInnes 2200a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, get, function 22019b94acceSBarry Smith 220231615d04SLois Curfman McInnes .seealso: SNESSetFunction(), SNESGetSolution(), SNESGetMinimizationFunction(), 220331615d04SLois Curfman McInnes SNESGetGradient() 22047bf4e008SBarry Smith 22059b94acceSBarry Smith @*/ 220600036973SBarry Smith int SNESGetFunction(SNES snes,Vec *r,void **ctx,int (**func)(SNES,Vec,Vec,void*)) 22079b94acceSBarry Smith { 22083a40ed3dSBarry Smith PetscFunctionBegin; 220977c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2210a8c6a408SBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 221129bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only"); 2212a8c6a408SBarry Smith } 22137bf4e008SBarry Smith if (r) *r = snes->vec_func_always; 22147bf4e008SBarry Smith if (ctx) *ctx = snes->funP; 221500036973SBarry Smith if (func) *func = snes->computefunction; 22163a40ed3dSBarry Smith PetscFunctionReturn(0); 22179b94acceSBarry Smith } 22189b94acceSBarry Smith 22194a2ae208SSatish Balay #undef __FUNCT__ 22204a2ae208SSatish Balay #define __FUNCT__ "SNESGetGradient" 22219b94acceSBarry Smith /*@C 22223638b69dSLois Curfman McInnes SNESGetGradient - Returns the vector where the gradient is stored. 22239b94acceSBarry Smith 2224c7afd0dbSLois Curfman McInnes Not Collective, but Vec is parallel if SNES is parallel 2225c7afd0dbSLois Curfman McInnes 22269b94acceSBarry Smith Input Parameter: 22279b94acceSBarry Smith . snes - the SNES context 22289b94acceSBarry Smith 22299b94acceSBarry Smith Output Parameter: 22307bf4e008SBarry Smith + r - the gradient (or PETSC_NULL) 22317bf4e008SBarry Smith - ctx - the gradient context (or PETSC_NULL) 22329b94acceSBarry Smith 22339b94acceSBarry Smith Notes: 22349b94acceSBarry Smith SNESGetGradient() is valid for SNES_UNCONSTRAINED_MINIMIZATION methods 22359b94acceSBarry Smith only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is 22369b94acceSBarry Smith SNESGetFunction(). 22379b94acceSBarry Smith 223836851e7fSLois Curfman McInnes Level: advanced 223936851e7fSLois Curfman McInnes 22409b94acceSBarry Smith .keywords: SNES, nonlinear, get, gradient 22419b94acceSBarry Smith 22427bf4e008SBarry Smith .seealso: SNESGetMinimizationFunction(), SNESGetSolution(), SNESGetFunction(), 22437bf4e008SBarry Smith SNESSetGradient(), SNESSetFunction() 22447bf4e008SBarry Smith 22459b94acceSBarry Smith @*/ 22467bf4e008SBarry Smith int SNESGetGradient(SNES snes,Vec *r,void **ctx) 22479b94acceSBarry Smith { 22483a40ed3dSBarry Smith PetscFunctionBegin; 224977c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 22503a40ed3dSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 225129bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 22523a40ed3dSBarry Smith } 22537bf4e008SBarry Smith if (r) *r = snes->vec_func_always; 22547bf4e008SBarry Smith if (ctx) *ctx = snes->funP; 22553a40ed3dSBarry Smith PetscFunctionReturn(0); 22569b94acceSBarry Smith } 22579b94acceSBarry Smith 22584a2ae208SSatish Balay #undef __FUNCT__ 22594a2ae208SSatish Balay #define __FUNCT__ "SNESGetMinimizationFunction" 22607bf4e008SBarry Smith /*@C 22619b94acceSBarry Smith SNESGetMinimizationFunction - Returns the scalar function value for 22629b94acceSBarry Smith unconstrained minimization problems. 22639b94acceSBarry Smith 2264c7afd0dbSLois Curfman McInnes Not Collective 2265c7afd0dbSLois Curfman McInnes 22669b94acceSBarry Smith Input Parameter: 22679b94acceSBarry Smith . snes - the SNES context 22689b94acceSBarry Smith 22699b94acceSBarry Smith Output Parameter: 22707bf4e008SBarry Smith + r - the function (or PETSC_NULL) 22717bf4e008SBarry Smith - ctx - the function context (or PETSC_NULL) 22729b94acceSBarry Smith 22739b94acceSBarry Smith Notes: 22749b94acceSBarry Smith SNESGetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION 22759b94acceSBarry Smith methods only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is 22769b94acceSBarry Smith SNESGetFunction(). 22779b94acceSBarry Smith 227836851e7fSLois Curfman McInnes Level: advanced 227936851e7fSLois Curfman McInnes 22809b94acceSBarry Smith .keywords: SNES, nonlinear, get, function 22819b94acceSBarry Smith 22827bf4e008SBarry Smith .seealso: SNESGetGradient(), SNESGetSolution(), SNESGetFunction(), SNESSetFunction() 22837bf4e008SBarry Smith 22849b94acceSBarry Smith @*/ 2285329f5518SBarry Smith int SNESGetMinimizationFunction(SNES snes,PetscReal *r,void **ctx) 22869b94acceSBarry Smith { 22873a40ed3dSBarry Smith PetscFunctionBegin; 228877c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 228974679c65SBarry Smith PetscValidScalarPointer(r); 22903a40ed3dSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 229129bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 22923a40ed3dSBarry Smith } 22937bf4e008SBarry Smith if (r) *r = snes->fc; 22947bf4e008SBarry Smith if (ctx) *ctx = snes->umfunP; 22953a40ed3dSBarry Smith PetscFunctionReturn(0); 22969b94acceSBarry Smith } 22979b94acceSBarry Smith 22984a2ae208SSatish Balay #undef __FUNCT__ 22994a2ae208SSatish Balay #define __FUNCT__ "SNESSetOptionsPrefix" 23003c7409f5SSatish Balay /*@C 23013c7409f5SSatish Balay SNESSetOptionsPrefix - Sets the prefix used for searching for all 2302d850072dSLois Curfman McInnes SNES options in the database. 23033c7409f5SSatish Balay 2304fee21e36SBarry Smith Collective on SNES 2305fee21e36SBarry Smith 2306c7afd0dbSLois Curfman McInnes Input Parameter: 2307c7afd0dbSLois Curfman McInnes + snes - the SNES context 2308c7afd0dbSLois Curfman McInnes - prefix - the prefix to prepend to all option names 2309c7afd0dbSLois Curfman McInnes 2310d850072dSLois Curfman McInnes Notes: 2311a83b1b31SSatish Balay A hyphen (-) must NOT be given at the beginning of the prefix name. 2312c7afd0dbSLois Curfman McInnes The first character of all runtime options is AUTOMATICALLY the hyphen. 2313d850072dSLois Curfman McInnes 231436851e7fSLois Curfman McInnes Level: advanced 231536851e7fSLois Curfman McInnes 23163c7409f5SSatish Balay .keywords: SNES, set, options, prefix, database 2317a86d99e1SLois Curfman McInnes 2318a86d99e1SLois Curfman McInnes .seealso: SNESSetFromOptions() 23193c7409f5SSatish Balay @*/ 23203c7409f5SSatish Balay int SNESSetOptionsPrefix(SNES snes,char *prefix) 23213c7409f5SSatish Balay { 23223c7409f5SSatish Balay int ierr; 23233c7409f5SSatish Balay 23243a40ed3dSBarry Smith PetscFunctionBegin; 232577c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2326639f9d9dSBarry Smith ierr = PetscObjectSetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr); 23273c7409f5SSatish Balay ierr = SLESSetOptionsPrefix(snes->sles,prefix);CHKERRQ(ierr); 23283a40ed3dSBarry Smith PetscFunctionReturn(0); 23293c7409f5SSatish Balay } 23303c7409f5SSatish Balay 23314a2ae208SSatish Balay #undef __FUNCT__ 23324a2ae208SSatish Balay #define __FUNCT__ "SNESAppendOptionsPrefix" 23333c7409f5SSatish Balay /*@C 2334f525115eSLois Curfman McInnes SNESAppendOptionsPrefix - Appends to the prefix used for searching for all 2335d850072dSLois Curfman McInnes SNES options in the database. 23363c7409f5SSatish Balay 2337fee21e36SBarry Smith Collective on SNES 2338fee21e36SBarry Smith 2339c7afd0dbSLois Curfman McInnes Input Parameters: 2340c7afd0dbSLois Curfman McInnes + snes - the SNES context 2341c7afd0dbSLois Curfman McInnes - prefix - the prefix to prepend to all option names 2342c7afd0dbSLois Curfman McInnes 2343d850072dSLois Curfman McInnes Notes: 2344a83b1b31SSatish Balay A hyphen (-) must NOT be given at the beginning of the prefix name. 2345c7afd0dbSLois Curfman McInnes The first character of all runtime options is AUTOMATICALLY the hyphen. 2346d850072dSLois Curfman McInnes 234736851e7fSLois Curfman McInnes Level: advanced 234836851e7fSLois Curfman McInnes 23493c7409f5SSatish Balay .keywords: SNES, append, options, prefix, database 2350a86d99e1SLois Curfman McInnes 2351a86d99e1SLois Curfman McInnes .seealso: SNESGetOptionsPrefix() 23523c7409f5SSatish Balay @*/ 23533c7409f5SSatish Balay int SNESAppendOptionsPrefix(SNES snes,char *prefix) 23543c7409f5SSatish Balay { 23553c7409f5SSatish Balay int ierr; 23563c7409f5SSatish Balay 23573a40ed3dSBarry Smith PetscFunctionBegin; 235877c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2359639f9d9dSBarry Smith ierr = PetscObjectAppendOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr); 23603c7409f5SSatish Balay ierr = SLESAppendOptionsPrefix(snes->sles,prefix);CHKERRQ(ierr); 23613a40ed3dSBarry Smith PetscFunctionReturn(0); 23623c7409f5SSatish Balay } 23633c7409f5SSatish Balay 23644a2ae208SSatish Balay #undef __FUNCT__ 23654a2ae208SSatish Balay #define __FUNCT__ "SNESGetOptionsPrefix" 23669ab63eb5SSatish Balay /*@C 23673c7409f5SSatish Balay SNESGetOptionsPrefix - Sets the prefix used for searching for all 23683c7409f5SSatish Balay SNES options in the database. 23693c7409f5SSatish Balay 2370c7afd0dbSLois Curfman McInnes Not Collective 2371c7afd0dbSLois Curfman McInnes 23723c7409f5SSatish Balay Input Parameter: 23733c7409f5SSatish Balay . snes - the SNES context 23743c7409f5SSatish Balay 23753c7409f5SSatish Balay Output Parameter: 23763c7409f5SSatish Balay . prefix - pointer to the prefix string used 23773c7409f5SSatish Balay 23789ab63eb5SSatish Balay Notes: On the fortran side, the user should pass in a string 'prifix' of 23799ab63eb5SSatish Balay sufficient length to hold the prefix. 23809ab63eb5SSatish Balay 238136851e7fSLois Curfman McInnes Level: advanced 238236851e7fSLois Curfman McInnes 23833c7409f5SSatish Balay .keywords: SNES, get, options, prefix, database 2384a86d99e1SLois Curfman McInnes 2385a86d99e1SLois Curfman McInnes .seealso: SNESAppendOptionsPrefix() 23863c7409f5SSatish Balay @*/ 23873c7409f5SSatish Balay int SNESGetOptionsPrefix(SNES snes,char **prefix) 23883c7409f5SSatish Balay { 23893c7409f5SSatish Balay int ierr; 23903c7409f5SSatish Balay 23913a40ed3dSBarry Smith PetscFunctionBegin; 239277c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2393639f9d9dSBarry Smith ierr = PetscObjectGetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr); 23943a40ed3dSBarry Smith PetscFunctionReturn(0); 23953c7409f5SSatish Balay } 23963c7409f5SSatish Balay 2397acb85ae6SSatish Balay /*MC 2398f1af5d2fSBarry Smith SNESRegisterDynamic - Adds a method to the nonlinear solver package. 23999b94acceSBarry Smith 2400b2002411SLois Curfman McInnes Synopsis: 24013a7fca6bSBarry Smith int SNESRegisterDynamic(char *name_solver,char *path,char *name_create,int (*routine_create)(SNES)) 24029b94acceSBarry Smith 24038d76a1e5SLois Curfman McInnes Not collective 24048d76a1e5SLois Curfman McInnes 2405b2002411SLois Curfman McInnes Input Parameters: 2406c7afd0dbSLois Curfman McInnes + name_solver - name of a new user-defined solver 2407b2002411SLois Curfman McInnes . path - path (either absolute or relative) the library containing this solver 2408b2002411SLois Curfman McInnes . name_create - name of routine to create method context 2409c7afd0dbSLois Curfman McInnes - routine_create - routine to create method context 24109b94acceSBarry Smith 2411b2002411SLois Curfman McInnes Notes: 2412f1af5d2fSBarry Smith SNESRegisterDynamic() may be called multiple times to add several user-defined solvers. 24133a40ed3dSBarry Smith 2414b2002411SLois Curfman McInnes If dynamic libraries are used, then the fourth input argument (routine_create) 2415b2002411SLois Curfman McInnes is ignored. 2416b2002411SLois Curfman McInnes 2417b9617806SBarry Smith Environmental variables such as ${PETSC_ARCH}, ${PETSC_DIR}, ${PETSC_LIB_DIR}, ${BOPT}, 24185ba88a07SLois Curfman McInnes and others of the form ${any_environmental_variable} occuring in pathname will be 24195ba88a07SLois Curfman McInnes replaced with appropriate values. 24205ba88a07SLois Curfman McInnes 2421b2002411SLois Curfman McInnes Sample usage: 242269225d78SLois Curfman McInnes .vb 2423f1af5d2fSBarry Smith SNESRegisterDynamic("my_solver",/home/username/my_lib/lib/libg/solaris/mylib.a, 2424b2002411SLois Curfman McInnes "MySolverCreate",MySolverCreate); 242569225d78SLois Curfman McInnes .ve 2426b2002411SLois Curfman McInnes 2427b2002411SLois Curfman McInnes Then, your solver can be chosen with the procedural interface via 2428b2002411SLois Curfman McInnes $ SNESSetType(snes,"my_solver") 2429b2002411SLois Curfman McInnes or at runtime via the option 2430b2002411SLois Curfman McInnes $ -snes_type my_solver 2431b2002411SLois Curfman McInnes 243236851e7fSLois Curfman McInnes Level: advanced 243336851e7fSLois Curfman McInnes 2434b2002411SLois Curfman McInnes .keywords: SNES, nonlinear, register 2435b2002411SLois Curfman McInnes 2436b2002411SLois Curfman McInnes .seealso: SNESRegisterAll(), SNESRegisterDestroy() 2437b2002411SLois Curfman McInnes M*/ 2438b2002411SLois Curfman McInnes 24394a2ae208SSatish Balay #undef __FUNCT__ 24404a2ae208SSatish Balay #define __FUNCT__ "SNESRegister" 2441f1af5d2fSBarry Smith int SNESRegister(char *sname,char *path,char *name,int (*function)(SNES)) 2442b2002411SLois Curfman McInnes { 2443b2002411SLois Curfman McInnes char fullname[256]; 2444b2002411SLois Curfman McInnes int ierr; 2445b2002411SLois Curfman McInnes 2446b2002411SLois Curfman McInnes PetscFunctionBegin; 2447b0a32e0cSBarry Smith ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr); 2448b9617806SBarry Smith ierr = PetscFListAdd(&SNESList,sname,fullname,(void (*)())function);CHKERRQ(ierr); 2449b2002411SLois Curfman McInnes PetscFunctionReturn(0); 2450b2002411SLois Curfman McInnes } 2451