1a4963045SJacob Faibussowitsch #pragma once
21e07b27eSBarry Smith
31e07b27eSBarry Smith /* Telescope */
49371c9d4SSatish Balay typedef enum {
59371c9d4SSatish Balay TELESCOPE_DEFAULT = 0,
69371c9d4SSatish Balay TELESCOPE_DMDA,
79371c9d4SSatish Balay TELESCOPE_DMPLEX,
89371c9d4SSatish Balay TELESCOPE_COARSEDM
99371c9d4SSatish Balay } PCTelescopeType;
101e07b27eSBarry Smith
111e07b27eSBarry Smith typedef struct _PC_Telescope *PC_Telescope;
121e07b27eSBarry Smith struct _PC_Telescope {
131e07b27eSBarry Smith PetscSubcomm psubcomm;
1448a10b22SPatrick Sanan PetscSubcommType subcommtype;
152a22aa42SDave May MPI_Comm subcomm;
161e07b27eSBarry Smith PetscInt redfactor; /* factor to reduce comm size by */
171e07b27eSBarry Smith KSP ksp;
181e07b27eSBarry Smith IS isin;
191e07b27eSBarry Smith VecScatter scatter;
201e07b27eSBarry Smith Vec xred, yred, xtmp;
211e07b27eSBarry Smith Mat Bred;
228d9f7141SDave May PetscBool ignore_dm, ignore_kspcomputeoperators, use_coarse_dm;
231e07b27eSBarry Smith PCTelescopeType sr_type;
241e07b27eSBarry Smith void *dm_ctx;
251e07b27eSBarry Smith PetscErrorCode (*pctelescope_setup_type)(PC, PC_Telescope);
261e07b27eSBarry Smith PetscErrorCode (*pctelescope_matcreate_type)(PC, PC_Telescope, MatReuse, Mat *);
27392968a1SPatrick Sanan PetscErrorCode (*pctelescope_matnullspacecreate_type)(PC, PC_Telescope, Mat);
281e07b27eSBarry Smith PetscErrorCode (*pctelescope_reset_type)(PC);
29e3acf2f7SBarry Smith };
301e07b27eSBarry Smith
311e07b27eSBarry Smith /* DMDA */
321e07b27eSBarry Smith typedef struct {
331e07b27eSBarry Smith DM dmrepart;
341e07b27eSBarry Smith Mat permutation;
351e07b27eSBarry Smith Vec xp;
361e07b27eSBarry Smith PetscInt Mp_re, Np_re, Pp_re;
371e07b27eSBarry Smith PetscInt *range_i_re, *range_j_re, *range_k_re;
381e07b27eSBarry Smith PetscInt *start_i_re, *start_j_re, *start_k_re;
391e07b27eSBarry Smith } PC_Telescope_DMDACtx;
401e07b27eSBarry Smith
PetscSubcomm_isActiveRank(PetscSubcomm scomm)41d71ae5a4SJacob Faibussowitsch static inline PetscBool PetscSubcomm_isActiveRank(PetscSubcomm scomm)
42d71ae5a4SJacob Faibussowitsch {
43*4ad8454bSPierre Jolivet if (scomm->color == 0) return PETSC_TRUE;
44*4ad8454bSPierre Jolivet else return PETSC_FALSE;
4557f12427SDave May }
461e07b27eSBarry Smith
PCTelescope_isActiveRank(PC_Telescope sred)47d71ae5a4SJacob Faibussowitsch static inline PetscBool PCTelescope_isActiveRank(PC_Telescope sred)
48d71ae5a4SJacob Faibussowitsch {
49*4ad8454bSPierre Jolivet if (sred->psubcomm) return PetscSubcomm_isActiveRank(sred->psubcomm);
5057f12427SDave May else {
51*4ad8454bSPierre Jolivet if (sred->subcomm != MPI_COMM_NULL) return PETSC_TRUE;
52*4ad8454bSPierre Jolivet else return PETSC_FALSE;
5357f12427SDave May }
5457f12427SDave May }
551e07b27eSBarry Smith
561e07b27eSBarry Smith PetscErrorCode PCTelescopeSetUp_dmda(PC, PC_Telescope);
571e07b27eSBarry Smith PetscErrorCode PCTelescopeMatCreate_dmda(PC, PC_Telescope, MatReuse, Mat *);
58392968a1SPatrick Sanan PetscErrorCode PCTelescopeMatNullSpaceCreate_dmda(PC, PC_Telescope, Mat);
591e07b27eSBarry Smith PetscErrorCode PCApply_Telescope_dmda(PC, Vec, Vec);
608d9f7141SDave May PetscErrorCode PCApplyRichardson_Telescope_dmda(PC, Vec, Vec, Vec, PetscReal, PetscReal, PetscReal, PetscInt, PetscBool, PetscInt *, PCRichardsonConvergedReason *);
611e07b27eSBarry Smith PetscErrorCode PCReset_Telescope_dmda(PC);
628d9f7141SDave May PetscErrorCode PCTelescopeSetUp_CoarseDM(PC, PC_Telescope);
638d9f7141SDave May PetscErrorCode PCApply_Telescope_CoarseDM(PC, Vec, Vec);
648d9f7141SDave May PetscErrorCode PCTelescopeMatNullSpaceCreate_CoarseDM(PC, PC_Telescope, Mat);
658d9f7141SDave May PetscErrorCode PCReset_Telescope_CoarseDM(PC);
668d9f7141SDave May PetscErrorCode PCApplyRichardson_Telescope_CoarseDM(PC, Vec, Vec, Vec, PetscReal, PetscReal, PetscReal, PetscInt, PetscBool, PetscInt *, PCRichardsonConvergedReason *);
678ef9ca65SPatrick Sanan PetscErrorCode DMView_DA_Short(DM, PetscViewer);
68