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 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 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