xref: /petsc/include/petscsnes.h (revision 6ac5842e34eedc6428162d8d42bedaaf46eae34c)
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 <petscdmtypes.h>
8 #include <petscdmdatypes.h>
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 typedef const char* SNESType;
31 #define SNESNEWTONLS     "newtonls"
32 #define SNESNEWTONTR     "newtontr"
33 #define SNESPYTHON       "python"
34 #define SNESTEST         "test"
35 #define SNESNRICHARDSON  "nrichardson"
36 #define SNESKSPONLY      "ksponly"
37 #define SNESVINEWTONRSLS "vinewtonrsls"
38 #define SNESVINEWTONSSLS "vinewtonssls"
39 #define SNESNGMRES       "ngmres"
40 #define SNESQN           "qn"
41 #define SNESSHELL        "shell"
42 #define SNESGS           "gs"
43 #define SNESNCG          "ncg"
44 #define SNESFAS          "fas"
45 #define SNESMS           "ms"
46 #define SNESNASM         "nasm"
47 #define SNESANDERSON     "anderson"
48 #define SNESASPIN        "aspin"
49 
50 /* Logging support */
51 PETSC_EXTERN PetscClassId SNES_CLASSID;
52 PETSC_EXTERN PetscClassId DMSNES_CLASSID;
53 
54 PETSC_EXTERN PetscErrorCode SNESInitializePackage(const char[]);
55 
56 PETSC_EXTERN PetscErrorCode SNESCreate(MPI_Comm,SNES*);
57 PETSC_EXTERN PetscErrorCode SNESReset(SNES);
58 PETSC_EXTERN PetscErrorCode SNESDestroy(SNES*);
59 PETSC_EXTERN PetscErrorCode SNESSetType(SNES,SNESType);
60 PETSC_EXTERN PetscErrorCode SNESMonitor(SNES,PetscInt,PetscReal);
61 PETSC_EXTERN PetscErrorCode SNESMonitorSet(SNES,PetscErrorCode(*)(SNES,PetscInt,PetscReal,void*),void *,PetscErrorCode (*)(void**));
62 PETSC_EXTERN PetscErrorCode SNESMonitorCancel(SNES);
63 PETSC_EXTERN PetscErrorCode SNESSetConvergenceHistory(SNES,PetscReal[],PetscInt[],PetscInt,PetscBool );
64 PETSC_EXTERN PetscErrorCode SNESGetConvergenceHistory(SNES,PetscReal*[],PetscInt *[],PetscInt *);
65 PETSC_EXTERN PetscErrorCode SNESSetUp(SNES);
66 PETSC_EXTERN PetscErrorCode SNESSolve(SNES,Vec,Vec);
67 PETSC_EXTERN PetscErrorCode SNESSetErrorIfNotConverged(SNES,PetscBool );
68 PETSC_EXTERN PetscErrorCode SNESGetErrorIfNotConverged(SNES,PetscBool  *);
69 
70 
71 PETSC_EXTERN PetscErrorCode SNESAddOptionsChecker(PetscErrorCode (*)(SNES));
72 
73 PETSC_EXTERN PetscErrorCode SNESSetUpdate(SNES, PetscErrorCode (*)(SNES, PetscInt));
74 PETSC_EXTERN PetscErrorCode SNESDefaultUpdate(SNES, PetscInt);
75 
76 PETSC_EXTERN PetscErrorCode SNESRegisterDestroy(void);
77 PETSC_EXTERN PetscErrorCode SNESRegisterAll(const char[]);
78 
79 PETSC_EXTERN PetscErrorCode SNESRegister(const char[],const char[],const char[],PetscErrorCode (*)(SNES));
80 
81 /*MC
82    SNESRegisterDynamic - Adds a method to the nonlinear solver package.
83 
84    Synopsis:
85     #include "petscsnes.h"
86    PetscErrorCode SNESRegisterDynamic(const char *name_solver,const char *path,const char *name_create,PetscErrorCode (*routine_create)(SNES))
87 
88    Not collective
89 
90    Input Parameters:
91 +  name_solver - name of a new user-defined solver
92 .  path - path (either absolute or relative) the library containing this solver
93 .  name_create - name of routine to create method context
94 -  routine_create - routine to create method context
95 
96    Notes:
97    SNESRegisterDynamic() may be called multiple times to add several user-defined solvers.
98 
99    If dynamic libraries are used, then the fourth input argument (routine_create)
100    is ignored.
101 
102    Environmental variables such as ${PETSC_ARCH}, ${PETSC_DIR}, ${PETSC_LIB_DIR},
103    and others of the form ${any_environmental_variable} occuring in pathname will be
104    replaced with appropriate values.
105 
106    Sample usage:
107 .vb
108    SNESRegisterDynamic("my_solver",/home/username/my_lib/lib/libg/solaris/mylib.a,
109                 "MySolverCreate",MySolverCreate);
110 .ve
111 
112    Then, your solver can be chosen with the procedural interface via
113 $     SNESSetType(snes,"my_solver")
114    or at runtime via the option
115 $     -snes_type my_solver
116 
117    Level: advanced
118 
119     Note: If your function is not being put into a shared library then use SNESRegister() instead
120 
121 .keywords: SNES, nonlinear, register
122 
123 .seealso: SNESRegisterAll(), SNESRegisterDestroy()
124 M*/
125 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
126 #define SNESRegisterDynamic(a,b,c,d) SNESRegister(a,b,c,0)
127 #else
128 #define SNESRegisterDynamic(a,b,c,d) SNESRegister(a,b,c,d)
129 #endif
130 
131 PETSC_EXTERN PetscErrorCode SNESGetKSP(SNES,KSP*);
132 PETSC_EXTERN PetscErrorCode SNESSetKSP(SNES,KSP);
133 PETSC_EXTERN PetscErrorCode SNESGetSolution(SNES,Vec*);
134 PETSC_EXTERN PetscErrorCode SNESGetSolutionUpdate(SNES,Vec*);
135 PETSC_EXTERN PetscErrorCode SNESGetRhs(SNES,Vec*);
136 PETSC_EXTERN PetscErrorCode SNESView(SNES,PetscViewer);
137 PETSC_EXTERN PetscErrorCode SNESLoad(SNES,PetscViewer);
138 
139 #define SNES_FILE_CLASSID 1211224
140 
141 PETSC_EXTERN PetscErrorCode SNESSetOptionsPrefix(SNES,const char[]);
142 PETSC_EXTERN PetscErrorCode SNESAppendOptionsPrefix(SNES,const char[]);
143 PETSC_EXTERN PetscErrorCode SNESGetOptionsPrefix(SNES,const char*[]);
144 PETSC_EXTERN PetscErrorCode SNESSetFromOptions(SNES);
145 PETSC_EXTERN PetscErrorCode SNESDefaultGetWork(SNES,PetscInt);
146 
147 PETSC_EXTERN PetscErrorCode MatCreateSNESMF(SNES,Mat*);
148 PETSC_EXTERN PetscErrorCode MatMFFDComputeJacobian(SNES,Vec,Mat*,Mat*,MatStructure*,void*);
149 
150 PETSC_EXTERN PetscErrorCode MatDAADSetSNES(Mat,SNES);
151 
152 PETSC_EXTERN PetscErrorCode SNESGetType(SNES,SNESType*);
153 PETSC_EXTERN PetscErrorCode SNESMonitorDefault(SNES,PetscInt,PetscReal,void *);
154 PETSC_EXTERN PetscErrorCode SNESMonitorRange(SNES,PetscInt,PetscReal,void *);
155 PETSC_EXTERN PetscErrorCode SNESMonitorRatio(SNES,PetscInt,PetscReal,void *);
156 PETSC_EXTERN PetscErrorCode SNESMonitorSetRatio(SNES,PetscViewer);
157 PETSC_EXTERN PetscErrorCode SNESMonitorSolution(SNES,PetscInt,PetscReal,void *);
158 PETSC_EXTERN PetscErrorCode SNESMonitorResidual(SNES,PetscInt,PetscReal,void *);
159 PETSC_EXTERN PetscErrorCode SNESMonitorSolutionUpdate(SNES,PetscInt,PetscReal,void *);
160 PETSC_EXTERN PetscErrorCode SNESMonitorDefaultShort(SNES,PetscInt,PetscReal,void *);
161 PETSC_EXTERN PetscErrorCode SNESMonitorJacUpdateSpectrum(SNES,PetscInt,PetscReal,void *);
162 PETSC_EXTERN PetscErrorCode SNESSetTolerances(SNES,PetscReal,PetscReal,PetscReal,PetscInt,PetscInt);
163 PETSC_EXTERN PetscErrorCode SNESGetTolerances(SNES,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscInt*);
164 PETSC_EXTERN PetscErrorCode SNESSetTrustRegionTolerance(SNES,PetscReal);
165 PETSC_EXTERN PetscErrorCode SNESGetFunctionNorm(SNES,PetscReal*);
166 PETSC_EXTERN PetscErrorCode SNESSetFunctionNorm(SNES,PetscReal);
167 PETSC_EXTERN PetscErrorCode SNESGetIterationNumber(SNES,PetscInt*);
168 PETSC_EXTERN PetscErrorCode SNESSetIterationNumber(SNES,PetscInt);
169 
170 PETSC_EXTERN PetscErrorCode SNESGetNonlinearStepFailures(SNES,PetscInt*);
171 PETSC_EXTERN PetscErrorCode SNESSetMaxNonlinearStepFailures(SNES,PetscInt);
172 PETSC_EXTERN PetscErrorCode SNESGetMaxNonlinearStepFailures(SNES,PetscInt*);
173 PETSC_EXTERN PetscErrorCode SNESGetNumberFunctionEvals(SNES,PetscInt*);
174 
175 PETSC_EXTERN PetscErrorCode SNESSetLagPreconditioner(SNES,PetscInt);
176 PETSC_EXTERN PetscErrorCode SNESGetLagPreconditioner(SNES,PetscInt*);
177 PETSC_EXTERN PetscErrorCode SNESSetLagJacobian(SNES,PetscInt);
178 PETSC_EXTERN PetscErrorCode SNESGetLagJacobian(SNES,PetscInt*);
179 PETSC_EXTERN PetscErrorCode SNESSetGridSequence(SNES,PetscInt);
180 
181 PETSC_EXTERN PetscErrorCode SNESGetLinearSolveIterations(SNES,PetscInt*);
182 PETSC_EXTERN PetscErrorCode SNESGetLinearSolveFailures(SNES,PetscInt*);
183 PETSC_EXTERN PetscErrorCode SNESSetMaxLinearSolveFailures(SNES,PetscInt);
184 PETSC_EXTERN PetscErrorCode SNESGetMaxLinearSolveFailures(SNES,PetscInt*);
185 
186 PETSC_EXTERN PetscErrorCode SNESKSPSetUseEW(SNES,PetscBool );
187 PETSC_EXTERN PetscErrorCode SNESKSPGetUseEW(SNES,PetscBool *);
188 PETSC_EXTERN PetscErrorCode SNESKSPSetParametersEW(SNES,PetscInt,PetscReal,PetscReal,PetscReal,PetscReal,PetscReal,PetscReal);
189 PETSC_EXTERN PetscErrorCode SNESKSPGetParametersEW(SNES,PetscInt*,PetscReal*,PetscReal*,PetscReal*,PetscReal*,PetscReal*,PetscReal*);
190 
191 #include <petscdrawtypes.h>
192 PETSC_EXTERN PetscErrorCode SNESMonitorLGCreate(const char[],const char[],int,int,int,int,PetscDrawLG*);
193 PETSC_EXTERN PetscErrorCode SNESMonitorLGResidualNorm(SNES,PetscInt,PetscReal,void*);
194 PETSC_EXTERN PetscErrorCode SNESMonitorLGDestroy(PetscDrawLG*);
195 PETSC_EXTERN PetscErrorCode SNESMonitorLGRange(SNES,PetscInt,PetscReal,void*);
196 
197 PETSC_EXTERN PetscErrorCode SNESSetApplicationContext(SNES,void *);
198 PETSC_EXTERN PetscErrorCode SNESGetApplicationContext(SNES,void *);
199 PETSC_EXTERN PetscErrorCode SNESSetComputeApplicationContext(SNES,PetscErrorCode (*)(SNES,void**),PetscErrorCode (*)(void**));
200 
201 PETSC_EXTERN PetscErrorCode SNESPythonSetType(SNES,const char[]);
202 
203 PETSC_EXTERN PetscErrorCode SNESSetFunctionDomainError(SNES);
204 PETSC_EXTERN PetscErrorCode SNESGetFunctionDomainError(SNES, PetscBool *);
205 
206 /*E
207     SNESConvergedReason - reason a SNES method was said to
208          have converged or diverged
209 
210    Level: beginner
211 
212    The two most common reasons for divergence are
213 $   1) an incorrectly coded or computed Jacobian or
214 $   2) failure or lack of convergence in the linear system (in this case we recommend
215 $      testing with -pc_type lu to eliminate the linear solver as the cause of the problem).
216 
217    Diverged Reasons:
218 .    SNES_DIVERGED_LOCAL_MIN - this can only occur when using the line-search variant of SNES.
219        The line search wants to minimize Q(alpha) = 1/2 || F(x + alpha s) ||^2_2  this occurs
220        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
221        you get Q'(alpha) = -F(x)^T F'(x)^(-1)^T F'(x+alpha s)F(x+alpha s); when alpha = 0
222        Q'(0) = - ||F(x)||^2_2 which is always NEGATIVE if F'(x) is invertible. This means the Newton
223        direction is a descent direction and the line search should succeed if alpha is small enough.
224 
225        If F'(x) is NOT invertible AND F'(x)^T F(x) = 0 then Q'(0) = 0 and the Newton direction
226        is NOT a descent direction so the line search will fail. All one can do at this point
227        is change the initial guess and try again.
228 
229        An alternative explanation: Newton's method can be regarded as replacing the function with
230        its linear approximation and minimizing the 2-norm of that. That is F(x+s) approx F(x) + F'(x)s
231        so we minimize || F(x) + F'(x) s ||^2_2; do this using Least Squares. If F'(x) is invertible then
232        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
233        exists a nontrival (that is F'(x)s != 0) solution to the equation and this direction is
234        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)
235        = - (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
236        and F'(x)^T F'(x) has no negative eigenvalues Q'(0) < 0 so s is a descent direction and the line
237        search should succeed for small enough alpha.
238 
239        Note that this RARELY happens in practice. Far more likely the linear system is not being solved
240        (well enough?) or the Jacobian is wrong.
241 
242    SNES_DIVERGED_MAX_IT means that the solver reached the maximum number of iterations without satisfying any
243    convergence criteria. SNES_CONVERGED_ITS means that SNESSkipConverged() was chosen as the convergence test;
244    thus the usual convergence criteria have not been checked and may or may not be satisfied.
245 
246    Developer Notes: this must match finclude/petscsnes.h
247 
248        The string versions of these are in SNESConvergedReason, if you change any value here you must
249      also adjust that array.
250 
251    Each reason has its own manual page.
252 
253 .seealso: SNESSolve(), SNESGetConvergedReason(), KSPConvergedReason, SNESSetConvergenceTest()
254 E*/
255 typedef enum {/* converged */
256               SNES_CONVERGED_FNORM_ABS         =  2, /* ||F|| < atol */
257               SNES_CONVERGED_FNORM_RELATIVE    =  3, /* ||F|| < rtol*||F_initial|| */
258               SNES_CONVERGED_SNORM_RELATIVE    =  4, /* Newton computed step size small; || delta x || < stol || x ||*/
259               SNES_CONVERGED_ITS               =  5, /* maximum iterations reached */
260               SNES_CONVERGED_TR_DELTA          =  7,
261               /* diverged */
262               SNES_DIVERGED_FUNCTION_DOMAIN     = -1, /* the new x location passed the function is not in the domain of F */
263               SNES_DIVERGED_FUNCTION_COUNT      = -2,
264               SNES_DIVERGED_LINEAR_SOLVE        = -3, /* the linear solve failed */
265               SNES_DIVERGED_FNORM_NAN           = -4,
266               SNES_DIVERGED_MAX_IT              = -5,
267               SNES_DIVERGED_LINE_SEARCH         = -6, /* the line search failed */
268               SNES_DIVERGED_INNER               = -7, /* inner solve failed */
269               SNES_DIVERGED_LOCAL_MIN           = -8, /* || J^T b || is small, implies converged to local minimum of F() */
270               SNES_CONVERGED_ITERATING          =  0} SNESConvergedReason;
271 PETSC_EXTERN const char *const*SNESConvergedReasons;
272 
273 /*MC
274      SNES_CONVERGED_FNORM_ABS - 2-norm(F) <= abstol
275 
276    Level: beginner
277 
278 .seealso:  SNESSolve(), SNESGetConvergedReason(), SNESConvergedReason, SNESSetTolerances()
279 
280 M*/
281 
282 /*MC
283      SNES_CONVERGED_FNORM_RELATIVE - 2-norm(F) <= rtol*2-norm(F(x_0)) where x_0 is the initial guess
284 
285    Level: beginner
286 
287 .seealso:  SNESSolve(), SNESGetConvergedReason(), SNESConvergedReason, SNESSetTolerances()
288 
289 M*/
290 
291 /*MC
292      SNES_CONVERGED_SNORM_RELATIVE - The 2-norm of the last step <= stol * 2-norm(x) where x is the current
293           solution and stol is the 4th argument to SNESSetTolerances()
294 
295      Options Database Keys:
296       -snes_stol <stol> - the step tolerance
297 
298    Level: beginner
299 
300 .seealso:  SNESSolve(), SNESGetConvergedReason(), SNESConvergedReason, SNESSetTolerances()
301 
302 M*/
303 
304 /*MC
305      SNES_DIVERGED_FUNCTION_COUNT - The user provided function has been called more times then the final
306          argument to SNESSetTolerances()
307 
308    Level: beginner
309 
310 .seealso:  SNESSolve(), SNESGetConvergedReason(), SNESConvergedReason, SNESSetTolerances()
311 
312 M*/
313 
314 /*MC
315      SNES_DIVERGED_FNORM_NAN - the 2-norm of the current function evaluation is not-a-number (NaN), this
316       is usually caused by a division of 0 by 0.
317 
318    Level: beginner
319 
320 .seealso:  SNESSolve(), SNESGetConvergedReason(), SNESConvergedReason, SNESSetTolerances()
321 
322 M*/
323 
324 /*MC
325      SNES_DIVERGED_MAX_IT - SNESSolve() has reached the maximum number of iterations requested
326 
327    Level: beginner
328 
329 .seealso:  SNESSolve(), SNESGetConvergedReason(), SNESConvergedReason, SNESSetTolerances()
330 
331 M*/
332 
333 /*MC
334      SNES_DIVERGED_LINE_SEARCH - The line search has failed. This only occurs for a SNES solvers that use a line search
335 
336    Level: beginner
337 
338 .seealso:  SNESSolve(), SNESGetConvergedReason(), SNESConvergedReason, SNESSetTolerances(), SNESLineSearch
339 
340 M*/
341 
342 /*MC
343      SNES_DIVERGED_LOCAL_MIN - the algorithm seems to have stagnated at a local minimum that is not zero.
344         See the manual page for SNESConvergedReason for more details
345 
346    Level: beginner
347 
348 .seealso:  SNESSolve(), SNESGetConvergedReason(), SNESConvergedReason, SNESSetTolerances()
349 
350 M*/
351 
352 /*MC
353      SNES_CONERGED_ITERATING - this only occurs if SNESGetConvergedReason() is called during the SNESSolve()
354 
355    Level: beginner
356 
357 .seealso:  SNESSolve(), SNESGetConvergedReason(), SNESConvergedReason, SNESSetTolerances()
358 
359 M*/
360 
361 PETSC_EXTERN PetscErrorCode SNESSetConvergenceTest(SNES,PetscErrorCode (*)(SNES,PetscInt,PetscReal,PetscReal,PetscReal,SNESConvergedReason*,void*),void*,PetscErrorCode (*)(void*));
362 PETSC_EXTERN PetscErrorCode SNESDefaultConverged(SNES,PetscInt,PetscReal,PetscReal,PetscReal,SNESConvergedReason*,void*);
363 PETSC_EXTERN PetscErrorCode SNESSkipConverged(SNES,PetscInt,PetscReal,PetscReal,PetscReal,SNESConvergedReason*,void*);
364 PETSC_EXTERN PetscErrorCode SNESGetConvergedReason(SNES,SNESConvergedReason*);
365 
366 PETSC_EXTERN PetscErrorCode SNESDMMeshComputeFunction(SNES,Vec,Vec,void*);
367 PETSC_EXTERN PetscErrorCode SNESDMMeshComputeJacobian(SNES,Vec,Mat*,Mat*,MatStructure*,void*);
368 
369 /* --------- Solving systems of nonlinear equations --------------- */
370 PETSC_EXTERN PetscErrorCode SNESSetFunction(SNES,Vec,PetscErrorCode (*SNESFunction)(SNES,Vec,Vec,void*),void*);
371 PETSC_EXTERN PetscErrorCode SNESGetFunction(SNES,Vec*,PetscErrorCode (**SNESFunction)(SNES,Vec,Vec,void*),void**);
372 PETSC_EXTERN PetscErrorCode SNESComputeFunction(SNES,Vec,Vec);
373 PETSC_EXTERN PetscErrorCode SNESSetJacobian(SNES,Mat,Mat,PetscErrorCode (*SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void*);
374 PETSC_EXTERN PetscErrorCode SNESGetJacobian(SNES,Mat*,Mat*,PetscErrorCode (**SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void**);
375 PETSC_EXTERN PetscErrorCode SNESDefaultObjectiveComputeFunctionFD(SNES,Vec,Vec,void*);
376 PETSC_EXTERN PetscErrorCode SNESDefaultComputeJacobian(SNES,Vec,Mat*,Mat*,MatStructure*,void*);
377 PETSC_EXTERN PetscErrorCode SNESDefaultComputeJacobianColor(SNES,Vec,Mat*,Mat*,MatStructure*,void*);
378 PETSC_EXTERN PetscErrorCode SNESSetComputeInitialGuess(SNES,PetscErrorCode (*)(SNES,Vec,void*),void*);
379 PETSC_EXTERN PetscErrorCode SNESSetPicard(SNES,Vec,PetscErrorCode (*SNESFunction)(SNES,Vec,Vec,void*),Mat,Mat,PetscErrorCode (*SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void*);
380 PETSC_EXTERN PetscErrorCode SNESGetPicard(SNES,Vec*,PetscErrorCode (**SNESFunction)(SNES,Vec,Vec,void*),Mat*,Mat*,PetscErrorCode (**SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void**);
381 PETSC_EXTERN PetscErrorCode SNESSetInitialFunction(SNES,Vec);
382 PETSC_EXTERN PetscErrorCode SNESSetInitialFunctionNorm(SNES,PetscReal);
383 
384 PETSC_EXTERN PetscErrorCode SNESSetObjective(SNES,PetscErrorCode (*SNESObjectiveFunction)(SNES,Vec,PetscReal *,void*),void*);
385 PETSC_EXTERN PetscErrorCode SNESGetObjective(SNES,PetscErrorCode (**SNESObjectiveFunction)(SNES,Vec,PetscReal *,void*),void**);
386 PETSC_EXTERN PetscErrorCode SNESComputeObjective(SNES,Vec,PetscReal *);
387 
388 /*E
389     SNESNormType - Norm that is passed in the Krylov convergence
390        test routines.
391 
392    Level: advanced
393 
394    Support for these is highly dependent on the solver.
395 
396    Notes:
397    This is primarily used to turn off extra norm and function computation
398    when the solvers are composed.
399 
400 .seealso: SNESSolve(), SNESGetConvergedReason(), KSPSetNormType(),
401           KSPSetConvergenceTest(), KSPSetPCSide()
402 E*/
403 
404 typedef enum {SNES_NORM_DEFAULT            = -1,
405               SNES_NORM_NONE               =  0,
406               SNES_NORM_FUNCTION           =  1,
407               SNES_NORM_INITIAL_ONLY       =  2,
408               SNES_NORM_FINAL_ONLY         =  3,
409               SNES_NORM_INITIAL_FINAL_ONLY =  4} SNESNormType;
410 PETSC_EXTERN const char *const*const SNESNormTypes;
411 /*MC
412     SNES_NORM_NONE - Don't compute function and its L2 norm.
413 
414    Level: advanced
415 
416     Notes:
417     This is most useful for stationary solvers with a fixed number of iterations used as smoothers.
418 
419 .seealso: SNESNormType, SNESSetNormType(), SNES_NORM_DEFAULT
420 M*/
421 
422 /*MC
423     SNES_NORM_FUNCTION - Compute the function and its L2 norm at each iteration.
424 
425    Level: advanced
426 
427     Notes:
428     Most solvers will use this no matter what norm type is passed to them.
429 
430 .seealso: SNESNormType, SNESSetNormType(), SNES_NORM_NONE
431 M*/
432 
433 /*MC
434     SNES_NORM_INITIAL_ONLY - Compute the function and its L2 at iteration 0, but do not update it.
435 
436    Level: advanced
437 
438    Notes:
439    This method is useful in composed methods, when a true solution might actually be found before SNESSolve() is called.
440    This option enables the solve to abort on the zeroth iteration if this is the case.
441 
442    For solvers that require the computation of the L2 norm of the function as part of the method, this merely cancels
443    the norm computation at the last iteration (if possible).
444 
445 .seealso: SNESNormType, SNESSetNormType(), SNES_NORM_FINAL_ONLY, SNES_NORM_INITIAL_FINAL_ONLY
446 M*/
447 
448 /*MC
449     SNES_NORM_FINAL_ONLY - Compute the function and its L2 norm on only the final iteration.
450 
451    Level: advanced
452 
453    Notes:
454    For solvers that require the computation of the L2 norm of the function as part of the method, behaves
455    exactly as SNES_NORM_DEFAULT.  This method is useful when the function is gotten after SNESSolve and
456    used in subsequent computation for methods that do not need the norm computed during the rest of the
457    solution procedure.
458 
459 .seealso: SNESNormType, SNESSetNormType(), SNES_NORM_INITIAL_ONLY, SNES_NORM_INITIAL_FINAL_ONLY
460 M*/
461 
462 /*MC
463     SNES_NORM_INITIAL_FINAL_ONLY - Compute the function and its L2 norm on only the initial and final iterations.
464 
465    Level: advanced
466 
467    Notes:
468    This method combines the benefits of SNES_NORM_INITIAL_ONLY and SNES_NORM_FINAL_ONLY.
469 
470 .seealso: SNESNormType, SNESSetNormType(), SNES_NORM_SNES_NORM_INITIAL_ONLY, SNES_NORM_FINAL_ONLY
471 M*/
472 
473 
474 PETSC_EXTERN PetscErrorCode SNESSetNormType(SNES,SNESNormType);
475 PETSC_EXTERN PetscErrorCode SNESGetNormType(SNES,SNESNormType*);
476 
477 PETSC_EXTERN PetscErrorCode SNESSetGS(SNES,PetscErrorCode (*SNESGSFunction)(SNES,Vec,Vec,void*),void*);
478 PETSC_EXTERN PetscErrorCode SNESGetGS(SNES,PetscErrorCode (**SNESGSFunction)(SNES,Vec,Vec,void*),void**);
479 PETSC_EXTERN PetscErrorCode SNESSetUseGS(SNES,PetscBool);
480 PETSC_EXTERN PetscErrorCode SNESGetUseGS(SNES,PetscBool *);
481 PETSC_EXTERN PetscErrorCode SNESComputeGS(SNES,Vec,Vec);
482 
483 PETSC_EXTERN PetscErrorCode SNESGSSetSweeps(SNES,PetscInt);
484 PETSC_EXTERN PetscErrorCode SNESGSGetSweeps(SNES,PetscInt *);
485 PETSC_EXTERN PetscErrorCode SNESGSSetTolerances(SNES,PetscReal,PetscReal,PetscReal,PetscInt);
486 PETSC_EXTERN PetscErrorCode SNESGSGetTolerances(SNES,PetscReal*,PetscReal*,PetscReal*,PetscInt*);
487 
488 PETSC_EXTERN PetscErrorCode SNESUpdateCheckJacobian(SNES,PetscInt);
489 
490 PETSC_EXTERN PetscErrorCode SNESShellGetContext(SNES,void**);
491 PETSC_EXTERN PetscErrorCode SNESShellSetContext(SNES,void*);
492 PETSC_EXTERN PetscErrorCode SNESShellSetSolve(SNES,PetscErrorCode (*)(SNES,Vec));
493 
494 /* --------- Routines specifically for line search methods --------------- */
495 
496 typedef struct _p_LineSearch* SNESLineSearch;
497 
498 /*S
499      SNESLineSearch - Abstract PETSc object that manages line-search operations
500 
501    Level: beginner
502 
503   Concepts: nonlinear solvers, line search
504 
505 .seealso:  SNESLineSearchCreate(), SNESLineSearchSetType(), SNES
506 S*/
507 
508 /*J
509     SNESLineSearchType - String with the name of a PETSc line search method
510 
511    Level: beginner
512 
513 .seealso: SNESLineSearchSetType(), SNES
514 J*/
515 
516 typedef const char* SNESLineSearchType;
517 #define SNESLINESEARCHBT                 "bt"
518 #define SNESLINESEARCHBASIC              "basic"
519 #define SNESLINESEARCHL2                 "l2"
520 #define SNESLINESEARCHCP                 "cp"
521 #define SNESLINESEARCHSHELL              "shell"
522 
523 PETSC_EXTERN PetscBool         SNESRegisterAllCalled;
524 PETSC_EXTERN PetscFunctionList SNESList;
525 PETSC_EXTERN PetscClassId      SNESLINESEARCH_CLASSID;
526 PETSC_EXTERN PetscBool         SNESLineSearchRegisterAllCalled;
527 PETSC_EXTERN PetscFunctionList SNESLineSearchList;
528 PETSC_EXTERN PetscLogEvent     SNESLineSearch_Apply;
529 
530 #define SNES_LINESEARCH_ORDER_LINEAR    1
531 #define SNES_LINESEARCH_ORDER_QUADRATIC 2
532 #define SNES_LINESEARCH_ORDER_CUBIC     3
533 
534 PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*SNESLineSearchVIProjectFunc)(SNES,Vec);
535 PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*SNESLineSearchVINormFunc)(SNES,Vec,Vec,PetscReal *);
536 PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*SNESLineSearchApplyFunc)(SNESLineSearch);
537 PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*SNESLineSearchUserFunc)(SNESLineSearch, void *);
538 
539 PETSC_EXTERN PetscErrorCode SNESLineSearchCreate(MPI_Comm, SNESLineSearch*);
540 PETSC_EXTERN PetscErrorCode SNESLineSearchReset(SNESLineSearch);
541 PETSC_EXTERN PetscErrorCode SNESLineSearchView(SNESLineSearch,PetscViewer);
542 PETSC_EXTERN PetscErrorCode SNESLineSearchDestroy(SNESLineSearch *);
543 PETSC_EXTERN PetscErrorCode SNESLineSearchSetType(SNESLineSearch, SNESLineSearchType);
544 PETSC_EXTERN PetscErrorCode SNESLineSearchSetFromOptions(SNESLineSearch);
545 PETSC_EXTERN PetscErrorCode SNESLineSearchSetUp(SNESLineSearch);
546 PETSC_EXTERN PetscErrorCode SNESLineSearchApply(SNESLineSearch, Vec, Vec, PetscReal *, Vec);
547 PETSC_EXTERN PetscErrorCode SNESLineSearchPreCheck(SNESLineSearch,Vec,Vec,PetscBool *);
548 PETSC_EXTERN PetscErrorCode SNESLineSearchPostCheck(SNESLineSearch,Vec,Vec,Vec,PetscBool *,PetscBool *);
549 PETSC_EXTERN PetscErrorCode SNESLineSearchGetWork(SNESLineSearch, PetscInt);
550 
551 /* set the functions for precheck and postcheck */
552 
553 PETSC_EXTERN PetscErrorCode SNESLineSearchSetPreCheck(SNESLineSearch, PetscErrorCode (*SNESLineSearchPreCheckFunction)(SNESLineSearch,Vec,Vec,PetscBool*,void*), void *ctx);
554 PETSC_EXTERN PetscErrorCode SNESLineSearchSetPostCheck(SNESLineSearch, PetscErrorCode (*SNESLineSearchPostCheckFunction)(SNESLineSearch,Vec,Vec,Vec,PetscBool *,PetscBool *,void*), void *ctx);
555 
556 PETSC_EXTERN PetscErrorCode SNESLineSearchGetPreCheck(SNESLineSearch, PetscErrorCode (**SNESLineSearchPreCheckFunction)(SNESLineSearch,Vec,Vec,PetscBool*,void*), void **ctx);
557 PETSC_EXTERN PetscErrorCode SNESLineSearchGetPostCheck(SNESLineSearch, PetscErrorCode (**SNESLineSearchPostCheckFunction)(SNESLineSearch,Vec,Vec,Vec,PetscBool *,PetscBool *,void*), void **ctx);
558 
559 /* set the functions for VI-specific line search operations */
560 
561 PETSC_EXTERN PetscErrorCode SNESLineSearchSetVIFunctions(SNESLineSearch, SNESLineSearchVIProjectFunc, SNESLineSearchVINormFunc);
562 PETSC_EXTERN PetscErrorCode SNESLineSearchGetVIFunctions(SNESLineSearch, SNESLineSearchVIProjectFunc*, SNESLineSearchVINormFunc*);
563 
564 /* pointers to the associated SNES in order to be able to get the function evaluation out */
565 PETSC_EXTERN PetscErrorCode SNESLineSearchSetSNES(SNESLineSearch,SNES);
566 PETSC_EXTERN PetscErrorCode SNESLineSearchGetSNES(SNESLineSearch,SNES*);
567 
568 /* set and get the parameters and vectors */
569 PETSC_EXTERN PetscErrorCode SNESLineSearchGetTolerances(SNESLineSearch,PetscReal*,PetscReal*,PetscReal*,PetscReal*,PetscReal*,PetscInt*);
570 PETSC_EXTERN PetscErrorCode SNESLineSearchSetTolerances(SNESLineSearch,PetscReal,PetscReal,PetscReal,PetscReal,PetscReal,PetscInt);
571 
572 PETSC_EXTERN PetscErrorCode SNESLineSearchPreCheckPicard(SNESLineSearch,Vec,Vec,PetscBool*,void*);
573 
574 PETSC_EXTERN PetscErrorCode SNESLineSearchGetLambda(SNESLineSearch,PetscReal*);
575 PETSC_EXTERN PetscErrorCode SNESLineSearchSetLambda(SNESLineSearch,PetscReal);
576 
577 PETSC_EXTERN PetscErrorCode SNESLineSearchGetDamping(SNESLineSearch,PetscReal*);
578 PETSC_EXTERN PetscErrorCode SNESLineSearchSetDamping(SNESLineSearch,PetscReal);
579 
580 PETSC_EXTERN PetscErrorCode SNESLineSearchGetOrder(SNESLineSearch,PetscInt *order);
581 PETSC_EXTERN PetscErrorCode SNESLineSearchSetOrder(SNESLineSearch,PetscInt order);
582 
583 PETSC_EXTERN PetscErrorCode SNESLineSearchGetSuccess(SNESLineSearch, PetscBool*);
584 PETSC_EXTERN PetscErrorCode SNESLineSearchSetSuccess(SNESLineSearch, PetscBool);
585 
586 PETSC_EXTERN PetscErrorCode SNESLineSearchGetVecs(SNESLineSearch,Vec*,Vec*,Vec*,Vec*,Vec*);
587 PETSC_EXTERN PetscErrorCode SNESLineSearchSetVecs(SNESLineSearch,Vec,Vec,Vec,Vec,Vec);
588 
589 PETSC_EXTERN PetscErrorCode SNESLineSearchGetNorms(SNESLineSearch, PetscReal *, PetscReal *, PetscReal *);
590 PETSC_EXTERN PetscErrorCode SNESLineSearchSetNorms(SNESLineSearch, PetscReal, PetscReal, PetscReal);
591 PETSC_EXTERN PetscErrorCode SNESLineSearchComputeNorms(SNESLineSearch);
592 PETSC_EXTERN PetscErrorCode SNESLineSearchSetComputeNorms(SNESLineSearch, PetscBool);
593 
594 PETSC_EXTERN PetscErrorCode SNESLineSearchSetMonitor(SNESLineSearch, PetscBool);
595 PETSC_EXTERN PetscErrorCode SNESLineSearchGetMonitor(SNESLineSearch, PetscViewer*);
596 
597 PETSC_EXTERN PetscErrorCode SNESLineSearchAppendOptionsPrefix(SNESLineSearch, const char prefix[]);
598 PETSC_EXTERN PetscErrorCode SNESLineSearchGetOptionsPrefix(SNESLineSearch, const char *prefix[]);
599 
600 
601 /* Shell interface functions */
602 PETSC_EXTERN PetscErrorCode SNESLineSearchShellSetUserFunc(SNESLineSearch,SNESLineSearchUserFunc,void*);
603 PETSC_EXTERN PetscErrorCode SNESLineSearchShellGetUserFunc(SNESLineSearch,SNESLineSearchUserFunc*,void**);
604 
605 /* BT interface functions */
606 PETSC_EXTERN PetscErrorCode SNESLineSearchBTSetAlpha(SNESLineSearch, PetscReal);
607 PETSC_EXTERN PetscErrorCode SNESLineSearchBTGetAlpha(SNESLineSearch, PetscReal*);
608 
609 /*register line search types */
610 PETSC_EXTERN PetscErrorCode SNESLineSearchRegister(const char[],const char[],const char[],PetscErrorCode(*)(SNESLineSearch));
611 PETSC_EXTERN PetscErrorCode SNESLineSearchRegisterAll(const char path[]);
612 PETSC_EXTERN PetscErrorCode SNESLineSearchRegisterDestroy(void);
613 
614 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
615 #define SNESLineSearchRegisterDynamic(a,b,c,d) SNESLineSearchRegister(a,b,c,0)
616 #else
617 #define SNESLineSearchRegisterDynamic(a,b,c,d) SNESLineSearchRegister(a,b,c,d)
618 #endif
619 
620 /* Routines for VI solver */
621 PETSC_EXTERN PetscErrorCode SNESVISetVariableBounds(SNES,Vec,Vec);
622 PETSC_EXTERN PetscErrorCode SNESVISetComputeVariableBounds(SNES, PetscErrorCode (*)(SNES,Vec,Vec));
623 PETSC_EXTERN PetscErrorCode SNESVIGetInactiveSet(SNES,IS*);
624 PETSC_EXTERN PetscErrorCode SNESVIGetActiveSetIS(SNES,Vec,Vec,IS*);
625 PETSC_EXTERN PetscErrorCode SNESVIComputeInactiveSetFnorm(SNES,Vec,Vec,PetscReal*);
626 PETSC_EXTERN PetscErrorCode SNESVISetRedundancyCheck(SNES,PetscErrorCode(*)(SNES,IS,IS*,void*),void*);
627 #define SNES_VI_INF   1.0e20
628 #define SNES_VI_NINF -1.0e20
629 
630 PETSC_EXTERN PetscErrorCode SNESTestLocalMin(SNES);
631 
632 /* Should this routine be private? */
633 PETSC_EXTERN PetscErrorCode SNESComputeJacobian(SNES,Vec,Mat*,Mat*,MatStructure*);
634 
635 PETSC_EXTERN PetscErrorCode SNESSetDM(SNES,DM);
636 PETSC_EXTERN PetscErrorCode SNESGetDM(SNES,DM*);
637 PETSC_EXTERN PetscErrorCode SNESSetPC(SNES,SNES);
638 PETSC_EXTERN PetscErrorCode SNESGetPC(SNES,SNES*);
639 PETSC_EXTERN PetscErrorCode SNESSetPCSide(SNES,PCSide);
640 PETSC_EXTERN PetscErrorCode SNESGetPCSide(SNES,PCSide*);
641 PETSC_EXTERN PetscErrorCode SNESSetSNESLineSearch(SNES,SNESLineSearch);
642 PETSC_EXTERN PetscErrorCode SNESGetSNESLineSearch(SNES,SNESLineSearch*);
643 PETSC_EXTERN PetscErrorCode SNESRestrictHookAdd(SNES,PetscErrorCode (*)(SNES,SNES,void*),void*);
644 PETSC_EXTERN PetscErrorCode SNESRestrictHooksRun(SNES,SNES);
645 
646 PETSC_EXTERN PetscErrorCode SNESSetUpMatrices(SNES);
647 PETSC_EXTERN PetscErrorCode DMSNESSetFunction(DM,PetscErrorCode(*SNESFunction)(SNES,Vec,Vec,void*),void*);
648 PETSC_EXTERN PetscErrorCode DMSNESGetFunction(DM,PetscErrorCode(**SNESSetFunction)(SNES,Vec,Vec,void*),void**);
649 PETSC_EXTERN PetscErrorCode DMSNESSetGS(DM,PetscErrorCode(*SNESGSFunction)(SNES,Vec,Vec,void*),void*);
650 PETSC_EXTERN PetscErrorCode DMSNESGetGS(DM,PetscErrorCode(**SNESGSFunction)(SNES,Vec,Vec,void*),void**);
651 PETSC_EXTERN PetscErrorCode DMSNESSetJacobian(DM,PetscErrorCode(*SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void*);
652 PETSC_EXTERN PetscErrorCode DMSNESGetJacobian(DM,PetscErrorCode(**SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void**);
653 PETSC_EXTERN PetscErrorCode DMSNESSetPicard(DM,PetscErrorCode(*SNESFunction)(SNES,Vec,Vec,void*),PetscErrorCode(*SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void*);
654 PETSC_EXTERN PetscErrorCode DMSNESGetPicard(DM,PetscErrorCode(**SNESFunction)(SNES,Vec,Vec,void*),PetscErrorCode(**SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void**);
655 PETSC_EXTERN PetscErrorCode DMSNESSetObjective(DM,PetscErrorCode (*SNESObjectiveFunction)(SNES,Vec,PetscReal *,void*),void*);
656 PETSC_EXTERN PetscErrorCode DMSNESGetObjective(DM,PetscErrorCode (**SNESObjectiveFunction)(SNES,Vec,PetscReal *,void*),void**);
657 
658 PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*DMDASNESFunction)(DMDALocalInfo*,void*,void*,void*);
659 PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*DMDASNESJacobian)(DMDALocalInfo*,void*,Mat,Mat,MatStructure*,void*);
660 PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*DMDASNESObjective)(DMDALocalInfo*,void*,PetscReal*,void*);
661 
662 PETSC_EXTERN PetscErrorCode DMDASNESSetFunctionLocal(DM,InsertMode,DMDASNESFunction,void*);
663 PETSC_EXTERN PetscErrorCode DMDASNESSetJacobianLocal(DM,DMDASNESJacobian,void*);
664 PETSC_EXTERN PetscErrorCode DMDASNESSetObjectiveLocal(DM,DMDASNESObjective,void*);
665 PETSC_EXTERN PetscErrorCode DMDASNESSetPicardLocal(DM,InsertMode,PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*),PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,MatStructure*,void*),void*);
666 
667 PETSC_EXTERN PetscErrorCode DMSNESSetFunctionLocal(DM,PetscErrorCode (*)(DM,Vec,Vec,void*),void*);
668 PETSC_EXTERN PetscErrorCode DMSNESSetJacobianLocal(DM,PetscErrorCode (*)(DM,Vec,Mat,Mat,MatStructure*,void*),void*);
669 
670 /* Routines for Multiblock solver */
671 PETSC_EXTERN PetscErrorCode SNESMultiblockSetFields(SNES, const char [], PetscInt, const PetscInt *);
672 PETSC_EXTERN PetscErrorCode SNESMultiblockSetIS(SNES, const char [], IS);
673 PETSC_EXTERN PetscErrorCode SNESMultiblockSetBlockSize(SNES, PetscInt);
674 PETSC_EXTERN PetscErrorCode SNESMultiblockSetType(SNES, PCCompositeType);
675 
676 /*J
677     SNESMSType - String with the name of a PETSc SNESMS method.
678 
679    Level: intermediate
680 
681 .seealso: SNESMSSetType(), SNES
682 J*/
683 typedef const char* SNESMSType;
684 #define SNESMSM62       "m62"
685 #define SNESMSEULER     "euler"
686 #define SNESMSJAMESON83 "jameson83"
687 #define SNESMSVLTP21    "vltp21"
688 #define SNESMSVLTP31    "vltp31"
689 #define SNESMSVLTP41    "vltp41"
690 #define SNESMSVLTP51    "vltp51"
691 #define SNESMSVLTP61    "vltp61"
692 
693 PETSC_EXTERN PetscErrorCode SNESMSRegister(SNESMSType,PetscInt,PetscInt,PetscReal,const PetscReal[],const PetscReal[],const PetscReal[]);
694 PETSC_EXTERN PetscErrorCode SNESMSSetType(SNES,SNESMSType);
695 PETSC_EXTERN PetscErrorCode SNESMSFinalizePackage(void);
696 PETSC_EXTERN PetscErrorCode SNESMSInitializePackage(const char path[]);
697 PETSC_EXTERN PetscErrorCode SNESMSRegisterDestroy(void);
698 PETSC_EXTERN PetscErrorCode SNESMSRegisterAll(void);
699 
700 /* routines for NGMRES solver */
701 
702 typedef enum {
703   SNES_NGMRES_RESTART_NONE       = 0,
704   SNES_NGMRES_RESTART_PERIODIC   = 1,
705   SNES_NGMRES_RESTART_DIFFERENCE = 2} SNESNGMRESRestartType;
706 PETSC_EXTERN const char *const SNESNGMRESRestartTypes[];
707 
708 typedef enum {
709   SNES_NGMRES_SELECT_NONE       = 0,
710   SNES_NGMRES_SELECT_DIFFERENCE = 1,
711   SNES_NGMRES_SELECT_LINESEARCH = 2} SNESNGMRESSelectType;
712 PETSC_EXTERN const char *const SNESNGMRESSelectTypes[];
713 
714 PETSC_EXTERN PetscErrorCode SNESNGMRESSetRestartType(SNES, SNESNGMRESRestartType);
715 PETSC_EXTERN PetscErrorCode SNESNGMRESSetSelectType(SNES, SNESNGMRESSelectType);
716 
717 /* routines for NCG solver */
718 
719 typedef enum {
720   SNES_NCG_FR    = 0,
721   SNES_NCG_PRP   = 1,
722   SNES_NCG_HS    = 2,
723   SNES_NCG_DY    = 3,
724   SNES_NCG_CD    = 4} SNESNCGType;
725 PETSC_EXTERN const char *const SNESNCGTypes[];
726 
727 PETSC_EXTERN PetscErrorCode SNESNCGSetType(SNES, SNESNCGType);
728 
729 typedef enum {SNES_QN_SCALE_NONE       = 0,
730               SNES_QN_SCALE_SHANNO     = 1,
731               SNES_QN_SCALE_LINESEARCH = 2,
732               SNES_QN_SCALE_JACOBIAN   = 3} SNESQNScaleType;
733 PETSC_EXTERN const char *const SNESQNScaleTypes[];
734 typedef enum {SNES_QN_RESTART_NONE     = 0,
735               SNES_QN_RESTART_POWELL   = 1,
736               SNES_QN_RESTART_PERIODIC = 2} SNESQNRestartType;
737 PETSC_EXTERN const char *const SNESQNRestartTypes[];
738 
739 PETSC_EXTERN PetscErrorCode SNESQNSetScaleType(SNES, SNESQNScaleType);
740 PETSC_EXTERN PetscErrorCode SNESQNSetRestartType(SNES, SNESQNRestartType);
741 
742 PETSC_EXTERN PetscErrorCode SNESNASMGetSubdomains(SNES,PetscInt*,SNES**,VecScatter**,VecScatter**,VecScatter**);
743 PETSC_EXTERN PetscErrorCode SNESNASMSetSubdomains(SNES,PetscInt,SNES*,VecScatter*,VecScatter*,VecScatter*);
744 PETSC_EXTERN PetscErrorCode SNESNASMGetSubdomainVecs(SNES,PetscInt*,Vec**,Vec**,Vec**,Vec**);
745 PETSC_EXTERN PetscErrorCode SNESNASMSetComputeFinalJacobian(SNES,PetscBool);
746 
747 #endif
748