1f26ada1bSBarry Smith /* 2f26ada1bSBarry Smith Defines the interface functions for the Krylov subspace accelerators. 3f26ada1bSBarry Smith */ 40a835dfdSSatish Balay #ifndef __PETSCKSP_H 50a835dfdSSatish Balay #define __PETSCKSP_H 60a835dfdSSatish Balay #include "petscpc.h" 7e9fa29b7SSatish Balay PETSC_EXTERN_CXX_BEGIN 82eac72dbSBarry Smith 9dfbe8321SBarry Smith EXTERN PetscErrorCode KSPInitializePackage(const char[]); 101dbb0a54SBarry Smith 1128ce4d24SBarry Smith /*S 1228ce4d24SBarry Smith KSP - Abstract PETSc object that manages all Krylov methods 1328ce4d24SBarry Smith 1428ce4d24SBarry Smith Level: beginner 1528ce4d24SBarry Smith 1628ce4d24SBarry Smith Concepts: Krylov methods 1728ce4d24SBarry Smith 1894b7f48cSBarry Smith .seealso: KSPCreate(), KSPSetType(), KSPType, SNES, TS, PC, KSP 1928ce4d24SBarry Smith S*/ 20e2a1c21fSSatish Balay typedef struct _p_KSP* KSP; 212eac72dbSBarry Smith 2228ce4d24SBarry Smith /*E 2328ce4d24SBarry Smith KSPType - String with the name of a PETSc Krylov method or the creation function 2428ce4d24SBarry Smith with an optional dynamic library name, for example 2528ce4d24SBarry Smith http://www.mcs.anl.gov/petsc/lib.a:mykspcreate() 2628ce4d24SBarry Smith 2728ce4d24SBarry Smith Level: beginner 2828ce4d24SBarry Smith 2928ce4d24SBarry Smith .seealso: KSPSetType(), KSP 3028ce4d24SBarry Smith E*/ 3182bf6240SBarry Smith #define KSPRICHARDSON "richardson" 3282bf6240SBarry Smith #define KSPCHEBYCHEV "chebychev" 3382bf6240SBarry Smith #define KSPCG "cg" 34df2a969aSvictorle #define KSPCGNE "cgne" 3582bf6240SBarry Smith #define KSPGMRES "gmres" 3682bf6240SBarry Smith #define KSPTCQMR "tcqmr" 3782bf6240SBarry Smith #define KSPBCGS "bcgs" 3882bf6240SBarry Smith #define KSPCGS "cgs" 3982bf6240SBarry Smith #define KSPTFQMR "tfqmr" 4082bf6240SBarry Smith #define KSPCR "cr" 4182bf6240SBarry Smith #define KSPLSQR "lsqr" 4282bf6240SBarry Smith #define KSPPREONLY "preonly" 4382bf6240SBarry Smith #define KSPQCG "qcg" 44c9cf9b11SBarry Smith #define KSPBICG "bicg" 45c38d4ed2SBarry Smith #define KSPFGMRES "fgmres" 46b4ac9ba4SBarry Smith #define KSPMINRES "minres" 4701c5daebSSatish Balay #define KSPSYMMLQ "symmlq" 48bae98175SBarry Smith #define KSPLGMRES "lgmres" 4949773a63SBarry Smith #define KSPType char* 502eac72dbSBarry Smith 518ba1e511SMatthew Knepley /* Logging support */ 52*6849ba73SBarry Smith extern PetscCookie KSP_COOKIE; 53*6849ba73SBarry Smith extern PetscEvent KSP_GMRESOrthogonalization, KSP_SetUp, KSP_Solve; 548ba1e511SMatthew Knepley 55dfbe8321SBarry Smith EXTERN PetscErrorCode KSPCreate(MPI_Comm,KSP *); 56dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSetType(KSP,const KSPType); 57dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSetUp(KSP); 58dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSetUpOnBlocks(KSP); 59dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSolve(KSP,Vec,Vec); 60dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSolveTranspose(KSP,Vec,Vec); 61dfbe8321SBarry Smith EXTERN PetscErrorCode KSPDestroy(KSP); 622eac72dbSBarry Smith 63b0a32e0cSBarry Smith extern PetscFList KSPList; 64dfbe8321SBarry Smith EXTERN PetscErrorCode KSPRegisterAll(const char[]); 65dfbe8321SBarry Smith EXTERN PetscErrorCode KSPRegisterDestroy(void); 662eac72dbSBarry Smith 67*6849ba73SBarry Smith EXTERN PetscErrorCode KSPRegister(const char[],const char[],const char[],PetscErrorCode (*)(KSP)); 6830de9b25SBarry Smith 6930de9b25SBarry Smith /*MC 7030de9b25SBarry Smith KSPRegisterDynamic - Adds a method to the Krylov subspace solver package. 7130de9b25SBarry Smith 7230de9b25SBarry Smith Synopsis: 73*6849ba73SBarry Smith int KSPRegisterDynamic(char *name_solver,char *path,char *name_create,PetscErrorCode (*routine_create)(KSP)) 7430de9b25SBarry Smith 7530de9b25SBarry Smith Not Collective 7630de9b25SBarry Smith 7730de9b25SBarry Smith Input Parameters: 7830de9b25SBarry Smith + name_solver - name of a new user-defined solver 7930de9b25SBarry Smith . path - path (either absolute or relative) the library containing this solver 8030de9b25SBarry Smith . name_create - name of routine to create method context 8130de9b25SBarry Smith - routine_create - routine to create method context 8230de9b25SBarry Smith 8330de9b25SBarry Smith Notes: 8430de9b25SBarry Smith KSPRegisterDynamic() may be called multiple times to add several user-defined solvers. 8530de9b25SBarry Smith 8630de9b25SBarry Smith If dynamic libraries are used, then the fourth input argument (routine_create) 8730de9b25SBarry Smith is ignored. 8830de9b25SBarry Smith 8930de9b25SBarry Smith Sample usage: 9030de9b25SBarry Smith .vb 9130de9b25SBarry Smith KSPRegisterDynamic("my_solver",/home/username/my_lib/lib/libO/solaris/mylib.a, 9230de9b25SBarry Smith "MySolverCreate",MySolverCreate); 9330de9b25SBarry Smith .ve 9430de9b25SBarry Smith 9530de9b25SBarry Smith Then, your solver can be chosen with the procedural interface via 9630de9b25SBarry Smith $ KSPSetType(ksp,"my_solver") 9730de9b25SBarry Smith or at runtime via the option 9830de9b25SBarry Smith $ -ksp_type my_solver 9930de9b25SBarry Smith 10030de9b25SBarry Smith Level: advanced 10130de9b25SBarry Smith 10230de9b25SBarry Smith Notes: Environmental variables such as ${PETSC_ARCH}, ${PETSC_DIR}, ${PETSC_LIB_DIR}, ${BOPT}, 10330de9b25SBarry Smith and others of the form ${any_environmental_variable} occuring in pathname will be 10430de9b25SBarry Smith replaced with appropriate values. 10530de9b25SBarry Smith If your function is not being put into a shared library then use KSPRegister() instead 10630de9b25SBarry Smith 10730de9b25SBarry Smith .keywords: KSP, register 10830de9b25SBarry Smith 10930de9b25SBarry Smith .seealso: KSPRegisterAll(), KSPRegisterDestroy() 11030de9b25SBarry Smith 11130de9b25SBarry Smith M*/ 112aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 113f1af5d2fSBarry Smith #define KSPRegisterDynamic(a,b,c,d) KSPRegister(a,b,c,0) 1146df38c32SLois Curfman McInnes #else 115f1af5d2fSBarry Smith #define KSPRegisterDynamic(a,b,c,d) KSPRegister(a,b,c,d) 1166df38c32SLois Curfman McInnes #endif 11782bf6240SBarry Smith 118dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGetType(KSP,KSPType *); 119dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSetPreconditionerSide(KSP,PCSide); 120dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGetPreconditionerSide(KSP,PCSide*); 121dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGetTolerances(KSP,PetscReal*,PetscReal*,PetscReal*,int*); 122dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSetTolerances(KSP,PetscReal,PetscReal,PetscReal,int); 123dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSetInitialGuessNonzero(KSP,PetscTruth); 124dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGetInitialGuessNonzero(KSP,PetscTruth *); 125dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSetInitialGuessKnoll(KSP,PetscTruth); 126dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGetInitialGuessKnoll(KSP,PetscTruth*); 127dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSetComputeEigenvalues(KSP,PetscTruth); 128dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSetComputeSingularValues(KSP,PetscTruth); 129dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGetRhs(KSP,Vec *); 130dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGetSolution(KSP,Vec *); 131dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGetResidualNorm(KSP,PetscReal*); 132dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGetIterationNumber(KSP,int*); 133dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSetNullSpace(KSP,MatNullSpace); 134dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGetNullSpace(KSP,MatNullSpace*); 1352eac72dbSBarry Smith 136dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSetPC(KSP,PC); 137dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGetPC(KSP,PC*); 138aabeff55SBarry Smith 139*6849ba73SBarry Smith EXTERN PetscErrorCode KSPSetMonitor(KSP,PetscErrorCode (*)(KSP,int,PetscReal,void*),void *,PetscErrorCode (*)(void*)); 140dfbe8321SBarry Smith EXTERN PetscErrorCode KSPClearMonitor(KSP); 141dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGetMonitorContext(KSP,void **); 142dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGetResidualHistory(KSP,PetscReal*[],int *); 143dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSetResidualHistory(KSP,PetscReal[],int,PetscTruth); 1444b0e389bSBarry Smith 1450e33f6ddSBarry Smith /* not sure where to put this */ 146dfbe8321SBarry Smith EXTERN PetscErrorCode PCKSPGetKSP(PC,KSP*); 147dfbe8321SBarry Smith EXTERN PetscErrorCode PCBJacobiGetSubKSP(PC,int*,int*,KSP*[]); 148dfbe8321SBarry Smith EXTERN PetscErrorCode PCASMGetSubKSP(PC,int*,int*,KSP*[]); 1492eac72dbSBarry Smith 150dfbe8321SBarry Smith EXTERN PetscErrorCode KSPBuildSolution(KSP,Vec,Vec *); 151dfbe8321SBarry Smith EXTERN PetscErrorCode KSPBuildResidual(KSP,Vec,Vec,Vec *); 1522eac72dbSBarry Smith 153dfbe8321SBarry Smith EXTERN PetscErrorCode KSPRichardsonSetScale(KSP,PetscReal); 154dfbe8321SBarry Smith EXTERN PetscErrorCode KSPChebychevSetEigenvalues(KSP,PetscReal,PetscReal); 155dfbe8321SBarry Smith EXTERN PetscErrorCode KSPComputeExtremeSingularValues(KSP,PetscReal*,PetscReal*); 156dfbe8321SBarry Smith EXTERN PetscErrorCode KSPComputeEigenvalues(KSP,int,PetscReal*,PetscReal*,int *); 157dfbe8321SBarry Smith EXTERN PetscErrorCode KSPComputeEigenvaluesExplicitly(KSP,int,PetscReal*,PetscReal*); 1584b0e389bSBarry Smith 159dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGMRESSetRestart(KSP, int); 160dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGMRESSetHapTol(KSP,PetscReal); 1619f236934SBarry Smith 162dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGMRESSetPreAllocateVectors(KSP); 163*6849ba73SBarry Smith EXTERN PetscErrorCode KSPGMRESSetOrthogonalization(KSP,PetscErrorCode (*)(KSP,int)); 164dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGMRESModifiedGramSchmidtOrthogonalization(KSP,int); 165dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGMRESClassicalGramSchmidtOrthogonalization(KSP,int); 1661d73ed98SBarry Smith 167dfbe8321SBarry Smith EXTERN PetscErrorCode KSPLGMRESSetAugDim(KSP,int); 168dfbe8321SBarry Smith EXTERN PetscErrorCode KSPLGMRESSetConstant(KSP); 1691d73ed98SBarry Smith 170b49fd9e1SBarry Smith /*E 171b49fd9e1SBarry Smith KSPGMRESCGSRefinementType - How the classical (unmodified) Gram-Schmidt is performed. 172b49fd9e1SBarry Smith 173b49fd9e1SBarry Smith Level: advanced 174b49fd9e1SBarry Smith 175b49fd9e1SBarry Smith .seealso: KSPGMRESClassicalGramSchmidtOrthogonalization(), KSPGMRESSetOrthogonalization(), 1768c5b8ba0SBarry Smith KSPGMRESSetCGSRefinementType(), KSPGMRESModifiedGramSchmidtOrthogonalization() 177b49fd9e1SBarry Smith 178b49fd9e1SBarry Smith E*/ 17978d1dd23SKris Buschelman typedef enum {KSP_GMRES_CGS_REFINE_NEVER, KSP_GMRES_CGS_REFINE_IFNEEDED, KSP_GMRES_CGS_REFINE_ALWAYS} KSPGMRESCGSRefinementType; 1808c5b8ba0SBarry Smith 1818c5b8ba0SBarry Smith /*M 1828c5b8ba0SBarry Smith KSP_GMRES_CGS_REFINE_NEVER - Just do the classical (unmodified) Gram-Schmidt process 1838c5b8ba0SBarry Smith 1848c5b8ba0SBarry Smith Level: advanced 1858c5b8ba0SBarry Smith 1868c5b8ba0SBarry Smith Note: Possible unstable, but the fastest to compute 1878c5b8ba0SBarry Smith 1888c5b8ba0SBarry Smith .seealso: KSPGMRESClassicalGramSchmidtOrthogonalization(), KSPGMRESSetOrthogonalization(), 1898c5b8ba0SBarry Smith KSPGMRESSetCGSRefinementType(), KSP_GMRES_CGS_REFINE_IFNEEDED, KSP_GMRES_CGS_REFINE_ALWAYS, 1908c5b8ba0SBarry Smith KSPGMRESModifiedGramSchmidtOrthogonalization() 1918c5b8ba0SBarry Smith M*/ 1928c5b8ba0SBarry Smith 1938c5b8ba0SBarry Smith /*M 1948c5b8ba0SBarry Smith KSP_GMRES_CGS_REFINE_IFNEEDED - Do the classical (unmodified) Gram-Schmidt process and one step of 1958c5b8ba0SBarry Smith iterative refinement if an estimate of the orthogonality of the resulting vectors indicates 1968c5b8ba0SBarry Smith poor orthogonality. 1978c5b8ba0SBarry Smith 1988c5b8ba0SBarry Smith Level: advanced 1998c5b8ba0SBarry Smith 2008c5b8ba0SBarry Smith Note: This is slower than KSP_GMRES_CGS_REFINE_NEVER because it requires an extra norm computation to 2018c5b8ba0SBarry Smith estimate the orthogonality but is more stable. 2028c5b8ba0SBarry Smith 2038c5b8ba0SBarry Smith .seealso: KSPGMRESClassicalGramSchmidtOrthogonalization(), KSPGMRESSetOrthogonalization(), 2048c5b8ba0SBarry Smith KSPGMRESSetCGSRefinementType(), KSP_GMRES_CGS_REFINE_NEVER, KSP_GMRES_CGS_REFINE_ALWAYS, 2058c5b8ba0SBarry Smith KSPGMRESModifiedGramSchmidtOrthogonalization() 2068c5b8ba0SBarry Smith M*/ 2078c5b8ba0SBarry Smith 2088c5b8ba0SBarry Smith /*M 2098c5b8ba0SBarry Smith KSP_GMRES_CGS_REFINE_NEVER - Do two steps of the classical (unmodified) Gram-Schmidt process. 2108c5b8ba0SBarry Smith 2118c5b8ba0SBarry Smith Level: advanced 2128c5b8ba0SBarry Smith 2138c5b8ba0SBarry Smith Note: This is roughly twice the cost of KSP_GMRES_CGS_REFINE_NEVER because it performs the process twice 2148c5b8ba0SBarry Smith but it saves the extra norm calculation needed by KSP_GMRES_CGS_REFINE_IFNEEDED. 2158c5b8ba0SBarry Smith 2168c5b8ba0SBarry Smith You should only use this if you absolutely know that the iterative refinement is needed. 2178c5b8ba0SBarry Smith 2188c5b8ba0SBarry Smith .seealso: KSPGMRESClassicalGramSchmidtOrthogonalization(), KSPGMRESSetOrthogonalization(), 2198c5b8ba0SBarry Smith KSPGMRESSetCGSRefinementType(), KSP_GMRES_CGS_REFINE_IFNEEDED, KSP_GMRES_CGS_REFINE_ALWAYS, 2208c5b8ba0SBarry Smith KSPGMRESModifiedGramSchmidtOrthogonalization() 2218c5b8ba0SBarry Smith M*/ 2228c5b8ba0SBarry Smith 223dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGMRESSetCGSRefinementType(KSP,KSPGMRESCGSRefinementType); 22408480c60SBarry Smith 225dfbe8321SBarry Smith EXTERN PetscErrorCode KSPFGMRESModifyPCNoChange(KSP,int,int,PetscReal,void*); 226dfbe8321SBarry Smith EXTERN PetscErrorCode KSPFGMRESModifyPCKSP(KSP,int,int,PetscReal,void*); 227*6849ba73SBarry Smith EXTERN PetscErrorCode KSPFGMRESSetModifyPC(KSP,PetscErrorCode (*)(KSP,int,int,PetscReal,void*),void*,PetscErrorCode(*)(void*)); 228c38d4ed2SBarry Smith 229dfbe8321SBarry Smith EXTERN PetscErrorCode KSPQCGSetTrustRegionRadius(KSP,PetscReal); 230dfbe8321SBarry Smith EXTERN PetscErrorCode KSPQCGGetQuadratic(KSP,PetscReal*); 231dfbe8321SBarry Smith EXTERN PetscErrorCode KSPQCGGetTrialStepNorm(KSP,PetscReal*); 232121fd945SKris Buschelman 233dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSetFromOptions(KSP); 234*6849ba73SBarry Smith EXTERN PetscErrorCode KSPAddOptionsChecker(PetscErrorCode (*)(KSP)); 2352eac72dbSBarry Smith 236dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSingularValueMonitor(KSP,int,PetscReal,void *); 237dfbe8321SBarry Smith EXTERN PetscErrorCode KSPDefaultMonitor(KSP,int,PetscReal,void *); 238dfbe8321SBarry Smith EXTERN PetscErrorCode KSPTrueMonitor(KSP,int,PetscReal,void *); 239dfbe8321SBarry Smith EXTERN PetscErrorCode KSPDefaultSMonitor(KSP,int,PetscReal,void *); 240dfbe8321SBarry Smith EXTERN PetscErrorCode KSPVecViewMonitor(KSP,int,PetscReal,void *); 241dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGMRESKrylovMonitor(KSP,int,PetscReal,void *); 24284cb2905SBarry Smith 243dfbe8321SBarry Smith EXTERN PetscErrorCode KSPUnwindPreconditioner(KSP,Vec,Vec); 244dfbe8321SBarry Smith EXTERN PetscErrorCode KSPDefaultBuildSolution(KSP,Vec,Vec*); 245dfbe8321SBarry Smith EXTERN PetscErrorCode KSPDefaultBuildResidual(KSP,Vec,Vec,Vec *); 246c01c455dSBarry Smith 247dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSetOperators(KSP,Mat,Mat,MatStructure); 248dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSetOptionsPrefix(KSP,const char[]); 249dfbe8321SBarry Smith EXTERN PetscErrorCode KSPAppendOptionsPrefix(KSP,const char[]); 250dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGetOptionsPrefix(KSP,char*[]); 2511eb62cbbSBarry Smith 252dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSetDiagonalScale(KSP,PetscTruth); 253dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGetDiagonalScale(KSP,PetscTruth*); 254dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSetDiagonalScaleFix(KSP,PetscTruth); 255dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGetDiagonalScaleFix(KSP,PetscTruth*); 2561f7f0c4fSBarry Smith 257dfbe8321SBarry Smith EXTERN PetscErrorCode KSPView(KSP,PetscViewer); 2581eb62cbbSBarry Smith 25928ce4d24SBarry Smith /*E 2608a4b9c5cSBarry Smith KSPNormType - Norm that is passed in the Krylov convergence 2618a4b9c5cSBarry Smith test routines. 2628a4b9c5cSBarry Smith 2638a4b9c5cSBarry Smith Level: advanced 2648a4b9c5cSBarry Smith 2658a4b9c5cSBarry Smith Notes: this must match finclude/petscksp.h 2668a4b9c5cSBarry Smith 26794b7f48cSBarry Smith .seealso: KSPSolve(), KSPGetConvergedReason(), KSPSetNormType(), 2688a4b9c5cSBarry Smith KSPSetConvergenceTest() 2698a4b9c5cSBarry Smith E*/ 2708a4b9c5cSBarry Smith typedef enum {KSP_NO_NORM = 0, 2718a4b9c5cSBarry Smith KSP_PRECONDITIONED_NORM = 1, 2728a4b9c5cSBarry Smith KSP_UNPRECONDITIONED_NORM = 2, 2738a4b9c5cSBarry Smith KSP_NATURAL_NORM = 3} KSPNormType; 2748c5b8ba0SBarry Smith 2758c5b8ba0SBarry Smith /*M 2768c5b8ba0SBarry Smith KSP_NO_NORM - Do not compute a norm during the Krylov process. This will 2778c5b8ba0SBarry Smith possibly save some computation but means the convergence test cannot 2788c5b8ba0SBarry Smith be based on a norm of a residual etc. 2798c5b8ba0SBarry Smith 2808c5b8ba0SBarry Smith Level: advanced 2818c5b8ba0SBarry Smith 2828c5b8ba0SBarry Smith Note: Some Krylov methods need to compute a residual norm and then this is ignored 2838c5b8ba0SBarry Smith 2848c5b8ba0SBarry Smith .seealso: KSPNormType, KSPSetNormType(), KSP_PRECONDITIONED_NORM, KSP_UNPRECONDITIONED_NORM, KSP_NATURAL_NORM 2858c5b8ba0SBarry Smith M*/ 2868c5b8ba0SBarry Smith 2878c5b8ba0SBarry Smith /*M 2888c5b8ba0SBarry Smith KSP_PRECONDITIONED_NORM - Compute the norm of the preconditioned residual and pass that to the 2898c5b8ba0SBarry Smith convergence test routine. 2908c5b8ba0SBarry Smith 2918c5b8ba0SBarry Smith Level: advanced 2928c5b8ba0SBarry Smith 2938c5b8ba0SBarry Smith .seealso: KSPNormType, KSPSetNormType(), KSP_NO_NORM, KSP_UNPRECONDITIONED_NORM, KSP_NATURAL_NORM, KSPSetConvergenceTest() 2948c5b8ba0SBarry Smith M*/ 2958c5b8ba0SBarry Smith 2968c5b8ba0SBarry Smith /*M 2978c5b8ba0SBarry Smith KSP_UNPRECONDITIONED_NORM - Compute the norm of the true residual (b - A*x) and pass that to the 2988c5b8ba0SBarry Smith convergence test routine. 2998c5b8ba0SBarry Smith 3008c5b8ba0SBarry Smith Level: advanced 3018c5b8ba0SBarry Smith 3028c5b8ba0SBarry Smith .seealso: KSPNormType, KSPSetNormType(), KSP_NO_NORM, KSP_PRECONDITIONED_NORM, KSP_NATURAL_NORM, KSPSetConvergenceTest() 3038c5b8ba0SBarry Smith M*/ 3048c5b8ba0SBarry Smith 3058c5b8ba0SBarry Smith /*M 3068c5b8ba0SBarry Smith KSP_NATURAL_NORM - Compute the 'natural norm' of residual sqrt((b - A*x)*B*(b - A*x)) and pass that to the 3078c5b8ba0SBarry Smith convergence test routine. 3088c5b8ba0SBarry Smith 3098c5b8ba0SBarry Smith Level: advanced 3108c5b8ba0SBarry Smith 3118c5b8ba0SBarry Smith .seealso: KSPNormType, KSPSetNormType(), KSP_NO_NORM, KSP_PRECONDITIONED_NORM, KSP_UNPRECONDITIONED_NORM, KSPSetConvergenceTest() 3128c5b8ba0SBarry Smith M*/ 3138c5b8ba0SBarry Smith 314dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSetNormType(KSP,KSPNormType); 3158a4b9c5cSBarry Smith 3168a4b9c5cSBarry Smith /*E 31728ce4d24SBarry Smith KSPConvergedReason - reason a Krylov method was said to 31828ce4d24SBarry Smith have converged or diverged 31928ce4d24SBarry Smith 32028ce4d24SBarry Smith Level: beginner 32128ce4d24SBarry Smith 32228ce4d24SBarry Smith Notes: this must match finclude/petscksp.h 32328ce4d24SBarry Smith 32486c02ca4SBarry Smith Developer note: The string versions of these are in 3254b9ad928SBarry Smith src/ksp/ksp/interface/itfunc.c called convergedreasons. 32686c02ca4SBarry Smith If these enums are changed you much change those. 32786c02ca4SBarry Smith 328718d5cbfSvictorle .seealso: KSPSolve(), KSPGetConvergedReason() 32928ce4d24SBarry Smith E*/ 330d15094e1SBarry Smith typedef enum {/* converged */ 331d15094e1SBarry Smith KSP_CONVERGED_RTOL = 2, 332d15094e1SBarry Smith KSP_CONVERGED_ATOL = 3, 333b335793eSSatish Balay KSP_CONVERGED_ITS = 4, 3348d9717b1SSatish Balay KSP_CONVERGED_QCG_NEG_CURVE = 5, 335329f5518SBarry Smith KSP_CONVERGED_QCG_CONSTRAINED = 6, 336329f5518SBarry Smith KSP_CONVERGED_STEP_LENGTH = 7, 337d15094e1SBarry Smith /* diverged */ 338b3cc6726SBarry Smith KSP_DIVERGED_NULL = -2, 339d15094e1SBarry Smith KSP_DIVERGED_ITS = -3, 340d15094e1SBarry Smith KSP_DIVERGED_DTOL = -4, 341d15094e1SBarry Smith KSP_DIVERGED_BREAKDOWN = -5, 342b4ac9ba4SBarry Smith KSP_DIVERGED_BREAKDOWN_BICG = -6, 343b4ac9ba4SBarry Smith KSP_DIVERGED_NONSYMMETRIC = -7, 344b4ac9ba4SBarry Smith KSP_DIVERGED_INDEFINITE_PC = -8, 345d15094e1SBarry Smith 346d15094e1SBarry Smith KSP_CONVERGED_ITERATING = 0} KSPConvergedReason; 347d15094e1SBarry Smith 348*6849ba73SBarry Smith EXTERN PetscErrorCode KSPSetConvergenceTest(KSP,PetscErrorCode (*)(KSP,int,PetscReal,KSPConvergedReason*,void*),void *); 349dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGetConvergenceContext(KSP,void **); 350dfbe8321SBarry Smith EXTERN PetscErrorCode KSPDefaultConverged(KSP,int,PetscReal,KSPConvergedReason*,void *); 351dfbe8321SBarry Smith EXTERN PetscErrorCode KSPSkipConverged(KSP,int,PetscReal,KSPConvergedReason*,void *); 352dfbe8321SBarry Smith EXTERN PetscErrorCode KSPGetConvergedReason(KSP,KSPConvergedReason *); 353abef13c0SSatish Balay 354dfbe8321SBarry Smith EXTERN PetscErrorCode KSPComputeExplicitOperator(KSP,Mat *); 355d4fbbf0eSBarry Smith 35628ce4d24SBarry Smith /*E 35728ce4d24SBarry Smith KSPCGType - Determines what type of CG to use 35828ce4d24SBarry Smith 35928ce4d24SBarry Smith Level: beginner 36028ce4d24SBarry Smith 36128ce4d24SBarry Smith .seealso: KSPCGSetType() 36228ce4d24SBarry Smith E*/ 3636d4a8577SBarry Smith typedef enum {KSP_CG_SYMMETRIC=1,KSP_CG_HERMITIAN=2} KSPCGType; 36428ce4d24SBarry Smith 365dfbe8321SBarry Smith EXTERN PetscErrorCode KSPCGSetType(KSP,KSPCGType); 366e559a7feSLois Curfman McInnes 367dfbe8321SBarry Smith EXTERN PetscErrorCode PCPreSolve(PC,KSP); 368dfbe8321SBarry Smith EXTERN PetscErrorCode PCPostSolve(PC,KSP); 3693369ce9aSBarry Smith 370dfbe8321SBarry Smith EXTERN PetscErrorCode KSPLGMonitorCreate(const char[],const char[],int,int,int,int,PetscDrawLG*); 371dfbe8321SBarry Smith EXTERN PetscErrorCode KSPLGMonitor(KSP,int,PetscReal,void*); 372dfbe8321SBarry Smith EXTERN PetscErrorCode KSPLGMonitorDestroy(PetscDrawLG); 373dfbe8321SBarry Smith EXTERN PetscErrorCode KSPLGTrueMonitorCreate(MPI_Comm,const char[],const char[],int,int,int,int,PetscDrawLG*); 374dfbe8321SBarry Smith EXTERN PetscErrorCode KSPLGTrueMonitor(KSP,int,PetscReal,void*); 375dfbe8321SBarry Smith EXTERN PetscErrorCode KSPLGTrueMonitorDestroy(PetscDrawLG); 3761eb62cbbSBarry Smith 377e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END 3782eac72dbSBarry Smith #endif 379