1: #ifndef PETSCHPDDM_H
2: #define PETSCHPDDM_H
4: #include <petsc/private/kspimpl.h>
6: #define PETSC_KSPHPDDM_DEFAULT_PRECISION \
7: (PetscDefined(USE_REAL_SINGLE) ? KSP_HPDDM_PRECISION_SINGLE : (PetscDefined(USE_REAL_DOUBLE) ? KSP_HPDDM_PRECISION_DOUBLE : (PetscDefined(USE_REAL___FLOAT128) ? KSP_HPDDM_PRECISION_QUADRUPLE : KSP_HPDDM_PRECISION_HALF)))
8: #define PETSC_PCHPDDM_MAXLEVELS 9
9: PETSC_EXTERN PetscLogEvent PC_HPDDM_PtAP;
10: PETSC_EXTERN PetscLogEvent PC_HPDDM_PtBP;
11: PETSC_EXTERN PetscLogEvent PC_HPDDM_Next;
12: PETSC_INTERN PetscErrorCode HPDDMLoadDL_Private(PetscBool *);
14: namespace HPDDM
15: {
16: template <class>
17: class Schwarz; /* forward definitions of two needed HPDDM classes */
18: class PETScOperator;
19: } // namespace HPDDM
21: struct PC_HPDDM_Level {
22: VecScatter scatter; /* scattering from PETSc nonoverlapping numbering to HPDDM overlapping */
23: Vec *v[2]; /* working vectors */
24: Mat V[3]; /* working matrices */
25: KSP ksp; /* KSP coupling the action of pc and P */
26: PC pc; /* inner fine-level PC, acting like a multigrid smoother */
27: HPDDM::Schwarz<PetscScalar> *P; /* coarse-level HPDDM solver */
28: Vec D; /* partition of unity */
29: PetscReal threshold; /* threshold for selecting local deflation vectors */
30: PetscInt nu; /* number of local deflation vectors */
31: const struct PC_HPDDM *parent; /* parent PC */
32: };
34: struct PC_HPDDM {
35: PC_HPDDM_Level **levels; /* array of shells */
36: Mat aux; /* local auxiliary matrix defined at the finest level on PETSC_COMM_SELF */
37: Mat B; /* right-hand side matrix defined at the finest level on PETSC_COMM_SELF */
38: Vec normal; /* temporary Vec when preconditioning the normal equations with KSPLSQR */
39: IS is; /* global numbering of the auxiliary matrix */
40: PetscInt N; /* number of levels */
41: PCHPDDMCoarseCorrectionType correction; /* type of coarse correction */
42: PetscBool Neumann; /* aux is the local Neumann matrix? */
43: PetscBool log_separate; /* separate events for each level? */
44: PetscBool share; /* shared subdomain KSP between SLEPc and PETSc? */
45: PetscBool deflation; /* aux is the local deflation space? */
46: PetscErrorCode (*setup)(Mat, PetscReal, Vec, Vec, PetscReal, IS, void *); /* setup function for the auxiliary matrix */
47: void *setup_ctx; /* context for setup */
48: };
50: struct KSP_HPDDM {
51: HPDDM::PETScOperator *op;
52: PetscReal rcntl[1];
53: int icntl[2];
54: unsigned short scntl[2];
55: char cntl[5];
56: KSPHPDDMPrecision precision;
57: };
59: PETSC_INTERN const char HPDDMCitation[];
60: PETSC_INTERN PetscBool HPDDMCite;
62: #include <HPDDM.hpp>
64: #endif /* PETSCHPDDM_H */