11e07b27eSBarry Smith 21e07b27eSBarry Smith #ifndef __PETSCPC_TELESCOPE_H 31e07b27eSBarry Smith #define __PETSCPC_TELESCOPE_H 41e07b27eSBarry Smith 51e07b27eSBarry Smith /* Telescope */ 68d9f7141SDave May typedef enum { TELESCOPE_DEFAULT = 0, TELESCOPE_DMDA, TELESCOPE_DMPLEX, TELESCOPE_COARSEDM } PCTelescopeType; 71e07b27eSBarry Smith 81e07b27eSBarry Smith typedef struct _PC_Telescope *PC_Telescope; 91e07b27eSBarry Smith struct _PC_Telescope { 101e07b27eSBarry Smith PetscSubcomm psubcomm; 1148a10b22SPatrick Sanan PetscSubcommType subcommtype; 122a22aa42SDave May MPI_Comm subcomm; 131e07b27eSBarry Smith PetscInt redfactor; /* factor to reduce comm size by */ 141e07b27eSBarry Smith KSP ksp; 151e07b27eSBarry Smith IS isin; 161e07b27eSBarry Smith VecScatter scatter; 171e07b27eSBarry Smith Vec xred,yred,xtmp; 181e07b27eSBarry Smith Mat Bred; 198d9f7141SDave May PetscBool ignore_dm,ignore_kspcomputeoperators,use_coarse_dm; 201e07b27eSBarry Smith PCTelescopeType sr_type; 211e07b27eSBarry Smith void *dm_ctx; 221e07b27eSBarry Smith PetscErrorCode (*pctelescope_setup_type)(PC,PC_Telescope); 231e07b27eSBarry Smith PetscErrorCode (*pctelescope_matcreate_type)(PC,PC_Telescope,MatReuse,Mat*); 24392968a1SPatrick Sanan PetscErrorCode (*pctelescope_matnullspacecreate_type)(PC,PC_Telescope,Mat); 251e07b27eSBarry Smith PetscErrorCode (*pctelescope_reset_type)(PC); 26e3acf2f7SBarry Smith }; 271e07b27eSBarry Smith 281e07b27eSBarry Smith /* DMDA */ 291e07b27eSBarry Smith typedef struct { 301e07b27eSBarry Smith DM dmrepart; 311e07b27eSBarry Smith Mat permutation; 321e07b27eSBarry Smith Vec xp; 331e07b27eSBarry Smith PetscInt Mp_re,Np_re,Pp_re; 341e07b27eSBarry Smith PetscInt *range_i_re,*range_j_re,*range_k_re; 351e07b27eSBarry Smith PetscInt *start_i_re,*start_j_re,*start_k_re; 361e07b27eSBarry Smith } PC_Telescope_DMDACtx; 371e07b27eSBarry Smith 38*57f12427SDave May PETSC_STATIC_INLINE PetscBool PetscSubcomm_isActiveRank(PetscSubcomm scomm) 39*57f12427SDave May { 40*57f12427SDave May if (scomm->color == 0) return(PETSC_TRUE); 41*57f12427SDave May else return(PETSC_FALSE); 42*57f12427SDave May } 431e07b27eSBarry Smith 44*57f12427SDave May PETSC_STATIC_INLINE PetscBool PCTelescope_isActiveRank(PC_Telescope sred) 45*57f12427SDave May { 46*57f12427SDave May if (sred->psubcomm) return(PetscSubcomm_isActiveRank(sred->psubcomm)); 47*57f12427SDave May else { 48*57f12427SDave May if (sred->subcomm != MPI_COMM_NULL) return(PETSC_TRUE); 49*57f12427SDave May else return (PETSC_FALSE); 50*57f12427SDave May } 51*57f12427SDave May } 521e07b27eSBarry Smith 531e07b27eSBarry Smith PetscErrorCode PCTelescopeSetUp_dmda(PC,PC_Telescope); 541e07b27eSBarry Smith PetscErrorCode PCTelescopeMatCreate_dmda(PC,PC_Telescope,MatReuse,Mat*); 55392968a1SPatrick Sanan PetscErrorCode PCTelescopeMatNullSpaceCreate_dmda(PC,PC_Telescope,Mat); 561e07b27eSBarry Smith PetscErrorCode PCApply_Telescope_dmda(PC,Vec,Vec); 578d9f7141SDave May PetscErrorCode PCApplyRichardson_Telescope_dmda(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool,PetscInt*,PCRichardsonConvergedReason*); 581e07b27eSBarry Smith PetscErrorCode PCReset_Telescope_dmda(PC); 598d9f7141SDave May PetscErrorCode PCTelescopeSetUp_CoarseDM(PC,PC_Telescope); 608d9f7141SDave May PetscErrorCode PCApply_Telescope_CoarseDM(PC,Vec,Vec); 618d9f7141SDave May PetscErrorCode PCTelescopeMatNullSpaceCreate_CoarseDM(PC,PC_Telescope,Mat); 628d9f7141SDave May PetscErrorCode PCReset_Telescope_CoarseDM(PC); 638d9f7141SDave May PetscErrorCode PCApplyRichardson_Telescope_CoarseDM(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool,PetscInt*,PCRichardsonConvergedReason*); 648ef9ca65SPatrick Sanan PetscErrorCode DMView_DA_Short(DM,PetscViewer); 651e07b27eSBarry Smith 661e07b27eSBarry Smith #endif 67