xref: /petsc/include/petscksp.h (revision 0a835dfde17e989aa2dfc49c3e55e39ea1705529)
1*0a835dfdSSatish Balay /* $Id: petscksp.h,v 1.89 2000/05/04 03:47:37 bsmith Exp balay $ */
2f26ada1bSBarry Smith /*
3f26ada1bSBarry Smith    Defines the interface functions for the Krylov subspace accelerators.
4f26ada1bSBarry Smith */
5*0a835dfdSSatish Balay #ifndef __PETSCKSP_H
6*0a835dfdSSatish Balay #define __PETSCKSP_H
7*0a835dfdSSatish 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 
306b5873e3SBarry Smith extern int KSPCreate(MPI_Comm,KSP *);
314b0e389bSBarry Smith extern int KSPSetType(KSP,KSPType);
328ed539a5SBarry Smith extern int KSPSetUp(KSP);
338ed539a5SBarry Smith extern int KSPSolve(KSP,int *);
347c922b88SBarry Smith extern int KSPSolveTranspose(KSP,int *);
358ed539a5SBarry Smith extern int KSPDestroy(KSP);
362eac72dbSBarry Smith 
37488ecbafSBarry Smith extern FList KSPList;
3882bf6240SBarry Smith extern int KSPRegisterAll(char *);
39cf256101SBarry Smith extern int KSPRegisterDestroy(void);
402eac72dbSBarry Smith 
41f1af5d2fSBarry 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 
4882bf6240SBarry Smith extern int KSPGetType(KSP,KSPType *);
49aad2872bSLois Curfman McInnes extern int KSPSetPreconditionerSide(KSP,PCSide);
50aad2872bSLois Curfman McInnes extern int KSPGetPreconditionerSide(KSP,PCSide*);
51ae622e99SLois Curfman McInnes extern int KSPGetTolerances(KSP,double*,double*,double*,int*);
52f9a5357eSLois Curfman McInnes extern int KSPSetTolerances(KSP,double,double,double,int);
53d4fbbf0eSBarry Smith extern int KSPSetComputeResidual(KSP,PetscTruth);
548ed539a5SBarry Smith extern int KSPSetUsePreconditionedResidual(KSP);
55c39b5c85SLois Curfman McInnes extern int KSPSetInitialGuessNonzero(KSP);
56af85ccbcSBarry Smith extern int KSPGetInitialGuessNonzero(KSP,PetscTruth *);
5790f02eecSBarry Smith extern int KSPSetComputeEigenvalues(KSP);
58d4fbbf0eSBarry Smith extern int KSPSetComputeSingularValues(KSP);
598ed539a5SBarry Smith extern int KSPSetRhs(KSP,Vec);
608ed539a5SBarry Smith extern int KSPGetRhs(KSP,Vec *);
618ed539a5SBarry Smith extern int KSPSetSolution(KSP,Vec);
628ed539a5SBarry Smith extern int KSPGetSolution(KSP,Vec *);
6325fce39dSBarry Smith extern int KSPGetResidualNorm(KSP,double*);
64597479d4SBarry Smith extern int KSPGetIterationNumber(KSP,int*);
652eac72dbSBarry Smith 
6677c4ece6SBarry Smith extern int KSPSetPC(KSP,PC);
6777c4ece6SBarry Smith extern int KSPGetPC(KSP,PC*);
68aabeff55SBarry Smith 
69fcb7de8cSBarry Smith extern int KSPSetAvoidNorms(KSP);
70fcb7de8cSBarry Smith 
71b8a78c4aSBarry Smith extern int KSPSetMonitor(KSP,int (*)(KSP,int,double,void*),void *,int (*)(void*));
725cd90555SBarry Smith extern int KSPClearMonitor(KSP);
738ed539a5SBarry Smith extern int KSPGetMonitorContext(KSP,void **);
740462333dSBarry Smith extern int KSPGetResidualHistory(KSP,double **,int *);
752c9e95e8SBarry Smith extern int KSPSetResidualHistory(KSP,double *,int,PetscTruth);
764b0e389bSBarry Smith 
772eac72dbSBarry Smith 
788ed539a5SBarry Smith extern int KSPBuildSolution(KSP,Vec,Vec *);
798ed539a5SBarry Smith extern int KSPBuildResidual(KSP,Vec,Vec,Vec *);
802eac72dbSBarry Smith 
818ed539a5SBarry Smith extern int KSPRichardsonSetScale(KSP,double);
828ed539a5SBarry Smith extern int KSPChebychevSetEigenvalues(KSP,double,double);
83d4fbbf0eSBarry Smith extern int KSPComputeExtremeSingularValues(KSP,double*,double*);
8488d459dfSBarry Smith extern int KSPComputeEigenvalues(KSP,int,double*,double*,int *);
85d4fbbf0eSBarry Smith extern int KSPComputeEigenvaluesExplicitly(KSP,int,double*,double*);
864b0e389bSBarry Smith 
878ed539a5SBarry Smith extern int KSPGMRESSetRestart(KSP,int);
88b4fd4287SBarry Smith extern int KSPGMRESSetPreAllocateVectors(KSP);
8977c4ece6SBarry Smith extern int KSPGMRESSetOrthogonalization(KSP,int (*)(KSP,int));
90bcd2baecSBarry Smith extern int KSPGMRESUnmodifiedGramSchmidtOrthogonalization(KSP,int);
91bcd2baecSBarry Smith extern int KSPGMRESModifiedGramSchmidtOrthogonalization(KSP,int);
92bcd2baecSBarry Smith extern int KSPGMRESIROrthogonalization(KSP,int);
9308480c60SBarry Smith 
94329f5518SBarry Smith extern int KSPFGMRESModifyPCNoChange(KSP,int,int,double,void*);
95329f5518SBarry Smith extern int KSPFGMRESModifyPCSLES(KSP,int,int,double,void*);
96329f5518SBarry Smith extern int KSPFGMRESSetModifyPC(KSP,int (*)(KSP,int,int,double,void*),void*,int(*)(void*));
97c38d4ed2SBarry Smith 
988ed539a5SBarry Smith extern int KSPSetFromOptions(KSP);
9915091d37SBarry Smith extern int KSPSetTypeFromOptions(KSP);
100639f9d9dSBarry Smith extern int KSPAddOptionsChecker(int (*)(KSP));
1012eac72dbSBarry Smith 
1028f4c8dbaSBarry Smith extern int KSPSingularValueMonitor(KSP,int,double,void *);
1038ed539a5SBarry Smith extern int KSPDefaultMonitor(KSP,int,double,void *);
104af6b99e9SBarry Smith extern int KSPTrueMonitor(KSP,int,double,void *);
1058c48e012SBarry Smith extern int KSPDefaultSMonitor(KSP,int,double,void *);
106a302ce19SBarry Smith extern int KSPVecViewMonitor(KSP,int,double,void *);
10721988a88SBarry Smith extern int KSPGMRESKrylovMonitor(KSP,int,double,void *);
10884cb2905SBarry Smith 
1092eac72dbSBarry Smith 
110c01c455dSBarry Smith extern int KSPResidual(KSP,Vec,Vec,Vec,Vec,Vec,Vec);
11177c4ece6SBarry Smith extern int KSPUnwindPreconditioner(KSP,Vec,Vec);
112c01c455dSBarry Smith extern int KSPDefaultBuildSolution(KSP,Vec,Vec*);
113c01c455dSBarry Smith extern int KSPDefaultBuildResidual(KSP,Vec,Vec,Vec *);
114c01c455dSBarry Smith 
1158ed539a5SBarry Smith extern int KSPPrintHelp(KSP);
1168ed539a5SBarry Smith 
1171eb62cbbSBarry Smith extern int KSPSetOptionsPrefix(KSP,char*);
1180985bb82SSatish Balay extern int KSPAppendOptionsPrefix(KSP,char*);
1190985bb82SSatish Balay extern int KSPGetOptionsPrefix(KSP,char**);
1201eb62cbbSBarry Smith 
1218ed539a5SBarry 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 
140abef13c0SSatish Balay extern int KSPSetConvergenceTest(KSP,int (*)(KSP,int,double,KSPConvergedReason*,void*),void *);
141abef13c0SSatish Balay extern int KSPGetConvergenceContext(KSP,void **);
142abef13c0SSatish Balay extern int KSPDefaultConverged(KSP,int,double,KSPConvergedReason*,void *);
143abef13c0SSatish Balay extern int KSPSkipConverged(KSP,int,double,KSPConvergedReason*,void *);
144329f5518SBarry Smith extern int KSPGetConvergedReason(KSP,KSPConvergedReason *);
145abef13c0SSatish Balay 
146d4fbbf0eSBarry Smith extern int KSPComputeExplicitOperator(KSP,Mat *);
147d4fbbf0eSBarry Smith 
1486d4a8577SBarry Smith typedef enum {KSP_CG_SYMMETRIC=1,KSP_CG_HERMITIAN=2} KSPCGType;
1496d4a8577SBarry Smith extern int KSPCGSetType(KSP,KSPCGType);
150e559a7feSLois Curfman McInnes 
1513369ce9aSBarry Smith extern int PCPreSolve(PC,KSP);
1523369ce9aSBarry Smith extern int PCPostSolve(PC,KSP);
1533369ce9aSBarry Smith 
154d7e8b826SBarry Smith extern int KSPLGMonitorCreate(char*,char*,int,int,int,int,DrawLG*);
1551eb62cbbSBarry Smith extern int KSPLGMonitor(KSP,int,double,void*);
156d7e8b826SBarry Smith extern int KSPLGMonitorDestroy(DrawLG);
1573b2fbd54SBarry Smith extern int KSPLGTrueMonitorCreate(MPI_Comm,char*,char*,int,int,int,int,DrawLG*);
158af6b99e9SBarry Smith extern int KSPLGTrueMonitor(KSP,int,double,void*);
159af6b99e9SBarry Smith extern int KSPLGTrueMonitorDestroy(DrawLG);
1601eb62cbbSBarry Smith 
1612eac72dbSBarry Smith #endif
1622eac72dbSBarry Smith 
1632eac72dbSBarry Smith 
164