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