1 /* 2 User interface for the nonlinear solvers package. 3 */ 4 #if !defined(__PETSCSNES_H) 5 #define __PETSCSNES_H 6 #include "petscksp.h" 7 PETSC_EXTERN_CXX_BEGIN 8 9 /*S 10 SNES - Abstract PETSc object that manages all nonlinear solves 11 12 Level: beginner 13 14 Concepts: nonlinear solvers 15 16 .seealso: SNESCreate(), SNESSetType(), SNESType, TS, KSP, KSP, PC 17 S*/ 18 typedef struct _p_SNES* SNES; 19 20 /*J 21 SNESType - String with the name of a PETSc SNES method or the creation function 22 with an optional dynamic library name, for example 23 http://www.mcs.anl.gov/petsc/lib.a:mysnescreate() 24 25 Level: beginner 26 27 .seealso: SNESSetType(), SNES 28 J*/ 29 #define SNESType char* 30 #define SNESLS "ls" 31 #define SNESTR "tr" 32 #define SNESPYTHON "python" 33 #define SNESTEST "test" 34 #define SNESNRICHARDSON "nrichardson" 35 #define SNESKSPONLY "ksponly" 36 #define SNESVIRS "virs" 37 #define SNESVISS "viss" 38 #define SNESNGMRES "ngmres" 39 #define SNESQN "qn" 40 #define SNESSHELL "shell" 41 #define SNESNCG "ncg" 42 #define SNESSORQN "sorqn" 43 #define SNESFAS "fas" 44 45 /* Logging support */ 46 extern PetscClassId SNES_CLASSID; 47 48 extern PetscErrorCode SNESInitializePackage(const char[]); 49 50 extern PetscErrorCode SNESCreate(MPI_Comm,SNES*); 51 extern PetscErrorCode SNESReset(SNES); 52 extern PetscErrorCode SNESDestroy(SNES*); 53 extern PetscErrorCode SNESSetType(SNES,const SNESType); 54 extern PetscErrorCode SNESMonitor(SNES,PetscInt,PetscReal); 55 extern PetscErrorCode SNESMonitorSet(SNES,PetscErrorCode(*)(SNES,PetscInt,PetscReal,void*),void *,PetscErrorCode (*)(void**)); 56 extern PetscErrorCode SNESMonitorCancel(SNES); 57 extern PetscErrorCode SNESSetConvergenceHistory(SNES,PetscReal[],PetscInt[],PetscInt,PetscBool ); 58 extern PetscErrorCode SNESGetConvergenceHistory(SNES,PetscReal*[],PetscInt *[],PetscInt *); 59 extern PetscErrorCode SNESSetUp(SNES); 60 extern PetscErrorCode SNESSolve(SNES,Vec,Vec); 61 extern PetscErrorCode SNESSetErrorIfNotConverged(SNES,PetscBool ); 62 extern PetscErrorCode SNESGetErrorIfNotConverged(SNES,PetscBool *); 63 64 65 extern PetscErrorCode SNESAddOptionsChecker(PetscErrorCode (*)(SNES)); 66 67 extern PetscErrorCode SNESSetUpdate(SNES, PetscErrorCode (*)(SNES, PetscInt)); 68 extern PetscErrorCode SNESDefaultUpdate(SNES, PetscInt); 69 70 extern PetscFList SNESList; 71 extern PetscErrorCode SNESRegisterDestroy(void); 72 extern PetscErrorCode SNESRegisterAll(const char[]); 73 74 extern PetscErrorCode SNESRegister(const char[],const char[],const char[],PetscErrorCode (*)(SNES)); 75 76 /*MC 77 SNESRegisterDynamic - Adds a method to the nonlinear solver package. 78 79 Synopsis: 80 PetscErrorCode SNESRegisterDynamic(const char *name_solver,const char *path,const char *name_create,PetscErrorCode (*routine_create)(SNES)) 81 82 Not collective 83 84 Input Parameters: 85 + name_solver - name of a new user-defined solver 86 . path - path (either absolute or relative) the library containing this solver 87 . name_create - name of routine to create method context 88 - routine_create - routine to create method context 89 90 Notes: 91 SNESRegisterDynamic() may be called multiple times to add several user-defined solvers. 92 93 If dynamic libraries are used, then the fourth input argument (routine_create) 94 is ignored. 95 96 Environmental variables such as ${PETSC_ARCH}, ${PETSC_DIR}, ${PETSC_LIB_DIR}, 97 and others of the form ${any_environmental_variable} occuring in pathname will be 98 replaced with appropriate values. 99 100 Sample usage: 101 .vb 102 SNESRegisterDynamic("my_solver",/home/username/my_lib/lib/libg/solaris/mylib.a, 103 "MySolverCreate",MySolverCreate); 104 .ve 105 106 Then, your solver can be chosen with the procedural interface via 107 $ SNESSetType(snes,"my_solver") 108 or at runtime via the option 109 $ -snes_type my_solver 110 111 Level: advanced 112 113 Note: If your function is not being put into a shared library then use SNESRegister() instead 114 115 .keywords: SNES, nonlinear, register 116 117 .seealso: SNESRegisterAll(), SNESRegisterDestroy() 118 M*/ 119 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 120 #define SNESRegisterDynamic(a,b,c,d) SNESRegister(a,b,c,0) 121 #else 122 #define SNESRegisterDynamic(a,b,c,d) SNESRegister(a,b,c,d) 123 #endif 124 125 extern PetscErrorCode SNESGetKSP(SNES,KSP*); 126 extern PetscErrorCode SNESSetKSP(SNES,KSP); 127 extern PetscErrorCode SNESGetSolution(SNES,Vec*); 128 extern PetscErrorCode SNESGetSolutionUpdate(SNES,Vec*); 129 extern PetscErrorCode SNESGetRhs(SNES,Vec*); 130 extern PetscErrorCode SNESView(SNES,PetscViewer); 131 132 extern PetscErrorCode SNESSetOptionsPrefix(SNES,const char[]); 133 extern PetscErrorCode SNESAppendOptionsPrefix(SNES,const char[]); 134 extern PetscErrorCode SNESGetOptionsPrefix(SNES,const char*[]); 135 extern PetscErrorCode SNESSetFromOptions(SNES); 136 extern PetscErrorCode SNESDefaultGetWork(SNES,PetscInt); 137 138 extern PetscErrorCode MatCreateSNESMF(SNES,Mat*); 139 extern PetscErrorCode MatMFFDComputeJacobian(SNES,Vec,Mat*,Mat*,MatStructure*,void*); 140 141 extern PetscErrorCode MatDAADSetSNES(Mat,SNES); 142 143 extern PetscErrorCode SNESGetType(SNES,const SNESType*); 144 extern PetscErrorCode SNESMonitorDefault(SNES,PetscInt,PetscReal,void *); 145 extern PetscErrorCode SNESMonitorRange(SNES,PetscInt,PetscReal,void *); 146 extern PetscErrorCode SNESMonitorRatio(SNES,PetscInt,PetscReal,void *); 147 extern PetscErrorCode SNESMonitorSetRatio(SNES,PetscViewer); 148 extern PetscErrorCode SNESMonitorSolution(SNES,PetscInt,PetscReal,void *); 149 extern PetscErrorCode SNESMonitorResidual(SNES,PetscInt,PetscReal,void *); 150 extern PetscErrorCode SNESMonitorSolutionUpdate(SNES,PetscInt,PetscReal,void *); 151 extern PetscErrorCode SNESMonitorDefaultShort(SNES,PetscInt,PetscReal,void *); 152 extern PetscErrorCode SNESSetTolerances(SNES,PetscReal,PetscReal,PetscReal,PetscInt,PetscInt); 153 extern PetscErrorCode SNESGetTolerances(SNES,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscInt*); 154 extern PetscErrorCode SNESSetTrustRegionTolerance(SNES,PetscReal); 155 extern PetscErrorCode SNESGetFunctionNorm(SNES,PetscReal*); 156 extern PetscErrorCode SNESGetIterationNumber(SNES,PetscInt*); 157 158 extern PetscErrorCode SNESGetNonlinearStepFailures(SNES,PetscInt*); 159 extern PetscErrorCode SNESSetMaxNonlinearStepFailures(SNES,PetscInt); 160 extern PetscErrorCode SNESGetMaxNonlinearStepFailures(SNES,PetscInt*); 161 extern PetscErrorCode SNESGetNumberFunctionEvals(SNES,PetscInt*); 162 163 extern PetscErrorCode SNESSetLagPreconditioner(SNES,PetscInt); 164 extern PetscErrorCode SNESGetLagPreconditioner(SNES,PetscInt*); 165 extern PetscErrorCode SNESSetLagJacobian(SNES,PetscInt); 166 extern PetscErrorCode SNESGetLagJacobian(SNES,PetscInt*); 167 extern PetscErrorCode SNESSetGridSequence(SNES,PetscInt); 168 169 extern PetscErrorCode SNESGetLinearSolveIterations(SNES,PetscInt*); 170 extern PetscErrorCode SNESGetLinearSolveFailures(SNES,PetscInt*); 171 extern PetscErrorCode SNESSetMaxLinearSolveFailures(SNES,PetscInt); 172 extern PetscErrorCode SNESGetMaxLinearSolveFailures(SNES,PetscInt*); 173 174 extern PetscErrorCode SNESKSPSetUseEW(SNES,PetscBool ); 175 extern PetscErrorCode SNESKSPGetUseEW(SNES,PetscBool *); 176 extern PetscErrorCode SNESKSPSetParametersEW(SNES,PetscInt,PetscReal,PetscReal,PetscReal,PetscReal,PetscReal,PetscReal); 177 extern PetscErrorCode SNESKSPGetParametersEW(SNES,PetscInt*,PetscReal*,PetscReal*,PetscReal*,PetscReal*,PetscReal*,PetscReal*); 178 179 extern PetscErrorCode SNESMonitorLGCreate(const char[],const char[],int,int,int,int,PetscDrawLG*); 180 extern PetscErrorCode SNESMonitorLG(SNES,PetscInt,PetscReal,void*); 181 extern PetscErrorCode SNESMonitorLGDestroy(PetscDrawLG*); 182 extern PetscErrorCode SNESMonitorLGRangeCreate(const char[],const char[],int,int,int,int,PetscDrawLG*); 183 extern PetscErrorCode SNESMonitorLGRange(SNES,PetscInt,PetscReal,void*); 184 extern PetscErrorCode SNESMonitorLGRangeDestroy(PetscDrawLG*); 185 186 extern PetscErrorCode SNESSetApplicationContext(SNES,void *); 187 extern PetscErrorCode SNESGetApplicationContext(SNES,void *); 188 extern PetscErrorCode SNESSetComputeApplicationContext(SNES,PetscErrorCode (*)(SNES,void**),PetscErrorCode (*)(void**)); 189 190 extern PetscErrorCode SNESPythonSetType(SNES,const char[]); 191 192 extern PetscErrorCode SNESSetFunctionDomainError(SNES); 193 /*E 194 SNESConvergedReason - reason a SNES method was said to 195 have converged or diverged 196 197 Level: beginner 198 199 The two most common reasons for divergence are 200 $ 1) an incorrectly coded or computed Jacobian or 201 $ 2) failure or lack of convergence in the linear system (in this case we recommend 202 $ testing with -pc_type lu to eliminate the linear solver as the cause of the problem). 203 204 Diverged Reasons: 205 . SNES_DIVERGED_LOCAL_MIN - this can only occur when using the line-search variant of SNES. 206 The line search wants to minimize Q(alpha) = 1/2 || F(x + alpha s) ||^2_2 this occurs 207 at Q'(alpha) = s^T F'(x+alpha s)^T F(x+alpha s) = 0. If s is the Newton direction - F'(x)^(-1)F(x) then 208 you get Q'(alpha) = -F(x)^T F'(x)^(-1)^T F'(x+alpha s)F(x+alpha s); when alpha = 0 209 Q'(0) = - ||F(x)||^2_2 which is always NEGATIVE if F'(x) is invertible. This means the Newton 210 direction is a descent direction and the line search should succeed if alpha is small enough. 211 212 If F'(x) is NOT invertible AND F'(x)^T F(x) = 0 then Q'(0) = 0 and the Newton direction 213 is NOT a descent direction so the line search will fail. All one can do at this point 214 is change the initial guess and try again. 215 216 An alternative explanation: Newton's method can be regarded as replacing the function with 217 its linear approximation and minimizing the 2-norm of that. That is F(x+s) approx F(x) + F'(x)s 218 so we minimize || F(x) + F'(x) s ||^2_2; do this using Least Squares. If F'(x) is invertible then 219 s = - F'(x)^(-1)F(x) otherwise F'(x)^T F'(x) s = -F'(x)^T F(x). If F'(x)^T F(x) is NOT zero then there 220 exists a nontrival (that is F'(x)s != 0) solution to the equation and this direction is 221 s = - [F'(x)^T F'(x)]^(-1) F'(x)^T F(x) so Q'(0) = - F(x)^T F'(x) [F'(x)^T F'(x)]^(-T) F'(x)^T F(x) 222 = - (F'(x)^T F(x)) [F'(x)^T F'(x)]^(-T) (F'(x)^T F(x)). Since we are assuming (F'(x)^T F(x)) != 0 223 and F'(x)^T F'(x) has no negative eigenvalues Q'(0) < 0 so s is a descent direction and the line 224 search should succeed for small enough alpha. 225 226 Note that this RARELY happens in practice. Far more likely the linear system is not being solved 227 (well enough?) or the Jacobian is wrong. 228 229 SNES_DIVERGED_MAX_IT means that the solver reached the maximum number of iterations without satisfying any 230 convergence criteria. SNES_CONVERGED_ITS means that SNESSkipConverged() was chosen as the convergence test; 231 thus the usual convergence criteria have not been checked and may or may not be satisfied. 232 233 Developer Notes: this must match finclude/petscsnes.h 234 235 The string versions of these are in SNESConvergedReason, if you change any value here you must 236 also adjust that array. 237 238 Each reason has its own manual page. 239 240 .seealso: SNESSolve(), SNESGetConvergedReason(), KSPConvergedReason, SNESSetConvergenceTest() 241 E*/ 242 typedef enum {/* converged */ 243 SNES_CONVERGED_FNORM_ABS = 2, /* ||F|| < atol */ 244 SNES_CONVERGED_FNORM_RELATIVE = 3, /* ||F|| < rtol*||F_initial|| */ 245 SNES_CONVERGED_PNORM_RELATIVE = 4, /* Newton computed step size small; || delta x || < stol */ 246 SNES_CONVERGED_ITS = 5, /* maximum iterations reached */ 247 SNES_CONVERGED_TR_DELTA = 7, 248 /* diverged */ 249 SNES_DIVERGED_FUNCTION_DOMAIN = -1, /* the new x location passed the function is not in the domain of F */ 250 SNES_DIVERGED_FUNCTION_COUNT = -2, 251 SNES_DIVERGED_LINEAR_SOLVE = -3, /* the linear solve failed */ 252 SNES_DIVERGED_FNORM_NAN = -4, 253 SNES_DIVERGED_MAX_IT = -5, 254 SNES_DIVERGED_LINE_SEARCH = -6, /* the line search failed */ 255 SNES_DIVERGED_INNER = -7, /* inner solve failed */ 256 SNES_DIVERGED_LOCAL_MIN = -8, /* || J^T b || is small, implies converged to local minimum of F() */ 257 SNES_CONVERGED_ITERATING = 0} SNESConvergedReason; 258 extern const char *const*SNESConvergedReasons; 259 260 /*MC 261 SNES_CONVERGED_FNORM_ABS - 2-norm(F) <= abstol 262 263 Level: beginner 264 265 .seealso: SNESSolve(), SNESGetConvergedReason(), SNESConvergedReason, SNESSetTolerances() 266 267 M*/ 268 269 /*MC 270 SNES_CONVERGED_FNORM_RELATIVE - 2-norm(F) <= rtol*2-norm(F(x_0)) where x_0 is the initial guess 271 272 Level: beginner 273 274 .seealso: SNESSolve(), SNESGetConvergedReason(), SNESConvergedReason, SNESSetTolerances() 275 276 M*/ 277 278 /*MC 279 SNES_CONVERGED_PNORM_RELATIVE - The 2-norm of the last step <= stol * 2-norm(x) where x is the current 280 solution and stol is the 4th argument to SNESSetTolerances() 281 282 Level: beginner 283 284 .seealso: SNESSolve(), SNESGetConvergedReason(), SNESConvergedReason, SNESSetTolerances() 285 286 M*/ 287 288 /*MC 289 SNES_DIVERGED_FUNCTION_COUNT - The user provided function has been called more times then the final 290 argument to SNESSetTolerances() 291 292 Level: beginner 293 294 .seealso: SNESSolve(), SNESGetConvergedReason(), SNESConvergedReason, SNESSetTolerances() 295 296 M*/ 297 298 /*MC 299 SNES_DIVERGED_FNORM_NAN - the 2-norm of the current function evaluation is not-a-number (NaN), this 300 is usually caused by a division of 0 by 0. 301 302 Level: beginner 303 304 .seealso: SNESSolve(), SNESGetConvergedReason(), SNESConvergedReason, SNESSetTolerances() 305 306 M*/ 307 308 /*MC 309 SNES_DIVERGED_MAX_IT - SNESSolve() has reached the maximum number of iterations requested 310 311 Level: beginner 312 313 .seealso: SNESSolve(), SNESGetConvergedReason(), SNESConvergedReason, SNESSetTolerances() 314 315 M*/ 316 317 /*MC 318 SNES_DIVERGED_LINE_SEARCH - The line search has failed. This only occurs for a SNESType of SNESLS 319 320 Level: beginner 321 322 .seealso: SNESSolve(), SNESGetConvergedReason(), SNESConvergedReason, SNESSetTolerances() 323 324 M*/ 325 326 /*MC 327 SNES_DIVERGED_LOCAL_MIN - the algorithm seems to have stagnated at a local minimum that is not zero. 328 See the manual page for SNESConvergedReason for more details 329 330 Level: beginner 331 332 .seealso: SNESSolve(), SNESGetConvergedReason(), SNESConvergedReason, SNESSetTolerances() 333 334 M*/ 335 336 /*MC 337 SNES_CONERGED_ITERATING - this only occurs if SNESGetConvergedReason() is called during the SNESSolve() 338 339 Level: beginner 340 341 .seealso: SNESSolve(), SNESGetConvergedReason(), SNESConvergedReason, SNESSetTolerances() 342 343 M*/ 344 345 extern PetscErrorCode SNESSetConvergenceTest(SNES,PetscErrorCode (*)(SNES,PetscInt,PetscReal,PetscReal,PetscReal,SNESConvergedReason*,void*),void*,PetscErrorCode (*)(void*)); 346 extern PetscErrorCode SNESDefaultConverged(SNES,PetscInt,PetscReal,PetscReal,PetscReal,SNESConvergedReason*,void*); 347 extern PetscErrorCode SNESSkipConverged(SNES,PetscInt,PetscReal,PetscReal,PetscReal,SNESConvergedReason*,void*); 348 extern PetscErrorCode SNESGetConvergedReason(SNES,SNESConvergedReason*); 349 350 extern PetscErrorCode SNESDMDAComputeFunction(SNES,Vec,Vec,void*); 351 extern PetscErrorCode SNESDMDAComputeJacobianWithAdic(SNES,Vec,Mat*,Mat*,MatStructure*,void*); 352 extern PetscErrorCode SNESDMDAComputeJacobianWithAdifor(SNES,Vec,Mat*,Mat*,MatStructure*,void*); 353 extern PetscErrorCode SNESDMDAComputeJacobian(SNES,Vec,Mat*,Mat*,MatStructure*,void*); 354 355 extern PetscErrorCode SNESDMMeshComputeFunction(SNES,Vec,Vec,void*); 356 extern PetscErrorCode SNESDMMeshComputeJacobian(SNES,Vec,Mat*,Mat*,MatStructure*,void*); 357 358 /* --------- Solving systems of nonlinear equations --------------- */ 359 typedef PetscErrorCode (*SNESFunction)(SNES,Vec,Vec,void*); 360 typedef PetscErrorCode (*SNESJacobian)(SNES,Vec,Mat*,Mat*,MatStructure*,void*); 361 typedef PetscErrorCode (*SNESGS)(SNES,Vec,Vec,void*); 362 extern PetscErrorCode SNESSetFunction(SNES,Vec,SNESFunction,void*); 363 extern PetscErrorCode SNESGetFunction(SNES,Vec*,SNESFunction*,void**); 364 extern PetscErrorCode SNESComputeFunction(SNES,Vec,Vec); 365 extern PetscErrorCode SNESSetJacobian(SNES,Mat,Mat,SNESJacobian,void*); 366 extern PetscErrorCode SNESGetJacobian(SNES,Mat*,Mat*,SNESJacobian*,void**); 367 extern PetscErrorCode SNESDefaultComputeJacobian(SNES,Vec,Mat*,Mat*,MatStructure*,void*); 368 extern PetscErrorCode SNESDefaultComputeJacobianColor(SNES,Vec,Mat*,Mat*,MatStructure*,void*); 369 extern PetscErrorCode SNESSetComputeInitialGuess(SNES,PetscErrorCode (*)(SNES,Vec,void*),void*); 370 extern PetscErrorCode SNESSetPicard(SNES,Vec,SNESFunction,Mat,Mat,SNESJacobian,void*); 371 extern PetscErrorCode SNESGetPicard(SNES,Vec*,SNESFunction*,Mat*,SNESJacobian*,void**); 372 373 extern PetscErrorCode SNESSetGS(SNES,SNESGS,void*); 374 extern PetscErrorCode SNESGetGS(SNES,SNESGS*,void**); 375 extern PetscErrorCode SNESComputeGS(SNES,Vec,Vec); 376 377 /* --------- Routines specifically for line search methods --------------- */ 378 /*E 379 SNESLineSearchType - type of line search used in Newton's method as well as VI solvers and Richardson solvers 380 381 Level: beginner 382 383 .seealso: SNESSetFromOptions(), SNESLineSearchSet() 384 E*/ 385 typedef enum {SNES_LS_BASIC, SNES_LS_BASIC_NONORMS, SNES_LS_QUADRATIC, SNES_LS_CUBIC, SNES_LS_EXACT, SNES_LS_TEST, SNES_LS_SECANT,SNES_LS_USER_DEFINED} SNESLineSearchType; 386 extern const char *const SNESLineSearchTypes[]; 387 extern const char *SNESLineSearchTypeName(SNESLineSearchType); /* Does bounds checking, use this for viewing */ 388 389 extern PetscErrorCode SNESLineSearchSet(SNES,PetscErrorCode(*)(SNES,void*,Vec,Vec,Vec,PetscReal,PetscReal,Vec,Vec,PetscReal*,PetscReal*,PetscBool *),void*); 390 extern PetscErrorCode SNESLineSearchSetType(SNES,SNESLineSearchType); 391 extern PetscErrorCode SNESLineSearchNo(SNES,void*,Vec,Vec,Vec,PetscReal,PetscReal,Vec,Vec,PetscReal*,PetscReal*,PetscBool *); 392 extern PetscErrorCode SNESLineSearchNoNorms(SNES,void*,Vec,Vec,Vec,PetscReal,PetscReal,Vec,Vec,PetscReal*,PetscReal*,PetscBool *); 393 extern PetscErrorCode SNESLineSearchQuadratic(SNES,void*,Vec,Vec,Vec,PetscReal,PetscReal,Vec,Vec,PetscReal*,PetscReal*,PetscBool *); 394 extern PetscErrorCode SNESLineSearchCubic(SNES,void*,Vec,Vec,Vec,PetscReal,PetscReal,Vec,Vec,PetscReal*,PetscReal*,PetscBool *); 395 extern PetscErrorCode SNESLineSearchSecant(SNES,void*,Vec,Vec,Vec,PetscReal,PetscReal,Vec,Vec,PetscReal*,PetscReal*,PetscBool *); 396 extern PetscErrorCode SNESLineSearchQuadraticSecant(SNES,void*,Vec,Vec,Vec,PetscReal,PetscReal,Vec,Vec,PetscReal*,PetscReal*,PetscBool *); 397 398 extern PetscErrorCode SNESLineSearchSetPostCheck(SNES,PetscErrorCode(*)(SNES,Vec,Vec,Vec,void*,PetscBool *,PetscBool *),void*); 399 extern PetscErrorCode SNESLineSearchSetPreCheck(SNES,PetscErrorCode(*)(SNES,Vec,Vec,void*,PetscBool *),void*); 400 extern PetscErrorCode SNESLineSearchPreCheckPicard(SNES,Vec,Vec,void*,PetscBool*); 401 extern PetscErrorCode SNESLineSearchSetParams(SNES,PetscReal,PetscReal,PetscReal); 402 extern PetscErrorCode SNESLineSearchGetParams(SNES,PetscReal*,PetscReal*,PetscReal*); 403 extern PetscErrorCode SNESLineSearchSetMonitor(SNES,PetscBool ); 404 405 extern PetscErrorCode SNESShellGetContext(SNES,void**); 406 extern PetscErrorCode SNESShellSetContext(SNES,void*); 407 extern PetscErrorCode SNESShellSetSolve(SNES,PetscErrorCode (*)(SNES,Vec)); 408 409 /* Routines for VI solver */ 410 extern PetscErrorCode SNESVISetVariableBounds(SNES,Vec,Vec); 411 extern PetscErrorCode SNESVISetComputeVariableBounds(SNES, PetscErrorCode (*)(SNES,Vec,Vec)); 412 extern PetscErrorCode SNESVIGetInactiveSet(SNES,IS*); 413 extern PetscErrorCode SNESVIGetActiveSetIS(SNES,Vec,Vec,IS*); 414 extern PetscErrorCode SNESVIComputeInactiveSetFnorm(SNES,Vec,Vec,PetscReal*); 415 extern PetscErrorCode SNESVISetRedundancyCheck(SNES,PetscErrorCode(*)(SNES,IS,IS*,void*),void*); 416 #define SNES_VI_INF 1.0e20 417 #define SNES_VI_NINF -1.0e20 418 419 extern PetscErrorCode SNESTestLocalMin(SNES); 420 421 /* Should this routine be private? */ 422 extern PetscErrorCode SNESComputeJacobian(SNES,Vec,Mat*,Mat*,MatStructure*); 423 424 extern PetscErrorCode SNESSetDM(SNES,DM); 425 extern PetscErrorCode SNESGetDM(SNES,DM*); 426 extern PetscErrorCode SNESSetPC(SNES,SNES); 427 extern PetscErrorCode SNESGetPC(SNES,SNES*); 428 429 /* Routines for Multiblock solver */ 430 extern PetscErrorCode SNESMultiblockSetFields(SNES, const char [], PetscInt, const PetscInt *); 431 extern PetscErrorCode SNESMultiblockSetIS(SNES, const char [], IS); 432 extern PetscErrorCode SNESMultiblockSetBlockSize(SNES, PetscInt); 433 extern PetscErrorCode SNESMultiblockSetType(SNES, PCCompositeType); 434 435 PETSC_EXTERN_CXX_END 436 #endif 437