xref: /petsc/include/petscsnes.h (revision 4bf303fab8706fca5c4c2515917737579b84f96a)
1f26ada1bSBarry Smith /*
2eef9c623SLois Curfman McInnes     User interface for the nonlinear solvers package.
3f26ada1bSBarry Smith */
46524c165SJacob Faibussowitsch #ifndef PETSCSNES_H
526bd1501SBarry Smith #define PETSCSNES_H
6ac09b921SBarry Smith 
72c8e378dSBarry Smith #include <petscksp.h>
81e25c274SJed Brown #include <petscdmtypes.h>
97ed8fce4SMatthew G. Knepley #include <petscfvtypes.h>
101e25c274SJed Brown #include <petscdmdatypes.h>
11b1f5cb9dSBarry Smith 
12ac09b921SBarry Smith /* SUBMANSEC = SNES */
13ac09b921SBarry Smith 
14435da068SBarry Smith /*S
1516a05f60SBarry Smith      SNES - Abstract PETSc object that manages nonlinear solves
16435da068SBarry Smith 
17435da068SBarry Smith    Level: beginner
18435da068SBarry Smith 
191cc06b55SBarry Smith .seealso: [](doc_nonlinsolve), [](ch_snes), `SNESCreate()`, `SNESSetType()`, `SNESType`, `TS`, `SNES`, `KSP`, `PC`, `SNESDestroy()`
20435da068SBarry Smith S*/
21f09e8eb9SSatish Balay typedef struct _p_SNES *SNES;
22435da068SBarry Smith 
2376bdecfbSBarry Smith /*J
2416a05f60SBarry Smith     SNESType - String with the name of a PETSc `SNES` method.
25435da068SBarry Smith 
26435da068SBarry Smith    Level: beginner
27435da068SBarry Smith 
281cc06b55SBarry Smith .seealso: [](doc_nonlinsolve), [](ch_snes), `SNESSetType()`, `SNES`, `SNESCreate()`, `SNESDestroy()`, `SNESSetFromOptions()`
2976bdecfbSBarry Smith J*/
3019fd82e9SBarry Smith typedef const char *SNESType;
3104d7464bSBarry Smith #define SNESNEWTONLS         "newtonls"
3204d7464bSBarry Smith #define SNESNEWTONTR         "newtontr"
3341ba4c6cSHeeho Park #define SNESNEWTONTRDC       "newtontrdc"
341d6018f0SLisandro Dalcin #define SNESPYTHON           "python"
35d5c3842bSBarry Smith #define SNESNRICHARDSON      "nrichardson"
36b79b07cfSJed Brown #define SNESKSPONLY          "ksponly"
371ef27442SStefano Zampini #define SNESKSPTRANSPOSEONLY "ksptransposeonly"
38f450aa47SBarry Smith #define SNESVINEWTONRSLS     "vinewtonrsls"
39f450aa47SBarry Smith #define SNESVINEWTONSSLS     "vinewtonssls"
404a0c5b0cSMatthew G Knepley #define SNESNGMRES           "ngmres"
414b11644fSPeter Brune #define SNESQN               "qn"
42c5ae4b9aSBarry Smith #define SNESSHELL            "shell"
43be95d8f1SBarry Smith #define SNESNGS              "ngs"
44fef7b6d8SPeter Brune #define SNESNCG              "ncg"
45421d9b32SPeter Brune #define SNESFAS              "fas"
4637e1895aSJed Brown #define SNESMS               "ms"
47eaedb033SPeter Brune #define SNESNASM             "nasm"
48f31c9d25SPeter Brune #define SNESANDERSON         "anderson"
49d728fb7dSPeter Brune #define SNESASPIN            "aspin"
50eed5f15bSPeter Brune #define SNESCOMPOSITE        "composite"
51561742edSMatthew G. Knepley #define SNESPATCH            "patch"
52d5c3842bSBarry Smith 
53deeb6e72SMatthew Knepley /* Logging support */
54014dd563SJed Brown PETSC_EXTERN PetscClassId SNES_CLASSID;
5522c6f798SBarry Smith PETSC_EXTERN PetscClassId DMSNES_CLASSID;
56deeb6e72SMatthew Knepley 
57607a6623SBarry Smith PETSC_EXTERN PetscErrorCode SNESInitializePackage(void);
58*4bf303faSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode SNESFinalizePackage(void);
59deeb6e72SMatthew Knepley 
60014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESCreate(MPI_Comm, SNES *);
61014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESReset(SNES);
62014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESDestroy(SNES *);
6319fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode SNESSetType(SNES, SNESType);
64014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESMonitor(SNES, PetscInt, PetscReal);
65014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESMonitorSet(SNES, PetscErrorCode (*)(SNES, PetscInt, PetscReal, void *), void *, PetscErrorCode (*)(void **));
66d43b4f6eSBarry Smith PETSC_EXTERN PetscErrorCode SNESMonitorSetFromOptions(SNES, const char[], const char[], const char[], PetscErrorCode (*)(SNES, PetscInt, PetscReal, PetscViewerAndFormat *), PetscErrorCode (*)(SNES, PetscViewerAndFormat *));
67014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESMonitorCancel(SNES);
688a70d858SHong Zhang PETSC_EXTERN PetscErrorCode SNESMonitorSAWs(SNES, PetscInt, PetscReal, void *);
698a70d858SHong Zhang PETSC_EXTERN PetscErrorCode SNESMonitorSAWsCreate(SNES, void **);
708a70d858SHong Zhang PETSC_EXTERN PetscErrorCode SNESMonitorSAWsDestroy(void **);
71014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetConvergenceHistory(SNES, PetscReal[], PetscInt[], PetscInt, PetscBool);
72014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESGetConvergenceHistory(SNES, PetscReal *[], PetscInt *[], PetscInt *);
73014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetUp(SNES);
74014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSolve(SNES, Vec, Vec);
75014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetErrorIfNotConverged(SNES, PetscBool);
76014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESGetErrorIfNotConverged(SNES, PetscBool *);
772d157150SStefano Zampini PETSC_EXTERN PetscErrorCode SNESConverged(SNES, PetscInt, PetscReal, PetscReal, PetscReal);
78e113a28aSBarry Smith 
79fa0ddf94SBarry Smith PETSC_EXTERN PetscErrorCode SNESSetWorkVecs(SNES, PetscInt);
8084cb2905SBarry Smith 
81014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESAddOptionsChecker(PetscErrorCode (*)(SNES));
824d8f6ca9SMatthew Knepley 
83014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetUpdate(SNES, PetscErrorCode (*)(SNES, PetscInt));
844d8f6ca9SMatthew Knepley 
85bdf89e91SBarry Smith PETSC_EXTERN PetscErrorCode SNESRegister(const char[], PetscErrorCode (*)(SNES));
8630de9b25SBarry Smith 
87014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESGetKSP(SNES, KSP *);
88014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetKSP(SNES, KSP);
893cd8a7caSMatthew G. Knepley PETSC_EXTERN PetscErrorCode SNESSetSolution(SNES, Vec);
90014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESGetSolution(SNES, Vec *);
91014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESGetSolutionUpdate(SNES, Vec *);
92014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESGetRhs(SNES, Vec *);
93014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESView(SNES, PetscViewer);
9455849f57SBarry Smith PETSC_EXTERN PetscErrorCode SNESLoad(SNES, PetscViewer);
95c4421ceaSFande Kong PETSC_EXTERN PetscErrorCode SNESConvergedReasonViewSet(SNES, PetscErrorCode (*)(SNES, void *), void *, PetscErrorCode (*)(void **));
96fe2efc57SMark PETSC_EXTERN PetscErrorCode SNESViewFromOptions(SNES, PetscObject, const char[]);
9719a666eeSBarry Smith PETSC_EXTERN PetscErrorCode SNESConvergedReasonView(SNES, PetscViewer);
9819a666eeSBarry Smith PETSC_EXTERN PetscErrorCode SNESConvergedReasonViewFromOptions(SNES);
99c4421ceaSFande Kong PETSC_EXTERN PetscErrorCode SNESConvergedReasonViewCancel(SNES);
10019a666eeSBarry Smith 
101edd03b47SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION(3, 14, 0, "SNESConvergedReasonView()", ) static inline PetscErrorCode SNESReasonView(SNES snes, PetscViewer v)
102d71ae5a4SJacob Faibussowitsch {
1039371c9d4SSatish Balay   return SNESConvergedReasonView(snes, v);
1049371c9d4SSatish Balay }
105edd03b47SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION(3, 14, 0, "SNESConvergedReasonViewFromOptions()", ) static inline PetscErrorCode SNESReasonViewFromOptions(SNES snes)
106d71ae5a4SJacob Faibussowitsch {
1079371c9d4SSatish Balay   return SNESConvergedReasonViewFromOptions(snes);
1089371c9d4SSatish Balay }
10955849f57SBarry Smith 
11055849f57SBarry Smith #define SNES_FILE_CLASSID 1211224
1117bc3d0afSSatish Balay 
112014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetOptionsPrefix(SNES, const char[]);
113014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESAppendOptionsPrefix(SNES, const char[]);
114014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESGetOptionsPrefix(SNES, const char *[]);
115014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetFromOptions(SNES);
11687d6299eSMatthew G. Knepley PETSC_EXTERN PetscErrorCode SNESResetFromOptions(SNES);
11740191667SLois Curfman McInnes 
1183565c898SBarry Smith PETSC_EXTERN PetscErrorCode SNESSetUseMatrixFree(SNES, PetscBool, PetscBool);
1193565c898SBarry Smith PETSC_EXTERN PetscErrorCode SNESGetUseMatrixFree(SNES, PetscBool *, PetscBool *);
120014dd563SJed Brown PETSC_EXTERN PetscErrorCode MatCreateSNESMF(SNES, Mat *);
121bc13fc8dSBarry Smith PETSC_EXTERN PetscErrorCode MatSNESMFGetSNES(Mat, SNES *);
122208be567SBarry Smith PETSC_EXTERN PetscErrorCode MatSNESMFSetReuseBase(Mat, PetscBool);
123208be567SBarry Smith PETSC_EXTERN PetscErrorCode MatSNESMFGetReuseBase(Mat, PetscBool *);
124d1e9a80fSBarry Smith PETSC_EXTERN PetscErrorCode MatMFFDComputeJacobian(SNES, Vec, Mat, Mat, void *);
125f6dfbefdSBarry Smith PETSC_EXTERN PetscErrorCode MatCreateSNESMFMore(SNES, Vec, Mat *);
126f6dfbefdSBarry Smith PETSC_EXTERN PetscErrorCode MatSNESMFMoreSetParameters(Mat, PetscReal, PetscReal, PetscReal);
1278f6e3e37SBarry Smith 
12819fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode SNESGetType(SNES, SNESType *);
129fbcc4530SMatthew G. Knepley PETSC_EXTERN PetscErrorCode SNESMonitorDefaultSetUp(SNES, PetscViewerAndFormat *);
130d43b4f6eSBarry Smith PETSC_EXTERN PetscErrorCode SNESMonitorDefault(SNES, PetscInt, PetscReal, PetscViewerAndFormat *);
1311f60017eSBarry Smith PETSC_EXTERN PetscErrorCode SNESMonitorScaling(SNES, PetscInt, PetscReal, PetscViewerAndFormat *);
132d43b4f6eSBarry Smith PETSC_EXTERN PetscErrorCode SNESMonitorRange(SNES, PetscInt, PetscReal, PetscViewerAndFormat *);
133d43b4f6eSBarry Smith PETSC_EXTERN PetscErrorCode SNESMonitorRatio(SNES, PetscInt, PetscReal, PetscViewerAndFormat *);
134d43b4f6eSBarry Smith PETSC_EXTERN PetscErrorCode SNESMonitorRatioSetUp(SNES, PetscViewerAndFormat *);
135d43b4f6eSBarry Smith PETSC_EXTERN PetscErrorCode SNESMonitorSolution(SNES, PetscInt, PetscReal, PetscViewerAndFormat *);
136d43b4f6eSBarry Smith PETSC_EXTERN PetscErrorCode SNESMonitorResidual(SNES, PetscInt, PetscReal, PetscViewerAndFormat *);
137d43b4f6eSBarry Smith PETSC_EXTERN PetscErrorCode SNESMonitorSolutionUpdate(SNES, PetscInt, PetscReal, PetscViewerAndFormat *);
138d43b4f6eSBarry Smith PETSC_EXTERN PetscErrorCode SNESMonitorDefaultShort(SNES, PetscInt, PetscReal, PetscViewerAndFormat *);
139d43b4f6eSBarry Smith PETSC_EXTERN PetscErrorCode SNESMonitorDefaultField(SNES, PetscInt, PetscReal, PetscViewerAndFormat *);
140d43b4f6eSBarry Smith PETSC_EXTERN PetscErrorCode SNESMonitorJacUpdateSpectrum(SNES, PetscInt, PetscReal, PetscViewerAndFormat *);
141d43b4f6eSBarry Smith PETSC_EXTERN PetscErrorCode SNESMonitorFields(SNES, PetscInt, PetscReal, PetscViewerAndFormat *);
142798534f6SMatthew G. Knepley PETSC_EXTERN PetscErrorCode KSPMonitorSNESResidual(KSP, PetscInt, PetscReal, PetscViewerAndFormat *);
143798534f6SMatthew G. Knepley PETSC_EXTERN PetscErrorCode KSPMonitorSNESResidualDrawLG(KSP, PetscInt, PetscReal, PetscViewerAndFormat *);
144798534f6SMatthew G. Knepley PETSC_EXTERN PetscErrorCode KSPMonitorSNESResidualDrawLGCreate(PetscViewer, PetscViewerFormat, void *, PetscViewerAndFormat **);
145e5f7ee39SBarry Smith 
146014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetTolerances(SNES, PetscReal, PetscReal, PetscReal, PetscInt, PetscInt);
147e4d06f11SPatrick Farrell PETSC_EXTERN PetscErrorCode SNESSetDivergenceTolerance(SNES, PetscReal);
148014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESGetTolerances(SNES, PetscReal *, PetscReal *, PetscReal *, PetscInt *, PetscInt *);
149e4d06f11SPatrick Farrell PETSC_EXTERN PetscErrorCode SNESGetDivergenceTolerance(SNES, PetscReal *);
150014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetTrustRegionTolerance(SNES, PetscReal);
15185216dc7SFande Kong PETSC_EXTERN PetscErrorCode SNESGetForceIteration(SNES, PetscBool *);
152be5caee7SBarry Smith PETSC_EXTERN PetscErrorCode SNESSetForceIteration(SNES, PetscBool);
153014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESGetIterationNumber(SNES, PetscInt *);
154014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetIterationNumber(SNES, PetscInt);
1553d4c4710SBarry Smith 
1564a221d59SStefano Zampini /*E
1574a221d59SStefano Zampini     SNESNewtonTRFallbackType - type of fallback in case the solution of the trust-region subproblem is outside of the radius
1584a221d59SStefano Zampini 
1594a221d59SStefano Zampini    Values:
1604a221d59SStefano Zampini +  `SNES_TR_FALLBACK_NEWTON` - use scaled Newton step
1614a221d59SStefano Zampini .  `SNES_TR_FALLBACK_CAUCHY` - use Cauchy direction
1624a221d59SStefano Zampini -  `SNES_TR_FALLBACK_DOGLEG` - use dogleg method
16316a05f60SBarry Smith 
16416a05f60SBarry Smith    Level: intermediate
16516a05f60SBarry Smith 
1661cc06b55SBarry Smith .seealso: [](ch_snes), `SNES`, `SNESNEWTONTR`, `SNESNEWTONTRDC`
1674a221d59SStefano Zampini E*/
1684a221d59SStefano Zampini typedef enum {
1694a221d59SStefano Zampini   SNES_TR_FALLBACK_NEWTON,
1704a221d59SStefano Zampini   SNES_TR_FALLBACK_CAUCHY,
1714a221d59SStefano Zampini   SNES_TR_FALLBACK_DOGLEG,
1724a221d59SStefano Zampini } SNESNewtonTRFallbackType;
1734a221d59SStefano Zampini 
1744a221d59SStefano Zampini PETSC_EXTERN const char *const SNESNewtonTRFallbackTypes[];
1754a221d59SStefano Zampini 
176c9368356SGlenn Hammond PETSC_EXTERN PetscErrorCode SNESNewtonTRSetPreCheck(SNES, PetscErrorCode (*)(SNES, Vec, Vec, PetscBool *, void *), void *ctx);
177c9368356SGlenn Hammond PETSC_EXTERN PetscErrorCode SNESNewtonTRGetPreCheck(SNES, PetscErrorCode (**)(SNES, Vec, Vec, PetscBool *, void *), void **ctx);
178c9368356SGlenn Hammond PETSC_EXTERN PetscErrorCode SNESNewtonTRSetPostCheck(SNES, PetscErrorCode (*)(SNES, Vec, Vec, Vec, PetscBool *, PetscBool *, void *), void *ctx);
179c9368356SGlenn Hammond PETSC_EXTERN PetscErrorCode SNESNewtonTRGetPostCheck(SNES, PetscErrorCode (**)(SNES, Vec, Vec, Vec, PetscBool *, PetscBool *, void *), void **ctx);
1804a221d59SStefano Zampini PETSC_EXTERN PetscErrorCode SNESNewtonTRSetFallbackType(SNES, SNESNewtonTRFallbackType);
1814a221d59SStefano Zampini PETSC_EXTERN PetscErrorCode SNESNewtonTRPreCheck(SNES, Vec, Vec, PetscBool *);
1824a221d59SStefano Zampini PETSC_EXTERN PetscErrorCode SNESNewtonTRPostCheck(SNES, Vec, Vec, Vec, PetscBool *, PetscBool *);
1837cb011f5SBarry Smith 
1844a221d59SStefano Zampini /* TRDC API, to be removed after 3.19 */
18541ba4c6cSHeeho Park PETSC_EXTERN PetscErrorCode SNESNewtonTRDCGetRhoFlag(SNES, PetscBool *);
18641ba4c6cSHeeho Park PETSC_EXTERN PetscErrorCode SNESNewtonTRDCSetPreCheck(SNES, PetscErrorCode (*)(SNES, Vec, Vec, PetscBool *, void *), void *ctx);
18741ba4c6cSHeeho Park PETSC_EXTERN PetscErrorCode SNESNewtonTRDCGetPreCheck(SNES, PetscErrorCode (**)(SNES, Vec, Vec, PetscBool *, void *), void **ctx);
18841ba4c6cSHeeho Park PETSC_EXTERN PetscErrorCode SNESNewtonTRDCSetPostCheck(SNES, PetscErrorCode (*)(SNES, Vec, Vec, Vec, PetscBool *, PetscBool *, void *), void *ctx);
18941ba4c6cSHeeho Park PETSC_EXTERN PetscErrorCode SNESNewtonTRDCGetPostCheck(SNES, PetscErrorCode (**)(SNES, Vec, Vec, Vec, PetscBool *, PetscBool *, void *), void **ctx);
19041ba4c6cSHeeho Park 
191014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESGetNonlinearStepFailures(SNES, PetscInt *);
192014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetMaxNonlinearStepFailures(SNES, PetscInt);
193014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESGetMaxNonlinearStepFailures(SNES, PetscInt *);
194014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESGetNumberFunctionEvals(SNES, PetscInt *);
195b850b91aSLisandro Dalcin 
196014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetLagPreconditioner(SNES, PetscInt);
197014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESGetLagPreconditioner(SNES, PetscInt *);
198014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetLagJacobian(SNES, PetscInt);
199014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESGetLagJacobian(SNES, PetscInt *);
20037ec4e1aSPeter Brune PETSC_EXTERN PetscErrorCode SNESSetLagPreconditionerPersists(SNES, PetscBool);
20137ec4e1aSPeter Brune PETSC_EXTERN PetscErrorCode SNESSetLagJacobianPersists(SNES, PetscBool);
202014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetGridSequence(SNES, PetscInt);
203fa19ca70SBarry Smith PETSC_EXTERN PetscErrorCode SNESGetGridSequence(SNES, PetscInt *);
204a8054027SBarry Smith 
205014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESGetLinearSolveIterations(SNES, PetscInt *);
206014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESGetLinearSolveFailures(SNES, PetscInt *);
207014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetMaxLinearSolveFailures(SNES, PetscInt);
208014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESGetMaxLinearSolveFailures(SNES, PetscInt *);
209971e163fSPeter Brune PETSC_EXTERN PetscErrorCode SNESSetCountersReset(SNES, PetscBool);
2103d4c4710SBarry Smith 
211014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESKSPSetUseEW(SNES, PetscBool);
212014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESKSPGetUseEW(SNES, PetscBool *);
213014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESKSPSetParametersEW(SNES, PetscInt, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal);
214014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESKSPGetParametersEW(SNES, PetscInt *, PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscReal *);
215eafb4bcbSBarry Smith 
2169804daf3SBarry Smith #include <petscdrawtypes.h>
217014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESMonitorLGRange(SNES, PetscInt, PetscReal, void *);
218eafb4bcbSBarry Smith 
219014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetApplicationContext(SNES, void *);
220014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESGetApplicationContext(SNES, void *);
221014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetComputeApplicationContext(SNES, PetscErrorCode (*)(SNES, void **), PetscErrorCode (*)(void **));
222184914b5SBarry Smith 
223014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESPythonSetType(SNES, const char[]);
224ebead697SStefano Zampini PETSC_EXTERN PetscErrorCode SNESPythonGetType(SNES, const char *[]);
2251d6018f0SLisandro Dalcin 
226014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetFunctionDomainError(SNES);
227014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESGetFunctionDomainError(SNES, PetscBool *);
228cc6b0f04SFande Kong PETSC_EXTERN PetscErrorCode SNESGetJacobianDomainError(SNES, PetscBool *);
229cc6b0f04SFande Kong PETSC_EXTERN PetscErrorCode SNESSetJacobianDomainError(SNES);
230b351a90bSFande Kong PETSC_EXTERN PetscErrorCode SNESSetCheckJacobianDomainError(SNES, PetscBool);
2318383d7d7SFande Kong PETSC_EXTERN PetscErrorCode SNESGetCheckJacobianDomainError(SNES, PetscBool *);
2326a388c36SPeter Brune 
233edd03b47SJacob Faibussowitsch #define SNES_CONVERGED_TR_DELTA_DEPRECATED SNES_CONVERGED_TR_DELTA PETSC_DEPRECATED_ENUM(3, 12, 0, "SNES_DIVERGED_TR_DELTA", )
234435da068SBarry Smith /*E
235dc4c0fb0SBarry Smith     SNESConvergedReason - reason a `SNESSolve()` was determined to have converged or diverged
236435da068SBarry Smith 
237dc4c0fb0SBarry Smith    Values:
238dc4c0fb0SBarry Smith +  `SNES_CONVERGED_FNORM_ABS` - 2-norm(F) <= abstol
239dc4c0fb0SBarry Smith .  `SNES_CONVERGED_FNORM_RELATIVE` - 2-norm(F) <= rtol*2-norm(F(x_0)) where x_0 is the initial guess
240dc4c0fb0SBarry Smith .  `SNES_CONVERGED_SNORM_RELATIVE` - The 2-norm of the last step <= stol * 2-norm(x) where x is the current
241dc4c0fb0SBarry Smith .  `SNES_DIVERGED_FUNCTION_COUNT` - The user provided function has been called more times than the maximum set in `SNESSetTolerances()`
242dc4c0fb0SBarry Smith .  `SNES_DIVERGED_DTOL` - The norm of the function has increased by a factor of divtol set with `SNESSetDivergenceTolerance()`
243dc4c0fb0SBarry Smith .  `SNES_DIVERGED_FNORM_NAN` - the 2-norm of the current function evaluation is not-a-number (NaN), this
244dc4c0fb0SBarry Smith       is usually caused by a division of 0 by 0.
245dc4c0fb0SBarry Smith .  `SNES_DIVERGED_MAX_IT` - `SNESSolve()` has reached the maximum number of iterations requested
246dc4c0fb0SBarry Smith .  `SNES_DIVERGED_LINE_SEARCH` - The line search has failed. This only occurs for `SNES` solvers that use a line search
247dc4c0fb0SBarry Smith .  `SNES_DIVERGED_LOCAL_MIN` - the algorithm seems to have stagnated at a local minimum that is not zero.
248dc4c0fb0SBarry Smith -  `SNES_CONERGED_ITERATING` - this only occurs if `SNESGetConvergedReason()` is called during the `SNESSolve()`
249f203c74bSBarry Smith 
25016a05f60SBarry Smith    Level: beginner
25116a05f60SBarry Smith 
252dc4c0fb0SBarry Smith     Notes:
253dc4c0fb0SBarry Smith    The two most common reasons for divergence are an incorrectly coded or computed Jacobian or failure or lack of convergence in the linear system (in this case we recommend
254dc4c0fb0SBarry Smith    testing with `-pc_type lu` to eliminate the linear solver as the cause of the problem).
255dc4c0fb0SBarry Smith 
256dc4c0fb0SBarry Smith    `SNES_DIVERGED_LOCAL_MIN` can only occur when using the line-search variant of `SNES`.
257f203c74bSBarry Smith        The line search wants to minimize Q(alpha) = 1/2 || F(x + alpha s) ||^2_2  this occurs
258f203c74bSBarry Smith        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
259f203c74bSBarry Smith        you get Q'(alpha) = -F(x)^T F'(x)^(-1)^T F'(x+alpha s)F(x+alpha s); when alpha = 0
260f203c74bSBarry Smith        Q'(0) = - ||F(x)||^2_2 which is always NEGATIVE if F'(x) is invertible. This means the Newton
261f203c74bSBarry Smith        direction is a descent direction and the line search should succeed if alpha is small enough.
262f203c74bSBarry Smith 
263f203c74bSBarry Smith        If F'(x) is NOT invertible AND F'(x)^T F(x) = 0 then Q'(0) = 0 and the Newton direction
264f203c74bSBarry Smith        is NOT a descent direction so the line search will fail. All one can do at this point
265f203c74bSBarry Smith        is change the initial guess and try again.
266f203c74bSBarry Smith 
267f203c74bSBarry Smith        An alternative explanation: Newton's method can be regarded as replacing the function with
268f203c74bSBarry Smith        its linear approximation and minimizing the 2-norm of that. That is F(x+s) approx F(x) + F'(x)s
269f203c74bSBarry Smith        so we minimize || F(x) + F'(x) s ||^2_2; do this using Least Squares. If F'(x) is invertible then
270f203c74bSBarry Smith        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
2716aad120cSJose E. Roman        exists a nontrivial (that is F'(x)s != 0) solution to the equation and this direction is
272f203c74bSBarry Smith        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)
273f203c74bSBarry Smith        = - (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
274f203c74bSBarry Smith        and F'(x)^T F'(x) has no negative eigenvalues Q'(0) < 0 so s is a descent direction and the line
275f203c74bSBarry Smith        search should succeed for small enough alpha.
276f203c74bSBarry Smith 
277f203c74bSBarry Smith        Note that this RARELY happens in practice. Far more likely the linear system is not being solved
278f203c74bSBarry Smith        (well enough?) or the Jacobian is wrong.
279f203c74bSBarry Smith 
28087497f52SBarry Smith    `SNES_DIVERGED_MAX_IT` means that the solver reached the maximum number of iterations without satisfying any
28187497f52SBarry Smith    convergence criteria. `SNES_CONVERGED_ITS` means that `SNESConvergedSkip()` was chosen as the convergence test;
2824d0a8057SBarry Smith    thus the usual convergence criteria have not been checked and may or may not be satisfied.
283f203c74bSBarry Smith 
2841cc06b55SBarry Smith .seealso: [](ch_snes), `SNES`, `SNESSolve()`, `SNESGetConvergedReason()`, `KSPConvergedReason`, `SNESSetConvergenceTest()`, `SNESSetTolerances()`
285435da068SBarry Smith E*/
286184914b5SBarry Smith typedef enum {                       /* converged */
28701b82886SBarry Smith   SNES_CONVERGED_FNORM_ABS      = 2, /* ||F|| < atol */
28801b82886SBarry Smith   SNES_CONVERGED_FNORM_RELATIVE = 3, /* ||F|| < rtol*||F_initial|| */
2895358d0d4SBarry Smith   SNES_CONVERGED_SNORM_RELATIVE = 4, /* Newton computed step size small; || delta x || < stol || x ||*/
2903f149594SLisandro Dalcin   SNES_CONVERGED_ITS            = 5, /* maximum iterations reached */
29141ba4c6cSHeeho Park   SNES_BREAKOUT_INNER_ITER      = 6, /* Flag to break out of inner loop after checking custom convergence. */
29241ba4c6cSHeeho Park                                      /* it is used in multi-phase flow when state changes */
293184914b5SBarry Smith   /* diverged */
29446a9e3ceSBarry Smith   SNES_DIVERGED_FUNCTION_DOMAIN      = -1, /* the new x location passed the function is not in the domain of F */
295184914b5SBarry Smith   SNES_DIVERGED_FUNCTION_COUNT       = -2,
29646a9e3ceSBarry Smith   SNES_DIVERGED_LINEAR_SOLVE         = -3, /* the linear solve failed */
297184914b5SBarry Smith   SNES_DIVERGED_FNORM_NAN            = -4,
298184914b5SBarry Smith   SNES_DIVERGED_MAX_IT               = -5,
299647a2e1fSBarry Smith   SNES_DIVERGED_LINE_SEARCH          = -6,  /* the line search failed */
3001e633543SBarry Smith   SNES_DIVERGED_INNER                = -7,  /* inner solve failed */
30158c775ebSBarry Smith   SNES_DIVERGED_LOCAL_MIN            = -8,  /* || J^T b || is small, implies converged to local minimum of F() */
302e37c518bSBarry Smith   SNES_DIVERGED_DTOL                 = -9,  /* || F || > divtol*||F_initial|| */
30307b62357SFande Kong   SNES_DIVERGED_JACOBIAN_DOMAIN      = -10, /* Jacobian calculation does not make sense */
3041c6b2ff8SBarry Smith   SNES_DIVERGED_TR_DELTA             = -11,
305c78072a7SPatrick Sanan   SNES_CONVERGED_TR_DELTA_DEPRECATED = -11,
306e37c518bSBarry Smith 
3079371c9d4SSatish Balay   SNES_CONVERGED_ITERATING = 0
3089371c9d4SSatish Balay } SNESConvergedReason;
309014dd563SJed Brown PETSC_EXTERN const char *const *SNESConvergedReasons;
310184914b5SBarry Smith 
311c838673bSBarry Smith /*MC
312c838673bSBarry Smith      SNES_CONVERGED_FNORM_ABS - 2-norm(F) <= abstol
313c838673bSBarry Smith 
314c838673bSBarry Smith    Level: beginner
315c838673bSBarry Smith 
3161cc06b55SBarry Smith .seealso: [](ch_snes), `SNES`, `SNESSolve()`, `SNESGetConvergedReason()`, `SNESConvergedReason`, `SNESSetTolerances()`
317c838673bSBarry Smith M*/
318c838673bSBarry Smith 
319c838673bSBarry Smith /*MC
320c838673bSBarry Smith      SNES_CONVERGED_FNORM_RELATIVE - 2-norm(F) <= rtol*2-norm(F(x_0)) where x_0 is the initial guess
321c838673bSBarry Smith 
322c838673bSBarry Smith    Level: beginner
323c838673bSBarry Smith 
3241cc06b55SBarry Smith .seealso: [](ch_snes), `SNES`, `SNESSolve()`, `SNESGetConvergedReason()`, `SNESConvergedReason`, `SNESSetTolerances()`
325c838673bSBarry Smith M*/
326c838673bSBarry Smith 
327c838673bSBarry Smith /*MC
328c60f73f4SPeter Brune      SNES_CONVERGED_SNORM_RELATIVE - The 2-norm of the last step <= stol * 2-norm(x) where x is the current
32987497f52SBarry Smith           solution and stol is the 4th argument to `SNESSetTolerances()`
330c838673bSBarry Smith 
331ae9be289SBarry Smith      Options Database Keys:
332ae9be289SBarry Smith       -snes_stol <stol> - the step tolerance
333ae9be289SBarry Smith 
334c838673bSBarry Smith    Level: beginner
335c838673bSBarry Smith 
3361cc06b55SBarry Smith .seealso: [](ch_snes), `SNES`, `SNESSolve()`, `SNESGetConvergedReason()`, `SNESConvergedReason`, `SNESSetTolerances()`
337c838673bSBarry Smith M*/
338c838673bSBarry Smith 
339c838673bSBarry Smith /*MC
340c838673bSBarry Smith      SNES_DIVERGED_FUNCTION_COUNT - The user provided function has been called more times then the final
34187497f52SBarry Smith          argument to `SNESSetTolerances()`
342c838673bSBarry Smith 
343c838673bSBarry Smith    Level: beginner
344c838673bSBarry Smith 
3451cc06b55SBarry Smith .seealso: [](ch_snes), `SNES`, `SNESSolve()`, `SNESGetConvergedReason()`, `SNESConvergedReason`, `SNESSetTolerances()`
346c838673bSBarry Smith M*/
347c838673bSBarry Smith 
348c838673bSBarry Smith /*MC
34987497f52SBarry Smith      SNES_DIVERGED_DTOL - The norm of the function has increased by a factor of divtol set with `SNESSetDivergenceTolerance()`
350e37c518bSBarry Smith 
351e37c518bSBarry Smith    Level: beginner
352e37c518bSBarry Smith 
3531cc06b55SBarry Smith .seealso: [](ch_snes), `SNES`, `SNESSolve()`, `SNESGetConvergedReason()`, `SNESConvergedReason`, `SNESSetTolerances()`, `SNESSetDivergenceTolerance()`
354e37c518bSBarry Smith M*/
355e37c518bSBarry Smith 
356e37c518bSBarry Smith /*MC
357c838673bSBarry Smith      SNES_DIVERGED_FNORM_NAN - the 2-norm of the current function evaluation is not-a-number (NaN), this
358c838673bSBarry Smith       is usually caused by a division of 0 by 0.
359c838673bSBarry Smith 
360c838673bSBarry Smith    Level: beginner
361c838673bSBarry Smith 
3621cc06b55SBarry Smith .seealso: [](ch_snes), `SNES`, `SNESSolve()`, `SNESGetConvergedReason()`, `SNESConvergedReason`, `SNESSetTolerances()`
363c838673bSBarry Smith M*/
364c838673bSBarry Smith 
365c838673bSBarry Smith /*MC
366c838673bSBarry Smith      SNES_DIVERGED_MAX_IT - SNESSolve() has reached the maximum number of iterations requested
367c838673bSBarry Smith 
368c838673bSBarry Smith    Level: beginner
369c838673bSBarry Smith 
3701cc06b55SBarry Smith .seealso: [](ch_snes), `SNES`, `SNESSolve()`, `SNESGetConvergedReason()`, `SNESConvergedReason`, `SNESSetTolerances()`
371c838673bSBarry Smith M*/
372c838673bSBarry Smith 
373c838673bSBarry Smith /*MC
37487497f52SBarry Smith      SNES_DIVERGED_LINE_SEARCH - The line search has failed. This only occurs for a `SNES` solvers that use a line search
375c838673bSBarry Smith 
376c838673bSBarry Smith    Level: beginner
377c838673bSBarry Smith 
3781cc06b55SBarry Smith .seealso: [](ch_snes), `SNES`, `SNESSolve()`, `SNESGetConvergedReason()`, `SNESConvergedReason`, `SNESSetTolerances()`, `SNESLineSearch`
379c838673bSBarry Smith M*/
380c838673bSBarry Smith 
381c838673bSBarry Smith /*MC
38246a9e3ceSBarry Smith      SNES_DIVERGED_LOCAL_MIN - the algorithm seems to have stagnated at a local minimum that is not zero.
38387497f52SBarry Smith         See the manual page for `SNESConvergedReason` for more details
384c838673bSBarry Smith 
385c838673bSBarry Smith    Level: beginner
386c838673bSBarry Smith 
3871cc06b55SBarry Smith .seealso: [](ch_snes), `SNES`, `SNESSolve()`, `SNESGetConvergedReason()`, `SNESConvergedReason`, `SNESSetTolerances()`
388c838673bSBarry Smith M*/
389c838673bSBarry Smith 
390c838673bSBarry Smith /*MC
39187497f52SBarry Smith      SNES_CONERGED_ITERATING - this only occurs if `SNESGetConvergedReason()` is called during the `SNESSolve()`
392c838673bSBarry Smith 
393c838673bSBarry Smith    Level: beginner
394c838673bSBarry Smith 
3951cc06b55SBarry Smith .seealso: [](ch_snes), `SNES`, `SNESSolve()`, `SNESGetConvergedReason()`, `SNESConvergedReason`, `SNESSetTolerances()`
396c838673bSBarry Smith M*/
397c838673bSBarry Smith 
398014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetConvergenceTest(SNES, PetscErrorCode (*)(SNES, PetscInt, PetscReal, PetscReal, PetscReal, SNESConvergedReason *, void *), void *, PetscErrorCode (*)(void *));
3998d359177SBarry Smith PETSC_EXTERN PetscErrorCode SNESConvergedDefault(SNES, PetscInt, PetscReal, PetscReal, PetscReal, SNESConvergedReason *, void *);
400e2a6519dSDmitry Karpeev PETSC_EXTERN PetscErrorCode SNESConvergedSkip(SNES, PetscInt, PetscReal, PetscReal, PetscReal, SNESConvergedReason *, void *);
401649ef022SMatthew Knepley PETSC_EXTERN PetscErrorCode SNESConvergedCorrectPressure(SNES, PetscInt, PetscReal, PetscReal, PetscReal, SNESConvergedReason *, void *);
402014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESGetConvergedReason(SNES, SNESConvergedReason *);
403c4421ceaSFande Kong PETSC_EXTERN PetscErrorCode SNESGetConvergedReasonString(SNES, const char **);
40433866048SMatthew G. Knepley PETSC_EXTERN PetscErrorCode SNESSetConvergedReason(SNES, SNESConvergedReason);
405ddbbdb52SLois Curfman McInnes 
406edd03b47SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION(3, 5, 0, "SNESConvergedSkip()", ) static inline void SNESSkipConverged(void)
407d71ae5a4SJacob Faibussowitsch { /* never called */
4089371c9d4SSatish Balay }
4098ea1b3e6SJed Brown #define SNESSkipConverged (SNESSkipConverged, SNESConvergedSkip)
41011f088b5SMatthew G Knepley 
411b67197daSBarry Smith /* --------- Solving systems of nonlinear equations --------------- */
412f8b49ee9SBarry Smith PETSC_EXTERN PetscErrorCode SNESSetFunction(SNES, Vec, PetscErrorCode (*)(SNES, Vec, Vec, void *), void *);
413f8b49ee9SBarry Smith PETSC_EXTERN PetscErrorCode SNESGetFunction(SNES, Vec *, PetscErrorCode (**)(SNES, Vec, Vec, void *), void **);
414014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESComputeFunction(SNES, Vec, Vec);
415bbc1464cSBarry Smith PETSC_EXTERN PetscErrorCode SNESComputeMFFunction(SNES, Vec, Vec);
41625acbd8eSLisandro Dalcin PETSC_EXTERN PetscErrorCode SNESSetInitialFunction(SNES, Vec);
41732f3f7c2SPeter Brune 
418d1e9a80fSBarry Smith PETSC_EXTERN PetscErrorCode SNESSetJacobian(SNES, Mat, Mat, PetscErrorCode (*)(SNES, Vec, Mat, Mat, void *), void *);
419d1e9a80fSBarry Smith PETSC_EXTERN PetscErrorCode SNESGetJacobian(SNES, Mat *, Mat *, PetscErrorCode (**)(SNES, Vec, Mat, Mat, void *), void **);
4208d359177SBarry Smith PETSC_EXTERN PetscErrorCode SNESObjectiveComputeFunctionDefaultFD(SNES, Vec, Vec, void *);
421d1e9a80fSBarry Smith PETSC_EXTERN PetscErrorCode SNESComputeJacobianDefault(SNES, Vec, Mat, Mat, void *);
422d1e9a80fSBarry Smith PETSC_EXTERN PetscErrorCode SNESComputeJacobianDefaultColor(SNES, Vec, Mat, Mat, void *);
42378e7fe0eSHong Zhang PETSC_EXTERN PetscErrorCode SNESPruneJacobianColor(SNES, Mat, Mat);
424014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetComputeInitialGuess(SNES, PetscErrorCode (*)(SNES, Vec, void *), void *);
425d1e9a80fSBarry Smith PETSC_EXTERN PetscErrorCode SNESSetPicard(SNES, Vec, PetscErrorCode (*)(SNES, Vec, Vec, void *), Mat, Mat, PetscErrorCode (*)(SNES, Vec, Mat, Mat, void *), void *);
426d1e9a80fSBarry Smith PETSC_EXTERN PetscErrorCode SNESGetPicard(SNES, Vec *, PetscErrorCode (**)(SNES, Vec, Vec, void *), Mat *, Mat *, PetscErrorCode (**)(SNES, Vec, Mat, Mat, void *), void **);
42725acbd8eSLisandro Dalcin PETSC_EXTERN PetscErrorCode SNESPicardComputeFunction(SNES, Vec, Vec, void *);
428bbc1464cSBarry Smith PETSC_EXTERN PetscErrorCode SNESPicardComputeMFFunction(SNES, Vec, Vec, void *);
42925acbd8eSLisandro Dalcin PETSC_EXTERN PetscErrorCode SNESPicardComputeJacobian(SNES, Vec, Mat, Mat, void *);
43017bae607SBarry Smith 
431f8b49ee9SBarry Smith PETSC_EXTERN PetscErrorCode SNESSetObjective(SNES, PetscErrorCode (*)(SNES, Vec, PetscReal *, void *), void *);
432f8b49ee9SBarry Smith PETSC_EXTERN PetscErrorCode SNESGetObjective(SNES, PetscErrorCode (**)(SNES, Vec, PetscReal *, void *), void **);
4332a4ee8f2SPeter Brune PETSC_EXTERN PetscErrorCode SNESComputeObjective(SNES, Vec, PetscReal *);
4342a4ee8f2SPeter Brune 
435534ebe21SPeter Brune /*E
43616a05f60SBarry Smith     SNESNormSchedule - Frequency with which the norm is computed during a nonliner solve
437534ebe21SPeter Brune 
438dc4c0fb0SBarry Smith    Values:
439dc4c0fb0SBarry Smith +   `SNES_NORM_DEFAULT` - use the default behavior for the current `SNESType`
440dc4c0fb0SBarry Smith .   `SNES_NORM_NONE` - avoid all norm computations
441dc4c0fb0SBarry Smith .   `SNES_NORM_ALWAYS` - compute the norms whenever possible
442dc4c0fb0SBarry Smith .   `SNES_NORM_INITIAL_ONLY` - compute the norm only when the algorithm starts
443dc4c0fb0SBarry Smith .   `SNES_NORM_FINAL_ONLY` - compute the norm only when the algorithm finishes
444dc4c0fb0SBarry Smith -   `SNES_NORM_INITIAL_FINAL_ONLY` - compute the norm at the start and end of the algorithm
445534ebe21SPeter Brune 
44616a05f60SBarry Smith    Level: advanced
44716a05f60SBarry Smith 
448534ebe21SPeter Brune    Notes:
449dc4c0fb0SBarry Smith    Support for these is highly dependent on the solver.
450dc4c0fb0SBarry Smith 
451dc4c0fb0SBarry Smith    Some options limit the convergence tests that can be used.
452dc4c0fb0SBarry Smith 
453dc4c0fb0SBarry Smith    The `SNES_NORM_NONE` option is most commonly used when the nonlinear solver is being used as a smoother, for example for `SNESFAS`
454dc4c0fb0SBarry Smith 
455534ebe21SPeter Brune    This is primarily used to turn off extra norm and function computation
456534ebe21SPeter Brune    when the solvers are composed.
457534ebe21SPeter Brune 
4581cc06b55SBarry Smith .seealso: [](ch_snes), `SNES`, `SNESSolve()`, `SNESGetConvergedReason()`, `KSPSetNormType()`,
459db781477SPatrick Sanan           `KSPSetConvergenceTest()`, `KSPSetPCSide()`
460534ebe21SPeter Brune E*/
4619371c9d4SSatish Balay typedef enum {
4629371c9d4SSatish Balay   SNES_NORM_DEFAULT            = -1,
463fdacfa88SPeter Brune   SNES_NORM_NONE               = 0,
464365a6726SPeter Brune   SNES_NORM_ALWAYS             = 1,
465fdacfa88SPeter Brune   SNES_NORM_INITIAL_ONLY       = 2,
466fdacfa88SPeter Brune   SNES_NORM_FINAL_ONLY         = 3,
4679371c9d4SSatish Balay   SNES_NORM_INITIAL_FINAL_ONLY = 4
4689371c9d4SSatish Balay } SNESNormSchedule;
469365a6726SPeter Brune PETSC_EXTERN const char *const *const SNESNormSchedules;
4701957e957SBarry Smith 
471534ebe21SPeter Brune /*MC
47216a05f60SBarry Smith     SNES_NORM_NONE - Don't compute function and its L2 norm when possible
473534ebe21SPeter Brune 
474534ebe21SPeter Brune    Level: advanced
475534ebe21SPeter Brune 
476dc4c0fb0SBarry Smith     Note:
477534ebe21SPeter Brune     This is most useful for stationary solvers with a fixed number of iterations used as smoothers.
478534ebe21SPeter Brune 
4791cc06b55SBarry Smith .seealso: [](ch_snes), `SNESNormSchedule`, `SNES`, `SNESSetNormSchedule()`, `SNES_NORM_DEFAULT`
480534ebe21SPeter Brune M*/
481534ebe21SPeter Brune 
482fdacfa88SPeter Brune /*MC
483365a6726SPeter Brune     SNES_NORM_ALWAYS - Compute the function and its L2 norm at each iteration.
484534ebe21SPeter Brune 
485fdacfa88SPeter Brune    Level: advanced
486fdacfa88SPeter Brune 
487dc4c0fb0SBarry Smith     Note:
488fdacfa88SPeter Brune     Most solvers will use this no matter what norm type is passed to them.
489fdacfa88SPeter Brune 
4901cc06b55SBarry Smith .seealso: [](ch_snes), `SNESNormSchedule`, `SNES`, `SNESSetNormSchedule()`, `SNES_NORM_NONE`
491fdacfa88SPeter Brune M*/
492534ebe21SPeter Brune 
493534ebe21SPeter Brune /*MC
494534ebe21SPeter Brune     SNES_NORM_INITIAL_ONLY - Compute the function and its L2 at iteration 0, but do not update it.
495534ebe21SPeter Brune 
496534ebe21SPeter Brune    Level: advanced
497534ebe21SPeter Brune 
498534ebe21SPeter Brune    Notes:
499dc4c0fb0SBarry Smith    This method is useful in composed methods, when a true solution might actually be found before `SNESSolve()` is called.
500534ebe21SPeter Brune    This option enables the solve to abort on the zeroth iteration if this is the case.
501534ebe21SPeter Brune 
502534ebe21SPeter Brune    For solvers that require the computation of the L2 norm of the function as part of the method, this merely cancels
503534ebe21SPeter Brune    the norm computation at the last iteration (if possible).
504534ebe21SPeter Brune 
5051cc06b55SBarry Smith .seealso: [](ch_snes), `SNESNormSchedule`, `SNES`, `SNESSetNormSchedule()`, `SNES_NORM_FINAL_ONLY`, `SNES_NORM_INITIAL_FINAL_ONLY`
506534ebe21SPeter Brune M*/
507534ebe21SPeter Brune 
508534ebe21SPeter Brune /*MC
509534ebe21SPeter Brune     SNES_NORM_FINAL_ONLY - Compute the function and its L2 norm on only the final iteration.
510534ebe21SPeter Brune 
511534ebe21SPeter Brune    Level: advanced
512534ebe21SPeter Brune 
513dc4c0fb0SBarry Smith    Note:
514534ebe21SPeter Brune    For solvers that require the computation of the L2 norm of the function as part of the method, behaves
51587497f52SBarry Smith    exactly as `SNES_NORM_DEFAULT`.  This method is useful when the function is gotten after `SNESSolve()` and
516534ebe21SPeter Brune    used in subsequent computation for methods that do not need the norm computed during the rest of the
517534ebe21SPeter Brune    solution procedure.
518534ebe21SPeter Brune 
5191cc06b55SBarry Smith .seealso: [](ch_snes), `SNESNormSchedule`, `SNES`, `SNESSetNormSchedule()`, `SNES_NORM_INITIAL_ONLY`, `SNES_NORM_INITIAL_FINAL_ONLY`
520534ebe21SPeter Brune M*/
521534ebe21SPeter Brune 
522534ebe21SPeter Brune /*MC
523534ebe21SPeter Brune     SNES_NORM_INITIAL_FINAL_ONLY - Compute the function and its L2 norm on only the initial and final iterations.
524534ebe21SPeter Brune 
525534ebe21SPeter Brune    Level: advanced
526534ebe21SPeter Brune 
527dc4c0fb0SBarry Smith    Note:
52887497f52SBarry Smith    This method combines the benefits of `SNES_NORM_INITIAL_ONLY` and `SNES_NORM_FINAL_ONLY`.
529534ebe21SPeter Brune 
5301cc06b55SBarry Smith .seealso: [](ch_snes), `SNESNormSchedule`, `SNES`, `SNESSetNormSchedule()`, `SNES_NORM_SNES_NORM_INITIAL_ONLY`, `SNES_NORM_FINAL_ONLY`
531534ebe21SPeter Brune M*/
532534ebe21SPeter Brune 
533365a6726SPeter Brune PETSC_EXTERN PetscErrorCode SNESSetNormSchedule(SNES, SNESNormSchedule);
534365a6726SPeter Brune PETSC_EXTERN PetscErrorCode SNESGetNormSchedule(SNES, SNESNormSchedule *);
535c5ce4427SMatthew G. Knepley PETSC_EXTERN PetscErrorCode SNESSetFunctionNorm(SNES, PetscReal);
536c5ce4427SMatthew G. Knepley PETSC_EXTERN PetscErrorCode SNESGetFunctionNorm(SNES, PetscReal *);
537c1e67a49SFande Kong PETSC_EXTERN PetscErrorCode SNESGetUpdateNorm(SNES, PetscReal *);
538c1e67a49SFande Kong PETSC_EXTERN PetscErrorCode SNESGetSolutionNorm(SNES, PetscReal *);
539534ebe21SPeter Brune 
54047073ea2SPeter Brune /*E
54147073ea2SPeter Brune     SNESFunctionType - Type of function computed
54247073ea2SPeter Brune 
543dc4c0fb0SBarry Smith    Values:
544dc4c0fb0SBarry Smith +  `SNES_FUNCTION_DEFAULT` - the default behavior for the current `SNESType`
545dc4c0fb0SBarry Smith .  `SNES_FUNCTION_UNPRECONDITIONED` - the original function provided
546dc4c0fb0SBarry Smith -  `SNES_FUNCTION_PRECONDITIONED` - the modification of the function by the preconditioner
54747073ea2SPeter Brune 
54816a05f60SBarry Smith    Level: advanced
54916a05f60SBarry Smith 
550dc4c0fb0SBarry Smith    Note:
551dc4c0fb0SBarry Smith    Support for these is dependent on the solver.
552dc4c0fb0SBarry Smith 
5531cc06b55SBarry Smith .seealso: [](ch_snes), `SNES`, `SNESSolve()`, `SNESGetConvergedReason()`, `KSPSetNormType()`,
554db781477SPatrick Sanan           `KSPSetConvergenceTest()`, `KSPSetPCSide()`
55547073ea2SPeter Brune E*/
5569371c9d4SSatish Balay typedef enum {
5579371c9d4SSatish Balay   SNES_FUNCTION_DEFAULT          = -1,
55847073ea2SPeter Brune   SNES_FUNCTION_UNPRECONDITIONED = 0,
5599371c9d4SSatish Balay   SNES_FUNCTION_PRECONDITIONED   = 1
5609371c9d4SSatish Balay } SNESFunctionType;
56147073ea2SPeter Brune PETSC_EXTERN const char *const *const SNESFunctionTypes;
56247073ea2SPeter Brune 
56347073ea2SPeter Brune PETSC_EXTERN PetscErrorCode SNESSetFunctionType(SNES, SNESFunctionType);
56447073ea2SPeter Brune PETSC_EXTERN PetscErrorCode SNESGetFunctionType(SNES, SNESFunctionType *);
565f1c6b773SPeter Brune 
566be95d8f1SBarry Smith PETSC_EXTERN PetscErrorCode SNESSetNGS(SNES, PetscErrorCode (*)(SNES, Vec, Vec, void *), void *);
567be95d8f1SBarry Smith PETSC_EXTERN PetscErrorCode SNESGetNGS(SNES, PetscErrorCode (**)(SNES, Vec, Vec, void *), void **);
568be95d8f1SBarry Smith PETSC_EXTERN PetscErrorCode SNESComputeNGS(SNES, Vec, Vec);
569b6266c6eSPeter Brune 
570be95d8f1SBarry Smith PETSC_EXTERN PetscErrorCode SNESNGSSetSweeps(SNES, PetscInt);
571be95d8f1SBarry Smith PETSC_EXTERN PetscErrorCode SNESNGSGetSweeps(SNES, PetscInt *);
572be95d8f1SBarry Smith PETSC_EXTERN PetscErrorCode SNESNGSSetTolerances(SNES, PetscReal, PetscReal, PetscReal, PetscInt);
573be95d8f1SBarry Smith PETSC_EXTERN PetscErrorCode SNESNGSGetTolerances(SNES, PetscReal *, PetscReal *, PetscReal *, PetscInt *);
574badc63e7SPeter Brune 
5754fc747eaSLawrence Mitchell PETSC_EXTERN PetscErrorCode SNESSetAlwaysComputesFinalResidual(SNES, PetscBool);
5764fc747eaSLawrence Mitchell PETSC_EXTERN PetscErrorCode SNESGetAlwaysComputesFinalResidual(SNES, PetscBool *);
5774fc747eaSLawrence Mitchell 
5783ec1f749SStefano Zampini PETSC_EXTERN PetscErrorCode SNESShellGetContext(SNES, void *);
579014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESShellSetContext(SNES, void *);
580014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESShellSetSolve(SNES, PetscErrorCode (*)(SNES, Vec));
581646217ecSPeter Brune 
582c5ae4b9aSBarry Smith /* --------- Routines specifically for line search methods --------------- */
583c5ae4b9aSBarry Smith 
584872b6db9SPeter Brune /*S
58587497f52SBarry Smith      SNESLineSearch - Abstract PETSc object that manages line-search operations for nonlinear solvers
5869e764e56SPeter Brune 
5879e764e56SPeter Brune    Level: beginner
5889e764e56SPeter Brune 
5891cc06b55SBarry Smith .seealso: [](ch_snes), `SNESLineSearchType`, `SNESLineSearchCreate()`, `SNESLineSearchSetType()`, `SNES`
5909e764e56SPeter Brune S*/
591907376e6SBarry Smith typedef struct _p_LineSearch *SNESLineSearch;
5929e764e56SPeter Brune 
5939e764e56SPeter Brune /*J
594dc4c0fb0SBarry Smith     SNESLineSearchType - String with the name of a PETSc line search method `SNESLineSearch`
5959e764e56SPeter Brune 
5969e764e56SPeter Brune    Level: beginner
5979e764e56SPeter Brune 
598ceaaa498SBarry Smith    Values:
599ceaaa498SBarry Smith +  `SNESLINESEARCHBASIC` - (or equivalently `SNESLINESEARCHNONE`) Simple damping line search, defaults to using the full Newton step
600ceaaa498SBarry Smith .  `SNESLINESEARCHBT` - Backtracking line search over the L2 norm of the function
601ceaaa498SBarry Smith .  `SNESLINESEARCHL2` - Secant line search over the L2 norm of the function
602ceaaa498SBarry Smith .  `SNESLINESEARCHCP` - Critical point secant line search assuming F(x) = grad G(x) for some unknown G(x)
603ceaaa498SBarry Smith .  `SNESLINESEARCHNLEQERR` - Affine-covariant error-oriented linesearch
604ceaaa498SBarry Smith -  `SNESLINESEARCHSHELL` - User provided `SNESLineSearch` implementation
605ceaaa498SBarry Smith 
6061cc06b55SBarry Smith .seealso: [](ch_snes), `SNESLineSearch`, `SNESLineSearchSetType()`, `SNES`
6079e764e56SPeter Brune J*/
60819fd82e9SBarry Smith typedef const char *SNESLineSearchType;
6099e764e56SPeter Brune #define SNESLINESEARCHBT        "bt"
610d4c6564cSPatrick Farrell #define SNESLINESEARCHNLEQERR   "nleqerr"
611c87759e9SPeter Brune #define SNESLINESEARCHBASIC     "basic"
6120b00b554SBarry Smith #define SNESLINESEARCHNONE      "none"
6139e764e56SPeter Brune #define SNESLINESEARCHL2        "l2"
6149e764e56SPeter Brune #define SNESLINESEARCHCP        "cp"
6159e764e56SPeter Brune #define SNESLINESEARCHSHELL     "shell"
616b5badacbSBarry Smith #define SNESLINESEARCHNCGLINEAR "ncglinear"
6179e764e56SPeter Brune 
618140e18c1SBarry Smith PETSC_EXTERN PetscFunctionList SNESList;
619014dd563SJed Brown PETSC_EXTERN PetscClassId      SNESLINESEARCH_CLASSID;
620140e18c1SBarry Smith PETSC_EXTERN PetscFunctionList SNESLineSearchList;
6219e764e56SPeter Brune 
622b000cd8dSPeter Brune #define SNES_LINESEARCH_ORDER_LINEAR    1
623b000cd8dSPeter Brune #define SNES_LINESEARCH_ORDER_QUADRATIC 2
624b000cd8dSPeter Brune #define SNES_LINESEARCH_ORDER_CUBIC     3
6259e764e56SPeter Brune 
626638cfed1SJed Brown PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*SNESLineSearchVIProjectFunc)(SNES, Vec);
627638cfed1SJed Brown PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*SNESLineSearchVINormFunc)(SNES, Vec, Vec, PetscReal *);
628638cfed1SJed Brown PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*SNESLineSearchApplyFunc)(SNESLineSearch);
629638cfed1SJed Brown PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*SNESLineSearchUserFunc)(SNESLineSearch, void *);
6309e764e56SPeter Brune 
631014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchCreate(MPI_Comm, SNESLineSearch *);
632014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchReset(SNESLineSearch);
633014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchView(SNESLineSearch, PetscViewer);
634014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchDestroy(SNESLineSearch *);
635a80ff896SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchGetType(SNESLineSearch, SNESLineSearchType *);
63619fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode SNESLineSearchSetType(SNESLineSearch, SNESLineSearchType);
637014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchSetFromOptions(SNESLineSearch);
638ed07d7d7SPeter Brune PETSC_EXTERN PetscErrorCode SNESLineSearchSetFunction(SNESLineSearch, PetscErrorCode (*)(SNES, Vec, Vec));
639014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchSetUp(SNESLineSearch);
640014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchApply(SNESLineSearch, Vec, Vec, PetscReal *, Vec);
641014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchPreCheck(SNESLineSearch, Vec, Vec, PetscBool *);
642014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchPostCheck(SNESLineSearch, Vec, Vec, Vec, PetscBool *, PetscBool *);
643fa0ddf94SBarry Smith PETSC_EXTERN PetscErrorCode SNESLineSearchSetWorkVecs(SNESLineSearch, PetscInt);
6449e764e56SPeter Brune 
6459bd66eb0SPeter Brune /* set the functions for precheck and postcheck */
64686d74e61SPeter Brune 
647f190f2fcSBarry Smith PETSC_EXTERN PetscErrorCode SNESLineSearchSetPreCheck(SNESLineSearch, PetscErrorCode (*)(SNESLineSearch, Vec, Vec, PetscBool *, void *), void *ctx);
648f190f2fcSBarry Smith PETSC_EXTERN PetscErrorCode SNESLineSearchSetPostCheck(SNESLineSearch, PetscErrorCode (*)(SNESLineSearch, Vec, Vec, Vec, PetscBool *, PetscBool *, void *), void *ctx);
6499e764e56SPeter Brune 
650f190f2fcSBarry Smith PETSC_EXTERN PetscErrorCode SNESLineSearchGetPreCheck(SNESLineSearch, PetscErrorCode (**)(SNESLineSearch, Vec, Vec, PetscBool *, void *), void **ctx);
651f190f2fcSBarry Smith PETSC_EXTERN PetscErrorCode SNESLineSearchGetPostCheck(SNESLineSearch, PetscErrorCode (**)(SNESLineSearch, Vec, Vec, Vec, PetscBool *, PetscBool *, void *), void **ctx);
6529e764e56SPeter Brune 
6539bd66eb0SPeter Brune /* set the functions for VI-specific line search operations */
6549bd66eb0SPeter Brune 
655014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchSetVIFunctions(SNESLineSearch, SNESLineSearchVIProjectFunc, SNESLineSearchVINormFunc);
656014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchGetVIFunctions(SNESLineSearch, SNESLineSearchVIProjectFunc *, SNESLineSearchVINormFunc *);
6579bd66eb0SPeter Brune 
6589e764e56SPeter Brune /* pointers to the associated SNES in order to be able to get the function evaluation out */
659014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchSetSNES(SNESLineSearch, SNES);
660014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchGetSNES(SNESLineSearch, SNES *);
6619e764e56SPeter Brune 
6629e764e56SPeter Brune /* set and get the parameters and vectors */
663014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchGetTolerances(SNESLineSearch, PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscInt *);
664014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchSetTolerances(SNESLineSearch, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal, PetscInt);
6659e764e56SPeter Brune 
666014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchPreCheckPicard(SNESLineSearch, Vec, Vec, PetscBool *, void *);
66786d74e61SPeter Brune 
668014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchGetLambda(SNESLineSearch, PetscReal *);
669014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchSetLambda(SNESLineSearch, PetscReal);
6709e764e56SPeter Brune 
671014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchGetDamping(SNESLineSearch, PetscReal *);
672014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchSetDamping(SNESLineSearch, PetscReal);
6739e764e56SPeter Brune 
674014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchGetOrder(SNESLineSearch, PetscInt *order);
675014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchSetOrder(SNESLineSearch, PetscInt order);
67659405d5eSPeter Brune 
677422a814eSBarry Smith /*E
678dc4c0fb0SBarry Smith     SNESLineSearchReason - indication if the line search has succeeded or failed and why
679422a814eSBarry Smith 
680dc4c0fb0SBarry Smith   Values:
681dc4c0fb0SBarry Smith +  `SNES_LINESEARCH_SUCCEEDED` - the line search succeeded
682dc4c0fb0SBarry Smith .  `SNES_LINESEARCH_FAILED_NANORINF` - a not a number of infinity appeared in the computions
683dc4c0fb0SBarry Smith .  `SNES_LINESEARCH_FAILED_DOMAIN` - the function was evaluated outside of its domain, see `SNESSetFunctionDomainError()` and `SNESSetJacobianDomainError()`
684dc4c0fb0SBarry Smith .  `SNES_LINESEARCH_FAILED_REDUCT` - the linear search failed to get the requested decrease in its norm or objective
685dc4c0fb0SBarry Smith .  `SNES_LINESEARCH_FAILED_USER` - used by `SNESLINESEARCHNLEQERR` to indicate the user changed the search direction inappropriately
686dc4c0fb0SBarry Smith -  `SNES_LINESEARCH_FAILED_FUNCTION` - indicates the maximum number of function evaluations allowed has been surpassed, `SNESConvergedReason` is also
687dc4c0fb0SBarry Smith                                      set to `SNES_DIVERGED_FUNCTION_COUNT`
688422a814eSBarry Smith 
68916a05f60SBarry Smith    Level: intermediate
69016a05f60SBarry Smith 
691dc4c0fb0SBarry Smith    Developer Note:
692dc4c0fb0SBarry Smith    Some of these reasons overlap with values of `SNESConvergedReason`
693422a814eSBarry Smith 
6941cc06b55SBarry Smith .seealso: [](ch_snes), `SNES`, `SNESSolve()`, `SNESGetConvergedReason()`, `KSPConvergedReason`, `SNESSetConvergenceTest()`,
695dc4c0fb0SBarry Smith           `SNESSetFunctionDomainError()` and `SNESSetJacobianDomainError()`
696422a814eSBarry Smith E*/
6979371c9d4SSatish Balay typedef enum {
6989371c9d4SSatish Balay   SNES_LINESEARCH_SUCCEEDED,
699422a814eSBarry Smith   SNES_LINESEARCH_FAILED_NANORINF,
700e9b602ebSSatish Balay   SNES_LINESEARCH_FAILED_DOMAIN,
701d5b43468SJose E. Roman   SNES_LINESEARCH_FAILED_REDUCT, /* INSUFFICIENT REDUCTION */
702e9b602ebSSatish Balay   SNES_LINESEARCH_FAILED_USER,
7039371c9d4SSatish Balay   SNES_LINESEARCH_FAILED_FUNCTION
7049371c9d4SSatish Balay } SNESLineSearchReason;
705422a814eSBarry Smith 
706422a814eSBarry Smith PETSC_EXTERN PetscErrorCode SNESLineSearchGetReason(SNESLineSearch, SNESLineSearchReason *);
707422a814eSBarry Smith PETSC_EXTERN PetscErrorCode SNESLineSearchSetReason(SNESLineSearch, SNESLineSearchReason);
7089e764e56SPeter Brune 
709014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchGetVecs(SNESLineSearch, Vec *, Vec *, Vec *, Vec *, Vec *);
710014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchSetVecs(SNESLineSearch, Vec, Vec, Vec, Vec, Vec);
7119e764e56SPeter Brune 
712014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchGetNorms(SNESLineSearch, PetscReal *, PetscReal *, PetscReal *);
713014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchSetNorms(SNESLineSearch, PetscReal, PetscReal, PetscReal);
714014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchComputeNorms(SNESLineSearch);
715014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchSetComputeNorms(SNESLineSearch, PetscBool);
7169e764e56SPeter Brune 
717dcf2fd19SBarry Smith PETSC_EXTERN PetscErrorCode SNESLineSearchMonitor(SNESLineSearch);
718dcf2fd19SBarry Smith PETSC_EXTERN PetscErrorCode SNESLineSearchMonitorSet(SNESLineSearch, PetscErrorCode (*)(SNESLineSearch, void *), void *, PetscErrorCode (*)(void **));
719d12e167eSBarry Smith PETSC_EXTERN PetscErrorCode SNESLineSearchMonitorSetFromOptions(SNESLineSearch, const char[], const char[], const char[], PetscErrorCode (*)(SNESLineSearch, PetscViewerAndFormat *), PetscErrorCode (*)(SNESLineSearch, PetscViewerAndFormat *));
720dcf2fd19SBarry Smith PETSC_EXTERN PetscErrorCode SNESLineSearchMonitorCancel(SNESLineSearch);
721dcf2fd19SBarry Smith PETSC_EXTERN PetscErrorCode SNESLineSearchSetDefaultMonitor(SNESLineSearch, PetscViewer);
722dcf2fd19SBarry Smith PETSC_EXTERN PetscErrorCode SNESLineSearchGetDefaultMonitor(SNESLineSearch, PetscViewer *);
723d12e167eSBarry Smith PETSC_EXTERN PetscErrorCode SNESLineSearchMonitorSolutionUpdate(SNESLineSearch, PetscViewerAndFormat *);
7249e764e56SPeter Brune 
725014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchAppendOptionsPrefix(SNESLineSearch, const char prefix[]);
726014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchGetOptionsPrefix(SNESLineSearch, const char *prefix[]);
7279e764e56SPeter Brune 
7289e764e56SPeter Brune /* Shell interface functions */
729014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchShellSetUserFunc(SNESLineSearch, SNESLineSearchUserFunc, void *);
730014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchShellGetUserFunc(SNESLineSearch, SNESLineSearchUserFunc *, void **);
7319e764e56SPeter Brune 
7322f4102e2SPeter Brune /* BT interface functions */
733014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchBTSetAlpha(SNESLineSearch, PetscReal);
734014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchBTGetAlpha(SNESLineSearch, PetscReal *);
7352f4102e2SPeter Brune 
7369e764e56SPeter Brune /*register line search types */
737bdf89e91SBarry Smith PETSC_EXTERN PetscErrorCode SNESLineSearchRegister(const char[], PetscErrorCode (*)(SNESLineSearch));
7389e764e56SPeter Brune 
739720c9a41SShri Abhyankar /* Routines for VI solver */
740014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESVISetVariableBounds(SNES, Vec, Vec);
741cf836535SBlaise Bourdin PETSC_EXTERN PetscErrorCode SNESVIGetVariableBounds(SNES, Vec *, Vec *);
742014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESVISetComputeVariableBounds(SNES, PetscErrorCode (*)(SNES, Vec, Vec));
743014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESVIGetInactiveSet(SNES, IS *);
744014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESVIGetActiveSetIS(SNES, Vec, Vec, IS *);
745014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESVIComputeInactiveSetFnorm(SNES, Vec, Vec, PetscReal *);
746014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESVISetRedundancyCheck(SNES, PetscErrorCode (*)(SNES, IS, IS *, void *), void *);
747f6dfbefdSBarry Smith PETSC_EXTERN PetscErrorCode SNESVIComputeMeritFunction(Vec, PetscReal *, PetscReal *);
748f6dfbefdSBarry Smith PETSC_EXTERN PetscErrorCode SNESVIComputeFunction(SNES, Vec, Vec, void *);
749f6dfbefdSBarry Smith PETSC_EXTERN PetscErrorCode DMSetVI(DM, IS);
750f6dfbefdSBarry Smith PETSC_EXTERN PetscErrorCode DMDestroyVI(DM);
751f5ea5bd2SShri Abhyankar 
752014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESTestLocalMin(SNES);
753da9b6338SBarry Smith 
754eef9c623SLois Curfman McInnes /* Should this routine be private? */
755d1e9a80fSBarry Smith PETSC_EXTERN PetscErrorCode SNESComputeJacobian(SNES, Vec, Mat, Mat);
756e885f1abSBarry Smith PETSC_EXTERN PetscErrorCode SNESTestJacobian(SNES);
757ddbbdb52SLois Curfman McInnes 
758014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetDM(SNES, DM);
759014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESGetDM(SNES, DM *);
760be95d8f1SBarry Smith PETSC_EXTERN PetscErrorCode SNESSetNPC(SNES, SNES);
761be95d8f1SBarry Smith PETSC_EXTERN PetscErrorCode SNESGetNPC(SNES, SNES *);
7623ad1a0b9SPatrick Farrell PETSC_EXTERN PetscErrorCode SNESHasNPC(SNES, PetscBool *);
763be95d8f1SBarry Smith PETSC_EXTERN PetscErrorCode SNESApplyNPC(SNES, Vec, Vec, Vec);
764be95d8f1SBarry Smith PETSC_EXTERN PetscErrorCode SNESGetNPCFunction(SNES, Vec, PetscReal *);
765be95d8f1SBarry Smith PETSC_EXTERN PetscErrorCode SNESComputeFunctionDefaultNPC(SNES, Vec, Vec);
766be95d8f1SBarry Smith PETSC_EXTERN PetscErrorCode SNESSetNPCSide(SNES, PCSide);
767be95d8f1SBarry Smith PETSC_EXTERN PetscErrorCode SNESGetNPCSide(SNES, PCSide *);
7687601faf0SJed Brown PETSC_EXTERN PetscErrorCode SNESSetLineSearch(SNES, SNESLineSearch);
7697601faf0SJed Brown PETSC_EXTERN PetscErrorCode SNESGetLineSearch(SNES, SNESLineSearch *);
7706c699258SBarry Smith 
771edd03b47SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION(3, 4, 0, "SNESGetLineSearch()", ) static inline PetscErrorCode SNESGetSNESLineSearch(SNES snes, SNESLineSearch *ls)
772d71ae5a4SJacob Faibussowitsch {
7739371c9d4SSatish Balay   return SNESGetLineSearch(snes, ls);
7749371c9d4SSatish Balay }
775edd03b47SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION(3, 4, 0, "SNESSetLineSearch()", ) static inline PetscErrorCode SNESSetSNESLineSearch(SNES snes, SNESLineSearch ls)
776d71ae5a4SJacob Faibussowitsch {
7779371c9d4SSatish Balay   return SNESSetLineSearch(snes, ls);
7789371c9d4SSatish Balay }
7798b7b3213SJed Brown 
780014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESSetUpMatrices(SNES);
781f8b49ee9SBarry Smith PETSC_EXTERN PetscErrorCode DMSNESSetFunction(DM, PetscErrorCode (*)(SNES, Vec, Vec, void *), void *);
782f8b49ee9SBarry Smith PETSC_EXTERN PetscErrorCode DMSNESGetFunction(DM, PetscErrorCode (**)(SNES, Vec, Vec, void *), void **);
783800f99ffSJeremy L Thompson PETSC_EXTERN PetscErrorCode DMSNESSetFunctionContextDestroy(DM, PetscErrorCode (*)(void *));
784bbc1464cSBarry Smith PETSC_EXTERN PetscErrorCode DMSNESSetMFFunction(DM, PetscErrorCode (*)(SNES, Vec, Vec, void *), void *);
785be95d8f1SBarry Smith PETSC_EXTERN PetscErrorCode DMSNESSetNGS(DM, PetscErrorCode (*)(SNES, Vec, Vec, void *), void *);
786be95d8f1SBarry Smith PETSC_EXTERN PetscErrorCode DMSNESGetNGS(DM, PetscErrorCode (**)(SNES, Vec, Vec, void *), void **);
787d1e9a80fSBarry Smith PETSC_EXTERN PetscErrorCode DMSNESSetJacobian(DM, PetscErrorCode (*)(SNES, Vec, Mat, Mat, void *), void *);
788d1e9a80fSBarry Smith PETSC_EXTERN PetscErrorCode DMSNESGetJacobian(DM, PetscErrorCode (**)(SNES, Vec, Mat, Mat, void *), void **);
789800f99ffSJeremy L Thompson PETSC_EXTERN PetscErrorCode DMSNESSetJacobianContextDestroy(DM, PetscErrorCode (*)(void *));
790d1e9a80fSBarry Smith PETSC_EXTERN PetscErrorCode DMSNESSetPicard(DM, PetscErrorCode (*)(SNES, Vec, Vec, void *), PetscErrorCode (*)(SNES, Vec, Mat, Mat, void *), void *);
791d1e9a80fSBarry Smith PETSC_EXTERN PetscErrorCode DMSNESGetPicard(DM, PetscErrorCode (**)(SNES, Vec, Vec, void *), PetscErrorCode (**)(SNES, Vec, Mat, Mat, void *), void **);
792f8b49ee9SBarry Smith PETSC_EXTERN PetscErrorCode DMSNESSetObjective(DM, PetscErrorCode (*)(SNES, Vec, PetscReal *, void *), void *);
793f8b49ee9SBarry Smith PETSC_EXTERN PetscErrorCode DMSNESGetObjective(DM, PetscErrorCode (**)(SNES, Vec, PetscReal *, void *), void **);
7944dd50a75SBarry Smith PETSC_EXTERN PetscErrorCode DMCopyDMSNES(DM, DM);
7956cab3a1bSJed Brown 
796c9d099b5SPeter Brune PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*DMDASNESFunction)(DMDALocalInfo *, void *, void *, void *);
797d1e9a80fSBarry Smith PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*DMDASNESJacobian)(DMDALocalInfo *, void *, Mat, Mat, void *);
7982a4ee8f2SPeter Brune PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*DMDASNESObjective)(DMDALocalInfo *, void *, PetscReal *, void *);
799c9d099b5SPeter Brune 
8005505f7afSJunchao Zhang PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*DMDASNESFunctionVec)(DMDALocalInfo *, Vec, Vec, void *);
8015505f7afSJunchao Zhang PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*DMDASNESJacobianVec)(DMDALocalInfo *, Vec, Mat, Mat, void *);
8025505f7afSJunchao Zhang PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*DMDASNESObjectiveVec)(DMDALocalInfo *, Vec, PetscReal *, void *);
8035505f7afSJunchao Zhang 
804c9d099b5SPeter Brune PETSC_EXTERN PetscErrorCode DMDASNESSetFunctionLocal(DM, InsertMode, DMDASNESFunction, void *);
805c9d099b5SPeter Brune PETSC_EXTERN PetscErrorCode DMDASNESSetJacobianLocal(DM, DMDASNESJacobian, void *);
8062a4ee8f2SPeter Brune PETSC_EXTERN PetscErrorCode DMDASNESSetObjectiveLocal(DM, DMDASNESObjective, void *);
807d1e9a80fSBarry Smith PETSC_EXTERN PetscErrorCode DMDASNESSetPicardLocal(DM, InsertMode, PetscErrorCode (*)(DMDALocalInfo *, void *, void *, void *), PetscErrorCode (*)(DMDALocalInfo *, void *, Mat, Mat, void *), void *);
8086cab3a1bSJed Brown 
8095505f7afSJunchao Zhang PETSC_EXTERN PetscErrorCode DMDASNESSetFunctionLocalVec(DM, InsertMode, DMDASNESFunctionVec, void *);
8105505f7afSJunchao Zhang PETSC_EXTERN PetscErrorCode DMDASNESSetJacobianLocalVec(DM, DMDASNESJacobianVec, void *);
8115505f7afSJunchao Zhang PETSC_EXTERN PetscErrorCode DMDASNESSetObjectiveLocalVec(DM, DMDASNESObjectiveVec, void *);
8125505f7afSJunchao Zhang 
813bdd6f66aSToby Isaac PETSC_EXTERN PetscErrorCode DMSNESSetBoundaryLocal(DM, PetscErrorCode (*)(DM, Vec, void *), void *);
814ff35dfedSBarry Smith PETSC_EXTERN PetscErrorCode DMSNESSetFunctionLocal(DM, PetscErrorCode (*)(DM, Vec, Vec, void *), void *);
815d1e9a80fSBarry Smith PETSC_EXTERN PetscErrorCode DMSNESSetJacobianLocal(DM, PetscErrorCode (*)(DM, Vec, Mat, Mat, void *), void *);
81628d58a37SPierre Jolivet PETSC_EXTERN PetscErrorCode DMSNESGetBoundaryLocal(DM, PetscErrorCode (**)(DM, Vec, void *), void **);
81728d58a37SPierre Jolivet PETSC_EXTERN PetscErrorCode DMSNESGetFunctionLocal(DM, PetscErrorCode (**)(DM, Vec, Vec, void *), void **);
81828d58a37SPierre Jolivet PETSC_EXTERN PetscErrorCode DMSNESGetJacobianLocal(DM, PetscErrorCode (**)(DM, Vec, Mat, Mat, void *), void **);
819ff35dfedSBarry Smith 
820b665c654SMatthew G Knepley /* Routines for Multiblock solver */
821014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESMultiblockSetFields(SNES, const char[], PetscInt, const PetscInt *);
822014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESMultiblockSetIS(SNES, const char[], IS);
823014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESMultiblockSetBlockSize(SNES, PetscInt);
824014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESMultiblockSetType(SNES, PCCompositeType);
825*4bf303faSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode SNESMultiblockGetSubSNES(SNES, PetscInt *, SNES *[]);
826aeed3662SMatthew G Knepley 
82737e1895aSJed Brown /*J
82887497f52SBarry Smith     SNESMSType - String with the name of a PETSc `SNESMS` method.
82937e1895aSJed Brown 
83037e1895aSJed Brown    Level: intermediate
83137e1895aSJed Brown 
8321cc06b55SBarry Smith .seealso: [](ch_snes), `SNESMS`, `SNESMSGetType()`, `SNESMSSetType()`, `SNES`
83337e1895aSJed Brown J*/
83419fd82e9SBarry Smith typedef const char *SNESMSType;
83537e1895aSJed Brown #define SNESMSM62       "m62"
83637e1895aSJed Brown #define SNESMSEULER     "euler"
837a97cb6bcSJed Brown #define SNESMSJAMESON83 "jameson83"
8383847c725SLisandro Dalcin #define SNESMSVLTP11    "vltp11"
839a97cb6bcSJed Brown #define SNESMSVLTP21    "vltp21"
840a97cb6bcSJed Brown #define SNESMSVLTP31    "vltp31"
841a97cb6bcSJed Brown #define SNESMSVLTP41    "vltp41"
842a97cb6bcSJed Brown #define SNESMSVLTP51    "vltp51"
843a97cb6bcSJed Brown #define SNESMSVLTP61    "vltp61"
84437e1895aSJed Brown 
84519fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode SNESMSRegister(SNESMSType, PetscInt, PetscInt, PetscReal, const PetscReal[], const PetscReal[], const PetscReal[]);
846*4bf303faSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode SNESMSRegisterAll(void);
84757715debSLisandro Dalcin PETSC_EXTERN PetscErrorCode SNESMSGetType(SNES, SNESMSType *);
84819fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode SNESMSSetType(SNES, SNESMSType);
84957715debSLisandro Dalcin PETSC_EXTERN PetscErrorCode SNESMSGetDamping(SNES, PetscReal *);
85057715debSLisandro Dalcin PETSC_EXTERN PetscErrorCode SNESMSSetDamping(SNES, PetscReal);
851014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESMSFinalizePackage(void);
852607a6623SBarry Smith PETSC_EXTERN PetscErrorCode SNESMSInitializePackage(void);
853014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESMSRegisterDestroy(void);
85437e1895aSJed Brown 
855ceaaa498SBarry Smith /*MC
856ceaaa498SBarry Smith    SNESNGMRESRestartType - the restart approach used by `SNESNGMRES`
85713a62661SPeter Brune 
858ceaaa498SBarry Smith    Level: intermediate
859ceaaa498SBarry Smith 
860ceaaa498SBarry Smith   Values:
861ceaaa498SBarry Smith +   `SNES_NGMRES_RESTART_NONE` - never restart
862ceaaa498SBarry Smith .   `SNES_NGMRES_RESTART_DIFFERENCE` - restart based upon difference criteria
863ceaaa498SBarry Smith -   `SNES_NGMRES_RESTART_PERIODIC` - restart after a fixed number of iterations
864ceaaa498SBarry Smith 
865ceaaa498SBarry Smith   Options Database Keys:
866ceaaa498SBarry Smith + -snes_ngmres_restart_type<difference,periodic,none> - set the restart type
867ceaaa498SBarry Smith - -snes_ngmres_restart[30]                            - sets the number of iterations before restart for periodic
868ceaaa498SBarry Smith 
869ceaaa498SBarry Smith .seealso: `SNES, `SNESNGMRES`, `SNESNGMRESSetSelectType()`, `SNESNGMRESGetSelectType()`, `SNESNGMRESSetRestartType()`,
870ceaaa498SBarry Smith           `SNESNGMRESGetRestartType()`, `SNESNGMRESSelectType`
871ceaaa498SBarry Smith M*/
87213a62661SPeter Brune typedef enum {
87313a62661SPeter Brune   SNES_NGMRES_RESTART_NONE       = 0,
87413a62661SPeter Brune   SNES_NGMRES_RESTART_PERIODIC   = 1,
8759371c9d4SSatish Balay   SNES_NGMRES_RESTART_DIFFERENCE = 2
8769371c9d4SSatish Balay } SNESNGMRESRestartType;
8776a6fc655SJed Brown PETSC_EXTERN const char *const SNESNGMRESRestartTypes[];
87813a62661SPeter Brune 
879ceaaa498SBarry Smith /*MC
880ceaaa498SBarry Smith    SNESNGMRESSelectType - the approach used by `SNESNGMRES` to determine how the candidate solution and
881ceaaa498SBarry Smith   combined solution are used to create the next iterate.
882ceaaa498SBarry Smith 
883ceaaa498SBarry Smith    Level: intermediate
884ceaaa498SBarry Smith 
885ceaaa498SBarry Smith    Values:
886ceaaa498SBarry Smith +   `SNES_NGMRES_SELECT_NONE` - choose the combined solution all the time
887ceaaa498SBarry Smith .   `SNES_NGMRES_SELECT_DIFFERENCE` - choose based upon the selection criteria
888ceaaa498SBarry Smith -   `SNES_NGMRES_SELECT_LINESEARCH` - choose based upon line search combination
889ceaaa498SBarry Smith 
890ceaaa498SBarry Smith   Options Database Key:
891ceaaa498SBarry Smith . -snes_ngmres_select_type<difference,none,linesearch> - select type
892ceaaa498SBarry Smith 
893ceaaa498SBarry Smith .seealso: `SNES, `SNESNGMRES`, `SNESNGMRESSetSelectType()`, `SNESNGMRESGetSelectType()`, `SNESNGMRESSetRestartType()`,
894ceaaa498SBarry Smith           `SNESNGMRESGetRestartType()`, `SNESNGMRESRestartType`
895ceaaa498SBarry Smith M*/
89613a62661SPeter Brune typedef enum {
89713a62661SPeter Brune   SNES_NGMRES_SELECT_NONE       = 0,
89813a62661SPeter Brune   SNES_NGMRES_SELECT_DIFFERENCE = 1,
8999371c9d4SSatish Balay   SNES_NGMRES_SELECT_LINESEARCH = 2
9009371c9d4SSatish Balay } SNESNGMRESSelectType;
9016a6fc655SJed Brown PETSC_EXTERN const char *const SNESNGMRESSelectTypes[];
90213a62661SPeter Brune 
903014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESNGMRESSetRestartType(SNES, SNESNGMRESRestartType);
904014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESNGMRESSetSelectType(SNES, SNESNGMRESSelectType);
90523b3e82cSAsbjørn Nilsen Riseth PETSC_EXTERN PetscErrorCode SNESNGMRESSetRestartFmRise(SNES, PetscBool);
90623b3e82cSAsbjørn Nilsen Riseth PETSC_EXTERN PetscErrorCode SNESNGMRESGetRestartFmRise(SNES, PetscBool *);
90713a62661SPeter Brune 
908ceaaa498SBarry Smith /*MC
909ceaaa498SBarry Smith    SNESNCGType - the conjugate update approach for `SNESNCG`
9100a844d1aSPeter Brune 
911ceaaa498SBarry Smith    Level: intermediate
912ceaaa498SBarry Smith 
913ceaaa498SBarry Smith    Values:
914ceaaa498SBarry Smith +   `SNES_NCG_FR` - Fletcher-Reeves update
915ceaaa498SBarry Smith .   `SNES_NCG_PRP` - Polak-Ribiere-Polyak update, the default and the only one that tolerates generalized search directions
916ceaaa498SBarry Smith .   `SNES_NCG_HS` - Hestenes-Steifel update
917ceaaa498SBarry Smith .   `SNES_NCG_DY` - Dai-Yuan update
918ceaaa498SBarry Smith -   `SNES_NCG_CD` - Conjugate Descent update
919ceaaa498SBarry Smith 
920ceaaa498SBarry Smith   Options Database Key:
921ceaaa498SBarry Smith . -snes_ncg_type<fr,prp,hs,dy,cd> - select type
922ceaaa498SBarry Smith 
923ceaaa498SBarry Smith .seealso: `SNES, `SNESNCG`, `SNESNCGSetType()`
924ceaaa498SBarry Smith M*/
9250a844d1aSPeter Brune typedef enum {
9260de8b71eSPeter Brune   SNES_NCG_FR  = 0,
9270de8b71eSPeter Brune   SNES_NCG_PRP = 1,
9280de8b71eSPeter Brune   SNES_NCG_HS  = 2,
9290de8b71eSPeter Brune   SNES_NCG_DY  = 3,
9309371c9d4SSatish Balay   SNES_NCG_CD  = 4
9319371c9d4SSatish Balay } SNESNCGType;
9326a6fc655SJed Brown PETSC_EXTERN const char *const SNESNCGTypes[];
9330a844d1aSPeter Brune 
934014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESNCGSetType(SNES, SNESNCGType);
93513a62661SPeter Brune 
936ceaaa498SBarry Smith /*MC
937ceaaa498SBarry Smith    SNESQNScaleType - the scaling type used by `SNESQN`
938ceaaa498SBarry Smith 
939ceaaa498SBarry Smith    Level: intermediate
940ceaaa498SBarry Smith 
941ceaaa498SBarry Smith    Values:
942ceaaa498SBarry Smith +   `SNES_QN_SCALE_NONE` - don't scale the problem
943ceaaa498SBarry Smith .   `SNES_QN_SCALE_SCALAR` - use Shanno scaling
944ceaaa498SBarry Smith .   `SNES_QN_SCALE_DIAGONAL` - scale with a diagonalized BFGS formula (see Gilbert and Lemarechal 1989), available
945ceaaa498SBarry Smith -   `SNES_QN_SCALE_JACOBIAN` - scale by solving a linear system coming from the Jacobian you provided with `SNESSetJacobian()`
946ceaaa498SBarry Smith                                computed at the first iteration of `SNESQN` and at ever restart.
947ceaaa498SBarry Smith 
948ceaaa498SBarry Smith     Options Database Key:
949ceaaa498SBarry Smith . -snes_qn_scale_type <diagonal,none,scalar,jacobian> - Scaling type
950ceaaa498SBarry Smith 
951ceaaa498SBarry Smith .seealso: `SNES, `SNESQN`, `SNESQNSetScaleType()`, `SNESQNType`, `SNESQNSetType()`, `SNESQNSetRestartType()`, `SNESQNRestartType`
952ceaaa498SBarry Smith M*/
9539371c9d4SSatish Balay typedef enum {
9549371c9d4SSatish Balay   SNES_QN_SCALE_DEFAULT  = 0,
9551efc8c45SPeter Brune   SNES_QN_SCALE_NONE     = 1,
95692f76d53SAlp Dener   SNES_QN_SCALE_SCALAR   = 2,
95792f76d53SAlp Dener   SNES_QN_SCALE_DIAGONAL = 3,
9589371c9d4SSatish Balay   SNES_QN_SCALE_JACOBIAN = 4
9599371c9d4SSatish Balay } SNESQNScaleType;
9606a6fc655SJed Brown PETSC_EXTERN const char *const SNESQNScaleTypes[];
961ceaaa498SBarry Smith 
962ceaaa498SBarry Smith /*MC
963ceaaa498SBarry Smith    SNESQNRestartType - the restart approached used by `SNESQN`
964ceaaa498SBarry Smith 
965ceaaa498SBarry Smith    Level: intermediate
966ceaaa498SBarry Smith 
967ceaaa498SBarry Smith    Values:
968ceaaa498SBarry Smith +   `SNES_QN_RESTART_NONE` - never restart
969ceaaa498SBarry Smith .   `SNES_QN_RESTART_POWELL` - restart based upon descent criteria
970ceaaa498SBarry Smith -   `SNES_QN_RESTART_PERIODIC` - restart after a fixed number of iterations
971ceaaa498SBarry Smith 
972ceaaa498SBarry Smith   Options Database Keys:
973ceaaa498SBarry Smith + -snes_qn_restart_type <powell,periodic,none> - set the restart type
974ceaaa498SBarry Smith - -snes_qn_m <m>                               - sets the number of stored updates and the restart period for periodic
975ceaaa498SBarry Smith 
976ceaaa498SBarry Smith .seealso: `SNES, `SNESQN`, `SNESQNSetScaleType()`, `SNESQNType`, `SNESQNSetType()`, `SNESQNSetRestartType()`, `SNESQNScaleType`
977ceaaa498SBarry Smith M*/
9789371c9d4SSatish Balay typedef enum {
9799371c9d4SSatish Balay   SNES_QN_RESTART_DEFAULT  = 0,
9801efc8c45SPeter Brune   SNES_QN_RESTART_NONE     = 1,
9811efc8c45SPeter Brune   SNES_QN_RESTART_POWELL   = 2,
9829371c9d4SSatish Balay   SNES_QN_RESTART_PERIODIC = 3
9839371c9d4SSatish Balay } SNESQNRestartType;
9846a6fc655SJed Brown PETSC_EXTERN const char *const SNESQNRestartTypes[];
985ceaaa498SBarry Smith 
986ceaaa498SBarry Smith /*MC
987ceaaa498SBarry Smith    SNESQNType - the type used by `SNESQN`
988ceaaa498SBarry Smith 
989ceaaa498SBarry Smith    Level: intermediate
990ceaaa498SBarry Smith 
991ceaaa498SBarry Smith   Values:
992ceaaa498SBarry Smith +   `SNES_QN_LBFGS` - LBFGS variant
993ceaaa498SBarry Smith .   `SNES_QN_BROYDEN` - Broyden variant
994ceaaa498SBarry Smith -   `SNES_QN_BADBROYDEN` - Bad Broyden variant
995ceaaa498SBarry Smith 
996ceaaa498SBarry Smith   Options Database Key:
997ceaaa498SBarry Smith . -snes_qn_type <lbfgs,broyden,badbroyden> - quasi-Newton type
998ceaaa498SBarry Smith 
999ceaaa498SBarry Smith .seealso: `SNES, `SNESQN`, `SNESQNSetScaleType()`, `SNESQNSetType()`, `SNESQNScaleType`, `SNESQNRestartType`, `SNESQNSetRestartType()`
1000ceaaa498SBarry Smith M*/
10019371c9d4SSatish Balay typedef enum {
10029371c9d4SSatish Balay   SNES_QN_LBFGS      = 0,
10031efc8c45SPeter Brune   SNES_QN_BROYDEN    = 1,
10041efc8c45SPeter Brune   SNES_QN_BADBROYDEN = 2
10051efc8c45SPeter Brune } SNESQNType;
10061efc8c45SPeter Brune PETSC_EXTERN const char *const SNESQNTypes[];
10070c777b0cSPeter Brune 
10081efc8c45SPeter Brune PETSC_EXTERN PetscErrorCode SNESQNSetType(SNES, SNESQNType);
1009014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESQNSetScaleType(SNES, SNESQNScaleType);
1010014dd563SJed Brown PETSC_EXTERN PetscErrorCode SNESQNSetRestartType(SNES, SNESQNRestartType);
10110c777b0cSPeter Brune 
1012e0331734SPeter Brune PETSC_EXTERN PetscErrorCode SNESNASMGetType(SNES, PCASMType *);
1013e0331734SPeter Brune PETSC_EXTERN PetscErrorCode SNESNASMSetType(SNES, PCASMType);
101476857b2aSPeter Brune PETSC_EXTERN PetscErrorCode SNESNASMGetSubdomains(SNES, PetscInt *, SNES **, VecScatter **, VecScatter **, VecScatter **);
101576857b2aSPeter Brune PETSC_EXTERN PetscErrorCode SNESNASMSetSubdomains(SNES, PetscInt, SNES *, VecScatter *, VecScatter *, VecScatter *);
1016610116beSPeter Brune PETSC_EXTERN PetscErrorCode SNESNASMSetDamping(SNES, PetscReal);
1017610116beSPeter Brune PETSC_EXTERN PetscErrorCode SNESNASMGetDamping(SNES, PetscReal *);
101876857b2aSPeter Brune PETSC_EXTERN PetscErrorCode SNESNASMGetSubdomainVecs(SNES, PetscInt *, Vec **, Vec **, Vec **, Vec **);
1019d728fb7dSPeter Brune PETSC_EXTERN PetscErrorCode SNESNASMSetComputeFinalJacobian(SNES, PetscBool);
1020d2dc0b00SPatrick Farrell PETSC_EXTERN PetscErrorCode SNESNASMGetSNES(SNES, PetscInt, SNES *);
1021d2dc0b00SPatrick Farrell PETSC_EXTERN PetscErrorCode SNESNASMGetNumber(SNES, PetscInt *);
1022f10b3e88SPatrick Farrell PETSC_EXTERN PetscErrorCode SNESNASMSetWeight(SNES, Vec);
10230c777b0cSPeter Brune 
10249371c9d4SSatish Balay typedef enum {
10259371c9d4SSatish Balay   SNES_COMPOSITE_ADDITIVE,
10269371c9d4SSatish Balay   SNES_COMPOSITE_MULTIPLICATIVE,
10279371c9d4SSatish Balay   SNES_COMPOSITE_ADDITIVEOPTIMAL
10289371c9d4SSatish Balay } SNESCompositeType;
1029eed5f15bSPeter Brune PETSC_EXTERN const char *const SNESCompositeTypes[];
1030eed5f15bSPeter Brune 
1031eed5f15bSPeter Brune PETSC_EXTERN PetscErrorCode SNESCompositeSetType(SNES, SNESCompositeType);
1032eed5f15bSPeter Brune PETSC_EXTERN PetscErrorCode SNESCompositeAddSNES(SNES, SNESType);
1033eed5f15bSPeter Brune PETSC_EXTERN PetscErrorCode SNESCompositeGetSNES(SNES, PetscInt, SNES *);
1034a6b47ab3SPatrick Farrell PETSC_EXTERN PetscErrorCode SNESCompositeGetNumber(SNES, PetscInt *);
10358f626970SPeter Brune PETSC_EXTERN PetscErrorCode SNESCompositeSetDamping(SNES, PetscInt, PetscReal);
1036eed5f15bSPeter Brune 
103768e6d53eSPatrick Farrell PETSC_EXTERN PetscErrorCode SNESPatchSetDiscretisationInfo(SNES, PetscInt, DM *, PetscInt *, PetscInt *, const PetscInt **, const PetscInt *, PetscInt, const PetscInt *, PetscInt, const PetscInt *);
10384d04e9f1SPatrick Farrell PETSC_EXTERN PetscErrorCode SNESPatchSetComputeOperator(SNES, PetscErrorCode (*func)(PC, PetscInt, Vec, Mat, IS, PetscInt, const PetscInt *, const PetscInt *, void *), void *);
103939fd2e8aSPatrick Farrell PETSC_EXTERN PetscErrorCode SNESPatchSetComputeFunction(SNES, PetscErrorCode (*func)(PC, PetscInt, Vec, Vec, IS, PetscInt, const PetscInt *, const PetscInt *, void *), void *);
104068e6d53eSPatrick Farrell PETSC_EXTERN PetscErrorCode SNESPatchSetConstructType(SNES, PCPatchConstructType, PetscErrorCode (*func)(PC, PetscInt *, IS **, IS *, void *), void *);
104168e6d53eSPatrick Farrell PETSC_EXTERN PetscErrorCode SNESPatchSetCellNumbering(SNES, PetscSection);
1042561742edSMatthew G. Knepley 
1043a055c8caSBarry Smith /*E
1044a055c8caSBarry Smith     SNESFASType - Determines the type of nonlinear multigrid method that is run.
1045a055c8caSBarry Smith 
1046a055c8caSBarry Smith    Values:
104787497f52SBarry Smith +  `SNES_FAS_MULTIPLICATIVE` (default) - traditional V or W cycle as determined by `SNESFASSetCycles()`
104887497f52SBarry Smith .  `SNES_FAS_ADDITIVE`                 - additive FAS cycle
104987497f52SBarry Smith .  `SNES_FAS_FULL`                     - full FAS cycle
105087497f52SBarry Smith -  `SNES_FAS_KASKADE`                  - Kaskade FAS cycle
1051a055c8caSBarry Smith 
105216a05f60SBarry Smith    Level: beginner
105316a05f60SBarry Smith 
10541cc06b55SBarry Smith .seealso: [](ch_snes), `SNESFAS`, `PCMGSetType()`, `PCMGType`
1055a055c8caSBarry Smith E*/
10569371c9d4SSatish Balay typedef enum {
10579371c9d4SSatish Balay   SNES_FAS_MULTIPLICATIVE,
10589371c9d4SSatish Balay   SNES_FAS_ADDITIVE,
10599371c9d4SSatish Balay   SNES_FAS_FULL,
10609371c9d4SSatish Balay   SNES_FAS_KASKADE
10619371c9d4SSatish Balay } SNESFASType;
1062a055c8caSBarry Smith PETSC_EXTERN const char *const SNESFASTypes[];
1063a055c8caSBarry Smith 
1064a055c8caSBarry Smith /* called on the finest level FAS instance*/
1065a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASSetType(SNES, SNESFASType);
1066a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASGetType(SNES, SNESFASType *);
1067a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASSetLevels(SNES, PetscInt, MPI_Comm *);
1068a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASGetLevels(SNES, PetscInt *);
1069a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASGetCycleSNES(SNES, PetscInt, SNES *);
1070a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASSetNumberSmoothUp(SNES, PetscInt);
1071a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASSetNumberSmoothDown(SNES, PetscInt);
1072a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASSetCycles(SNES, PetscInt);
1073d142ab34SLawrence Mitchell PETSC_EXTERN PetscErrorCode SNESFASSetMonitor(SNES, PetscViewerAndFormat *, PetscBool);
1074a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASSetLog(SNES, PetscBool);
1075a055c8caSBarry Smith 
1076a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASSetGalerkin(SNES, PetscBool);
1077a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASGetGalerkin(SNES, PetscBool *);
107825acbd8eSLisandro Dalcin PETSC_EXTERN PetscErrorCode SNESFASGalerkinFunctionDefault(SNES, Vec, Vec, void *);
1079a055c8caSBarry Smith 
1080a055c8caSBarry Smith /* called on any level -- "Cycle" FAS instance */
1081a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASCycleGetSmoother(SNES, SNES *);
1082a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASCycleGetSmootherUp(SNES, SNES *);
1083a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASCycleGetSmootherDown(SNES, SNES *);
1084a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASCycleGetCorrection(SNES, SNES *);
1085a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASCycleGetInterpolation(SNES, Mat *);
1086a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASCycleGetRestriction(SNES, Mat *);
1087a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASCycleGetInjection(SNES, Mat *);
1088a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASCycleGetRScale(SNES, Vec *);
1089a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASCycleSetCycles(SNES, PetscInt);
1090a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASCycleIsFine(SNES, PetscBool *);
1091a055c8caSBarry Smith 
1092a055c8caSBarry Smith /* called on the (outer) finest level FAS to set/get parameters on any level instance */
1093a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASSetInterpolation(SNES, PetscInt, Mat);
1094a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASGetInterpolation(SNES, PetscInt, Mat *);
1095a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASSetRestriction(SNES, PetscInt, Mat);
1096a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASGetRestriction(SNES, PetscInt, Mat *);
1097a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASSetInjection(SNES, PetscInt, Mat);
1098a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASGetInjection(SNES, PetscInt, Mat *);
1099a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASSetRScale(SNES, PetscInt, Vec);
1100a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASGetRScale(SNES, PetscInt, Vec *);
1101020631bcSPeter Brune PETSC_EXTERN PetscErrorCode SNESFASSetContinuation(SNES, PetscBool);
1102a055c8caSBarry Smith 
1103a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASGetSmoother(SNES, PetscInt, SNES *);
1104a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASGetSmootherUp(SNES, PetscInt, SNES *);
1105a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASGetSmootherDown(SNES, PetscInt, SNES *);
1106a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASGetCoarseSolve(SNES, SNES *);
1107a055c8caSBarry Smith 
1108a055c8caSBarry Smith /* parameters for full FAS */
1109a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASFullSetDownSweep(SNES, PetscBool);
1110a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASCreateCoarseVec(SNES, Vec *);
1111a055c8caSBarry Smith PETSC_EXTERN PetscErrorCode SNESFASRestrict(SNES, Vec, Vec);
11126dfbafefSToby Isaac PETSC_EXTERN PetscErrorCode SNESFASFullSetTotal(SNES, PetscBool);
11136dfbafefSToby Isaac PETSC_EXTERN PetscErrorCode SNESFASFullGetTotal(SNES, PetscBool *);
1114a055c8caSBarry Smith 
1115f2cacb80SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSNESCheckDiscretization(SNES, DM, PetscReal, Vec, PetscReal, PetscReal[]);
1116f3c94560SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSNESCheckResidual(SNES, DM, Vec, PetscReal, PetscReal *);
1117f3c94560SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSNESCheckJacobian(SNES, DM, Vec, PetscReal, PetscBool *, PetscReal *);
11187f96f943SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSNESCheckFromOptions(SNES, Vec);
11198e3a2eefSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSNESComputeJacobianAction(DM, Vec, Vec, Vec, void *);
11208e3a2eefSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSNESCreateJacobianMF(DM, Vec, void *, Mat *);
11211878804aSMatthew G. Knepley 
1122ce3d82beSBarry Smith #endif
1123