1*ca44d042SBarry Smith /* $Id: petscksp.h,v 1.90 2000/05/08 15:09:50 balay Exp bsmith $ */ 2f26ada1bSBarry Smith /* 3f26ada1bSBarry Smith Defines the interface functions for the Krylov subspace accelerators. 4f26ada1bSBarry Smith */ 50a835dfdSSatish Balay #ifndef __PETSCKSP_H 60a835dfdSSatish Balay #define __PETSCKSP_H 70a835dfdSSatish Balay #include "petscpc.h" 82eac72dbSBarry Smith 99e25ed09SBarry Smith #define KSP_COOKIE PETSC_COOKIE+8 10f0479e8cSBarry Smith 11e2a1c21fSSatish Balay typedef struct _p_KSP* KSP; 122eac72dbSBarry Smith 1382bf6240SBarry Smith #define KSPRICHARDSON "richardson" 1482bf6240SBarry Smith #define KSPCHEBYCHEV "chebychev" 1582bf6240SBarry Smith #define KSPCG "cg" 1682bf6240SBarry Smith #define KSPGMRES "gmres" 1782bf6240SBarry Smith #define KSPTCQMR "tcqmr" 1882bf6240SBarry Smith #define KSPBCGS "bcgs" 1982bf6240SBarry Smith #define KSPCGS "cgs" 2082bf6240SBarry Smith #define KSPTFQMR "tfqmr" 2182bf6240SBarry Smith #define KSPCR "cr" 2282bf6240SBarry Smith #define KSPLSQR "lsqr" 2382bf6240SBarry Smith #define KSPPREONLY "preonly" 2482bf6240SBarry Smith #define KSPQCG "qcg" 25c9cf9b11SBarry Smith #define KSPBICG "bicg" 26c38d4ed2SBarry Smith #define KSPFGMRES "fgmres" 27b4ac9ba4SBarry Smith #define KSPMINRES "minres" 2882bf6240SBarry Smith typedef char * KSPType; 292eac72dbSBarry Smith 30*ca44d042SBarry Smith EXTERN int KSPCreate(MPI_Comm,KSP *); 31*ca44d042SBarry Smith EXTERN int KSPSetType(KSP,KSPType); 32*ca44d042SBarry Smith EXTERN int KSPSetUp(KSP); 33*ca44d042SBarry Smith EXTERN int KSPSolve(KSP,int *); 34*ca44d042SBarry Smith EXTERN int KSPSolveTranspose(KSP,int *); 35*ca44d042SBarry Smith EXTERN int KSPDestroy(KSP); 362eac72dbSBarry Smith 37488ecbafSBarry Smith extern FList KSPList; 38*ca44d042SBarry Smith EXTERN int KSPRegisterAll(char *); 39*ca44d042SBarry Smith EXTERN int KSPRegisterDestroy(void); 402eac72dbSBarry Smith 41*ca44d042SBarry Smith EXTERN int KSPRegister(char*,char*,char*,int(*)(KSP)); 42aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 43f1af5d2fSBarry Smith #define KSPRegisterDynamic(a,b,c,d) KSPRegister(a,b,c,0) 446df38c32SLois Curfman McInnes #else 45f1af5d2fSBarry Smith #define KSPRegisterDynamic(a,b,c,d) KSPRegister(a,b,c,d) 466df38c32SLois Curfman McInnes #endif 4782bf6240SBarry Smith 48*ca44d042SBarry Smith EXTERN int KSPGetType(KSP,KSPType *); 49*ca44d042SBarry Smith EXTERN int KSPSetPreconditionerSide(KSP,PCSide); 50*ca44d042SBarry Smith EXTERN int KSPGetPreconditionerSide(KSP,PCSide*); 51*ca44d042SBarry Smith EXTERN int KSPGetTolerances(KSP,double*,double*,double*,int*); 52*ca44d042SBarry Smith EXTERN int KSPSetTolerances(KSP,double,double,double,int); 53*ca44d042SBarry Smith EXTERN int KSPSetComputeResidual(KSP,PetscTruth); 54*ca44d042SBarry Smith EXTERN int KSPSetUsePreconditionedResidual(KSP); 55*ca44d042SBarry Smith EXTERN int KSPSetInitialGuessNonzero(KSP); 56*ca44d042SBarry Smith EXTERN int KSPGetInitialGuessNonzero(KSP,PetscTruth *); 57*ca44d042SBarry Smith EXTERN int KSPSetComputeEigenvalues(KSP); 58*ca44d042SBarry Smith EXTERN int KSPSetComputeSingularValues(KSP); 59*ca44d042SBarry Smith EXTERN int KSPSetRhs(KSP,Vec); 60*ca44d042SBarry Smith EXTERN int KSPGetRhs(KSP,Vec *); 61*ca44d042SBarry Smith EXTERN int KSPSetSolution(KSP,Vec); 62*ca44d042SBarry Smith EXTERN int KSPGetSolution(KSP,Vec *); 63*ca44d042SBarry Smith EXTERN int KSPGetResidualNorm(KSP,double*); 64*ca44d042SBarry Smith EXTERN int KSPGetIterationNumber(KSP,int*); 652eac72dbSBarry Smith 66*ca44d042SBarry Smith EXTERN int KSPSetPC(KSP,PC); 67*ca44d042SBarry Smith EXTERN int KSPGetPC(KSP,PC*); 68aabeff55SBarry Smith 69*ca44d042SBarry Smith EXTERN int KSPSetAvoidNorms(KSP); 70fcb7de8cSBarry Smith 71*ca44d042SBarry Smith EXTERN int KSPSetMonitor(KSP,int (*)(KSP,int,double,void*),void *,int (*)(void*)); 72*ca44d042SBarry Smith EXTERN int KSPClearMonitor(KSP); 73*ca44d042SBarry Smith EXTERN int KSPGetMonitorContext(KSP,void **); 74*ca44d042SBarry Smith EXTERN int KSPGetResidualHistory(KSP,double **,int *); 75*ca44d042SBarry Smith EXTERN int KSPSetResidualHistory(KSP,double *,int,PetscTruth); 764b0e389bSBarry Smith 772eac72dbSBarry Smith 78*ca44d042SBarry Smith EXTERN int KSPBuildSolution(KSP,Vec,Vec *); 79*ca44d042SBarry Smith EXTERN int KSPBuildResidual(KSP,Vec,Vec,Vec *); 802eac72dbSBarry Smith 81*ca44d042SBarry Smith EXTERN int KSPRichardsonSetScale(KSP,double); 82*ca44d042SBarry Smith EXTERN int KSPChebychevSetEigenvalues(KSP,double,double); 83*ca44d042SBarry Smith EXTERN int KSPComputeExtremeSingularValues(KSP,double*,double*); 84*ca44d042SBarry Smith EXTERN int KSPComputeEigenvalues(KSP,int,double*,double*,int *); 85*ca44d042SBarry Smith EXTERN int KSPComputeEigenvaluesExplicitly(KSP,int,double*,double*); 864b0e389bSBarry Smith 87*ca44d042SBarry Smith EXTERN int KSPGMRESSetRestart(KSP,int); 88*ca44d042SBarry Smith EXTERN int KSPGMRESSetPreAllocateVectors(KSP); 89*ca44d042SBarry Smith EXTERN int KSPGMRESSetOrthogonalization(KSP,int (*)(KSP,int)); 90*ca44d042SBarry Smith EXTERN int KSPGMRESUnmodifiedGramSchmidtOrthogonalization(KSP,int); 91*ca44d042SBarry Smith EXTERN int KSPGMRESModifiedGramSchmidtOrthogonalization(KSP,int); 92*ca44d042SBarry Smith EXTERN int KSPGMRESIROrthogonalization(KSP,int); 9308480c60SBarry Smith 94*ca44d042SBarry Smith EXTERN int KSPFGMRESModifyPCNoChange(KSP,int,int,double,void*); 95*ca44d042SBarry Smith EXTERN int KSPFGMRESModifyPCSLES(KSP,int,int,double,void*); 96*ca44d042SBarry Smith EXTERN int KSPFGMRESSetModifyPC(KSP,int (*)(KSP,int,int,double,void*),void*,int(*)(void*)); 97c38d4ed2SBarry Smith 98*ca44d042SBarry Smith EXTERN int KSPSetFromOptions(KSP); 99*ca44d042SBarry Smith EXTERN int KSPSetTypeFromOptions(KSP); 100*ca44d042SBarry Smith EXTERN int KSPAddOptionsChecker(int (*)(KSP)); 1012eac72dbSBarry Smith 102*ca44d042SBarry Smith EXTERN int KSPSingularValueMonitor(KSP,int,double,void *); 103*ca44d042SBarry Smith EXTERN int KSPDefaultMonitor(KSP,int,double,void *); 104*ca44d042SBarry Smith EXTERN int KSPTrueMonitor(KSP,int,double,void *); 105*ca44d042SBarry Smith EXTERN int KSPDefaultSMonitor(KSP,int,double,void *); 106*ca44d042SBarry Smith EXTERN int KSPVecViewMonitor(KSP,int,double,void *); 107*ca44d042SBarry Smith EXTERN int KSPGMRESKrylovMonitor(KSP,int,double,void *); 10884cb2905SBarry Smith 1092eac72dbSBarry Smith 110*ca44d042SBarry Smith EXTERN int KSPResidual(KSP,Vec,Vec,Vec,Vec,Vec,Vec); 111*ca44d042SBarry Smith EXTERN int KSPUnwindPreconditioner(KSP,Vec,Vec); 112*ca44d042SBarry Smith EXTERN int KSPDefaultBuildSolution(KSP,Vec,Vec*); 113*ca44d042SBarry Smith EXTERN int KSPDefaultBuildResidual(KSP,Vec,Vec,Vec *); 114c01c455dSBarry Smith 115*ca44d042SBarry Smith EXTERN int KSPPrintHelp(KSP); 1168ed539a5SBarry Smith 117*ca44d042SBarry Smith EXTERN int KSPSetOptionsPrefix(KSP,char*); 118*ca44d042SBarry Smith EXTERN int KSPAppendOptionsPrefix(KSP,char*); 119*ca44d042SBarry Smith EXTERN int KSPGetOptionsPrefix(KSP,char**); 1201eb62cbbSBarry Smith 121*ca44d042SBarry Smith EXTERN int KSPView(KSP,Viewer); 1221eb62cbbSBarry Smith 123d15094e1SBarry Smith typedef enum {/* converged */ 124d15094e1SBarry Smith KSP_CONVERGED_RTOL = 2, 125d15094e1SBarry Smith KSP_CONVERGED_ATOL = 3, 126b335793eSSatish Balay KSP_CONVERGED_ITS = 4, 127329f5518SBarry Smith KSP_CONVERGED_QCG_NEGATIVE_CURVE = 5, 128329f5518SBarry Smith KSP_CONVERGED_QCG_CONSTRAINED = 6, 129329f5518SBarry Smith KSP_CONVERGED_STEP_LENGTH = 7, 130d15094e1SBarry Smith /* diverged */ 131d15094e1SBarry Smith KSP_DIVERGED_ITS = -3, 132d15094e1SBarry Smith KSP_DIVERGED_DTOL = -4, 133d15094e1SBarry Smith KSP_DIVERGED_BREAKDOWN = -5, 134b4ac9ba4SBarry Smith KSP_DIVERGED_BREAKDOWN_BICG = -6, 135b4ac9ba4SBarry Smith KSP_DIVERGED_NONSYMMETRIC = -7, 136b4ac9ba4SBarry Smith KSP_DIVERGED_INDEFINITE_PC = -8, 137d15094e1SBarry Smith 138d15094e1SBarry Smith KSP_CONVERGED_ITERATING = 0} KSPConvergedReason; 139d15094e1SBarry Smith 140*ca44d042SBarry Smith EXTERN int KSPSetConvergenceTest(KSP,int (*)(KSP,int,double,KSPConvergedReason*,void*),void *); 141*ca44d042SBarry Smith EXTERN int KSPGetConvergenceContext(KSP,void **); 142*ca44d042SBarry Smith EXTERN int KSPDefaultConverged(KSP,int,double,KSPConvergedReason*,void *); 143*ca44d042SBarry Smith EXTERN int KSPSkipConverged(KSP,int,double,KSPConvergedReason*,void *); 144*ca44d042SBarry Smith EXTERN int KSPGetConvergedReason(KSP,KSPConvergedReason *); 145abef13c0SSatish Balay 146*ca44d042SBarry Smith EXTERN int KSPComputeExplicitOperator(KSP,Mat *); 147d4fbbf0eSBarry Smith 1486d4a8577SBarry Smith typedef enum {KSP_CG_SYMMETRIC=1,KSP_CG_HERMITIAN=2} KSPCGType; 149*ca44d042SBarry Smith EXTERN int KSPCGSetType(KSP,KSPCGType); 150e559a7feSLois Curfman McInnes 151*ca44d042SBarry Smith EXTERN int PCPreSolve(PC,KSP); 152*ca44d042SBarry Smith EXTERN int PCPostSolve(PC,KSP); 1533369ce9aSBarry Smith 154*ca44d042SBarry Smith EXTERN int KSPLGMonitorCreate(char*,char*,int,int,int,int,DrawLG*); 155*ca44d042SBarry Smith EXTERN int KSPLGMonitor(KSP,int,double,void*); 156*ca44d042SBarry Smith EXTERN int KSPLGMonitorDestroy(DrawLG); 157*ca44d042SBarry Smith EXTERN int KSPLGTrueMonitorCreate(MPI_Comm,char*,char*,int,int,int,int,DrawLG*); 158*ca44d042SBarry Smith EXTERN int KSPLGTrueMonitor(KSP,int,double,void*); 159*ca44d042SBarry Smith EXTERN int KSPLGTrueMonitorDestroy(DrawLG); 1601eb62cbbSBarry Smith 1612eac72dbSBarry Smith #endif 1622eac72dbSBarry Smith 1632eac72dbSBarry Smith 164