1*ea709b57SSatish Balay /*$Id: snes.c,v 1.233 2001/08/06 21:17:07 bsmith Exp balay $*/ 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); 101b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," tolerances: relative=%g, absolute=%g, truncation=%g, solution=%g\n", 102d132466eSBarry Smith snes->rtol,snes->atol,snes->trunctol,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; 608b18e04deSLois Curfman McInnes snes->trunctol = 1.e-12; /* no longer used */ 6099b94acceSBarry Smith snes->nfuncs = 0; 6109b94acceSBarry Smith snes->nfailures = 0; 6117a00f4a9SLois Curfman McInnes snes->linear_its = 0; 612639f9d9dSBarry Smith snes->numbermonitors = 0; 6139b94acceSBarry Smith snes->data = 0; 6149b94acceSBarry Smith snes->view = 0; 6159b94acceSBarry Smith snes->computeumfunction = 0; 6169b94acceSBarry Smith snes->umfunP = 0; 6179b94acceSBarry Smith snes->fc = 0; 6189b94acceSBarry Smith snes->deltatol = 1.e-12; 6199b94acceSBarry Smith snes->fmin = -1.e30; 6209b94acceSBarry Smith snes->method_class = type; 6219b94acceSBarry Smith snes->set_method_called = 0; 62282bf6240SBarry Smith snes->setupcalled = 0; 623186905e3SBarry Smith snes->ksp_ewconv = PETSC_FALSE; 6246f24a144SLois Curfman McInnes snes->vwork = 0; 6256f24a144SLois Curfman McInnes snes->nwork = 0; 626758f92a0SBarry Smith snes->conv_hist_len = 0; 627758f92a0SBarry Smith snes->conv_hist_max = 0; 628758f92a0SBarry Smith snes->conv_hist = PETSC_NULL; 629758f92a0SBarry Smith snes->conv_hist_its = PETSC_NULL; 630758f92a0SBarry Smith snes->conv_hist_reset = PETSC_TRUE; 631184914b5SBarry Smith snes->reason = SNES_CONVERGED_ITERATING; 6329b94acceSBarry Smith 6339b94acceSBarry Smith /* Create context to compute Eisenstat-Walker relative tolerance for KSP */ 634b0a32e0cSBarry Smith ierr = PetscNew(SNES_KSP_EW_ConvCtx,&kctx);CHKERRQ(ierr); 635b0a32e0cSBarry Smith PetscLogObjectMemory(snes,sizeof(SNES_KSP_EW_ConvCtx)); 6369b94acceSBarry Smith snes->kspconvctx = (void*)kctx; 6379b94acceSBarry Smith kctx->version = 2; 6389b94acceSBarry Smith kctx->rtol_0 = .3; /* Eisenstat and Walker suggest rtol_0=.5, but 6399b94acceSBarry Smith this was too large for some test cases */ 6409b94acceSBarry Smith kctx->rtol_last = 0; 6419b94acceSBarry Smith kctx->rtol_max = .9; 6429b94acceSBarry Smith kctx->gamma = 1.0; 6439b94acceSBarry Smith kctx->alpha2 = .5*(1.0 + sqrt(5.0)); 6449b94acceSBarry Smith kctx->alpha = kctx->alpha2; 6459b94acceSBarry Smith kctx->threshold = .1; 6469b94acceSBarry Smith kctx->lresid_last = 0; 6479b94acceSBarry Smith kctx->norm_last = 0; 6489b94acceSBarry Smith 6499b94acceSBarry Smith ierr = SLESCreate(comm,&snes->sles);CHKERRQ(ierr); 650b0a32e0cSBarry Smith PetscLogObjectParent(snes,snes->sles) 6515334005bSBarry Smith 6529b94acceSBarry Smith *outsnes = snes; 65300036973SBarry Smith ierr = PetscPublishAll(snes);CHKERRQ(ierr); 6543a40ed3dSBarry Smith PetscFunctionReturn(0); 6559b94acceSBarry Smith } 6569b94acceSBarry Smith 6579b94acceSBarry Smith /* --------------------------------------------------------------- */ 6584a2ae208SSatish Balay #undef __FUNCT__ 6594a2ae208SSatish Balay #define __FUNCT__ "SNESSetFunction" 6609b94acceSBarry Smith /*@C 6619b94acceSBarry Smith SNESSetFunction - Sets the function evaluation routine and function 6629b94acceSBarry Smith vector for use by the SNES routines in solving systems of nonlinear 6639b94acceSBarry Smith equations. 6649b94acceSBarry Smith 665fee21e36SBarry Smith Collective on SNES 666fee21e36SBarry Smith 667c7afd0dbSLois Curfman McInnes Input Parameters: 668c7afd0dbSLois Curfman McInnes + snes - the SNES context 669c7afd0dbSLois Curfman McInnes . func - function evaluation routine 670c7afd0dbSLois Curfman McInnes . r - vector to store function value 671c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined context for private data for the 672c7afd0dbSLois Curfman McInnes function evaluation routine (may be PETSC_NULL) 6739b94acceSBarry Smith 674c7afd0dbSLois Curfman McInnes Calling sequence of func: 6758d76a1e5SLois Curfman McInnes $ func (SNES snes,Vec x,Vec f,void *ctx); 676c7afd0dbSLois Curfman McInnes 677313e4042SLois Curfman McInnes . f - function vector 678c7afd0dbSLois Curfman McInnes - ctx - optional user-defined function context 6799b94acceSBarry Smith 6809b94acceSBarry Smith Notes: 6819b94acceSBarry Smith The Newton-like methods typically solve linear systems of the form 6829b94acceSBarry Smith $ f'(x) x = -f(x), 683c7afd0dbSLois Curfman McInnes where f'(x) denotes the Jacobian matrix and f(x) is the function. 6849b94acceSBarry Smith 6859b94acceSBarry Smith SNESSetFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only. 6869b94acceSBarry Smith Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are 6879b94acceSBarry Smith SNESSetMinimizationFunction() and SNESSetGradient(); 6889b94acceSBarry Smith 68936851e7fSLois Curfman McInnes Level: beginner 69036851e7fSLois Curfman McInnes 6919b94acceSBarry Smith .keywords: SNES, nonlinear, set, function 6929b94acceSBarry Smith 693a86d99e1SLois Curfman McInnes .seealso: SNESGetFunction(), SNESComputeFunction(), SNESSetJacobian() 6949b94acceSBarry Smith @*/ 6955334005bSBarry Smith int SNESSetFunction(SNES snes,Vec r,int (*func)(SNES,Vec,Vec,void*),void *ctx) 6969b94acceSBarry Smith { 6973a40ed3dSBarry Smith PetscFunctionBegin; 69877c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 699184914b5SBarry Smith PetscValidHeaderSpecific(r,VEC_COOKIE); 700184914b5SBarry Smith PetscCheckSameComm(snes,r); 701a8c6a408SBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 70229bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only"); 703a8c6a408SBarry Smith } 704184914b5SBarry Smith 7059b94acceSBarry Smith snes->computefunction = func; 7069b94acceSBarry Smith snes->vec_func = snes->vec_func_always = r; 7079b94acceSBarry Smith snes->funP = ctx; 7083a40ed3dSBarry Smith PetscFunctionReturn(0); 7099b94acceSBarry Smith } 7109b94acceSBarry Smith 7114a2ae208SSatish Balay #undef __FUNCT__ 7124a2ae208SSatish Balay #define __FUNCT__ "SNESComputeFunction" 7139b94acceSBarry Smith /*@ 71436851e7fSLois Curfman McInnes SNESComputeFunction - Calls the function that has been set with 7159b94acceSBarry Smith SNESSetFunction(). 7169b94acceSBarry Smith 717c7afd0dbSLois Curfman McInnes Collective on SNES 718c7afd0dbSLois Curfman McInnes 7199b94acceSBarry Smith Input Parameters: 720c7afd0dbSLois Curfman McInnes + snes - the SNES context 721c7afd0dbSLois Curfman McInnes - x - input vector 7229b94acceSBarry Smith 7239b94acceSBarry Smith Output Parameter: 7243638b69dSLois Curfman McInnes . y - function vector, as set by SNESSetFunction() 7259b94acceSBarry Smith 7261bffabb2SLois Curfman McInnes Notes: 7279b94acceSBarry Smith SNESComputeFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only. 7289b94acceSBarry Smith Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are 7299b94acceSBarry Smith SNESComputeMinimizationFunction() and SNESComputeGradient(); 7309b94acceSBarry Smith 73136851e7fSLois Curfman McInnes SNESComputeFunction() is typically used within nonlinear solvers 73236851e7fSLois Curfman McInnes implementations, so most users would not generally call this routine 73336851e7fSLois Curfman McInnes themselves. 73436851e7fSLois Curfman McInnes 73536851e7fSLois Curfman McInnes Level: developer 73636851e7fSLois Curfman McInnes 7379b94acceSBarry Smith .keywords: SNES, nonlinear, compute, function 7389b94acceSBarry Smith 739a86d99e1SLois Curfman McInnes .seealso: SNESSetFunction(), SNESGetFunction() 7409b94acceSBarry Smith @*/ 7419b94acceSBarry Smith int SNESComputeFunction(SNES snes,Vec x,Vec y) 7429b94acceSBarry Smith { 7439b94acceSBarry Smith int ierr; 7449b94acceSBarry Smith 7453a40ed3dSBarry Smith PetscFunctionBegin; 746184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 747184914b5SBarry Smith PetscValidHeaderSpecific(x,VEC_COOKIE); 748184914b5SBarry Smith PetscValidHeaderSpecific(y,VEC_COOKIE); 749184914b5SBarry Smith PetscCheckSameComm(snes,x); 750184914b5SBarry Smith PetscCheckSameComm(snes,y); 751d4bb536fSBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 75229bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only"); 753d4bb536fSBarry Smith } 754184914b5SBarry Smith 755b0a32e0cSBarry Smith ierr = PetscLogEventBegin(SNES_FunctionEval,snes,x,y,0);CHKERRQ(ierr); 756d64ed03dSBarry Smith PetscStackPush("SNES user function"); 7579b94acceSBarry Smith ierr = (*snes->computefunction)(snes,x,y,snes->funP);CHKERRQ(ierr); 758d64ed03dSBarry Smith PetscStackPop; 759ae3c334cSLois Curfman McInnes snes->nfuncs++; 760b0a32e0cSBarry Smith ierr = PetscLogEventEnd(SNES_FunctionEval,snes,x,y,0);CHKERRQ(ierr); 7613a40ed3dSBarry Smith PetscFunctionReturn(0); 7629b94acceSBarry Smith } 7639b94acceSBarry Smith 7644a2ae208SSatish Balay #undef __FUNCT__ 7654a2ae208SSatish Balay #define __FUNCT__ "SNESSetMinimizationFunction" 7669b94acceSBarry Smith /*@C 7679b94acceSBarry Smith SNESSetMinimizationFunction - Sets the function evaluation routine for 7689b94acceSBarry Smith unconstrained minimization. 7699b94acceSBarry Smith 770fee21e36SBarry Smith Collective on SNES 771fee21e36SBarry Smith 772c7afd0dbSLois Curfman McInnes Input Parameters: 773c7afd0dbSLois Curfman McInnes + snes - the SNES context 774c7afd0dbSLois Curfman McInnes . func - function evaluation routine 775c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined context for private data for the 776c7afd0dbSLois Curfman McInnes function evaluation routine (may be PETSC_NULL) 7779b94acceSBarry Smith 778c7afd0dbSLois Curfman McInnes Calling sequence of func: 779329f5518SBarry Smith $ func (SNES snes,Vec x,PetscReal *f,void *ctx); 780c7afd0dbSLois Curfman McInnes 781c7afd0dbSLois Curfman McInnes + x - input vector 7829b94acceSBarry Smith . f - function 783c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined function context 7849b94acceSBarry Smith 78536851e7fSLois Curfman McInnes Level: beginner 78636851e7fSLois Curfman McInnes 7879b94acceSBarry Smith Notes: 7889b94acceSBarry Smith SNESSetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION 7899b94acceSBarry Smith methods only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is 7909b94acceSBarry Smith SNESSetFunction(). 7919b94acceSBarry Smith 7929b94acceSBarry Smith .keywords: SNES, nonlinear, set, minimization, function 7939b94acceSBarry Smith 794a86d99e1SLois Curfman McInnes .seealso: SNESGetMinimizationFunction(), SNESComputeMinimizationFunction(), 795a86d99e1SLois Curfman McInnes SNESSetHessian(), SNESSetGradient() 7969b94acceSBarry Smith @*/ 797329f5518SBarry Smith int SNESSetMinimizationFunction(SNES snes,int (*func)(SNES,Vec,PetscReal*,void*),void *ctx) 7989b94acceSBarry Smith { 7993a40ed3dSBarry Smith PetscFunctionBegin; 80077c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 801a8c6a408SBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 80229bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"Only for SNES_UNCONSTRAINED_MINIMIZATION"); 803a8c6a408SBarry Smith } 8049b94acceSBarry Smith snes->computeumfunction = func; 8059b94acceSBarry Smith snes->umfunP = ctx; 8063a40ed3dSBarry Smith PetscFunctionReturn(0); 8079b94acceSBarry Smith } 8089b94acceSBarry Smith 8094a2ae208SSatish Balay #undef __FUNCT__ 8104a2ae208SSatish Balay #define __FUNCT__ "SNESComputeMinimizationFunction" 8119b94acceSBarry Smith /*@ 8129b94acceSBarry Smith SNESComputeMinimizationFunction - Computes the function that has been 8139b94acceSBarry Smith set with SNESSetMinimizationFunction(). 8149b94acceSBarry Smith 815c7afd0dbSLois Curfman McInnes Collective on SNES 816c7afd0dbSLois Curfman McInnes 8179b94acceSBarry Smith Input Parameters: 818c7afd0dbSLois Curfman McInnes + snes - the SNES context 819c7afd0dbSLois Curfman McInnes - x - input vector 8209b94acceSBarry Smith 8219b94acceSBarry Smith Output Parameter: 8229b94acceSBarry Smith . y - function value 8239b94acceSBarry Smith 8249b94acceSBarry Smith Notes: 8259b94acceSBarry Smith SNESComputeMinimizationFunction() is valid only for 8269b94acceSBarry Smith SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for 8279b94acceSBarry Smith SNES_NONLINEAR_EQUATIONS methods is SNESComputeFunction(). 828a86d99e1SLois Curfman McInnes 82936851e7fSLois Curfman McInnes SNESComputeMinimizationFunction() is typically used within minimization 83036851e7fSLois Curfman McInnes implementations, so most users would not generally call this routine 83136851e7fSLois Curfman McInnes themselves. 83236851e7fSLois Curfman McInnes 83336851e7fSLois Curfman McInnes Level: developer 83436851e7fSLois Curfman McInnes 835a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, compute, minimization, function 836a86d99e1SLois Curfman McInnes 837a86d99e1SLois Curfman McInnes .seealso: SNESSetMinimizationFunction(), SNESGetMinimizationFunction(), 838a86d99e1SLois Curfman McInnes SNESComputeGradient(), SNESComputeHessian() 8399b94acceSBarry Smith @*/ 840329f5518SBarry Smith int SNESComputeMinimizationFunction(SNES snes,Vec x,PetscReal *y) 8419b94acceSBarry Smith { 8429b94acceSBarry Smith int ierr; 8433a40ed3dSBarry Smith 8443a40ed3dSBarry Smith PetscFunctionBegin; 845184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 846184914b5SBarry Smith PetscValidHeaderSpecific(x,VEC_COOKIE); 847184914b5SBarry Smith PetscCheckSameComm(snes,x); 848a8c6a408SBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 84929bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"Only for SNES_UNCONSTRAINED_MINIMIZATION"); 850a8c6a408SBarry Smith } 851184914b5SBarry Smith 852b0a32e0cSBarry Smith ierr = PetscLogEventBegin(SNES_MinimizationFunctionEval,snes,x,y,0);CHKERRQ(ierr); 853d64ed03dSBarry Smith PetscStackPush("SNES user minimzation function"); 8549b94acceSBarry Smith ierr = (*snes->computeumfunction)(snes,x,y,snes->umfunP);CHKERRQ(ierr); 855d64ed03dSBarry Smith PetscStackPop; 856ae3c334cSLois Curfman McInnes snes->nfuncs++; 857b0a32e0cSBarry Smith ierr = PetscLogEventEnd(SNES_MinimizationFunctionEval,snes,x,y,0);CHKERRQ(ierr); 8583a40ed3dSBarry Smith PetscFunctionReturn(0); 8599b94acceSBarry Smith } 8609b94acceSBarry Smith 8614a2ae208SSatish Balay #undef __FUNCT__ 8624a2ae208SSatish Balay #define __FUNCT__ "SNESSetGradient" 8639b94acceSBarry Smith /*@C 8649b94acceSBarry Smith SNESSetGradient - Sets the gradient evaluation routine and gradient 8659b94acceSBarry Smith vector for use by the SNES routines. 8669b94acceSBarry Smith 867c7afd0dbSLois Curfman McInnes Collective on SNES 868c7afd0dbSLois Curfman McInnes 8699b94acceSBarry Smith Input Parameters: 870c7afd0dbSLois Curfman McInnes + snes - the SNES context 8719b94acceSBarry Smith . func - function evaluation routine 872044dda88SLois Curfman McInnes . ctx - optional user-defined context for private data for the 873044dda88SLois Curfman McInnes gradient evaluation routine (may be PETSC_NULL) 874c7afd0dbSLois Curfman McInnes - r - vector to store gradient value 875fee21e36SBarry Smith 8769b94acceSBarry Smith Calling sequence of func: 8778d76a1e5SLois Curfman McInnes $ func (SNES, Vec x, Vec g, void *ctx); 8789b94acceSBarry Smith 879c7afd0dbSLois Curfman McInnes + x - input vector 8809b94acceSBarry Smith . g - gradient vector 881c7afd0dbSLois Curfman McInnes - ctx - optional user-defined gradient context 8829b94acceSBarry Smith 8839b94acceSBarry Smith Notes: 8849b94acceSBarry Smith SNESSetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION 8859b94acceSBarry Smith methods only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is 8869b94acceSBarry Smith SNESSetFunction(). 8879b94acceSBarry Smith 88836851e7fSLois Curfman McInnes Level: beginner 88936851e7fSLois Curfman McInnes 8909b94acceSBarry Smith .keywords: SNES, nonlinear, set, function 8919b94acceSBarry Smith 892a86d99e1SLois Curfman McInnes .seealso: SNESGetGradient(), SNESComputeGradient(), SNESSetHessian(), 893a86d99e1SLois Curfman McInnes SNESSetMinimizationFunction(), 8949b94acceSBarry Smith @*/ 89574679c65SBarry Smith int SNESSetGradient(SNES snes,Vec r,int (*func)(SNES,Vec,Vec,void*),void *ctx) 8969b94acceSBarry Smith { 8973a40ed3dSBarry Smith PetscFunctionBegin; 89877c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 899184914b5SBarry Smith PetscValidHeaderSpecific(r,VEC_COOKIE); 900184914b5SBarry Smith PetscCheckSameComm(snes,r); 901a8c6a408SBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 90229bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 903a8c6a408SBarry Smith } 9049b94acceSBarry Smith snes->computefunction = func; 9059b94acceSBarry Smith snes->vec_func = snes->vec_func_always = r; 9069b94acceSBarry Smith snes->funP = ctx; 9073a40ed3dSBarry Smith PetscFunctionReturn(0); 9089b94acceSBarry Smith } 9099b94acceSBarry Smith 9104a2ae208SSatish Balay #undef __FUNCT__ 9114a2ae208SSatish Balay #define __FUNCT__ "SNESComputeGradient" 9129b94acceSBarry Smith /*@ 913a86d99e1SLois Curfman McInnes SNESComputeGradient - Computes the gradient that has been set with 914a86d99e1SLois Curfman McInnes SNESSetGradient(). 9159b94acceSBarry Smith 916c7afd0dbSLois Curfman McInnes Collective on SNES 917c7afd0dbSLois Curfman McInnes 9189b94acceSBarry Smith Input Parameters: 919c7afd0dbSLois Curfman McInnes + snes - the SNES context 920c7afd0dbSLois Curfman McInnes - x - input vector 9219b94acceSBarry Smith 9229b94acceSBarry Smith Output Parameter: 9239b94acceSBarry Smith . y - gradient vector 9249b94acceSBarry Smith 9259b94acceSBarry Smith Notes: 9269b94acceSBarry Smith SNESComputeGradient() is valid only for 9279b94acceSBarry Smith SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for 9289b94acceSBarry Smith SNES_NONLINEAR_EQUATIONS methods is SNESComputeFunction(). 929a86d99e1SLois Curfman McInnes 93036851e7fSLois Curfman McInnes SNESComputeGradient() is typically used within minimization 93136851e7fSLois Curfman McInnes implementations, so most users would not generally call this routine 93236851e7fSLois Curfman McInnes themselves. 93336851e7fSLois Curfman McInnes 93436851e7fSLois Curfman McInnes Level: developer 93536851e7fSLois Curfman McInnes 936a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, compute, gradient 937a86d99e1SLois Curfman McInnes 938a86d99e1SLois Curfman McInnes .seealso: SNESSetGradient(), SNESGetGradient(), 939a86d99e1SLois Curfman McInnes SNESComputeMinimizationFunction(), SNESComputeHessian() 9409b94acceSBarry Smith @*/ 9419b94acceSBarry Smith int SNESComputeGradient(SNES snes,Vec x,Vec y) 9429b94acceSBarry Smith { 9439b94acceSBarry Smith int ierr; 9443a40ed3dSBarry Smith 9453a40ed3dSBarry Smith PetscFunctionBegin; 946184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 947184914b5SBarry Smith PetscValidHeaderSpecific(x,VEC_COOKIE); 948184914b5SBarry Smith PetscValidHeaderSpecific(y,VEC_COOKIE); 949184914b5SBarry Smith PetscCheckSameComm(snes,x); 950184914b5SBarry Smith PetscCheckSameComm(snes,y); 9513a40ed3dSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 95229bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 9533a40ed3dSBarry Smith } 954b0a32e0cSBarry Smith ierr = PetscLogEventBegin(SNES_GradientEval,snes,x,y,0);CHKERRQ(ierr); 955d64ed03dSBarry Smith PetscStackPush("SNES user gradient function"); 9569b94acceSBarry Smith ierr = (*snes->computefunction)(snes,x,y,snes->funP);CHKERRQ(ierr); 957d64ed03dSBarry Smith PetscStackPop; 958b0a32e0cSBarry Smith ierr = PetscLogEventEnd(SNES_GradientEval,snes,x,y,0);CHKERRQ(ierr); 9593a40ed3dSBarry Smith PetscFunctionReturn(0); 9609b94acceSBarry Smith } 9619b94acceSBarry Smith 9624a2ae208SSatish Balay #undef __FUNCT__ 9634a2ae208SSatish Balay #define __FUNCT__ "SNESComputeJacobian" 96462fef451SLois Curfman McInnes /*@ 96562fef451SLois Curfman McInnes SNESComputeJacobian - Computes the Jacobian matrix that has been 96662fef451SLois Curfman McInnes set with SNESSetJacobian(). 96762fef451SLois Curfman McInnes 968c7afd0dbSLois Curfman McInnes Collective on SNES and Mat 969c7afd0dbSLois Curfman McInnes 97062fef451SLois Curfman McInnes Input Parameters: 971c7afd0dbSLois Curfman McInnes + snes - the SNES context 972c7afd0dbSLois Curfman McInnes - x - input vector 97362fef451SLois Curfman McInnes 97462fef451SLois Curfman McInnes Output Parameters: 975c7afd0dbSLois Curfman McInnes + A - Jacobian matrix 97662fef451SLois Curfman McInnes . B - optional preconditioning matrix 977c7afd0dbSLois Curfman McInnes - flag - flag indicating matrix structure 978fee21e36SBarry Smith 97962fef451SLois Curfman McInnes Notes: 98062fef451SLois Curfman McInnes Most users should not need to explicitly call this routine, as it 98162fef451SLois Curfman McInnes is used internally within the nonlinear solvers. 98262fef451SLois Curfman McInnes 983dc5a77f8SLois Curfman McInnes See SLESSetOperators() for important information about setting the 984dc5a77f8SLois Curfman McInnes flag parameter. 98562fef451SLois Curfman McInnes 98662fef451SLois Curfman McInnes SNESComputeJacobian() is valid only for SNES_NONLINEAR_EQUATIONS 98762fef451SLois Curfman McInnes methods. An analogous routine for SNES_UNCONSTRAINED_MINIMIZATION 988005c665bSBarry Smith methods is SNESComputeHessian(). 98962fef451SLois Curfman McInnes 99036851e7fSLois Curfman McInnes Level: developer 99136851e7fSLois Curfman McInnes 99262fef451SLois Curfman McInnes .keywords: SNES, compute, Jacobian, matrix 99362fef451SLois Curfman McInnes 99462fef451SLois Curfman McInnes .seealso: SNESSetJacobian(), SLESSetOperators() 99562fef451SLois Curfman McInnes @*/ 9969b94acceSBarry Smith int SNESComputeJacobian(SNES snes,Vec X,Mat *A,Mat *B,MatStructure *flg) 9979b94acceSBarry Smith { 9989b94acceSBarry Smith int ierr; 9993a40ed3dSBarry Smith 10003a40ed3dSBarry Smith PetscFunctionBegin; 1001184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1002184914b5SBarry Smith PetscValidHeaderSpecific(X,VEC_COOKIE); 1003184914b5SBarry Smith PetscCheckSameComm(snes,X); 10043a40ed3dSBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 100529bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only"); 10063a40ed3dSBarry Smith } 10073a40ed3dSBarry Smith if (!snes->computejacobian) PetscFunctionReturn(0); 1008b0a32e0cSBarry Smith ierr = PetscLogEventBegin(SNES_JacobianEval,snes,X,*A,*B);CHKERRQ(ierr); 1009c4fc05e7SBarry Smith *flg = DIFFERENT_NONZERO_PATTERN; 1010d64ed03dSBarry Smith PetscStackPush("SNES user Jacobian function"); 10119b94acceSBarry Smith ierr = (*snes->computejacobian)(snes,X,A,B,flg,snes->jacP);CHKERRQ(ierr); 1012d64ed03dSBarry Smith PetscStackPop; 1013b0a32e0cSBarry Smith ierr = PetscLogEventEnd(SNES_JacobianEval,snes,X,*A,*B);CHKERRQ(ierr); 10146d84be18SBarry Smith /* make sure user returned a correct Jacobian and preconditioner */ 101577c4ece6SBarry Smith PetscValidHeaderSpecific(*A,MAT_COOKIE); 101677c4ece6SBarry Smith PetscValidHeaderSpecific(*B,MAT_COOKIE); 10173a40ed3dSBarry Smith PetscFunctionReturn(0); 10189b94acceSBarry Smith } 10199b94acceSBarry Smith 10204a2ae208SSatish Balay #undef __FUNCT__ 10214a2ae208SSatish Balay #define __FUNCT__ "SNESComputeHessian" 102262fef451SLois Curfman McInnes /*@ 102362fef451SLois Curfman McInnes SNESComputeHessian - Computes the Hessian matrix that has been 102462fef451SLois Curfman McInnes set with SNESSetHessian(). 102562fef451SLois Curfman McInnes 1026c7afd0dbSLois Curfman McInnes Collective on SNES and Mat 1027c7afd0dbSLois Curfman McInnes 102862fef451SLois Curfman McInnes Input Parameters: 1029c7afd0dbSLois Curfman McInnes + snes - the SNES context 1030c7afd0dbSLois Curfman McInnes - x - input vector 103162fef451SLois Curfman McInnes 103262fef451SLois Curfman McInnes Output Parameters: 1033c7afd0dbSLois Curfman McInnes + A - Hessian matrix 103462fef451SLois Curfman McInnes . B - optional preconditioning matrix 1035c7afd0dbSLois Curfman McInnes - flag - flag indicating matrix structure 1036fee21e36SBarry Smith 103762fef451SLois Curfman McInnes Notes: 103862fef451SLois Curfman McInnes Most users should not need to explicitly call this routine, as it 103962fef451SLois Curfman McInnes is used internally within the nonlinear solvers. 104062fef451SLois Curfman McInnes 1041dc5a77f8SLois Curfman McInnes See SLESSetOperators() for important information about setting the 1042dc5a77f8SLois Curfman McInnes flag parameter. 104362fef451SLois Curfman McInnes 104462fef451SLois Curfman McInnes SNESComputeHessian() is valid only for 104562fef451SLois Curfman McInnes SNES_UNCONSTRAINED_MINIMIZATION methods. An analogous routine for 104662fef451SLois Curfman McInnes SNES_NONLINEAR_EQUATIONS methods is SNESComputeJacobian(). 104762fef451SLois Curfman McInnes 104836851e7fSLois Curfman McInnes SNESComputeHessian() is typically used within minimization 104936851e7fSLois Curfman McInnes implementations, so most users would not generally call this routine 105036851e7fSLois Curfman McInnes themselves. 105136851e7fSLois Curfman McInnes 105236851e7fSLois Curfman McInnes Level: developer 105336851e7fSLois Curfman McInnes 105462fef451SLois Curfman McInnes .keywords: SNES, compute, Hessian, matrix 105562fef451SLois Curfman McInnes 1056a86d99e1SLois Curfman McInnes .seealso: SNESSetHessian(), SLESSetOperators(), SNESComputeGradient(), 1057a86d99e1SLois Curfman McInnes SNESComputeMinimizationFunction() 105862fef451SLois Curfman McInnes @*/ 105962fef451SLois Curfman McInnes int SNESComputeHessian(SNES snes,Vec x,Mat *A,Mat *B,MatStructure *flag) 10609b94acceSBarry Smith { 10619b94acceSBarry Smith int ierr; 10623a40ed3dSBarry Smith 10633a40ed3dSBarry Smith PetscFunctionBegin; 1064184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1065184914b5SBarry Smith PetscValidHeaderSpecific(x,VEC_COOKIE); 1066184914b5SBarry Smith PetscCheckSameComm(snes,x); 10673a40ed3dSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 106829bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 10693a40ed3dSBarry Smith } 10703a40ed3dSBarry Smith if (!snes->computejacobian) PetscFunctionReturn(0); 1071b0a32e0cSBarry Smith ierr = PetscLogEventBegin(SNES_HessianEval,snes,x,*A,*B);CHKERRQ(ierr); 10720f4a323eSLois Curfman McInnes *flag = DIFFERENT_NONZERO_PATTERN; 1073d64ed03dSBarry Smith PetscStackPush("SNES user Hessian function"); 107462fef451SLois Curfman McInnes ierr = (*snes->computejacobian)(snes,x,A,B,flag,snes->jacP);CHKERRQ(ierr); 1075d64ed03dSBarry Smith PetscStackPop; 1076b0a32e0cSBarry Smith ierr = PetscLogEventEnd(SNES_HessianEval,snes,x,*A,*B);CHKERRQ(ierr); 10770f4a323eSLois Curfman McInnes /* make sure user returned a correct Jacobian and preconditioner */ 107877c4ece6SBarry Smith PetscValidHeaderSpecific(*A,MAT_COOKIE); 107977c4ece6SBarry Smith PetscValidHeaderSpecific(*B,MAT_COOKIE); 10803a40ed3dSBarry Smith PetscFunctionReturn(0); 10819b94acceSBarry Smith } 10829b94acceSBarry Smith 10834a2ae208SSatish Balay #undef __FUNCT__ 10844a2ae208SSatish Balay #define __FUNCT__ "SNESSetJacobian" 10859b94acceSBarry Smith /*@C 10869b94acceSBarry Smith SNESSetJacobian - Sets the function to compute Jacobian as well as the 1087044dda88SLois Curfman McInnes location to store the matrix. 10889b94acceSBarry Smith 1089c7afd0dbSLois Curfman McInnes Collective on SNES and Mat 1090c7afd0dbSLois Curfman McInnes 10919b94acceSBarry Smith Input Parameters: 1092c7afd0dbSLois Curfman McInnes + snes - the SNES context 10939b94acceSBarry Smith . A - Jacobian matrix 10949b94acceSBarry Smith . B - preconditioner matrix (usually same as the Jacobian) 10959b94acceSBarry Smith . func - Jacobian evaluation routine 1096c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined context for private data for the 10972cd2dfdcSLois Curfman McInnes Jacobian evaluation routine (may be PETSC_NULL) 10989b94acceSBarry Smith 10999b94acceSBarry Smith Calling sequence of func: 11008d76a1e5SLois Curfman McInnes $ func (SNES snes,Vec x,Mat *A,Mat *B,int *flag,void *ctx); 11019b94acceSBarry Smith 1102c7afd0dbSLois Curfman McInnes + x - input vector 11039b94acceSBarry Smith . A - Jacobian matrix 11049b94acceSBarry Smith . B - preconditioner matrix, usually the same as A 1105ac21db08SLois Curfman McInnes . flag - flag indicating information about the preconditioner matrix 1106ac21db08SLois Curfman McInnes structure (same as flag in SLESSetOperators()) 1107c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined Jacobian context 11089b94acceSBarry Smith 11099b94acceSBarry Smith Notes: 1110dc5a77f8SLois Curfman McInnes See SLESSetOperators() for important information about setting the flag 11112cd2dfdcSLois Curfman McInnes output parameter in the routine func(). Be sure to read this information! 1112ac21db08SLois Curfman McInnes 1113ac21db08SLois Curfman McInnes The routine func() takes Mat * as the matrix arguments rather than Mat. 11149b94acceSBarry Smith This allows the Jacobian evaluation routine to replace A and/or B with a 11159b94acceSBarry Smith completely new new matrix structure (not just different matrix elements) 11169b94acceSBarry Smith when appropriate, for instance, if the nonzero structure is changing 11179b94acceSBarry Smith throughout the global iterations. 11189b94acceSBarry Smith 111936851e7fSLois Curfman McInnes Level: beginner 112036851e7fSLois Curfman McInnes 11219b94acceSBarry Smith .keywords: SNES, nonlinear, set, Jacobian, matrix 11229b94acceSBarry Smith 1123ac21db08SLois Curfman McInnes .seealso: SLESSetOperators(), SNESSetFunction() 11249b94acceSBarry Smith @*/ 1125454a90a3SBarry Smith int SNESSetJacobian(SNES snes,Mat A,Mat B,int (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx) 11269b94acceSBarry Smith { 11273a7fca6bSBarry Smith int ierr; 11283a7fca6bSBarry Smith 11293a40ed3dSBarry Smith PetscFunctionBegin; 113077c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 113100036973SBarry Smith if (A) PetscValidHeaderSpecific(A,MAT_COOKIE); 113200036973SBarry Smith if (B) PetscValidHeaderSpecific(B,MAT_COOKIE); 113300036973SBarry Smith if (A) PetscCheckSameComm(snes,A); 113400036973SBarry Smith if (B) PetscCheckSameComm(snes,B); 1135a8c6a408SBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 113629bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only"); 1137a8c6a408SBarry Smith } 1138184914b5SBarry Smith 11393a7fca6bSBarry Smith if (func) snes->computejacobian = func; 11403a7fca6bSBarry Smith if (ctx) snes->jacP = ctx; 11413a7fca6bSBarry Smith if (A) { 11423a7fca6bSBarry Smith if (snes->jacobian) {ierr = MatDestroy(snes->jacobian);CHKERRQ(ierr);} 11439b94acceSBarry Smith snes->jacobian = A; 11443a7fca6bSBarry Smith ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); 11453a7fca6bSBarry Smith } 11463a7fca6bSBarry Smith if (B) { 11473a7fca6bSBarry Smith if (snes->jacobian_pre) {ierr = MatDestroy(snes->jacobian_pre);CHKERRQ(ierr);} 11489b94acceSBarry Smith snes->jacobian_pre = B; 11493a7fca6bSBarry Smith ierr = PetscObjectReference((PetscObject)B);CHKERRQ(ierr); 11503a7fca6bSBarry Smith } 11513a40ed3dSBarry Smith PetscFunctionReturn(0); 11529b94acceSBarry Smith } 115362fef451SLois Curfman McInnes 11544a2ae208SSatish Balay #undef __FUNCT__ 11554a2ae208SSatish Balay #define __FUNCT__ "SNESGetJacobian" 1156c2aafc4cSSatish Balay /*@C 1157b4fd4287SBarry Smith SNESGetJacobian - Returns the Jacobian matrix and optionally the user 1158b4fd4287SBarry Smith provided context for evaluating the Jacobian. 1159b4fd4287SBarry Smith 1160c7afd0dbSLois Curfman McInnes Not Collective, but Mat object will be parallel if SNES object is 1161c7afd0dbSLois Curfman McInnes 1162b4fd4287SBarry Smith Input Parameter: 1163b4fd4287SBarry Smith . snes - the nonlinear solver context 1164b4fd4287SBarry Smith 1165b4fd4287SBarry Smith Output Parameters: 1166c7afd0dbSLois Curfman McInnes + A - location to stash Jacobian matrix (or PETSC_NULL) 1167b4fd4287SBarry Smith . B - location to stash preconditioner matrix (or PETSC_NULL) 116800036973SBarry Smith . ctx - location to stash Jacobian ctx (or PETSC_NULL) 116900036973SBarry Smith - func - location to put Jacobian function (or PETSC_NULL) 1170fee21e36SBarry Smith 117136851e7fSLois Curfman McInnes Level: advanced 117236851e7fSLois Curfman McInnes 1173b4fd4287SBarry Smith .seealso: SNESSetJacobian(), SNESComputeJacobian() 1174b4fd4287SBarry Smith @*/ 117500036973SBarry Smith int SNESGetJacobian(SNES snes,Mat *A,Mat *B,void **ctx,int (**func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*)) 1176b4fd4287SBarry Smith { 11773a40ed3dSBarry Smith PetscFunctionBegin; 1178184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 11793a40ed3dSBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 118029bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only"); 11813a40ed3dSBarry Smith } 1182b4fd4287SBarry Smith if (A) *A = snes->jacobian; 1183b4fd4287SBarry Smith if (B) *B = snes->jacobian_pre; 1184b4fd4287SBarry Smith if (ctx) *ctx = snes->jacP; 118500036973SBarry Smith if (func) *func = snes->computejacobian; 11863a40ed3dSBarry Smith PetscFunctionReturn(0); 1187b4fd4287SBarry Smith } 1188b4fd4287SBarry Smith 11894a2ae208SSatish Balay #undef __FUNCT__ 11904a2ae208SSatish Balay #define __FUNCT__ "SNESSetHessian" 11919b94acceSBarry Smith /*@C 11929b94acceSBarry Smith SNESSetHessian - Sets the function to compute Hessian as well as the 1193044dda88SLois Curfman McInnes location to store the matrix. 11949b94acceSBarry Smith 1195c7afd0dbSLois Curfman McInnes Collective on SNES and Mat 1196c7afd0dbSLois Curfman McInnes 11979b94acceSBarry Smith Input Parameters: 1198c7afd0dbSLois Curfman McInnes + snes - the SNES context 11999b94acceSBarry Smith . A - Hessian matrix 12009b94acceSBarry Smith . B - preconditioner matrix (usually same as the Hessian) 12019b94acceSBarry Smith . func - Jacobian evaluation routine 1202c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined context for private data for the 1203313e4042SLois Curfman McInnes Hessian evaluation routine (may be PETSC_NULL) 12049b94acceSBarry Smith 12059b94acceSBarry Smith Calling sequence of func: 12068d76a1e5SLois Curfman McInnes $ func (SNES snes,Vec x,Mat *A,Mat *B,int *flag,void *ctx); 12079b94acceSBarry Smith 1208c7afd0dbSLois Curfman McInnes + x - input vector 12099b94acceSBarry Smith . A - Hessian matrix 12109b94acceSBarry Smith . B - preconditioner matrix, usually the same as A 1211ac21db08SLois Curfman McInnes . flag - flag indicating information about the preconditioner matrix 1212ac21db08SLois Curfman McInnes structure (same as flag in SLESSetOperators()) 1213c7afd0dbSLois Curfman McInnes - ctx - [optional] user-defined Hessian context 12149b94acceSBarry Smith 12159b94acceSBarry Smith Notes: 1216dc5a77f8SLois Curfman McInnes See SLESSetOperators() for important information about setting the flag 12172cd2dfdcSLois Curfman McInnes output parameter in the routine func(). Be sure to read this information! 1218ac21db08SLois Curfman McInnes 12199b94acceSBarry Smith The function func() takes Mat * as the matrix arguments rather than Mat. 12209b94acceSBarry Smith This allows the Hessian evaluation routine to replace A and/or B with a 12219b94acceSBarry Smith completely new new matrix structure (not just different matrix elements) 12229b94acceSBarry Smith when appropriate, for instance, if the nonzero structure is changing 12239b94acceSBarry Smith throughout the global iterations. 12249b94acceSBarry Smith 122536851e7fSLois Curfman McInnes Level: beginner 122636851e7fSLois Curfman McInnes 12279b94acceSBarry Smith .keywords: SNES, nonlinear, set, Hessian, matrix 12289b94acceSBarry Smith 1229ac21db08SLois Curfman McInnes .seealso: SNESSetMinimizationFunction(), SNESSetGradient(), SLESSetOperators() 12309b94acceSBarry Smith @*/ 1231454a90a3SBarry Smith int SNESSetHessian(SNES snes,Mat A,Mat B,int (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx) 12329b94acceSBarry Smith { 12333a7fca6bSBarry Smith int ierr; 12343a7fca6bSBarry Smith 12353a40ed3dSBarry Smith PetscFunctionBegin; 123677c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1237184914b5SBarry Smith PetscValidHeaderSpecific(A,MAT_COOKIE); 1238184914b5SBarry Smith PetscValidHeaderSpecific(B,MAT_COOKIE); 1239184914b5SBarry Smith PetscCheckSameComm(snes,A); 1240184914b5SBarry Smith PetscCheckSameComm(snes,B); 1241d4bb536fSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 124229bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 1243d4bb536fSBarry Smith } 12443a7fca6bSBarry Smith if (func) snes->computejacobian = func; 12453a7fca6bSBarry Smith if (ctx) snes->jacP = ctx; 12463a7fca6bSBarry Smith if (A) { 12473a7fca6bSBarry Smith if (snes->jacobian) {ierr = MatDestroy(snes->jacobian);CHKERRQ(ierr);} 12489b94acceSBarry Smith snes->jacobian = A; 12493a7fca6bSBarry Smith ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); 12503a7fca6bSBarry Smith } 12513a7fca6bSBarry Smith if (B) { 12523a7fca6bSBarry Smith if (snes->jacobian_pre) {ierr = MatDestroy(snes->jacobian_pre);CHKERRQ(ierr);} 12539b94acceSBarry Smith snes->jacobian_pre = B; 12543a7fca6bSBarry Smith ierr = PetscObjectReference((PetscObject)B);CHKERRQ(ierr); 12553a7fca6bSBarry Smith } 12563a40ed3dSBarry Smith PetscFunctionReturn(0); 12579b94acceSBarry Smith } 12589b94acceSBarry Smith 12594a2ae208SSatish Balay #undef __FUNCT__ 12604a2ae208SSatish Balay #define __FUNCT__ "SNESGetHessian" 126162fef451SLois Curfman McInnes /*@ 126262fef451SLois Curfman McInnes SNESGetHessian - Returns the Hessian matrix and optionally the user 126362fef451SLois Curfman McInnes provided context for evaluating the Hessian. 126462fef451SLois Curfman McInnes 1265c7afd0dbSLois Curfman McInnes Not Collective, but Mat object is parallel if SNES object is parallel 1266c7afd0dbSLois Curfman McInnes 126762fef451SLois Curfman McInnes Input Parameter: 126862fef451SLois Curfman McInnes . snes - the nonlinear solver context 126962fef451SLois Curfman McInnes 127062fef451SLois Curfman McInnes Output Parameters: 1271c7afd0dbSLois Curfman McInnes + A - location to stash Hessian matrix (or PETSC_NULL) 127262fef451SLois Curfman McInnes . B - location to stash preconditioner matrix (or PETSC_NULL) 1273c7afd0dbSLois Curfman McInnes - ctx - location to stash Hessian ctx (or PETSC_NULL) 1274fee21e36SBarry Smith 127536851e7fSLois Curfman McInnes Level: advanced 127636851e7fSLois Curfman McInnes 127762fef451SLois Curfman McInnes .seealso: SNESSetHessian(), SNESComputeHessian() 1278c7afd0dbSLois Curfman McInnes 1279c7afd0dbSLois Curfman McInnes .keywords: SNES, get, Hessian 128062fef451SLois Curfman McInnes @*/ 128162fef451SLois Curfman McInnes int SNESGetHessian(SNES snes,Mat *A,Mat *B,void **ctx) 128262fef451SLois Curfman McInnes { 12833a40ed3dSBarry Smith PetscFunctionBegin; 1284184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 12853a40ed3dSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION){ 128629bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 12873a40ed3dSBarry Smith } 128862fef451SLois Curfman McInnes if (A) *A = snes->jacobian; 128962fef451SLois Curfman McInnes if (B) *B = snes->jacobian_pre; 129062fef451SLois Curfman McInnes if (ctx) *ctx = snes->jacP; 12913a40ed3dSBarry Smith PetscFunctionReturn(0); 129262fef451SLois Curfman McInnes } 129362fef451SLois Curfman McInnes 12949b94acceSBarry Smith /* ----- Routines to initialize and destroy a nonlinear solver ---- */ 12959b94acceSBarry Smith 12964a2ae208SSatish Balay #undef __FUNCT__ 12974a2ae208SSatish Balay #define __FUNCT__ "SNESSetUp" 12989b94acceSBarry Smith /*@ 12999b94acceSBarry Smith SNESSetUp - Sets up the internal data structures for the later use 1300272ac6f2SLois Curfman McInnes of a nonlinear solver. 13019b94acceSBarry Smith 1302fee21e36SBarry Smith Collective on SNES 1303fee21e36SBarry Smith 1304c7afd0dbSLois Curfman McInnes Input Parameters: 1305c7afd0dbSLois Curfman McInnes + snes - the SNES context 1306c7afd0dbSLois Curfman McInnes - x - the solution vector 1307c7afd0dbSLois Curfman McInnes 1308272ac6f2SLois Curfman McInnes Notes: 1309272ac6f2SLois Curfman McInnes For basic use of the SNES solvers the user need not explicitly call 1310272ac6f2SLois Curfman McInnes SNESSetUp(), since these actions will automatically occur during 1311272ac6f2SLois Curfman McInnes the call to SNESSolve(). However, if one wishes to control this 1312272ac6f2SLois Curfman McInnes phase separately, SNESSetUp() should be called after SNESCreate() 1313272ac6f2SLois Curfman McInnes and optional routines of the form SNESSetXXX(), but before SNESSolve(). 1314272ac6f2SLois Curfman McInnes 131536851e7fSLois Curfman McInnes Level: advanced 131636851e7fSLois Curfman McInnes 13179b94acceSBarry Smith .keywords: SNES, nonlinear, setup 13189b94acceSBarry Smith 13199b94acceSBarry Smith .seealso: SNESCreate(), SNESSolve(), SNESDestroy() 13209b94acceSBarry Smith @*/ 13218ddd3da0SLois Curfman McInnes int SNESSetUp(SNES snes,Vec x) 13229b94acceSBarry Smith { 1323f1af5d2fSBarry Smith int ierr; 1324f1af5d2fSBarry Smith PetscTruth flg; 13253a40ed3dSBarry Smith 13263a40ed3dSBarry Smith PetscFunctionBegin; 132777c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 132877c4ece6SBarry Smith PetscValidHeaderSpecific(x,VEC_COOKIE); 1329184914b5SBarry Smith PetscCheckSameComm(snes,x); 13308ddd3da0SLois Curfman McInnes snes->vec_sol = snes->vec_sol_always = x; 13319b94acceSBarry Smith 1332b0a32e0cSBarry Smith ierr = PetscOptionsHasName(snes->prefix,"-snes_mf_operator",&flg);CHKERRQ(ierr); 1333c1f60f51SBarry Smith /* 1334c1f60f51SBarry Smith This version replaces the user provided Jacobian matrix with a 1335dfa02198SLois Curfman McInnes matrix-free version but still employs the user-provided preconditioner matrix 1336c1f60f51SBarry Smith */ 1337c1f60f51SBarry Smith if (flg) { 1338c1f60f51SBarry Smith Mat J; 13395a655dc6SBarry Smith ierr = MatCreateSNESMF(snes,snes->vec_sol,&J);CHKERRQ(ierr); 13405a655dc6SBarry Smith ierr = MatSNESMFSetFromOptions(J);CHKERRQ(ierr); 13413a7fca6bSBarry Smith PetscLogInfo(snes,"SNESSetUp: Setting default matrix-free operator routines\n"); 13423a7fca6bSBarry Smith ierr = SNESSetJacobian(snes,J,0,0,0);CHKERRQ(ierr); 13433a7fca6bSBarry Smith ierr = MatDestroy(J);CHKERRQ(ierr); 1344c1f60f51SBarry Smith } 1345b0a32e0cSBarry Smith ierr = PetscOptionsHasName(snes->prefix,"-snes_mf",&flg);CHKERRQ(ierr); 1346c1f60f51SBarry Smith /* 1347dfa02198SLois Curfman McInnes This version replaces both the user-provided Jacobian and the user- 1348c1f60f51SBarry Smith provided preconditioner matrix with the default matrix free version. 1349c1f60f51SBarry Smith */ 135031615d04SLois Curfman McInnes if (flg) { 1351272ac6f2SLois Curfman McInnes Mat J; 1352f3ef73ceSBarry Smith SLES sles; 1353f3ef73ceSBarry Smith PC pc; 1354f3ef73ceSBarry Smith 13555a655dc6SBarry Smith ierr = MatCreateSNESMF(snes,snes->vec_sol,&J);CHKERRQ(ierr); 13563a7fca6bSBarry Smith ierr = MatSNESMFSetFromOptions(J);CHKERRQ(ierr); 135793b98531SBarry Smith PetscLogInfo(snes,"SNESSetUp: Setting default matrix-free operator and preconditioner routines\n"); 135883e56afdSLois Curfman McInnes if (snes->method_class == SNES_NONLINEAR_EQUATIONS) { 13593a7fca6bSBarry Smith ierr = SNESSetJacobian(snes,J,J,MatSNESMFComputeJacobian,snes->funP);CHKERRQ(ierr); 1360d64ed03dSBarry Smith } else if (snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION) { 13613a7fca6bSBarry Smith ierr = SNESSetHessian(snes,J,J,MatSNESMFComputeJacobian,snes->funP);CHKERRQ(ierr); 1362d4bb536fSBarry Smith } else { 136329bbc08cSBarry Smith SETERRQ(PETSC_ERR_SUP,"Method class doesn't support matrix-free option"); 1364d4bb536fSBarry Smith } 13653a7fca6bSBarry Smith ierr = MatDestroy(J);CHKERRQ(ierr); 13663a7fca6bSBarry Smith 1367f3ef73ceSBarry Smith /* force no preconditioner */ 1368f3ef73ceSBarry Smith ierr = SNESGetSLES(snes,&sles);CHKERRQ(ierr); 1369f3ef73ceSBarry Smith ierr = SLESGetPC(sles,&pc);CHKERRQ(ierr); 1370f3ef73ceSBarry Smith ierr = PCSetType(pc,PCNONE);CHKERRQ(ierr); 1371272ac6f2SLois Curfman McInnes } 1372f3ef73ceSBarry Smith 13739b94acceSBarry Smith if ((snes->method_class == SNES_NONLINEAR_EQUATIONS)) { 13746831982aSBarry Smith PetscTruth iseqtr; 13756831982aSBarry Smith 137629bbc08cSBarry Smith if (!snes->vec_func) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetFunction() first"); 137729bbc08cSBarry Smith if (!snes->computefunction) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetFunction() first"); 137829bbc08cSBarry Smith if (!snes->jacobian) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetJacobian() first \n or use -snes_mf option"); 1379a8c6a408SBarry Smith if (snes->vec_func == snes->vec_sol) { 138029bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_IDN,"Solution vector cannot be function vector"); 1381a8c6a408SBarry Smith } 1382a703fe33SLois Curfman McInnes 1383a703fe33SLois Curfman McInnes /* Set the KSP stopping criterion to use the Eisenstat-Walker method */ 13846831982aSBarry Smith ierr = PetscTypeCompare((PetscObject)snes,SNESEQTR,&iseqtr);CHKERRQ(ierr); 13856831982aSBarry Smith if (snes->ksp_ewconv && !iseqtr) { 1386a703fe33SLois Curfman McInnes SLES sles; KSP ksp; 1387a703fe33SLois Curfman McInnes ierr = SNESGetSLES(snes,&sles);CHKERRQ(ierr); 1388a703fe33SLois Curfman McInnes ierr = SLESGetKSP(sles,&ksp);CHKERRQ(ierr); 1389186905e3SBarry Smith ierr = KSPSetConvergenceTest(ksp,SNES_KSP_EW_Converged_Private,snes);CHKERRQ(ierr); 1390a703fe33SLois Curfman McInnes } 13919b94acceSBarry Smith } else if ((snes->method_class == SNES_UNCONSTRAINED_MINIMIZATION)) { 139229bbc08cSBarry Smith if (!snes->vec_func) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetGradient() first"); 139329bbc08cSBarry Smith if (!snes->computefunction) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetGradient() first"); 1394a8c6a408SBarry Smith if (!snes->computeumfunction) { 139529bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetMinimizationFunction() first"); 1396a8c6a408SBarry Smith } 139729bbc08cSBarry Smith if (!snes->jacobian) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call SNESSetHessian()"); 1398d4bb536fSBarry Smith } else { 139929bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Unknown method class"); 1400d4bb536fSBarry Smith } 1401a703fe33SLois Curfman McInnes if (snes->setup) {ierr = (*snes->setup)(snes);CHKERRQ(ierr);} 140282bf6240SBarry Smith snes->setupcalled = 1; 14033a40ed3dSBarry Smith PetscFunctionReturn(0); 14049b94acceSBarry Smith } 14059b94acceSBarry Smith 14064a2ae208SSatish Balay #undef __FUNCT__ 14074a2ae208SSatish Balay #define __FUNCT__ "SNESDestroy" 14089b94acceSBarry Smith /*@C 14099b94acceSBarry Smith SNESDestroy - Destroys the nonlinear solver context that was created 14109b94acceSBarry Smith with SNESCreate(). 14119b94acceSBarry Smith 1412c7afd0dbSLois Curfman McInnes Collective on SNES 1413c7afd0dbSLois Curfman McInnes 14149b94acceSBarry Smith Input Parameter: 14159b94acceSBarry Smith . snes - the SNES context 14169b94acceSBarry Smith 141736851e7fSLois Curfman McInnes Level: beginner 141836851e7fSLois Curfman McInnes 14199b94acceSBarry Smith .keywords: SNES, nonlinear, destroy 14209b94acceSBarry Smith 142163a78c88SLois Curfman McInnes .seealso: SNESCreate(), SNESSolve() 14229b94acceSBarry Smith @*/ 14239b94acceSBarry Smith int SNESDestroy(SNES snes) 14249b94acceSBarry Smith { 1425b8a78c4aSBarry Smith int i,ierr; 14263a40ed3dSBarry Smith 14273a40ed3dSBarry Smith PetscFunctionBegin; 142877c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 14293a40ed3dSBarry Smith if (--snes->refct > 0) PetscFunctionReturn(0); 1430d4bb536fSBarry Smith 1431be0abb6dSBarry Smith /* if memory was published with AMS then destroy it */ 14320f5bd95cSBarry Smith ierr = PetscObjectDepublish(snes);CHKERRQ(ierr); 1433be0abb6dSBarry Smith 1434e1311b90SBarry Smith if (snes->destroy) {ierr = (*(snes)->destroy)(snes);CHKERRQ(ierr);} 1435606d414cSSatish Balay if (snes->kspconvctx) {ierr = PetscFree(snes->kspconvctx);CHKERRQ(ierr);} 14363a7fca6bSBarry Smith if (snes->jacobian) {ierr = MatDestroy(snes->jacobian);CHKERRQ(ierr);} 14373a7fca6bSBarry Smith if (snes->jacobian_pre) {ierr = MatDestroy(snes->jacobian_pre);CHKERRQ(ierr);} 14389b94acceSBarry Smith ierr = SLESDestroy(snes->sles);CHKERRQ(ierr); 1439522c5e43SBarry Smith if (snes->vwork) {ierr = VecDestroyVecs(snes->vwork,snes->nvwork);CHKERRQ(ierr);} 1440b8a78c4aSBarry Smith for (i=0; i<snes->numbermonitors; i++) { 1441b8a78c4aSBarry Smith if (snes->monitordestroy[i]) { 1442b8a78c4aSBarry Smith ierr = (*snes->monitordestroy[i])(snes->monitorcontext[i]);CHKERRQ(ierr); 1443b8a78c4aSBarry Smith } 1444b8a78c4aSBarry Smith } 1445b0a32e0cSBarry Smith PetscLogObjectDestroy((PetscObject)snes); 14460452661fSBarry Smith PetscHeaderDestroy((PetscObject)snes); 14473a40ed3dSBarry Smith PetscFunctionReturn(0); 14489b94acceSBarry Smith } 14499b94acceSBarry Smith 14509b94acceSBarry Smith /* ----------- Routines to set solver parameters ---------- */ 14519b94acceSBarry Smith 14524a2ae208SSatish Balay #undef __FUNCT__ 14534a2ae208SSatish Balay #define __FUNCT__ "SNESSetTolerances" 14549b94acceSBarry Smith /*@ 1455d7a720efSLois Curfman McInnes SNESSetTolerances - Sets various parameters used in convergence tests. 14569b94acceSBarry Smith 1457c7afd0dbSLois Curfman McInnes Collective on SNES 1458c7afd0dbSLois Curfman McInnes 14599b94acceSBarry Smith Input Parameters: 1460c7afd0dbSLois Curfman McInnes + snes - the SNES context 146133174efeSLois Curfman McInnes . atol - absolute convergence tolerance 146233174efeSLois Curfman McInnes . rtol - relative convergence tolerance 146333174efeSLois Curfman McInnes . stol - convergence tolerance in terms of the norm 146433174efeSLois Curfman McInnes of the change in the solution between steps 146533174efeSLois Curfman McInnes . maxit - maximum number of iterations 1466c7afd0dbSLois Curfman McInnes - maxf - maximum number of function evaluations 1467fee21e36SBarry Smith 146833174efeSLois Curfman McInnes Options Database Keys: 1469c7afd0dbSLois Curfman McInnes + -snes_atol <atol> - Sets atol 1470c7afd0dbSLois Curfman McInnes . -snes_rtol <rtol> - Sets rtol 1471c7afd0dbSLois Curfman McInnes . -snes_stol <stol> - Sets stol 1472c7afd0dbSLois Curfman McInnes . -snes_max_it <maxit> - Sets maxit 1473c7afd0dbSLois Curfman McInnes - -snes_max_funcs <maxf> - Sets maxf 14749b94acceSBarry Smith 1475d7a720efSLois Curfman McInnes Notes: 14769b94acceSBarry Smith The default maximum number of iterations is 50. 14779b94acceSBarry Smith The default maximum number of function evaluations is 1000. 14789b94acceSBarry Smith 147936851e7fSLois Curfman McInnes Level: intermediate 148036851e7fSLois Curfman McInnes 148133174efeSLois Curfman McInnes .keywords: SNES, nonlinear, set, convergence, tolerances 14829b94acceSBarry Smith 1483d7a720efSLois Curfman McInnes .seealso: SNESSetTrustRegionTolerance(), SNESSetMinimizationFunctionTolerance() 14849b94acceSBarry Smith @*/ 1485329f5518SBarry Smith int SNESSetTolerances(SNES snes,PetscReal atol,PetscReal rtol,PetscReal stol,int maxit,int maxf) 14869b94acceSBarry Smith { 14873a40ed3dSBarry Smith PetscFunctionBegin; 148877c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1489d7a720efSLois Curfman McInnes if (atol != PETSC_DEFAULT) snes->atol = atol; 1490d7a720efSLois Curfman McInnes if (rtol != PETSC_DEFAULT) snes->rtol = rtol; 1491d7a720efSLois Curfman McInnes if (stol != PETSC_DEFAULT) snes->xtol = stol; 1492d7a720efSLois Curfman McInnes if (maxit != PETSC_DEFAULT) snes->max_its = maxit; 1493d7a720efSLois Curfman McInnes if (maxf != PETSC_DEFAULT) snes->max_funcs = maxf; 14943a40ed3dSBarry Smith PetscFunctionReturn(0); 14959b94acceSBarry Smith } 14969b94acceSBarry Smith 14974a2ae208SSatish Balay #undef __FUNCT__ 14984a2ae208SSatish Balay #define __FUNCT__ "SNESGetTolerances" 14999b94acceSBarry Smith /*@ 150033174efeSLois Curfman McInnes SNESGetTolerances - Gets various parameters used in convergence tests. 150133174efeSLois Curfman McInnes 1502c7afd0dbSLois Curfman McInnes Not Collective 1503c7afd0dbSLois Curfman McInnes 150433174efeSLois Curfman McInnes Input Parameters: 1505c7afd0dbSLois Curfman McInnes + snes - the SNES context 150633174efeSLois Curfman McInnes . atol - absolute convergence tolerance 150733174efeSLois Curfman McInnes . rtol - relative convergence tolerance 150833174efeSLois Curfman McInnes . stol - convergence tolerance in terms of the norm 150933174efeSLois Curfman McInnes of the change in the solution between steps 151033174efeSLois Curfman McInnes . maxit - maximum number of iterations 1511c7afd0dbSLois Curfman McInnes - maxf - maximum number of function evaluations 1512fee21e36SBarry Smith 151333174efeSLois Curfman McInnes Notes: 151433174efeSLois Curfman McInnes The user can specify PETSC_NULL for any parameter that is not needed. 151533174efeSLois Curfman McInnes 151636851e7fSLois Curfman McInnes Level: intermediate 151736851e7fSLois Curfman McInnes 151833174efeSLois Curfman McInnes .keywords: SNES, nonlinear, get, convergence, tolerances 151933174efeSLois Curfman McInnes 152033174efeSLois Curfman McInnes .seealso: SNESSetTolerances() 152133174efeSLois Curfman McInnes @*/ 1522329f5518SBarry Smith int SNESGetTolerances(SNES snes,PetscReal *atol,PetscReal *rtol,PetscReal *stol,int *maxit,int *maxf) 152333174efeSLois Curfman McInnes { 15243a40ed3dSBarry Smith PetscFunctionBegin; 152533174efeSLois Curfman McInnes PetscValidHeaderSpecific(snes,SNES_COOKIE); 152633174efeSLois Curfman McInnes if (atol) *atol = snes->atol; 152733174efeSLois Curfman McInnes if (rtol) *rtol = snes->rtol; 152833174efeSLois Curfman McInnes if (stol) *stol = snes->xtol; 152933174efeSLois Curfman McInnes if (maxit) *maxit = snes->max_its; 153033174efeSLois Curfman McInnes if (maxf) *maxf = snes->max_funcs; 15313a40ed3dSBarry Smith PetscFunctionReturn(0); 153233174efeSLois Curfman McInnes } 153333174efeSLois Curfman McInnes 15344a2ae208SSatish Balay #undef __FUNCT__ 15354a2ae208SSatish Balay #define __FUNCT__ "SNESSetTrustRegionTolerance" 153633174efeSLois Curfman McInnes /*@ 15379b94acceSBarry Smith SNESSetTrustRegionTolerance - Sets the trust region parameter tolerance. 15389b94acceSBarry Smith 1539fee21e36SBarry Smith Collective on SNES 1540fee21e36SBarry Smith 1541c7afd0dbSLois Curfman McInnes Input Parameters: 1542c7afd0dbSLois Curfman McInnes + snes - the SNES context 1543c7afd0dbSLois Curfman McInnes - tol - tolerance 1544c7afd0dbSLois Curfman McInnes 15459b94acceSBarry Smith Options Database Key: 1546c7afd0dbSLois Curfman McInnes . -snes_trtol <tol> - Sets tol 15479b94acceSBarry Smith 154836851e7fSLois Curfman McInnes Level: intermediate 154936851e7fSLois Curfman McInnes 15509b94acceSBarry Smith .keywords: SNES, nonlinear, set, trust region, tolerance 15519b94acceSBarry Smith 1552d7a720efSLois Curfman McInnes .seealso: SNESSetTolerances(), SNESSetMinimizationFunctionTolerance() 15539b94acceSBarry Smith @*/ 1554329f5518SBarry Smith int SNESSetTrustRegionTolerance(SNES snes,PetscReal tol) 15559b94acceSBarry Smith { 15563a40ed3dSBarry Smith PetscFunctionBegin; 155777c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 15589b94acceSBarry Smith snes->deltatol = tol; 15593a40ed3dSBarry Smith PetscFunctionReturn(0); 15609b94acceSBarry Smith } 15619b94acceSBarry Smith 15624a2ae208SSatish Balay #undef __FUNCT__ 15634a2ae208SSatish Balay #define __FUNCT__ "SNESSetMinimizationFunctionTolerance" 15649b94acceSBarry Smith /*@ 156577c4ece6SBarry Smith SNESSetMinimizationFunctionTolerance - Sets the minimum allowable function tolerance 15669b94acceSBarry Smith for unconstrained minimization solvers. 15679b94acceSBarry Smith 1568fee21e36SBarry Smith Collective on SNES 1569fee21e36SBarry Smith 1570c7afd0dbSLois Curfman McInnes Input Parameters: 1571c7afd0dbSLois Curfman McInnes + snes - the SNES context 1572c7afd0dbSLois Curfman McInnes - ftol - minimum function tolerance 1573c7afd0dbSLois Curfman McInnes 15749b94acceSBarry Smith Options Database Key: 1575c7afd0dbSLois Curfman McInnes . -snes_fmin <ftol> - Sets ftol 15769b94acceSBarry Smith 15779b94acceSBarry Smith Note: 157877c4ece6SBarry Smith SNESSetMinimizationFunctionTolerance() is valid for SNES_UNCONSTRAINED_MINIMIZATION 15799b94acceSBarry Smith methods only. 15809b94acceSBarry Smith 158136851e7fSLois Curfman McInnes Level: intermediate 158236851e7fSLois Curfman McInnes 15839b94acceSBarry Smith .keywords: SNES, nonlinear, set, minimum, convergence, function, tolerance 15849b94acceSBarry Smith 1585d7a720efSLois Curfman McInnes .seealso: SNESSetTolerances(), SNESSetTrustRegionTolerance() 15869b94acceSBarry Smith @*/ 1587329f5518SBarry Smith int SNESSetMinimizationFunctionTolerance(SNES snes,PetscReal ftol) 15889b94acceSBarry Smith { 15893a40ed3dSBarry Smith PetscFunctionBegin; 159077c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 15919b94acceSBarry Smith snes->fmin = ftol; 15923a40ed3dSBarry Smith PetscFunctionReturn(0); 15939b94acceSBarry Smith } 1594df9fa365SBarry Smith /* 1595df9fa365SBarry Smith Duplicate the lg monitors for SNES from KSP; for some reason with 1596df9fa365SBarry Smith dynamic libraries things don't work under Sun4 if we just use 1597df9fa365SBarry Smith macros instead of functions 1598df9fa365SBarry Smith */ 15994a2ae208SSatish Balay #undef __FUNCT__ 16004a2ae208SSatish Balay #define __FUNCT__ "SNESLGMonitor" 1601329f5518SBarry Smith int SNESLGMonitor(SNES snes,int it,PetscReal norm,void *ctx) 1602ce1608b8SBarry Smith { 1603ce1608b8SBarry Smith int ierr; 1604ce1608b8SBarry Smith 1605ce1608b8SBarry Smith PetscFunctionBegin; 1606184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1607ce1608b8SBarry Smith ierr = KSPLGMonitor((KSP)snes,it,norm,ctx);CHKERRQ(ierr); 1608ce1608b8SBarry Smith PetscFunctionReturn(0); 1609ce1608b8SBarry Smith } 1610ce1608b8SBarry Smith 16114a2ae208SSatish Balay #undef __FUNCT__ 16124a2ae208SSatish Balay #define __FUNCT__ "SNESLGMonitorCreate" 1613b0a32e0cSBarry Smith int SNESLGMonitorCreate(char *host,char *label,int x,int y,int m,int n,PetscDrawLG *draw) 1614df9fa365SBarry Smith { 1615df9fa365SBarry Smith int ierr; 1616df9fa365SBarry Smith 1617df9fa365SBarry Smith PetscFunctionBegin; 1618df9fa365SBarry Smith ierr = KSPLGMonitorCreate(host,label,x,y,m,n,draw);CHKERRQ(ierr); 1619df9fa365SBarry Smith PetscFunctionReturn(0); 1620df9fa365SBarry Smith } 1621df9fa365SBarry Smith 16224a2ae208SSatish Balay #undef __FUNCT__ 16234a2ae208SSatish Balay #define __FUNCT__ "SNESLGMonitorDestroy" 1624b0a32e0cSBarry Smith int SNESLGMonitorDestroy(PetscDrawLG draw) 1625df9fa365SBarry Smith { 1626df9fa365SBarry Smith int ierr; 1627df9fa365SBarry Smith 1628df9fa365SBarry Smith PetscFunctionBegin; 1629df9fa365SBarry Smith ierr = KSPLGMonitorDestroy(draw);CHKERRQ(ierr); 1630df9fa365SBarry Smith PetscFunctionReturn(0); 1631df9fa365SBarry Smith } 1632df9fa365SBarry Smith 16339b94acceSBarry Smith /* ------------ Routines to set performance monitoring options ----------- */ 16349b94acceSBarry Smith 16354a2ae208SSatish Balay #undef __FUNCT__ 16364a2ae208SSatish Balay #define __FUNCT__ "SNESSetMonitor" 16379b94acceSBarry Smith /*@C 16385cd90555SBarry Smith SNESSetMonitor - Sets an ADDITIONAL function that is to be used at every 16399b94acceSBarry Smith iteration of the nonlinear solver to display the iteration's 16409b94acceSBarry Smith progress. 16419b94acceSBarry Smith 1642fee21e36SBarry Smith Collective on SNES 1643fee21e36SBarry Smith 1644c7afd0dbSLois Curfman McInnes Input Parameters: 1645c7afd0dbSLois Curfman McInnes + snes - the SNES context 1646c7afd0dbSLois Curfman McInnes . func - monitoring routine 1647b8a78c4aSBarry Smith . mctx - [optional] user-defined context for private data for the 1648b3006f0bSLois Curfman McInnes monitor routine (use PETSC_NULL if no context is desitre) 1649b3006f0bSLois Curfman McInnes - monitordestroy - [optional] routine that frees monitor context 1650b3006f0bSLois Curfman McInnes (may be PETSC_NULL) 16519b94acceSBarry Smith 1652c7afd0dbSLois Curfman McInnes Calling sequence of func: 1653329f5518SBarry Smith $ int func(SNES snes,int its, PetscReal norm,void *mctx) 1654c7afd0dbSLois Curfman McInnes 1655c7afd0dbSLois Curfman McInnes + snes - the SNES context 1656c7afd0dbSLois Curfman McInnes . its - iteration number 1657c7afd0dbSLois Curfman McInnes . norm - 2-norm function value (may be estimated) 1658c7afd0dbSLois Curfman McInnes for SNES_NONLINEAR_EQUATIONS methods 165940a0c1c6SLois Curfman McInnes . norm - 2-norm gradient value (may be estimated) 1660c7afd0dbSLois Curfman McInnes for SNES_UNCONSTRAINED_MINIMIZATION methods 166140a0c1c6SLois Curfman McInnes - mctx - [optional] monitoring context 16629b94acceSBarry Smith 16639665c990SLois Curfman McInnes Options Database Keys: 1664c7afd0dbSLois Curfman McInnes + -snes_monitor - sets SNESDefaultMonitor() 1665c7afd0dbSLois Curfman McInnes . -snes_xmonitor - sets line graph monitor, 1666c7afd0dbSLois Curfman McInnes uses SNESLGMonitorCreate() 1667c7afd0dbSLois Curfman McInnes _ -snes_cancelmonitors - cancels all monitors that have 1668c7afd0dbSLois Curfman McInnes been hardwired into a code by 1669c7afd0dbSLois Curfman McInnes calls to SNESSetMonitor(), but 1670c7afd0dbSLois Curfman McInnes does not cancel those set via 1671c7afd0dbSLois Curfman McInnes the options database. 16729665c990SLois Curfman McInnes 1673639f9d9dSBarry Smith Notes: 16746bc08f3fSLois Curfman McInnes Several different monitoring routines may be set by calling 16756bc08f3fSLois Curfman McInnes SNESSetMonitor() multiple times; all will be called in the 16766bc08f3fSLois Curfman McInnes order in which they were set. 1677639f9d9dSBarry Smith 167836851e7fSLois Curfman McInnes Level: intermediate 167936851e7fSLois Curfman McInnes 16809b94acceSBarry Smith .keywords: SNES, nonlinear, set, monitor 16819b94acceSBarry Smith 16825cd90555SBarry Smith .seealso: SNESDefaultMonitor(), SNESClearMonitor() 16839b94acceSBarry Smith @*/ 1684329f5518SBarry Smith int SNESSetMonitor(SNES snes,int (*func)(SNES,int,PetscReal,void*),void *mctx,int (*monitordestroy)(void *)) 16859b94acceSBarry Smith { 16863a40ed3dSBarry Smith PetscFunctionBegin; 1687184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1688639f9d9dSBarry Smith if (snes->numbermonitors >= MAXSNESMONITORS) { 168929bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Too many monitors set"); 1690639f9d9dSBarry Smith } 1691639f9d9dSBarry Smith 1692639f9d9dSBarry Smith snes->monitor[snes->numbermonitors] = func; 1693b8a78c4aSBarry Smith snes->monitordestroy[snes->numbermonitors] = monitordestroy; 1694639f9d9dSBarry Smith snes->monitorcontext[snes->numbermonitors++] = (void*)mctx; 16953a40ed3dSBarry Smith PetscFunctionReturn(0); 16969b94acceSBarry Smith } 16979b94acceSBarry Smith 16984a2ae208SSatish Balay #undef __FUNCT__ 16994a2ae208SSatish Balay #define __FUNCT__ "SNESClearMonitor" 17005cd90555SBarry Smith /*@C 17015cd90555SBarry Smith SNESClearMonitor - Clears all the monitor functions for a SNES object. 17025cd90555SBarry Smith 1703c7afd0dbSLois Curfman McInnes Collective on SNES 1704c7afd0dbSLois Curfman McInnes 17055cd90555SBarry Smith Input Parameters: 17065cd90555SBarry Smith . snes - the SNES context 17075cd90555SBarry Smith 17085cd90555SBarry Smith Options Database: 1709c7afd0dbSLois Curfman McInnes . -snes_cancelmonitors - cancels all monitors that have been hardwired 1710c7afd0dbSLois Curfman McInnes into a code by calls to SNESSetMonitor(), but does not cancel those 1711c7afd0dbSLois Curfman McInnes set via the options database 17125cd90555SBarry Smith 17135cd90555SBarry Smith Notes: 17145cd90555SBarry Smith There is no way to clear one specific monitor from a SNES object. 17155cd90555SBarry Smith 171636851e7fSLois Curfman McInnes Level: intermediate 171736851e7fSLois Curfman McInnes 17185cd90555SBarry Smith .keywords: SNES, nonlinear, set, monitor 17195cd90555SBarry Smith 17205cd90555SBarry Smith .seealso: SNESDefaultMonitor(), SNESSetMonitor() 17215cd90555SBarry Smith @*/ 17225cd90555SBarry Smith int SNESClearMonitor(SNES snes) 17235cd90555SBarry Smith { 17245cd90555SBarry Smith PetscFunctionBegin; 1725184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 17265cd90555SBarry Smith snes->numbermonitors = 0; 17275cd90555SBarry Smith PetscFunctionReturn(0); 17285cd90555SBarry Smith } 17295cd90555SBarry Smith 17304a2ae208SSatish Balay #undef __FUNCT__ 17314a2ae208SSatish Balay #define __FUNCT__ "SNESSetConvergenceTest" 17329b94acceSBarry Smith /*@C 17339b94acceSBarry Smith SNESSetConvergenceTest - Sets the function that is to be used 17349b94acceSBarry Smith to test for convergence of the nonlinear iterative solution. 17359b94acceSBarry Smith 1736fee21e36SBarry Smith Collective on SNES 1737fee21e36SBarry Smith 1738c7afd0dbSLois Curfman McInnes Input Parameters: 1739c7afd0dbSLois Curfman McInnes + snes - the SNES context 1740c7afd0dbSLois Curfman McInnes . func - routine to test for convergence 1741c7afd0dbSLois Curfman McInnes - cctx - [optional] context for private data for the convergence routine 1742c7afd0dbSLois Curfman McInnes (may be PETSC_NULL) 17439b94acceSBarry Smith 1744c7afd0dbSLois Curfman McInnes Calling sequence of func: 1745329f5518SBarry Smith $ int func (SNES snes,PetscReal xnorm,PetscReal gnorm,PetscReal f,SNESConvergedReason *reason,void *cctx) 1746c7afd0dbSLois Curfman McInnes 1747c7afd0dbSLois Curfman McInnes + snes - the SNES context 1748c7afd0dbSLois Curfman McInnes . cctx - [optional] convergence context 1749184914b5SBarry Smith . reason - reason for convergence/divergence 1750c7afd0dbSLois Curfman McInnes . xnorm - 2-norm of current iterate 1751c7afd0dbSLois Curfman McInnes . gnorm - 2-norm of current step (SNES_NONLINEAR_EQUATIONS methods) 1752c7afd0dbSLois Curfman McInnes . f - 2-norm of function (SNES_NONLINEAR_EQUATIONS methods) 1753c7afd0dbSLois Curfman McInnes . gnorm - 2-norm of current gradient (SNES_UNCONSTRAINED_MINIMIZATION methods) 1754c7afd0dbSLois Curfman McInnes - f - function value (SNES_UNCONSTRAINED_MINIMIZATION methods) 17559b94acceSBarry Smith 175636851e7fSLois Curfman McInnes Level: advanced 175736851e7fSLois Curfman McInnes 17589b94acceSBarry Smith .keywords: SNES, nonlinear, set, convergence, test 17599b94acceSBarry Smith 176040191667SLois Curfman McInnes .seealso: SNESConverged_EQ_LS(), SNESConverged_EQ_TR(), 176140191667SLois Curfman McInnes SNESConverged_UM_LS(), SNESConverged_UM_TR() 17629b94acceSBarry Smith @*/ 1763329f5518SBarry Smith int SNESSetConvergenceTest(SNES snes,int (*func)(SNES,PetscReal,PetscReal,PetscReal,SNESConvergedReason*,void*),void *cctx) 17649b94acceSBarry Smith { 17653a40ed3dSBarry Smith PetscFunctionBegin; 1766184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 17679b94acceSBarry Smith (snes)->converged = func; 17689b94acceSBarry Smith (snes)->cnvP = cctx; 17693a40ed3dSBarry Smith PetscFunctionReturn(0); 17709b94acceSBarry Smith } 17719b94acceSBarry Smith 17724a2ae208SSatish Balay #undef __FUNCT__ 17734a2ae208SSatish Balay #define __FUNCT__ "SNESGetConvergedReason" 1774184914b5SBarry Smith /*@C 1775184914b5SBarry Smith SNESGetConvergedReason - Gets the reason the SNES iteration was stopped. 1776184914b5SBarry Smith 1777184914b5SBarry Smith Not Collective 1778184914b5SBarry Smith 1779184914b5SBarry Smith Input Parameter: 1780184914b5SBarry Smith . snes - the SNES context 1781184914b5SBarry Smith 1782184914b5SBarry Smith Output Parameter: 1783e090d566SSatish Balay . reason - negative value indicates diverged, positive value converged, see petscsnes.h or the 1784184914b5SBarry Smith manual pages for the individual convergence tests for complete lists 1785184914b5SBarry Smith 1786184914b5SBarry Smith Level: intermediate 1787184914b5SBarry Smith 1788184914b5SBarry Smith Notes: Can only be called after the call the SNESSolve() is complete. 1789184914b5SBarry Smith 1790184914b5SBarry Smith .keywords: SNES, nonlinear, set, convergence, test 1791184914b5SBarry Smith 1792184914b5SBarry Smith .seealso: SNESSetConvergenceTest(), SNESConverged_EQ_LS(), SNESConverged_EQ_TR(), 1793435da068SBarry Smith SNESConverged_UM_LS(), SNESConverged_UM_TR(), SNESConvergedReason 1794184914b5SBarry Smith @*/ 1795184914b5SBarry Smith int SNESGetConvergedReason(SNES snes,SNESConvergedReason *reason) 1796184914b5SBarry Smith { 1797184914b5SBarry Smith PetscFunctionBegin; 1798184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1799184914b5SBarry Smith *reason = snes->reason; 1800184914b5SBarry Smith PetscFunctionReturn(0); 1801184914b5SBarry Smith } 1802184914b5SBarry Smith 18034a2ae208SSatish Balay #undef __FUNCT__ 18044a2ae208SSatish Balay #define __FUNCT__ "SNESSetConvergenceHistory" 1805c9005455SLois Curfman McInnes /*@ 1806c9005455SLois Curfman McInnes SNESSetConvergenceHistory - Sets the array used to hold the convergence history. 1807c9005455SLois Curfman McInnes 1808fee21e36SBarry Smith Collective on SNES 1809fee21e36SBarry Smith 1810c7afd0dbSLois Curfman McInnes Input Parameters: 1811c7afd0dbSLois Curfman McInnes + snes - iterative context obtained from SNESCreate() 1812c7afd0dbSLois Curfman McInnes . a - array to hold history 1813cd5578b5SBarry Smith . its - integer array holds the number of linear iterations for each solve. 1814758f92a0SBarry Smith . na - size of a and its 181564731454SLois Curfman McInnes - reset - PETSC_TRUE indicates each new nonlinear solve resets the history counter to zero, 1816758f92a0SBarry Smith else it continues storing new values for new nonlinear solves after the old ones 1817c7afd0dbSLois Curfman McInnes 1818c9005455SLois Curfman McInnes Notes: 1819c9005455SLois Curfman McInnes If set, this array will contain the function norms (for 1820c9005455SLois Curfman McInnes SNES_NONLINEAR_EQUATIONS methods) or gradient norms 1821c9005455SLois Curfman McInnes (for SNES_UNCONSTRAINED_MINIMIZATION methods) computed 1822c9005455SLois Curfman McInnes at each step. 1823c9005455SLois Curfman McInnes 1824c9005455SLois Curfman McInnes This routine is useful, e.g., when running a code for purposes 1825c9005455SLois Curfman McInnes of accurate performance monitoring, when no I/O should be done 1826c9005455SLois Curfman McInnes during the section of code that is being timed. 1827c9005455SLois Curfman McInnes 182836851e7fSLois Curfman McInnes Level: intermediate 182936851e7fSLois Curfman McInnes 1830c9005455SLois Curfman McInnes .keywords: SNES, set, convergence, history 1831758f92a0SBarry Smith 183208405cd6SLois Curfman McInnes .seealso: SNESGetConvergenceHistory() 1833758f92a0SBarry Smith 1834c9005455SLois Curfman McInnes @*/ 1835329f5518SBarry Smith int SNESSetConvergenceHistory(SNES snes,PetscReal *a,int *its,int na,PetscTruth reset) 1836c9005455SLois Curfman McInnes { 18373a40ed3dSBarry Smith PetscFunctionBegin; 1838c9005455SLois Curfman McInnes PetscValidHeaderSpecific(snes,SNES_COOKIE); 1839c9005455SLois Curfman McInnes if (na) PetscValidScalarPointer(a); 1840c9005455SLois Curfman McInnes snes->conv_hist = a; 1841758f92a0SBarry Smith snes->conv_hist_its = its; 1842758f92a0SBarry Smith snes->conv_hist_max = na; 1843758f92a0SBarry Smith snes->conv_hist_reset = reset; 1844758f92a0SBarry Smith PetscFunctionReturn(0); 1845758f92a0SBarry Smith } 1846758f92a0SBarry Smith 18474a2ae208SSatish Balay #undef __FUNCT__ 18484a2ae208SSatish Balay #define __FUNCT__ "SNESGetConvergenceHistory" 18490c4c9dddSBarry Smith /*@C 1850758f92a0SBarry Smith SNESGetConvergenceHistory - Gets the array used to hold the convergence history. 1851758f92a0SBarry Smith 1852758f92a0SBarry Smith Collective on SNES 1853758f92a0SBarry Smith 1854758f92a0SBarry Smith Input Parameter: 1855758f92a0SBarry Smith . snes - iterative context obtained from SNESCreate() 1856758f92a0SBarry Smith 1857758f92a0SBarry Smith Output Parameters: 1858758f92a0SBarry Smith . a - array to hold history 1859758f92a0SBarry Smith . its - integer array holds the number of linear iterations (or 1860758f92a0SBarry Smith negative if not converged) for each solve. 1861758f92a0SBarry Smith - na - size of a and its 1862758f92a0SBarry Smith 1863758f92a0SBarry Smith Notes: 1864758f92a0SBarry Smith The calling sequence for this routine in Fortran is 1865758f92a0SBarry Smith $ call SNESGetConvergenceHistory(SNES snes, integer na, integer ierr) 1866758f92a0SBarry Smith 1867758f92a0SBarry Smith This routine is useful, e.g., when running a code for purposes 1868758f92a0SBarry Smith of accurate performance monitoring, when no I/O should be done 1869758f92a0SBarry Smith during the section of code that is being timed. 1870758f92a0SBarry Smith 1871758f92a0SBarry Smith Level: intermediate 1872758f92a0SBarry Smith 1873758f92a0SBarry Smith .keywords: SNES, get, convergence, history 1874758f92a0SBarry Smith 1875758f92a0SBarry Smith .seealso: SNESSetConvergencHistory() 1876758f92a0SBarry Smith 1877758f92a0SBarry Smith @*/ 1878329f5518SBarry Smith int SNESGetConvergenceHistory(SNES snes,PetscReal **a,int **its,int *na) 1879758f92a0SBarry Smith { 1880758f92a0SBarry Smith PetscFunctionBegin; 1881758f92a0SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1882758f92a0SBarry Smith if (a) *a = snes->conv_hist; 1883758f92a0SBarry Smith if (its) *its = snes->conv_hist_its; 1884758f92a0SBarry Smith if (na) *na = snes->conv_hist_len; 18853a40ed3dSBarry Smith PetscFunctionReturn(0); 1886c9005455SLois Curfman McInnes } 1887c9005455SLois Curfman McInnes 18884a2ae208SSatish Balay #undef __FUNCT__ 18894a2ae208SSatish Balay #define __FUNCT__ "SNESScaleStep_Private" 18909b94acceSBarry Smith /* 18919b94acceSBarry Smith SNESScaleStep_Private - Scales a step so that its length is less than the 18929b94acceSBarry Smith positive parameter delta. 18939b94acceSBarry Smith 18949b94acceSBarry Smith Input Parameters: 1895c7afd0dbSLois Curfman McInnes + snes - the SNES context 18969b94acceSBarry Smith . y - approximate solution of linear system 18979b94acceSBarry Smith . fnorm - 2-norm of current function 1898c7afd0dbSLois Curfman McInnes - delta - trust region size 18999b94acceSBarry Smith 19009b94acceSBarry Smith Output Parameters: 1901c7afd0dbSLois Curfman McInnes + gpnorm - predicted function norm at the new point, assuming local 19029b94acceSBarry Smith linearization. The value is zero if the step lies within the trust 19039b94acceSBarry Smith region, and exceeds zero otherwise. 1904c7afd0dbSLois Curfman McInnes - ynorm - 2-norm of the step 19059b94acceSBarry Smith 19069b94acceSBarry Smith Note: 19076831982aSBarry Smith For non-trust region methods such as SNESEQLS, the parameter delta 19089b94acceSBarry Smith is set to be the maximum allowable step size. 19099b94acceSBarry Smith 19109b94acceSBarry Smith .keywords: SNES, nonlinear, scale, step 19119b94acceSBarry Smith */ 1912329f5518SBarry Smith int SNESScaleStep_Private(SNES snes,Vec y,PetscReal *fnorm,PetscReal *delta, 1913329f5518SBarry Smith PetscReal *gpnorm,PetscReal *ynorm) 19149b94acceSBarry Smith { 1915329f5518SBarry Smith PetscReal norm; 1916*ea709b57SSatish Balay PetscScalar cnorm; 19173a40ed3dSBarry Smith int ierr; 19183a40ed3dSBarry Smith 19193a40ed3dSBarry Smith PetscFunctionBegin; 1920184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1921184914b5SBarry Smith PetscValidHeaderSpecific(y,VEC_COOKIE); 1922184914b5SBarry Smith PetscCheckSameComm(snes,y); 1923184914b5SBarry Smith 19243a40ed3dSBarry Smith ierr = VecNorm(y,NORM_2,&norm);CHKERRQ(ierr); 19259b94acceSBarry Smith if (norm > *delta) { 19269b94acceSBarry Smith norm = *delta/norm; 19279b94acceSBarry Smith *gpnorm = (1.0 - norm)*(*fnorm); 19289b94acceSBarry Smith cnorm = norm; 1929329f5518SBarry Smith ierr = VecScale(&cnorm,y);CHKERRQ(ierr); 19309b94acceSBarry Smith *ynorm = *delta; 19319b94acceSBarry Smith } else { 19329b94acceSBarry Smith *gpnorm = 0.0; 19339b94acceSBarry Smith *ynorm = norm; 19349b94acceSBarry Smith } 19353a40ed3dSBarry Smith PetscFunctionReturn(0); 19369b94acceSBarry Smith } 19379b94acceSBarry Smith 19384a2ae208SSatish Balay #undef __FUNCT__ 19394a2ae208SSatish Balay #define __FUNCT__ "SNESSolve" 19409b94acceSBarry Smith /*@ 19419b94acceSBarry Smith SNESSolve - Solves a nonlinear system. Call SNESSolve after calling 194263a78c88SLois Curfman McInnes SNESCreate() and optional routines of the form SNESSetXXX(). 19439b94acceSBarry Smith 1944c7afd0dbSLois Curfman McInnes Collective on SNES 1945c7afd0dbSLois Curfman McInnes 1946b2002411SLois Curfman McInnes Input Parameters: 1947c7afd0dbSLois Curfman McInnes + snes - the SNES context 1948c7afd0dbSLois Curfman McInnes - x - the solution vector 19499b94acceSBarry Smith 19509b94acceSBarry Smith Output Parameter: 1951b2002411SLois Curfman McInnes . its - number of iterations until termination 19529b94acceSBarry Smith 1953b2002411SLois Curfman McInnes Notes: 19548ddd3da0SLois Curfman McInnes The user should initialize the vector,x, with the initial guess 19558ddd3da0SLois Curfman McInnes for the nonlinear solve prior to calling SNESSolve. In particular, 19568ddd3da0SLois Curfman McInnes to employ an initial guess of zero, the user should explicitly set 19578ddd3da0SLois Curfman McInnes this vector to zero by calling VecSet(). 19588ddd3da0SLois Curfman McInnes 195936851e7fSLois Curfman McInnes Level: beginner 196036851e7fSLois Curfman McInnes 19619b94acceSBarry Smith .keywords: SNES, nonlinear, solve 19629b94acceSBarry Smith 196363a78c88SLois Curfman McInnes .seealso: SNESCreate(), SNESDestroy() 19649b94acceSBarry Smith @*/ 19658ddd3da0SLois Curfman McInnes int SNESSolve(SNES snes,Vec x,int *its) 19669b94acceSBarry Smith { 1967f1af5d2fSBarry Smith int ierr; 1968f1af5d2fSBarry Smith PetscTruth flg; 1969052efed2SBarry Smith 19703a40ed3dSBarry Smith PetscFunctionBegin; 197177c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 1972184914b5SBarry Smith PetscValidHeaderSpecific(x,VEC_COOKIE); 1973184914b5SBarry Smith PetscCheckSameComm(snes,x); 197474679c65SBarry Smith PetscValidIntPointer(its); 197529bbc08cSBarry Smith if (!snes->solve) SETERRQ(1,"SNESSetType() or SNESSetFromOptions() must be called before SNESSolve()"); 197674637425SBarry Smith 197782bf6240SBarry Smith if (!snes->setupcalled) {ierr = SNESSetUp(snes,x);CHKERRQ(ierr);} 1978c4fc05e7SBarry Smith else {snes->vec_sol = snes->vec_sol_always = x;} 1979758f92a0SBarry Smith if (snes->conv_hist_reset == PETSC_TRUE) snes->conv_hist_len = 0; 1980b0a32e0cSBarry Smith ierr = PetscLogEventBegin(SNES_Solve,snes,0,0,0);CHKERRQ(ierr); 1981c96a6f78SLois Curfman McInnes snes->nfuncs = 0; snes->linear_its = 0; snes->nfailures = 0; 19829b94acceSBarry Smith ierr = (*(snes)->solve)(snes,its);CHKERRQ(ierr); 1983b0a32e0cSBarry Smith ierr = PetscLogEventEnd(SNES_Solve,snes,0,0,0);CHKERRQ(ierr); 1984b0a32e0cSBarry Smith ierr = PetscOptionsHasName(snes->prefix,"-snes_view",&flg);CHKERRQ(ierr); 198593b98531SBarry Smith if (flg && !PetscPreLoadingOn) { ierr = SNESView(snes,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); } 19863a40ed3dSBarry Smith PetscFunctionReturn(0); 19879b94acceSBarry Smith } 19889b94acceSBarry Smith 19899b94acceSBarry Smith /* --------- Internal routines for SNES Package --------- */ 19909b94acceSBarry Smith 19914a2ae208SSatish Balay #undef __FUNCT__ 19924a2ae208SSatish Balay #define __FUNCT__ "SNESSetType" 199382bf6240SBarry Smith /*@C 19944b0e389bSBarry Smith SNESSetType - Sets the method for the nonlinear solver. 19959b94acceSBarry Smith 1996fee21e36SBarry Smith Collective on SNES 1997fee21e36SBarry Smith 1998c7afd0dbSLois Curfman McInnes Input Parameters: 1999c7afd0dbSLois Curfman McInnes + snes - the SNES context 2000454a90a3SBarry Smith - type - a known method 2001c7afd0dbSLois Curfman McInnes 2002c7afd0dbSLois Curfman McInnes Options Database Key: 2003454a90a3SBarry Smith . -snes_type <type> - Sets the method; use -help for a list 2004c7afd0dbSLois Curfman McInnes of available methods (for instance, ls or tr) 2005ae12b187SLois Curfman McInnes 20069b94acceSBarry Smith Notes: 2007e090d566SSatish Balay See "petsc/include/petscsnes.h" for available methods (for instance) 20086831982aSBarry Smith + SNESEQLS - Newton's method with line search 2009c7afd0dbSLois Curfman McInnes (systems of nonlinear equations) 20106831982aSBarry Smith . SNESEQTR - Newton's method with trust region 2011c7afd0dbSLois Curfman McInnes (systems of nonlinear equations) 20126831982aSBarry Smith . SNESUMTR - Newton's method with trust region 2013c7afd0dbSLois Curfman McInnes (unconstrained minimization) 20146831982aSBarry Smith - SNESUMLS - Newton's method with line search 2015c7afd0dbSLois Curfman McInnes (unconstrained minimization) 20169b94acceSBarry Smith 2017ae12b187SLois Curfman McInnes Normally, it is best to use the SNESSetFromOptions() command and then 2018ae12b187SLois Curfman McInnes set the SNES solver type from the options database rather than by using 2019ae12b187SLois Curfman McInnes this routine. Using the options database provides the user with 2020ae12b187SLois Curfman McInnes maximum flexibility in evaluating the many nonlinear solvers. 2021ae12b187SLois Curfman McInnes The SNESSetType() routine is provided for those situations where it 2022ae12b187SLois Curfman McInnes is necessary to set the nonlinear solver independently of the command 2023ae12b187SLois Curfman McInnes line or options database. This might be the case, for example, when 2024ae12b187SLois Curfman McInnes the choice of solver changes during the execution of the program, 2025ae12b187SLois Curfman McInnes and the user's application is taking responsibility for choosing the 2026b0a32e0cSBarry Smith appropriate method. 202736851e7fSLois Curfman McInnes 202836851e7fSLois Curfman McInnes Level: intermediate 2029a703fe33SLois Curfman McInnes 2030454a90a3SBarry Smith .keywords: SNES, set, type 2031435da068SBarry Smith 2032435da068SBarry Smith .seealso: SNESType, SNESCreate() 2033435da068SBarry Smith 20349b94acceSBarry Smith @*/ 2035454a90a3SBarry Smith int SNESSetType(SNES snes,SNESType type) 20369b94acceSBarry Smith { 20370f5bd95cSBarry Smith int ierr,(*r)(SNES); 20386831982aSBarry Smith PetscTruth match; 20393a40ed3dSBarry Smith 20403a40ed3dSBarry Smith PetscFunctionBegin; 204177c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 20420f5bd95cSBarry Smith PetscValidCharPointer(type); 204382bf6240SBarry Smith 20446831982aSBarry Smith ierr = PetscTypeCompare((PetscObject)snes,type,&match);CHKERRQ(ierr); 20450f5bd95cSBarry Smith if (match) PetscFunctionReturn(0); 204682bf6240SBarry Smith 204782bf6240SBarry Smith if (snes->setupcalled) { 2048e1311b90SBarry Smith ierr = (*(snes)->destroy)(snes);CHKERRQ(ierr); 204982bf6240SBarry Smith snes->data = 0; 205082bf6240SBarry Smith } 20517d1a2b2bSBarry Smith 20529b94acceSBarry Smith /* Get the function pointers for the iterative method requested */ 205382bf6240SBarry Smith if (!SNESRegisterAllCalled) {ierr = SNESRegisterAll(PETSC_NULL);CHKERRQ(ierr);} 205482bf6240SBarry Smith 2055b9617806SBarry Smith ierr = PetscFListFind(snes->comm,SNESList,type,(void (**)(void)) &r);CHKERRQ(ierr); 205682bf6240SBarry Smith 205729bbc08cSBarry Smith if (!r) SETERRQ1(1,"Unable to find requested SNES type %s",type); 20581548b14aSBarry Smith 2059606d414cSSatish Balay if (snes->data) {ierr = PetscFree(snes->data);CHKERRQ(ierr);} 206082bf6240SBarry Smith snes->data = 0; 20613a40ed3dSBarry Smith ierr = (*r)(snes);CHKERRQ(ierr); 206282bf6240SBarry Smith 2063454a90a3SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)snes,type);CHKERRQ(ierr); 206482bf6240SBarry Smith snes->set_method_called = 1; 206582bf6240SBarry Smith 20663a40ed3dSBarry Smith PetscFunctionReturn(0); 20679b94acceSBarry Smith } 20689b94acceSBarry Smith 2069a847f771SSatish Balay 20709b94acceSBarry Smith /* --------------------------------------------------------------------- */ 20714a2ae208SSatish Balay #undef __FUNCT__ 20724a2ae208SSatish Balay #define __FUNCT__ "SNESRegisterDestroy" 20739b94acceSBarry Smith /*@C 20749b94acceSBarry Smith SNESRegisterDestroy - Frees the list of nonlinear solvers that were 2075f1af5d2fSBarry Smith registered by SNESRegisterDynamic(). 20769b94acceSBarry Smith 2077fee21e36SBarry Smith Not Collective 2078fee21e36SBarry Smith 207936851e7fSLois Curfman McInnes Level: advanced 208036851e7fSLois Curfman McInnes 20819b94acceSBarry Smith .keywords: SNES, nonlinear, register, destroy 20829b94acceSBarry Smith 20839b94acceSBarry Smith .seealso: SNESRegisterAll(), SNESRegisterAll() 20849b94acceSBarry Smith @*/ 2085cf256101SBarry Smith int SNESRegisterDestroy(void) 20869b94acceSBarry Smith { 208782bf6240SBarry Smith int ierr; 208882bf6240SBarry Smith 20893a40ed3dSBarry Smith PetscFunctionBegin; 209082bf6240SBarry Smith if (SNESList) { 2091b0a32e0cSBarry Smith ierr = PetscFListDestroy(&SNESList);CHKERRQ(ierr); 209282bf6240SBarry Smith SNESList = 0; 20939b94acceSBarry Smith } 20944c49b128SBarry Smith SNESRegisterAllCalled = PETSC_FALSE; 20953a40ed3dSBarry Smith PetscFunctionReturn(0); 20969b94acceSBarry Smith } 20979b94acceSBarry Smith 20984a2ae208SSatish Balay #undef __FUNCT__ 20994a2ae208SSatish Balay #define __FUNCT__ "SNESGetType" 21009b94acceSBarry Smith /*@C 21019a28b0a6SLois Curfman McInnes SNESGetType - Gets the SNES method type and name (as a string). 21029b94acceSBarry Smith 2103c7afd0dbSLois Curfman McInnes Not Collective 2104c7afd0dbSLois Curfman McInnes 21059b94acceSBarry Smith Input Parameter: 21064b0e389bSBarry Smith . snes - nonlinear solver context 21079b94acceSBarry Smith 21089b94acceSBarry Smith Output Parameter: 21093a7fca6bSBarry Smith . type - SNES method (a character string) 21109b94acceSBarry Smith 211136851e7fSLois Curfman McInnes Level: intermediate 211236851e7fSLois Curfman McInnes 2113454a90a3SBarry Smith .keywords: SNES, nonlinear, get, type, name 21149b94acceSBarry Smith @*/ 2115454a90a3SBarry Smith int SNESGetType(SNES snes,SNESType *type) 21169b94acceSBarry Smith { 21173a40ed3dSBarry Smith PetscFunctionBegin; 2118184914b5SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2119454a90a3SBarry Smith *type = snes->type_name; 21203a40ed3dSBarry Smith PetscFunctionReturn(0); 21219b94acceSBarry Smith } 21229b94acceSBarry Smith 21234a2ae208SSatish Balay #undef __FUNCT__ 21244a2ae208SSatish Balay #define __FUNCT__ "SNESGetSolution" 21259b94acceSBarry Smith /*@C 21269b94acceSBarry Smith SNESGetSolution - Returns the vector where the approximate solution is 21279b94acceSBarry Smith stored. 21289b94acceSBarry Smith 2129c7afd0dbSLois Curfman McInnes Not Collective, but Vec is parallel if SNES is parallel 2130c7afd0dbSLois Curfman McInnes 21319b94acceSBarry Smith Input Parameter: 21329b94acceSBarry Smith . snes - the SNES context 21339b94acceSBarry Smith 21349b94acceSBarry Smith Output Parameter: 21359b94acceSBarry Smith . x - the solution 21369b94acceSBarry Smith 213736851e7fSLois Curfman McInnes Level: advanced 213836851e7fSLois Curfman McInnes 21399b94acceSBarry Smith .keywords: SNES, nonlinear, get, solution 21409b94acceSBarry Smith 2141a86d99e1SLois Curfman McInnes .seealso: SNESGetFunction(), SNESGetGradient(), SNESGetSolutionUpdate() 21429b94acceSBarry Smith @*/ 21439b94acceSBarry Smith int SNESGetSolution(SNES snes,Vec *x) 21449b94acceSBarry Smith { 21453a40ed3dSBarry Smith PetscFunctionBegin; 214677c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 21479b94acceSBarry Smith *x = snes->vec_sol_always; 21483a40ed3dSBarry Smith PetscFunctionReturn(0); 21499b94acceSBarry Smith } 21509b94acceSBarry Smith 21514a2ae208SSatish Balay #undef __FUNCT__ 21524a2ae208SSatish Balay #define __FUNCT__ "SNESGetSolutionUpdate" 21539b94acceSBarry Smith /*@C 21549b94acceSBarry Smith SNESGetSolutionUpdate - Returns the vector where the solution update is 21559b94acceSBarry Smith stored. 21569b94acceSBarry Smith 2157c7afd0dbSLois Curfman McInnes Not Collective, but Vec is parallel if SNES is parallel 2158c7afd0dbSLois Curfman McInnes 21599b94acceSBarry Smith Input Parameter: 21609b94acceSBarry Smith . snes - the SNES context 21619b94acceSBarry Smith 21629b94acceSBarry Smith Output Parameter: 21639b94acceSBarry Smith . x - the solution update 21649b94acceSBarry Smith 216536851e7fSLois Curfman McInnes Level: advanced 216636851e7fSLois Curfman McInnes 21679b94acceSBarry Smith .keywords: SNES, nonlinear, get, solution, update 21689b94acceSBarry Smith 21699b94acceSBarry Smith .seealso: SNESGetSolution(), SNESGetFunction 21709b94acceSBarry Smith @*/ 21719b94acceSBarry Smith int SNESGetSolutionUpdate(SNES snes,Vec *x) 21729b94acceSBarry Smith { 21733a40ed3dSBarry Smith PetscFunctionBegin; 217477c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 21759b94acceSBarry Smith *x = snes->vec_sol_update_always; 21763a40ed3dSBarry Smith PetscFunctionReturn(0); 21779b94acceSBarry Smith } 21789b94acceSBarry Smith 21794a2ae208SSatish Balay #undef __FUNCT__ 21804a2ae208SSatish Balay #define __FUNCT__ "SNESGetFunction" 21819b94acceSBarry Smith /*@C 21823638b69dSLois Curfman McInnes SNESGetFunction - Returns the vector where the function is stored. 21839b94acceSBarry Smith 2184c7afd0dbSLois Curfman McInnes Not Collective, but Vec is parallel if SNES is parallel 2185c7afd0dbSLois Curfman McInnes 21869b94acceSBarry Smith Input Parameter: 21879b94acceSBarry Smith . snes - the SNES context 21889b94acceSBarry Smith 21899b94acceSBarry Smith Output Parameter: 21907bf4e008SBarry Smith + r - the function (or PETSC_NULL) 219100036973SBarry Smith . ctx - the function context (or PETSC_NULL) 219200036973SBarry Smith - func - the function (or PETSC_NULL) 21939b94acceSBarry Smith 21949b94acceSBarry Smith Notes: 21959b94acceSBarry Smith SNESGetFunction() is valid for SNES_NONLINEAR_EQUATIONS methods only 21969b94acceSBarry Smith Analogous routines for SNES_UNCONSTRAINED_MINIMIZATION methods are 21979b94acceSBarry Smith SNESGetMinimizationFunction() and SNESGetGradient(); 21989b94acceSBarry Smith 219936851e7fSLois Curfman McInnes Level: advanced 220036851e7fSLois Curfman McInnes 2201a86d99e1SLois Curfman McInnes .keywords: SNES, nonlinear, get, function 22029b94acceSBarry Smith 220331615d04SLois Curfman McInnes .seealso: SNESSetFunction(), SNESGetSolution(), SNESGetMinimizationFunction(), 220431615d04SLois Curfman McInnes SNESGetGradient() 22057bf4e008SBarry Smith 22069b94acceSBarry Smith @*/ 220700036973SBarry Smith int SNESGetFunction(SNES snes,Vec *r,void **ctx,int (**func)(SNES,Vec,Vec,void*)) 22089b94acceSBarry Smith { 22093a40ed3dSBarry Smith PetscFunctionBegin; 221077c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2211a8c6a408SBarry Smith if (snes->method_class != SNES_NONLINEAR_EQUATIONS) { 221229bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_NONLINEAR_EQUATIONS only"); 2213a8c6a408SBarry Smith } 22147bf4e008SBarry Smith if (r) *r = snes->vec_func_always; 22157bf4e008SBarry Smith if (ctx) *ctx = snes->funP; 221600036973SBarry Smith if (func) *func = snes->computefunction; 22173a40ed3dSBarry Smith PetscFunctionReturn(0); 22189b94acceSBarry Smith } 22199b94acceSBarry Smith 22204a2ae208SSatish Balay #undef __FUNCT__ 22214a2ae208SSatish Balay #define __FUNCT__ "SNESGetGradient" 22229b94acceSBarry Smith /*@C 22233638b69dSLois Curfman McInnes SNESGetGradient - Returns the vector where the gradient is stored. 22249b94acceSBarry Smith 2225c7afd0dbSLois Curfman McInnes Not Collective, but Vec is parallel if SNES is parallel 2226c7afd0dbSLois Curfman McInnes 22279b94acceSBarry Smith Input Parameter: 22289b94acceSBarry Smith . snes - the SNES context 22299b94acceSBarry Smith 22309b94acceSBarry Smith Output Parameter: 22317bf4e008SBarry Smith + r - the gradient (or PETSC_NULL) 22327bf4e008SBarry Smith - ctx - the gradient context (or PETSC_NULL) 22339b94acceSBarry Smith 22349b94acceSBarry Smith Notes: 22359b94acceSBarry Smith SNESGetGradient() is valid for SNES_UNCONSTRAINED_MINIMIZATION methods 22369b94acceSBarry Smith only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is 22379b94acceSBarry Smith SNESGetFunction(). 22389b94acceSBarry Smith 223936851e7fSLois Curfman McInnes Level: advanced 224036851e7fSLois Curfman McInnes 22419b94acceSBarry Smith .keywords: SNES, nonlinear, get, gradient 22429b94acceSBarry Smith 22437bf4e008SBarry Smith .seealso: SNESGetMinimizationFunction(), SNESGetSolution(), SNESGetFunction(), 22447bf4e008SBarry Smith SNESSetGradient(), SNESSetFunction() 22457bf4e008SBarry Smith 22469b94acceSBarry Smith @*/ 22477bf4e008SBarry Smith int SNESGetGradient(SNES snes,Vec *r,void **ctx) 22489b94acceSBarry Smith { 22493a40ed3dSBarry Smith PetscFunctionBegin; 225077c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 22513a40ed3dSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 225229bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 22533a40ed3dSBarry Smith } 22547bf4e008SBarry Smith if (r) *r = snes->vec_func_always; 22557bf4e008SBarry Smith if (ctx) *ctx = snes->funP; 22563a40ed3dSBarry Smith PetscFunctionReturn(0); 22579b94acceSBarry Smith } 22589b94acceSBarry Smith 22594a2ae208SSatish Balay #undef __FUNCT__ 22604a2ae208SSatish Balay #define __FUNCT__ "SNESGetMinimizationFunction" 22617bf4e008SBarry Smith /*@C 22629b94acceSBarry Smith SNESGetMinimizationFunction - Returns the scalar function value for 22639b94acceSBarry Smith unconstrained minimization problems. 22649b94acceSBarry Smith 2265c7afd0dbSLois Curfman McInnes Not Collective 2266c7afd0dbSLois Curfman McInnes 22679b94acceSBarry Smith Input Parameter: 22689b94acceSBarry Smith . snes - the SNES context 22699b94acceSBarry Smith 22709b94acceSBarry Smith Output Parameter: 22717bf4e008SBarry Smith + r - the function (or PETSC_NULL) 22727bf4e008SBarry Smith - ctx - the function context (or PETSC_NULL) 22739b94acceSBarry Smith 22749b94acceSBarry Smith Notes: 22759b94acceSBarry Smith SNESGetMinimizationFunction() is valid for SNES_UNCONSTRAINED_MINIMIZATION 22769b94acceSBarry Smith methods only. An analogous routine for SNES_NONLINEAR_EQUATIONS methods is 22779b94acceSBarry Smith SNESGetFunction(). 22789b94acceSBarry Smith 227936851e7fSLois Curfman McInnes Level: advanced 228036851e7fSLois Curfman McInnes 22819b94acceSBarry Smith .keywords: SNES, nonlinear, get, function 22829b94acceSBarry Smith 22837bf4e008SBarry Smith .seealso: SNESGetGradient(), SNESGetSolution(), SNESGetFunction(), SNESSetFunction() 22847bf4e008SBarry Smith 22859b94acceSBarry Smith @*/ 2286329f5518SBarry Smith int SNESGetMinimizationFunction(SNES snes,PetscReal *r,void **ctx) 22879b94acceSBarry Smith { 22883a40ed3dSBarry Smith PetscFunctionBegin; 228977c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 229074679c65SBarry Smith PetscValidScalarPointer(r); 22913a40ed3dSBarry Smith if (snes->method_class != SNES_UNCONSTRAINED_MINIMIZATION) { 229229bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"For SNES_UNCONSTRAINED_MINIMIZATION only"); 22933a40ed3dSBarry Smith } 22947bf4e008SBarry Smith if (r) *r = snes->fc; 22957bf4e008SBarry Smith if (ctx) *ctx = snes->umfunP; 22963a40ed3dSBarry Smith PetscFunctionReturn(0); 22979b94acceSBarry Smith } 22989b94acceSBarry Smith 22994a2ae208SSatish Balay #undef __FUNCT__ 23004a2ae208SSatish Balay #define __FUNCT__ "SNESSetOptionsPrefix" 23013c7409f5SSatish Balay /*@C 23023c7409f5SSatish Balay SNESSetOptionsPrefix - Sets the prefix used for searching for all 2303d850072dSLois Curfman McInnes SNES options in the database. 23043c7409f5SSatish Balay 2305fee21e36SBarry Smith Collective on SNES 2306fee21e36SBarry Smith 2307c7afd0dbSLois Curfman McInnes Input Parameter: 2308c7afd0dbSLois Curfman McInnes + snes - the SNES context 2309c7afd0dbSLois Curfman McInnes - prefix - the prefix to prepend to all option names 2310c7afd0dbSLois Curfman McInnes 2311d850072dSLois Curfman McInnes Notes: 2312a83b1b31SSatish Balay A hyphen (-) must NOT be given at the beginning of the prefix name. 2313c7afd0dbSLois Curfman McInnes The first character of all runtime options is AUTOMATICALLY the hyphen. 2314d850072dSLois Curfman McInnes 231536851e7fSLois Curfman McInnes Level: advanced 231636851e7fSLois Curfman McInnes 23173c7409f5SSatish Balay .keywords: SNES, set, options, prefix, database 2318a86d99e1SLois Curfman McInnes 2319a86d99e1SLois Curfman McInnes .seealso: SNESSetFromOptions() 23203c7409f5SSatish Balay @*/ 23213c7409f5SSatish Balay int SNESSetOptionsPrefix(SNES snes,char *prefix) 23223c7409f5SSatish Balay { 23233c7409f5SSatish Balay int ierr; 23243c7409f5SSatish Balay 23253a40ed3dSBarry Smith PetscFunctionBegin; 232677c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2327639f9d9dSBarry Smith ierr = PetscObjectSetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr); 23283c7409f5SSatish Balay ierr = SLESSetOptionsPrefix(snes->sles,prefix);CHKERRQ(ierr); 23293a40ed3dSBarry Smith PetscFunctionReturn(0); 23303c7409f5SSatish Balay } 23313c7409f5SSatish Balay 23324a2ae208SSatish Balay #undef __FUNCT__ 23334a2ae208SSatish Balay #define __FUNCT__ "SNESAppendOptionsPrefix" 23343c7409f5SSatish Balay /*@C 2335f525115eSLois Curfman McInnes SNESAppendOptionsPrefix - Appends to the prefix used for searching for all 2336d850072dSLois Curfman McInnes SNES options in the database. 23373c7409f5SSatish Balay 2338fee21e36SBarry Smith Collective on SNES 2339fee21e36SBarry Smith 2340c7afd0dbSLois Curfman McInnes Input Parameters: 2341c7afd0dbSLois Curfman McInnes + snes - the SNES context 2342c7afd0dbSLois Curfman McInnes - prefix - the prefix to prepend to all option names 2343c7afd0dbSLois Curfman McInnes 2344d850072dSLois Curfman McInnes Notes: 2345a83b1b31SSatish Balay A hyphen (-) must NOT be given at the beginning of the prefix name. 2346c7afd0dbSLois Curfman McInnes The first character of all runtime options is AUTOMATICALLY the hyphen. 2347d850072dSLois Curfman McInnes 234836851e7fSLois Curfman McInnes Level: advanced 234936851e7fSLois Curfman McInnes 23503c7409f5SSatish Balay .keywords: SNES, append, options, prefix, database 2351a86d99e1SLois Curfman McInnes 2352a86d99e1SLois Curfman McInnes .seealso: SNESGetOptionsPrefix() 23533c7409f5SSatish Balay @*/ 23543c7409f5SSatish Balay int SNESAppendOptionsPrefix(SNES snes,char *prefix) 23553c7409f5SSatish Balay { 23563c7409f5SSatish Balay int ierr; 23573c7409f5SSatish Balay 23583a40ed3dSBarry Smith PetscFunctionBegin; 235977c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2360639f9d9dSBarry Smith ierr = PetscObjectAppendOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr); 23613c7409f5SSatish Balay ierr = SLESAppendOptionsPrefix(snes->sles,prefix);CHKERRQ(ierr); 23623a40ed3dSBarry Smith PetscFunctionReturn(0); 23633c7409f5SSatish Balay } 23643c7409f5SSatish Balay 23654a2ae208SSatish Balay #undef __FUNCT__ 23664a2ae208SSatish Balay #define __FUNCT__ "SNESGetOptionsPrefix" 23679ab63eb5SSatish Balay /*@C 23683c7409f5SSatish Balay SNESGetOptionsPrefix - Sets the prefix used for searching for all 23693c7409f5SSatish Balay SNES options in the database. 23703c7409f5SSatish Balay 2371c7afd0dbSLois Curfman McInnes Not Collective 2372c7afd0dbSLois Curfman McInnes 23733c7409f5SSatish Balay Input Parameter: 23743c7409f5SSatish Balay . snes - the SNES context 23753c7409f5SSatish Balay 23763c7409f5SSatish Balay Output Parameter: 23773c7409f5SSatish Balay . prefix - pointer to the prefix string used 23783c7409f5SSatish Balay 23799ab63eb5SSatish Balay Notes: On the fortran side, the user should pass in a string 'prifix' of 23809ab63eb5SSatish Balay sufficient length to hold the prefix. 23819ab63eb5SSatish Balay 238236851e7fSLois Curfman McInnes Level: advanced 238336851e7fSLois Curfman McInnes 23843c7409f5SSatish Balay .keywords: SNES, get, options, prefix, database 2385a86d99e1SLois Curfman McInnes 2386a86d99e1SLois Curfman McInnes .seealso: SNESAppendOptionsPrefix() 23873c7409f5SSatish Balay @*/ 23883c7409f5SSatish Balay int SNESGetOptionsPrefix(SNES snes,char **prefix) 23893c7409f5SSatish Balay { 23903c7409f5SSatish Balay int ierr; 23913c7409f5SSatish Balay 23923a40ed3dSBarry Smith PetscFunctionBegin; 239377c4ece6SBarry Smith PetscValidHeaderSpecific(snes,SNES_COOKIE); 2394639f9d9dSBarry Smith ierr = PetscObjectGetOptionsPrefix((PetscObject)snes,prefix);CHKERRQ(ierr); 23953a40ed3dSBarry Smith PetscFunctionReturn(0); 23963c7409f5SSatish Balay } 23973c7409f5SSatish Balay 2398acb85ae6SSatish Balay /*MC 2399f1af5d2fSBarry Smith SNESRegisterDynamic - Adds a method to the nonlinear solver package. 24009b94acceSBarry Smith 2401b2002411SLois Curfman McInnes Synopsis: 24023a7fca6bSBarry Smith int SNESRegisterDynamic(char *name_solver,char *path,char *name_create,int (*routine_create)(SNES)) 24039b94acceSBarry Smith 24048d76a1e5SLois Curfman McInnes Not collective 24058d76a1e5SLois Curfman McInnes 2406b2002411SLois Curfman McInnes Input Parameters: 2407c7afd0dbSLois Curfman McInnes + name_solver - name of a new user-defined solver 2408b2002411SLois Curfman McInnes . path - path (either absolute or relative) the library containing this solver 2409b2002411SLois Curfman McInnes . name_create - name of routine to create method context 2410c7afd0dbSLois Curfman McInnes - routine_create - routine to create method context 24119b94acceSBarry Smith 2412b2002411SLois Curfman McInnes Notes: 2413f1af5d2fSBarry Smith SNESRegisterDynamic() may be called multiple times to add several user-defined solvers. 24143a40ed3dSBarry Smith 2415b2002411SLois Curfman McInnes If dynamic libraries are used, then the fourth input argument (routine_create) 2416b2002411SLois Curfman McInnes is ignored. 2417b2002411SLois Curfman McInnes 2418b9617806SBarry Smith Environmental variables such as ${PETSC_ARCH}, ${PETSC_DIR}, ${PETSC_LIB_DIR}, ${BOPT}, 24195ba88a07SLois Curfman McInnes and others of the form ${any_environmental_variable} occuring in pathname will be 24205ba88a07SLois Curfman McInnes replaced with appropriate values. 24215ba88a07SLois Curfman McInnes 2422b2002411SLois Curfman McInnes Sample usage: 242369225d78SLois Curfman McInnes .vb 2424f1af5d2fSBarry Smith SNESRegisterDynamic("my_solver",/home/username/my_lib/lib/libg/solaris/mylib.a, 2425b2002411SLois Curfman McInnes "MySolverCreate",MySolverCreate); 242669225d78SLois Curfman McInnes .ve 2427b2002411SLois Curfman McInnes 2428b2002411SLois Curfman McInnes Then, your solver can be chosen with the procedural interface via 2429b2002411SLois Curfman McInnes $ SNESSetType(snes,"my_solver") 2430b2002411SLois Curfman McInnes or at runtime via the option 2431b2002411SLois Curfman McInnes $ -snes_type my_solver 2432b2002411SLois Curfman McInnes 243336851e7fSLois Curfman McInnes Level: advanced 243436851e7fSLois Curfman McInnes 2435b2002411SLois Curfman McInnes .keywords: SNES, nonlinear, register 2436b2002411SLois Curfman McInnes 2437b2002411SLois Curfman McInnes .seealso: SNESRegisterAll(), SNESRegisterDestroy() 2438b2002411SLois Curfman McInnes M*/ 2439b2002411SLois Curfman McInnes 24404a2ae208SSatish Balay #undef __FUNCT__ 24414a2ae208SSatish Balay #define __FUNCT__ "SNESRegister" 2442f1af5d2fSBarry Smith int SNESRegister(char *sname,char *path,char *name,int (*function)(SNES)) 2443b2002411SLois Curfman McInnes { 2444b2002411SLois Curfman McInnes char fullname[256]; 2445b2002411SLois Curfman McInnes int ierr; 2446b2002411SLois Curfman McInnes 2447b2002411SLois Curfman McInnes PetscFunctionBegin; 2448b0a32e0cSBarry Smith ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr); 2449b9617806SBarry Smith ierr = PetscFListAdd(&SNESList,sname,fullname,(void (*)())function);CHKERRQ(ierr); 2450b2002411SLois Curfman McInnes PetscFunctionReturn(0); 2451b2002411SLois Curfman McInnes } 2452