xref: /petsc/include/petscsnes.h (revision bc0cc02b50436274feb0da0b98fa7f6ad991e737)
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