1*29bbc08cSBarry Smith /* $Id: petscis.h,v 1.56 2000/08/01 20:58:40 bsmith Exp bsmith $ */ 22eac72dbSBarry Smith 32eac72dbSBarry Smith /* 4f8256253SLois Curfman McInnes An index set is a generalization of a subset of integers. Index sets 5f8256253SLois Curfman McInnes are used for defining scatters and gathers. 62eac72dbSBarry Smith */ 70a835dfdSSatish Balay #if !defined(__PETSCIS_H) 80a835dfdSSatish Balay #define __PETSCIS_H 92eac72dbSBarry Smith #include "petsc.h" 102eac72dbSBarry Smith 119e25ed09SBarry Smith #define IS_COOKIE PETSC_COOKIE+2 12f0479e8cSBarry Smith 13f09e8eb9SSatish Balay typedef struct _p_IS* IS; 142eac72dbSBarry Smith 15639f9d9dSBarry Smith /* 16639f9d9dSBarry Smith Default index set data structures that PETSc provides. 17639f9d9dSBarry Smith */ 18639f9d9dSBarry Smith typedef enum {IS_GENERAL=0,IS_STRIDE=1,IS_BLOCK = 2} ISType; 19ca44d042SBarry Smith EXTERN int ISCreateGeneral(MPI_Comm,int,const int[],IS *); 20ca44d042SBarry Smith EXTERN int ISCreateBlock(MPI_Comm,int,int,const int[],IS *); 21ca44d042SBarry Smith EXTERN int ISCreateStride(MPI_Comm,int,int,int,IS *); 224b0e389bSBarry Smith 23ca44d042SBarry Smith EXTERN int ISDestroy(IS); 244b0e389bSBarry Smith 25ca44d042SBarry Smith EXTERN int ISSetPermutation(IS); 26ca44d042SBarry Smith EXTERN int ISPermutation(IS,PetscTruth*); 27ca44d042SBarry Smith EXTERN int ISSetIdentity(IS); 28ca44d042SBarry Smith EXTERN int ISIdentity(IS,PetscTruth*); 2908480c60SBarry Smith 30ca44d042SBarry Smith EXTERN int ISGetIndices(IS,int *[]); 31ca44d042SBarry Smith EXTERN int ISRestoreIndices(IS,int *[]); 32ca44d042SBarry Smith EXTERN int ISGetSize(IS,int *); 3305e11b22SBarry Smith EXTERN int ISGetLocalSize(IS,int *); 34ca44d042SBarry Smith EXTERN int ISInvertPermutation(IS,int,IS*); 35ca44d042SBarry Smith EXTERN int ISView(IS,Viewer); 36ca44d042SBarry Smith EXTERN int ISEqual(IS,IS,PetscTruth *); 37ca44d042SBarry Smith EXTERN int ISSort(IS); 38ca44d042SBarry Smith EXTERN int ISSorted(IS,PetscTruth *); 39ca44d042SBarry Smith EXTERN int ISDifference(IS,IS,IS*); 40ca44d042SBarry Smith EXTERN int ISSum(IS,IS,IS*); 41612dd529SBarry Smith 42ca44d042SBarry Smith EXTERN int ISBlock(IS,PetscTruth*); 43ca44d042SBarry Smith EXTERN int ISBlockGetIndices(IS,int *[]); 44ca44d042SBarry Smith EXTERN int ISBlockRestoreIndices(IS,int *[]); 45ca44d042SBarry Smith EXTERN int ISBlockGetSize(IS,int *); 46ca44d042SBarry Smith EXTERN int ISBlockGetBlockSize(IS,int *); 47c16cb8f2SBarry Smith 48ca44d042SBarry Smith EXTERN int ISStride(IS,PetscTruth*); 49ca44d042SBarry Smith EXTERN int ISStrideGetInfo(IS,int *,int*); 50c16cb8f2SBarry Smith 51ca44d042SBarry Smith EXTERN int ISStrideToGeneral(IS); 5238f40f24SLois Curfman McInnes 53ca44d042SBarry Smith EXTERN int ISDuplicate(IS,IS*); 54ca44d042SBarry Smith EXTERN int ISAllGather(IS,IS*); 55d64ed03dSBarry Smith 5656cd22aeSBarry Smith /* --------------------------------------------------------------------------*/ 5756cd22aeSBarry Smith 58639f9d9dSBarry Smith /* 5990f02eecSBarry Smith ISLocalToGlobalMappings are mappings from an arbitrary 6090f02eecSBarry Smith local ordering from 0 to n-1 to a global PETSc ordering 61d4bb536fSBarry Smith used by a vector or matrix. 62d4bb536fSBarry Smith 63d4bb536fSBarry Smith Note: mapping from Local to Global is scalable; but Global 64eec0b4cfSBarry Smith to Local may not be if the range of global values represented locally 65d4bb536fSBarry Smith is very large. 6674637425SBarry Smith 6774637425SBarry Smith Note: the ISLocalToGlobalMapping is actually a private object; it is included 6874637425SBarry Smith here for the MACRO ISLocalToGlobalMappingApply() to allow it to be inlined since 6974637425SBarry Smith it is used so often. 7090f02eecSBarry Smith */ 71d4bb536fSBarry Smith #define IS_LTOGM_COOKIE PETSC_COOKIE+12 7274637425SBarry Smith 7374637425SBarry Smith struct _p_ISLocalToGlobalMapping{ 7474637425SBarry Smith PETSCHEADER(int) 7574637425SBarry Smith int n; /* number of local indices */ 7674637425SBarry Smith int *indices; /* global index of each local index */ 7774637425SBarry Smith int globalstart; /* first global referenced in indices */ 7874637425SBarry Smith int globalend; /* last + 1 global referenced in indices */ 7974637425SBarry Smith int *globals; /* local index for each global index between start and end */ 8074637425SBarry Smith }; 81f09e8eb9SSatish Balay typedef struct _p_ISLocalToGlobalMapping* ISLocalToGlobalMapping; 82987e4450SSatish Balay typedef enum {IS_GTOLM_MASK,IS_GTOLM_DROP} ISGlobalToLocalMappingType; 8390f02eecSBarry Smith 84ca44d042SBarry Smith EXTERN int ISLocalToGlobalMappingCreate(MPI_Comm,int,const int[],ISLocalToGlobalMapping*); 85ca44d042SBarry Smith EXTERN int ISLocalToGlobalMappingCreateIS(IS,ISLocalToGlobalMapping *); 86ca44d042SBarry Smith EXTERN int ISLocalToGlobalMappingView(ISLocalToGlobalMapping,Viewer); 87ca44d042SBarry Smith EXTERN int ISLocalToGlobalMappingDestroy(ISLocalToGlobalMapping); 88ca44d042SBarry Smith EXTERN int ISLocalToGlobalMappingApplyIS(ISLocalToGlobalMapping,IS,IS*); 8974637425SBarry Smith EXTERN int ISGlobalToLocalMappingApply(ISLocalToGlobalMapping,ISGlobalToLocalMappingType,int,const int[],int*,int[]); 9074637425SBarry Smith EXTERN int ISLocalToGlobalMappingGetSize(ISLocalToGlobalMapping,int*); 9174637425SBarry Smith EXTERN int ISLocalToGlobalMappingGetInfo(ISLocalToGlobalMapping,int*,int**,int**,int***); 9274637425SBarry Smith EXTERN int ISLocalToGlobalMappingRestoreInfo(ISLocalToGlobalMapping,int*,int**,int**,int***); 9374637425SBarry Smith 9474637425SBarry Smith #define ISLocalToGlobalMappingApply(mapping,N,in,out) 0;\ 9574637425SBarry Smith {\ 9674637425SBarry Smith int _i,*_idx = (mapping)->indices,_Nmax = (mapping)->n;\ 9774637425SBarry Smith for (_i=0; _i<N; _i++) {\ 9874637425SBarry Smith if ((in)[_i] < 0) {(out)[_i] = (in)[_i]; continue;}\ 99*29bbc08cSBarry Smith if ((in)[_i] >= _Nmax) SETERRQ3(PETSC_ERR_ARG_OUTOFRANGE,"Local index %d too large %d (max) at %d",(in)[_i],_Nmax,_i);\ 10074637425SBarry Smith (out)[_i] = _idx[(in)[_i]];\ 10174637425SBarry Smith }\ 10274637425SBarry Smith } 10390f02eecSBarry Smith 10456cd22aeSBarry Smith /* --------------------------------------------------------------------------*/ 10556cd22aeSBarry Smith 10690f02eecSBarry Smith /* 107639f9d9dSBarry Smith ISColorings are sets of IS's that define a coloring 108639f9d9dSBarry Smith of the underlying indices 109639f9d9dSBarry Smith */ 110f09e8eb9SSatish Balay struct _p_ISColoring { 111639f9d9dSBarry Smith int n; 112639f9d9dSBarry Smith IS *is; 113639f9d9dSBarry Smith MPI_Comm comm; 114639f9d9dSBarry Smith }; 115f09e8eb9SSatish Balay typedef struct _p_ISColoring* ISColoring; 116639f9d9dSBarry Smith 117ca44d042SBarry Smith EXTERN int ISColoringCreate(MPI_Comm,int,const int[],ISColoring*); 118ca44d042SBarry Smith EXTERN int ISColoringDestroy(ISColoring); 119ca44d042SBarry Smith EXTERN int ISColoringView(ISColoring,Viewer); 120ca44d042SBarry Smith EXTERN int ISColoringGetIS(ISColoring,int*,IS*[]); 12122327b12SSatish Balay EXTERN int ISColoringRestoreIS(ISColoring,IS*[]); 122639f9d9dSBarry Smith 123dbef8a1cSBarry Smith /* --------------------------------------------------------------------------*/ 124dbef8a1cSBarry Smith 125ca44d042SBarry Smith EXTERN int ISPartitioningToNumbering(IS,IS*); 126ca44d042SBarry Smith EXTERN int ISPartitioningCount(IS,int[]); 127dbef8a1cSBarry Smith 128a2ce50c7SBarry Smith #endif 1297588ac45SBarry Smith 1307588ac45SBarry Smith 131639f9d9dSBarry Smith 132639f9d9dSBarry Smith 133