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