xref: /petsc/include/petscsnes.h (revision 30de9b251c71d073cc9d88242eefe8db4dcc3e99)
173f4d377SMatthew Knepley /* $Id: petscsnes.h,v 1.111 2001/08/06 21:17:05 bsmith Exp $ */
2f26ada1bSBarry Smith /*
3eef9c623SLois Curfman McInnes     User interface for the nonlinear solvers package.
4f26ada1bSBarry Smith */
50a835dfdSSatish Balay #if !defined(__PETSCSNES_H)
60a835dfdSSatish Balay #define __PETSCSNES_H
70a835dfdSSatish Balay #include "petscsles.h"
8b1f5cb9dSBarry Smith 
9435da068SBarry Smith /*S
10435da068SBarry Smith      SNES - Abstract PETSc object that manages all nonlinear solves
11435da068SBarry Smith 
12435da068SBarry Smith    Level: beginner
13435da068SBarry Smith 
14435da068SBarry Smith   Concepts: nonlinear solvers
15435da068SBarry Smith 
16eef9c623SLois Curfman McInnes .seealso:  SNESCreate(), SNESSetType(), SNESType, TS, SLES, KSP, PC
17435da068SBarry Smith S*/
18f09e8eb9SSatish Balay typedef struct _p_SNES* SNES;
19435da068SBarry Smith 
20435da068SBarry Smith /*E
21435da068SBarry Smith     SNESType - String with the name of a PETSc SNES method or the creation function
22435da068SBarry Smith        with an optional dynamic library name, for example
23435da068SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:mysnescreate()
24435da068SBarry Smith 
25435da068SBarry Smith    Level: beginner
26435da068SBarry Smith 
27435da068SBarry Smith .seealso: SNESSetType(), SNES
28435da068SBarry Smith E*/
29eef9c623SLois Curfman McInnes #define SNESLS          "ls"
30eef9c623SLois Curfman McInnes #define SNESTR          "tr"
31eef9c623SLois Curfman McInnes #define SNESTEST        "test"
3282bf6240SBarry Smith typedef char *SNESType;
33b1f5cb9dSBarry Smith 
34deeb6e72SMatthew Knepley /* Logging support */
35deeb6e72SMatthew Knepley extern int SNES_COOKIE;
36eef9c623SLois Curfman McInnes extern int SNES_Solve, SNES_LineSearch, SNES_FunctionEval, SNES_JacobianEval;
37eef9c623SLois Curfman McInnes 
38deeb6e72SMatthew Knepley 
398ba1e511SMatthew Knepley EXTERN int SNESInitializePackage(char *);
40deeb6e72SMatthew Knepley 
41eef9c623SLois Curfman McInnes EXTERN int SNESCreate(MPI_Comm,SNES*);
42ca44d042SBarry Smith EXTERN int SNESDestroy(SNES);
43ca44d042SBarry Smith EXTERN int SNESSetType(SNES,SNESType);
4487828ca2SBarry Smith EXTERN int SNESSetMonitor(SNES,int(*)(SNES,int,PetscReal,void*),void *,int (*)(void *));
45ca44d042SBarry Smith EXTERN int SNESClearMonitor(SNES);
4687828ca2SBarry Smith EXTERN int SNESSetConvergenceHistory(SNES,PetscReal*,int *,int,PetscTruth);
4787828ca2SBarry Smith EXTERN int SNESGetConvergenceHistory(SNES,PetscReal**,int **,int *);
48ca44d042SBarry Smith EXTERN int SNESSetUp(SNES,Vec);
49ca44d042SBarry Smith EXTERN int SNESSolve(SNES,Vec,int*);
5084cb2905SBarry Smith 
514d8f6ca9SMatthew Knepley EXTERN int SNESAddOptionsChecker(int (*)(SNES));
524d8f6ca9SMatthew Knepley 
534d8f6ca9SMatthew Knepley EXTERN int SNESSetRhsBC(SNES, int (*)(SNES, Vec, void *));
544d8f6ca9SMatthew Knepley EXTERN int SNESDefaultRhsBC(SNES, Vec, void *);
554d8f6ca9SMatthew Knepley EXTERN int SNESSetSolutionBC(SNES, int (*)(SNES, Vec, void *));
564d8f6ca9SMatthew Knepley EXTERN int SNESDefaultSolutionBC(SNES, Vec, void *);
574d8f6ca9SMatthew Knepley EXTERN int SNESSetUpdate(SNES, int (*)(SNES, int));
584d8f6ca9SMatthew Knepley EXTERN int SNESDefaultUpdate(SNES, int);
594d8f6ca9SMatthew Knepley 
60b0a32e0cSBarry Smith extern PetscFList SNESList;
61ca44d042SBarry Smith EXTERN int SNESRegisterDestroy(void);
62ca44d042SBarry Smith EXTERN int SNESRegisterAll(char *);
6384cb2905SBarry Smith 
64ca44d042SBarry Smith EXTERN int SNESRegister(char*,char*,char*,int(*)(SNES));
65*30de9b25SBarry Smith 
66*30de9b25SBarry Smith /*MC
67*30de9b25SBarry Smith    SNESRegisterDynamic - Adds a method to the nonlinear solver package.
68*30de9b25SBarry Smith 
69*30de9b25SBarry Smith    Synopsis:
70*30de9b25SBarry Smith    int SNESRegisterDynamic(char *name_solver,char *path,char *name_create,int (*routine_create)(SNES))
71*30de9b25SBarry Smith 
72*30de9b25SBarry Smith    Not collective
73*30de9b25SBarry Smith 
74*30de9b25SBarry Smith    Input Parameters:
75*30de9b25SBarry Smith +  name_solver - name of a new user-defined solver
76*30de9b25SBarry Smith .  path - path (either absolute or relative) the library containing this solver
77*30de9b25SBarry Smith .  name_create - name of routine to create method context
78*30de9b25SBarry Smith -  routine_create - routine to create method context
79*30de9b25SBarry Smith 
80*30de9b25SBarry Smith    Notes:
81*30de9b25SBarry Smith    SNESRegisterDynamic() may be called multiple times to add several user-defined solvers.
82*30de9b25SBarry Smith 
83*30de9b25SBarry Smith    If dynamic libraries are used, then the fourth input argument (routine_create)
84*30de9b25SBarry Smith    is ignored.
85*30de9b25SBarry Smith 
86*30de9b25SBarry Smith    Environmental variables such as ${PETSC_ARCH}, ${PETSC_DIR}, ${PETSC_LIB_DIR}, ${BOPT},
87*30de9b25SBarry Smith    and others of the form ${any_environmental_variable} occuring in pathname will be
88*30de9b25SBarry Smith    replaced with appropriate values.
89*30de9b25SBarry Smith 
90*30de9b25SBarry Smith    Sample usage:
91*30de9b25SBarry Smith .vb
92*30de9b25SBarry Smith    SNESRegisterDynamic("my_solver",/home/username/my_lib/lib/libg/solaris/mylib.a,
93*30de9b25SBarry Smith                 "MySolverCreate",MySolverCreate);
94*30de9b25SBarry Smith .ve
95*30de9b25SBarry Smith 
96*30de9b25SBarry Smith    Then, your solver can be chosen with the procedural interface via
97*30de9b25SBarry Smith $     SNESSetType(snes,"my_solver")
98*30de9b25SBarry Smith    or at runtime via the option
99*30de9b25SBarry Smith $     -snes_type my_solver
100*30de9b25SBarry Smith 
101*30de9b25SBarry Smith    Level: advanced
102*30de9b25SBarry Smith 
103*30de9b25SBarry Smith     Note: If your function is not being put into a shared library then use SNESRegister() instead
104*30de9b25SBarry Smith 
105*30de9b25SBarry Smith .keywords: SNES, nonlinear, register
106*30de9b25SBarry Smith 
107*30de9b25SBarry Smith .seealso: SNESRegisterAll(), SNESRegisterDestroy()
108*30de9b25SBarry Smith M*/
109aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
110f1af5d2fSBarry Smith #define SNESRegisterDynamic(a,b,c,d) SNESRegister(a,b,c,0)
111b2002411SLois Curfman McInnes #else
112f1af5d2fSBarry Smith #define SNESRegisterDynamic(a,b,c,d) SNESRegister(a,b,c,d)
113b2002411SLois Curfman McInnes #endif
114b2002411SLois Curfman McInnes 
115ca44d042SBarry Smith EXTERN int SNESGetSLES(SNES,SLES*);
116ca44d042SBarry Smith EXTERN int SNESGetSolution(SNES,Vec*);
117ca44d042SBarry Smith EXTERN int SNESGetSolutionUpdate(SNES,Vec*);
1188439883dSBarry Smith EXTERN int SNESGetFunction(SNES,Vec*,void**,int(**)(SNES,Vec,Vec,void*));
119b0a32e0cSBarry Smith EXTERN int SNESView(SNES,PetscViewer);
1207bc3d0afSSatish Balay 
121ca44d042SBarry Smith EXTERN int SNESSetOptionsPrefix(SNES,char*);
122ca44d042SBarry Smith EXTERN int SNESAppendOptionsPrefix(SNES,char*);
123ca44d042SBarry Smith EXTERN int SNESGetOptionsPrefix(SNES,char**);
124ca44d042SBarry Smith EXTERN int SNESSetFromOptions(SNES);
12540191667SLois Curfman McInnes 
126ca44d042SBarry Smith EXTERN int MatCreateSNESMF(SNES,Vec,Mat*);
1271d1367b7SBarry Smith EXTERN int MatCreateMF(Vec,Mat*);
1281d1367b7SBarry Smith EXTERN int MatSNESMFSetBase(Mat,Vec);
1293a7fca6bSBarry Smith EXTERN int MatSNESMFComputeJacobian(SNES,Vec,Mat*,Mat*,MatStructure*,void*);
130ca44d042SBarry Smith EXTERN int MatSNESMFSetFunction(Mat,Vec,int(*)(SNES,Vec,Vec,void*),void*);
13187828ca2SBarry Smith EXTERN int MatSNESMFSetFunctioni(Mat,int (*)(int,Vec,PetscScalar*,void*));
1328a124369SBarry Smith EXTERN int MatSNESMFSetFunctioniBase(Mat,int (*)(Vec,void*));
13374637425SBarry Smith EXTERN int MatSNESMFAddNullSpace(Mat,MatNullSpace);
13487828ca2SBarry Smith EXTERN int MatSNESMFSetHHistory(Mat,PetscScalar *,int);
135ca44d042SBarry Smith EXTERN int MatSNESMFResetHHistory(Mat);
13687828ca2SBarry Smith EXTERN int MatSNESMFSetFunctionError(Mat,PetscReal);
137ca44d042SBarry Smith EXTERN int MatSNESMFSetPeriod(Mat,int);
13887828ca2SBarry Smith EXTERN int MatSNESMFGetH(Mat,PetscScalar *);
13987828ca2SBarry Smith EXTERN int MatSNESMFKSPMonitor(KSP,int,PetscReal,void *);
140ca44d042SBarry Smith EXTERN int MatSNESMFSetFromOptions(Mat);
1415b7f0c42SBarry Smith EXTERN int MatSNESMFCheckPositivity(Vec,Vec,PetscScalar*,void*);
14261860be5SBarry Smith EXTERN int MatSNESMFSetCheckh(Mat,int (*)(Vec,Vec,PetscScalar*,void*),void*);
1435b7f0c42SBarry Smith 
1445a655dc6SBarry Smith typedef struct _p_MatSNESMFCtx   *MatSNESMFCtx;
145435da068SBarry Smith 
146435da068SBarry Smith #define MATSNESMF_DEFAULT "default"
147435da068SBarry Smith #define MATSNESMF_WP      "wp"
148b7fd4e64SBarry Smith typedef char* MatSNESMFType;
149ca44d042SBarry Smith EXTERN int MatSNESMFSetType(Mat,MatSNESMFType);
150ca44d042SBarry Smith EXTERN int MatSNESMFRegister(char *,char *,char *,int (*)(MatSNESMFCtx));
151*30de9b25SBarry Smith 
152*30de9b25SBarry Smith /*MC
153*30de9b25SBarry Smith    MatSNESMFRegisterDynamic - Adds a method to the MatSNESMF registry.
154*30de9b25SBarry Smith 
155*30de9b25SBarry Smith    Synopsis:
156*30de9b25SBarry Smith    int MatSNESMFRegisterDynamic(char *name_solver,char *path,char *name_create,int (*routine_create)(MatSNESMF))
157*30de9b25SBarry Smith 
158*30de9b25SBarry Smith    Not Collective
159*30de9b25SBarry Smith 
160*30de9b25SBarry Smith    Input Parameters:
161*30de9b25SBarry Smith +  name_solver - name of a new user-defined compute-h module
162*30de9b25SBarry Smith .  path - path (either absolute or relative) the library containing this solver
163*30de9b25SBarry Smith .  name_create - name of routine to create method context
164*30de9b25SBarry Smith -  routine_create - routine to create method context
165*30de9b25SBarry Smith 
166*30de9b25SBarry Smith    Level: developer
167*30de9b25SBarry Smith 
168*30de9b25SBarry Smith    Notes:
169*30de9b25SBarry Smith    MatSNESMFRegisterDynamic) may be called multiple times to add several user-defined solvers.
170*30de9b25SBarry Smith 
171*30de9b25SBarry Smith    If dynamic libraries are used, then the fourth input argument (routine_create)
172*30de9b25SBarry Smith    is ignored.
173*30de9b25SBarry Smith 
174*30de9b25SBarry Smith    Sample usage:
175*30de9b25SBarry Smith .vb
176*30de9b25SBarry Smith    MatSNESMFRegisterDynamic"my_h",/home/username/my_lib/lib/libO/solaris/mylib.a,
177*30de9b25SBarry Smith                "MyHCreate",MyHCreate);
178*30de9b25SBarry Smith .ve
179*30de9b25SBarry Smith 
180*30de9b25SBarry Smith    Then, your solver can be chosen with the procedural interface via
181*30de9b25SBarry Smith $     MatSNESMFSetType(mfctx,"my_h")
182*30de9b25SBarry Smith    or at runtime via the option
183*30de9b25SBarry Smith $     -snes_mf_type my_h
184*30de9b25SBarry Smith 
185*30de9b25SBarry Smith .keywords: MatSNESMF, register
186*30de9b25SBarry Smith 
187*30de9b25SBarry Smith .seealso: MatSNESMFRegisterAll(), MatSNESMFRegisterDestroy()
188*30de9b25SBarry Smith M*/
189aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
190f1af5d2fSBarry Smith #define MatSNESMFRegisterDynamic(a,b,c,d) MatSNESMFRegister(a,b,c,0)
1919a6cb015SBarry Smith #else
192f1af5d2fSBarry Smith #define MatSNESMFRegisterDynamic(a,b,c,d) MatSNESMFRegister(a,b,c,d)
1939a6cb015SBarry Smith #endif
194*30de9b25SBarry Smith 
195ca44d042SBarry Smith EXTERN int MatSNESMFRegisterAll(char *);
196ca44d042SBarry Smith EXTERN int MatSNESMFRegisterDestroy(void);
1973a7fca6bSBarry Smith EXTERN int MatSNESMFDefaultSetUmin(Mat,PetscReal);
198ca44d042SBarry Smith EXTERN int MatSNESMFWPSetComputeNormA(Mat,PetscTruth);
199ca44d042SBarry Smith EXTERN int MatSNESMFWPSetComputeNormU(Mat,PetscTruth);
2008f6e3e37SBarry Smith 
2013a7fca6bSBarry Smith EXTERN int MatDAADSetSNES(Mat,SNES);
2023a7fca6bSBarry Smith 
203ca44d042SBarry Smith EXTERN int SNESGetType(SNES,SNESType*);
20487828ca2SBarry Smith EXTERN int SNESDefaultMonitor(SNES,int,PetscReal,void *);
20587828ca2SBarry Smith EXTERN int SNESRatioMonitor(SNES,int,PetscReal,void *);
2063a7fca6bSBarry Smith EXTERN int SNESSetRatioMonitor(SNES);
20787828ca2SBarry Smith EXTERN int SNESVecViewMonitor(SNES,int,PetscReal,void *);
2085ed2d596SBarry Smith EXTERN int SNESVecViewResidualMonitor(SNES,int,PetscReal,void *);
20987828ca2SBarry Smith EXTERN int SNESVecViewUpdateMonitor(SNES,int,PetscReal,void *);
21087828ca2SBarry Smith EXTERN int SNESDefaultSMonitor(SNES,int,PetscReal,void *);
21187828ca2SBarry Smith EXTERN int SNESSetTolerances(SNES,PetscReal,PetscReal,PetscReal,int,int);
21287828ca2SBarry Smith EXTERN int SNESGetTolerances(SNES,PetscReal*,PetscReal*,PetscReal*,int*,int*);
21387828ca2SBarry Smith EXTERN int SNESSetTrustRegionTolerance(SNES,PetscReal);
214ca44d042SBarry Smith EXTERN int SNESGetIterationNumber(SNES,int*);
21587828ca2SBarry Smith EXTERN int SNESGetFunctionNorm(SNES,PetscScalar*);
216ca44d042SBarry Smith EXTERN int SNESGetNumberUnsuccessfulSteps(SNES,int*);
2173064298fSMatthew Knepley EXTERN int SNESSetMaximumUnsuccessfulSteps(SNES,int);
2183064298fSMatthew Knepley EXTERN int SNESGetMaximumUnsuccessfulSteps(SNES,int*);
219ca44d042SBarry Smith EXTERN int SNESGetNumberLinearIterations(SNES,int*);
22087828ca2SBarry Smith EXTERN int SNES_KSP_SetParametersEW(SNES,int,PetscReal,PetscReal,PetscReal,PetscReal,PetscReal,PetscReal);
221ca44d042SBarry Smith EXTERN int SNES_KSP_SetConvergenceTestEW(SNES);
222eafb4bcbSBarry Smith 
2233369ce9aSBarry Smith /*
2243369ce9aSBarry Smith      Reuse the default KSP monitor routines for SNES
2253369ce9aSBarry Smith */
226b0a32e0cSBarry Smith EXTERN int SNESLGMonitorCreate(char*,char*,int,int,int,int,PetscDrawLG*);
22787828ca2SBarry Smith EXTERN int SNESLGMonitor(SNES,int,PetscReal,void*);
228b0a32e0cSBarry Smith EXTERN int SNESLGMonitorDestroy(PetscDrawLG);
229eafb4bcbSBarry Smith 
230ca44d042SBarry Smith EXTERN int SNESSetApplicationContext(SNES,void *);
231ca44d042SBarry Smith EXTERN int SNESGetApplicationContext(SNES,void **);
232184914b5SBarry Smith 
233435da068SBarry Smith /*E
234435da068SBarry Smith     SNESConvergedReason - reason a SNES method was said to
235435da068SBarry Smith          have converged or diverged
236435da068SBarry Smith 
237435da068SBarry Smith    Level: beginner
238435da068SBarry Smith 
239435da068SBarry Smith    Notes: this must match finclude/petscsnes.h
240435da068SBarry Smith 
241435da068SBarry Smith .seealso: SNESSolve(), SNESGetConvergedReason(), KSPConvergedReason, SNESSetConvergenceTest()
242435da068SBarry Smith E*/
243184914b5SBarry Smith typedef enum {/* converged */
244184914b5SBarry Smith               SNES_CONVERGED_FNORM_ABS         =  2, /* F < F_minabs */
245184914b5SBarry Smith               SNES_CONVERGED_FNORM_RELATIVE    =  3, /* F < F_mintol*F_initial */
246184914b5SBarry Smith               SNES_CONVERGED_PNORM_RELATIVE    =  4, /* step size small */
247184914b5SBarry Smith               SNES_CONVERGED_GNORM_ABS         =  5, /* grad F < grad F_min */
248184914b5SBarry Smith               SNES_CONVERGED_TR_REDUCTION      =  6,
249184914b5SBarry Smith               SNES_CONVERGED_TR_DELTA          =  7,
250184914b5SBarry Smith               /* diverged */
251184914b5SBarry Smith               SNES_DIVERGED_FUNCTION_COUNT     = -2,
252184914b5SBarry Smith               SNES_DIVERGED_FNORM_NAN          = -4,
253184914b5SBarry Smith               SNES_DIVERGED_MAX_IT             = -5,
254184914b5SBarry Smith               SNES_DIVERGED_LS_FAILURE         = -6,
255184914b5SBarry Smith               SNES_DIVERGED_TR_REDUCTION       = -7,
25658c775ebSBarry Smith               SNES_DIVERGED_LOCAL_MIN          = -8,  /* || J^T b || is small, implies converged to local minimum of F() */
257184914b5SBarry Smith               SNES_CONVERGED_ITERATING         =  0} SNESConvergedReason;
258184914b5SBarry Smith 
25987828ca2SBarry Smith EXTERN int SNESSetConvergenceTest(SNES,int (*)(SNES,PetscReal,PetscReal,PetscReal,SNESConvergedReason*,void*),void*);
260eef9c623SLois Curfman McInnes EXTERN int SNESConverged_LS(SNES,PetscReal,PetscReal,PetscReal,SNESConvergedReason*,void*);
261eef9c623SLois Curfman McInnes EXTERN int SNESConverged_TR(SNES,PetscReal,PetscReal,PetscReal,SNESConvergedReason*,void*);
262ca44d042SBarry Smith EXTERN int SNESGetConvergedReason(SNES,SNESConvergedReason*);
263ddbbdb52SLois Curfman McInnes 
2643a7fca6bSBarry Smith EXTERN int SNESDAFormFunction(SNES,Vec,Vec,void*);
2653a7fca6bSBarry Smith EXTERN int SNESDAComputeJacobianWithAdic(SNES,Vec,Mat*,Mat*,MatStructure*,void*);
2663a7fca6bSBarry Smith EXTERN int SNESDAComputeJacobianWithAdifor(SNES,Vec,Mat*,Mat*,MatStructure*,void*);
2673a7fca6bSBarry Smith EXTERN int SNESDAComputeJacobian(SNES,Vec,Mat*,Mat*,MatStructure*,void*);
2683a7fca6bSBarry Smith 
269b67197daSBarry Smith /* --------- Solving systems of nonlinear equations --------------- */
270ca44d042SBarry Smith EXTERN int SNESSetFunction(SNES,Vec,int(*)(SNES,Vec,Vec,void*),void *);
271ca44d042SBarry Smith EXTERN int SNESComputeFunction(SNES,Vec,Vec);
272ca44d042SBarry Smith EXTERN int SNESSetJacobian(SNES,Mat,Mat,int(*)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *);
2738439883dSBarry Smith EXTERN int SNESGetJacobian(SNES,Mat*,Mat*,void **,int(**)(SNES,Vec,Mat*,Mat*,MatStructure*,void*));
274ca44d042SBarry Smith EXTERN int SNESDefaultComputeJacobian(SNES,Vec,Mat*,Mat*,MatStructure*,void*);
275ca44d042SBarry Smith EXTERN int SNESDefaultComputeJacobianColor(SNES,Vec,Mat*,Mat*,MatStructure*,void*);
27687828ca2SBarry Smith EXTERN int SNESSetLineSearch(SNES,int(*)(SNES,void*,Vec,Vec,Vec,Vec,Vec,PetscReal,PetscReal*,PetscReal*,int*),void*);
27787828ca2SBarry Smith EXTERN int SNESNoLineSearch(SNES,void*,Vec,Vec,Vec,Vec,Vec,PetscReal,PetscReal*,PetscReal*,int*);
27887828ca2SBarry Smith EXTERN int SNESNoLineSearchNoNorms(SNES,void*,Vec,Vec,Vec,Vec,Vec,PetscReal,PetscReal*,PetscReal*,int*);
27987828ca2SBarry Smith EXTERN int SNESCubicLineSearch(SNES,void*,Vec,Vec,Vec,Vec,Vec,PetscReal,PetscReal*,PetscReal*,int*);
28087828ca2SBarry Smith EXTERN int SNESQuadraticLineSearch(SNES,void*,Vec,Vec,Vec,Vec,Vec,PetscReal,PetscReal*,PetscReal*,int*);
281ca44d042SBarry Smith EXTERN int SNESSetLineSearchCheck(SNES,int(*)(SNES,void*,Vec,PetscTruth*),void*);
28287828ca2SBarry Smith EXTERN int SNESSetLineSearchParams(SNES,PetscReal,PetscReal,PetscReal);
28387828ca2SBarry Smith EXTERN int SNESGetLineSearchParams(SNES,PetscReal*,PetscReal*,PetscReal*);
28440191667SLois Curfman McInnes 
285da9b6338SBarry Smith EXTERN int SNESTestLocalMin(SNES snes);
286da9b6338SBarry Smith 
287eef9c623SLois Curfman McInnes /* Should this routine be private? */
288ca44d042SBarry Smith EXTERN int SNESComputeJacobian(SNES,Vec,Mat*,Mat*,MatStructure*);
289ddbbdb52SLois Curfman McInnes 
290ce3d82beSBarry Smith #endif
291b1f5cb9dSBarry Smith 
292