1*b335793eSSatish Balay /* $Id: ksp.h,v 1.86 1999/12/03 19:03:37 balay Exp balay $ */ 2f26ada1bSBarry Smith /* 3f26ada1bSBarry Smith Defines the interface functions for the Krylov subspace accelerators. 4f26ada1bSBarry Smith */ 588d459dfSBarry Smith #ifndef __KSP_H 688d459dfSBarry Smith #define __KSP_H 72eac72dbSBarry Smith #include "petsc.h" 82eac72dbSBarry Smith #include "vec.h" 9aabeff55SBarry Smith #include "mat.h" 10aabeff55SBarry Smith #include "pc.h" 112eac72dbSBarry Smith 129e25ed09SBarry Smith #define KSP_COOKIE PETSC_COOKIE+8 13f0479e8cSBarry Smith 14e2a1c21fSSatish Balay typedef struct _p_KSP* KSP; 152eac72dbSBarry Smith 1682bf6240SBarry Smith #define KSPRICHARDSON "richardson" 1782bf6240SBarry Smith #define KSPCHEBYCHEV "chebychev" 1882bf6240SBarry Smith #define KSPCG "cg" 1982bf6240SBarry Smith #define KSPGMRES "gmres" 2082bf6240SBarry Smith #define KSPTCQMR "tcqmr" 2182bf6240SBarry Smith #define KSPBCGS "bcgs" 2282bf6240SBarry Smith #define KSPCGS "cgs" 2382bf6240SBarry Smith #define KSPTFQMR "tfqmr" 2482bf6240SBarry Smith #define KSPCR "cr" 2582bf6240SBarry Smith #define KSPLSQR "lsqr" 2682bf6240SBarry Smith #define KSPPREONLY "preonly" 2782bf6240SBarry Smith #define KSPQCG "qcg" 28c9cf9b11SBarry Smith #define KSPBICG "bicg" 29c38d4ed2SBarry Smith #define KSPFGMRES "fgmres" 3082bf6240SBarry Smith typedef char * KSPType; 312eac72dbSBarry Smith 326b5873e3SBarry Smith extern int KSPCreate(MPI_Comm,KSP *); 334b0e389bSBarry Smith extern int KSPSetType(KSP,KSPType); 348ed539a5SBarry Smith extern int KSPSetUp(KSP); 358ed539a5SBarry Smith extern int KSPSolve(KSP,int *); 367c922b88SBarry Smith extern int KSPSolveTranspose(KSP,int *); 378ed539a5SBarry Smith extern int KSPDestroy(KSP); 382eac72dbSBarry Smith 39488ecbafSBarry Smith extern FList KSPList; 4082bf6240SBarry Smith extern int KSPRegisterAll(char *); 41cf256101SBarry Smith extern int KSPRegisterDestroy(void); 422eac72dbSBarry Smith 43f1af5d2fSBarry Smith extern int KSPRegister(char*,char*,char*,int(*)(KSP)); 44aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 45f1af5d2fSBarry Smith #define KSPRegisterDynamic(a,b,c,d) KSPRegister(a,b,c,0) 466df38c32SLois Curfman McInnes #else 47f1af5d2fSBarry Smith #define KSPRegisterDynamic(a,b,c,d) KSPRegister(a,b,c,d) 486df38c32SLois Curfman McInnes #endif 4982bf6240SBarry Smith 5082bf6240SBarry Smith extern int KSPGetType(KSP, KSPType *); 51aad2872bSLois Curfman McInnes extern int KSPSetPreconditionerSide(KSP,PCSide); 52aad2872bSLois Curfman McInnes extern int KSPGetPreconditionerSide(KSP,PCSide*); 53ae622e99SLois Curfman McInnes extern int KSPGetTolerances(KSP,double*,double*,double*,int*); 54f9a5357eSLois Curfman McInnes extern int KSPSetTolerances(KSP,double,double,double,int); 55d4fbbf0eSBarry Smith extern int KSPSetComputeResidual(KSP,PetscTruth); 568ed539a5SBarry Smith extern int KSPSetUsePreconditionedResidual(KSP); 57c39b5c85SLois Curfman McInnes extern int KSPSetInitialGuessNonzero(KSP); 58af85ccbcSBarry Smith extern int KSPGetInitialGuessNonzero(KSP,PetscTruth *); 5990f02eecSBarry Smith extern int KSPSetComputeEigenvalues(KSP); 60d4fbbf0eSBarry Smith extern int KSPSetComputeSingularValues(KSP); 618ed539a5SBarry Smith extern int KSPSetRhs(KSP,Vec); 628ed539a5SBarry Smith extern int KSPGetRhs(KSP,Vec *); 638ed539a5SBarry Smith extern int KSPSetSolution(KSP,Vec); 648ed539a5SBarry Smith extern int KSPGetSolution(KSP,Vec *); 6525fce39dSBarry Smith extern int KSPGetResidualNorm(KSP,double*); 66597479d4SBarry Smith extern int KSPGetIterationNumber(KSP,int*); 672eac72dbSBarry Smith 6877c4ece6SBarry Smith extern int KSPSetPC(KSP,PC); 6977c4ece6SBarry Smith extern int KSPGetPC(KSP,PC*); 70aabeff55SBarry Smith 71fcb7de8cSBarry Smith extern int KSPSetAvoidNorms(KSP); 72fcb7de8cSBarry Smith 73b8a78c4aSBarry Smith extern int KSPSetMonitor(KSP,int (*)(KSP,int,double, void*), void *,int (*)(void*)); 745cd90555SBarry Smith extern int KSPClearMonitor(KSP); 758ed539a5SBarry Smith extern int KSPGetMonitorContext(KSP,void **); 760462333dSBarry Smith extern int KSPGetResidualHistory(KSP, double **, int *); 772c9e95e8SBarry Smith extern int KSPSetResidualHistory(KSP, double *,int,PetscTruth); 784b0e389bSBarry Smith 792eac72dbSBarry Smith 808ed539a5SBarry Smith extern int KSPBuildSolution(KSP, Vec,Vec *); 818ed539a5SBarry Smith extern int KSPBuildResidual(KSP, Vec, Vec,Vec *); 822eac72dbSBarry Smith 838ed539a5SBarry Smith extern int KSPRichardsonSetScale(KSP , double); 848ed539a5SBarry Smith extern int KSPChebychevSetEigenvalues(KSP , double, double); 85d4fbbf0eSBarry Smith extern int KSPComputeExtremeSingularValues(KSP, double*,double*); 8688d459dfSBarry Smith extern int KSPComputeEigenvalues(KSP,int,double*,double*,int *); 87d4fbbf0eSBarry Smith extern int KSPComputeEigenvaluesExplicitly(KSP,int,double*,double*); 884b0e389bSBarry Smith 898ed539a5SBarry Smith extern int KSPGMRESSetRestart(KSP, int); 90b4fd4287SBarry Smith extern int KSPGMRESSetPreAllocateVectors(KSP); 9177c4ece6SBarry Smith extern int KSPGMRESSetOrthogonalization(KSP,int (*)(KSP,int)); 92bcd2baecSBarry Smith extern int KSPGMRESUnmodifiedGramSchmidtOrthogonalization(KSP,int); 93bcd2baecSBarry Smith extern int KSPGMRESModifiedGramSchmidtOrthogonalization(KSP,int); 94bcd2baecSBarry Smith extern int KSPGMRESIROrthogonalization(KSP,int); 95cb5b572fSBarry Smith extern int KSPGMRESPrestartSet(KSP,int); 9608480c60SBarry Smith 97c38d4ed2SBarry Smith 98c38d4ed2SBarry Smith extern int KSPFGMRESSetRestart( KSP, int); 99c38d4ed2SBarry Smith extern int KSPFGMRESSetPreAllocateVectors( KSP ); 100c38d4ed2SBarry Smith extern int KSPFGMRESSetOrthogonalization( KSP, int (*)( KSP, int ) ); 101c38d4ed2SBarry Smith extern int KSPFGMRESUnmodifiedGramSchmidtOrthogonalization( KSP, int ); 102c38d4ed2SBarry Smith extern int KSPFGMRESModifiedGramSchmidtOrthogonalization( KSP, int ); 103c38d4ed2SBarry Smith extern int KSPFGMRESIROrthogonalization( KSP, int ); 104c38d4ed2SBarry Smith extern int KSPFGMRESPrestartSet( KSP, int ); 105c38d4ed2SBarry Smith 106c38d4ed2SBarry Smith extern int KSPFGMRESModifyPCNoChange( KSP, int, int, int, int, double ); 107c38d4ed2SBarry Smith extern int KSPFGMRESModifyPCGMRESVariableEx( KSP, int, int, int, int, double ); 108c38d4ed2SBarry Smith extern int KSPFGMRESModifyPCEx( KSP, int, int, int, int, double ); 109c38d4ed2SBarry Smith extern int KSPFGMRESSetModifyPC(KSP,int (*)(KSP,int,int,int,int,double)); 110c38d4ed2SBarry Smith 1118ed539a5SBarry Smith extern int KSPSetFromOptions(KSP); 11215091d37SBarry Smith extern int KSPSetTypeFromOptions(KSP); 113639f9d9dSBarry Smith extern int KSPAddOptionsChecker(int (*)(KSP)); 1142eac72dbSBarry Smith 1158f4c8dbaSBarry Smith extern int KSPSingularValueMonitor(KSP,int,double, void * ); 1168ed539a5SBarry Smith extern int KSPDefaultMonitor(KSP,int,double, void *); 117af6b99e9SBarry Smith extern int KSPTrueMonitor(KSP,int,double, void *); 1188c48e012SBarry Smith extern int KSPDefaultSMonitor(KSP,int,double, void *); 119a302ce19SBarry Smith extern int KSPVecViewMonitor(KSP,int,double,void *); 12021988a88SBarry Smith extern int KSPGMRESKrylovMonitor(KSP,int,double,void *); 12184cb2905SBarry Smith 1222eac72dbSBarry Smith 123c01c455dSBarry Smith extern int KSPResidual(KSP,Vec,Vec,Vec,Vec,Vec,Vec); 12477c4ece6SBarry Smith extern int KSPUnwindPreconditioner(KSP,Vec,Vec); 125c01c455dSBarry Smith extern int KSPDefaultBuildSolution(KSP,Vec,Vec*); 126c01c455dSBarry Smith extern int KSPDefaultBuildResidual(KSP,Vec,Vec,Vec *); 127c01c455dSBarry Smith 1288ed539a5SBarry Smith extern int KSPPrintHelp(KSP); 1298ed539a5SBarry Smith 1301eb62cbbSBarry Smith extern int KSPSetOptionsPrefix(KSP,char*); 1310985bb82SSatish Balay extern int KSPAppendOptionsPrefix(KSP,char*); 1320985bb82SSatish Balay extern int KSPGetOptionsPrefix(KSP,char**); 1331eb62cbbSBarry Smith 1348ed539a5SBarry Smith extern int KSPView(KSP,Viewer); 1351eb62cbbSBarry Smith 136d15094e1SBarry Smith typedef enum {/* converged */ 137d15094e1SBarry Smith KSP_CONVERGED_RTOL = 2, 138d15094e1SBarry Smith KSP_CONVERGED_ATOL = 3, 139*b335793eSSatish Balay KSP_CONVERGED_ITS = 4, 140d15094e1SBarry Smith /* diverged */ 141d15094e1SBarry Smith KSP_DIVERGED_ITS = -3, 142d15094e1SBarry Smith KSP_DIVERGED_DTOL = -4, 143d15094e1SBarry Smith KSP_DIVERGED_BREAKDOWN = -5, 144d15094e1SBarry Smith 145d15094e1SBarry Smith KSP_CONVERGED_ITERATING = 0} KSPConvergedReason; 146d15094e1SBarry Smith 147abef13c0SSatish Balay extern int KSPSetConvergenceTest(KSP,int (*)(KSP,int,double, KSPConvergedReason*,void*), void *); 148abef13c0SSatish Balay extern int KSPGetConvergenceContext(KSP,void **); 149abef13c0SSatish Balay extern int KSPDefaultConverged(KSP,int,double, KSPConvergedReason*,void *); 150abef13c0SSatish Balay extern int KSPSkipConverged(KSP,int,double, KSPConvergedReason*,void *); 151abef13c0SSatish Balay 152d4fbbf0eSBarry Smith extern int KSPComputeExplicitOperator(KSP,Mat *); 153d4fbbf0eSBarry Smith 1546d4a8577SBarry Smith typedef enum {KSP_CG_SYMMETRIC=1, KSP_CG_HERMITIAN=2} KSPCGType; 1556d4a8577SBarry Smith extern int KSPCGSetType(KSP,KSPCGType); 156e559a7feSLois Curfman McInnes 1573369ce9aSBarry Smith extern int PCPreSolve(PC,KSP); 1583369ce9aSBarry Smith extern int PCPostSolve(PC,KSP); 1593369ce9aSBarry Smith 160d7e8b826SBarry Smith extern int KSPLGMonitorCreate(char*,char*,int,int,int,int,DrawLG*); 1611eb62cbbSBarry Smith extern int KSPLGMonitor(KSP,int,double,void*); 162d7e8b826SBarry Smith extern int KSPLGMonitorDestroy(DrawLG); 1633b2fbd54SBarry Smith extern int KSPLGTrueMonitorCreate(MPI_Comm,char*,char*,int,int,int,int,DrawLG*); 164af6b99e9SBarry Smith extern int KSPLGTrueMonitor(KSP,int,double,void*); 165af6b99e9SBarry Smith extern int KSPLGTrueMonitorDestroy(DrawLG); 1661eb62cbbSBarry Smith 1672eac72dbSBarry Smith #endif 1682eac72dbSBarry Smith 1692eac72dbSBarry Smith 170