Actual source code: telescope.h
2: #ifndef PETSCPC_TELESCOPE_H
3: #define PETSCPC_TELESCOPE_H
5: /* Telescope */
6: typedef enum {
7: TELESCOPE_DEFAULT = 0,
8: TELESCOPE_DMDA,
9: TELESCOPE_DMPLEX,
10: TELESCOPE_COARSEDM
11: } PCTelescopeType;
13: typedef struct _PC_Telescope *PC_Telescope;
14: struct _PC_Telescope {
15: PetscSubcomm psubcomm;
16: PetscSubcommType subcommtype;
17: MPI_Comm subcomm;
18: PetscInt redfactor; /* factor to reduce comm size by */
19: KSP ksp;
20: IS isin;
21: VecScatter scatter;
22: Vec xred, yred, xtmp;
23: Mat Bred;
24: PetscBool ignore_dm, ignore_kspcomputeoperators, use_coarse_dm;
25: PCTelescopeType sr_type;
26: void *dm_ctx;
27: PetscErrorCode (*pctelescope_setup_type)(PC, PC_Telescope);
28: PetscErrorCode (*pctelescope_matcreate_type)(PC, PC_Telescope, MatReuse, Mat *);
29: PetscErrorCode (*pctelescope_matnullspacecreate_type)(PC, PC_Telescope, Mat);
30: PetscErrorCode (*pctelescope_reset_type)(PC);
31: };
33: /* DMDA */
34: typedef struct {
35: DM dmrepart;
36: Mat permutation;
37: Vec xp;
38: PetscInt Mp_re, Np_re, Pp_re;
39: PetscInt *range_i_re, *range_j_re, *range_k_re;
40: PetscInt *start_i_re, *start_j_re, *start_k_re;
41: } PC_Telescope_DMDACtx;
43: static inline PetscBool PetscSubcomm_isActiveRank(PetscSubcomm scomm)
44: {
45: if (scomm->color == 0) return (PETSC_TRUE);
46: else return (PETSC_FALSE);
47: }
49: static inline PetscBool PCTelescope_isActiveRank(PC_Telescope sred)
50: {
51: if (sred->psubcomm) return (PetscSubcomm_isActiveRank(sred->psubcomm));
52: else {
53: if (sred->subcomm != MPI_COMM_NULL) return (PETSC_TRUE);
54: else return (PETSC_FALSE);
55: }
56: }
58: PetscErrorCode PCTelescopeSetUp_dmda(PC, PC_Telescope);
59: PetscErrorCode PCTelescopeMatCreate_dmda(PC, PC_Telescope, MatReuse, Mat *);
60: PetscErrorCode PCTelescopeMatNullSpaceCreate_dmda(PC, PC_Telescope, Mat);
61: PetscErrorCode PCApply_Telescope_dmda(PC, Vec, Vec);
62: PetscErrorCode PCApplyRichardson_Telescope_dmda(PC, Vec, Vec, Vec, PetscReal, PetscReal, PetscReal, PetscInt, PetscBool, PetscInt *, PCRichardsonConvergedReason *);
63: PetscErrorCode PCReset_Telescope_dmda(PC);
64: PetscErrorCode PCTelescopeSetUp_CoarseDM(PC, PC_Telescope);
65: PetscErrorCode PCApply_Telescope_CoarseDM(PC, Vec, Vec);
66: PetscErrorCode PCTelescopeMatNullSpaceCreate_CoarseDM(PC, PC_Telescope, Mat);
67: PetscErrorCode PCReset_Telescope_CoarseDM(PC);
68: PetscErrorCode PCApplyRichardson_Telescope_CoarseDM(PC, Vec, Vec, Vec, PetscReal, PetscReal, PetscReal, PetscInt, PetscBool, PetscInt *, PCRichardsonConvergedReason *);
69: PetscErrorCode DMView_DA_Short(DM, PetscViewer);
71: #endif