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