1*5c20da3cSBarry Smith /* $Id: petscis.h,v 1.59 2001/01/17 19:43:59 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 13*5c20da3cSBarry Smith /*S 14*5c20da3cSBarry Smith IS - Abstract PETSc object that indexing. 15*5c20da3cSBarry Smith 16*5c20da3cSBarry Smith Level: beginner 17*5c20da3cSBarry Smith 18*5c20da3cSBarry Smith Concepts: indexing, stride 19*5c20da3cSBarry Smith 20*5c20da3cSBarry Smith .seealso: ISCreateGeneral(), ISCreateBlock(), ISCreateStride(), ISGetIndices(), ISDestroy() 21*5c20da3cSBarry Smith S*/ 22f09e8eb9SSatish Balay typedef struct _p_IS* IS; 232eac72dbSBarry Smith 24639f9d9dSBarry Smith /* 25639f9d9dSBarry Smith Default index set data structures that PETSc provides. 26639f9d9dSBarry Smith */ 27639f9d9dSBarry Smith typedef enum {IS_GENERAL=0,IS_STRIDE=1,IS_BLOCK = 2} ISType; 28ca44d042SBarry Smith EXTERN int ISCreateGeneral(MPI_Comm,int,const int[],IS *); 29ca44d042SBarry Smith EXTERN int ISCreateBlock(MPI_Comm,int,int,const int[],IS *); 30ca44d042SBarry Smith EXTERN int ISCreateStride(MPI_Comm,int,int,int,IS *); 314b0e389bSBarry Smith 32ca44d042SBarry Smith EXTERN int ISDestroy(IS); 334b0e389bSBarry Smith 34ca44d042SBarry Smith EXTERN int ISSetPermutation(IS); 35ca44d042SBarry Smith EXTERN int ISPermutation(IS,PetscTruth*); 36ca44d042SBarry Smith EXTERN int ISSetIdentity(IS); 37ca44d042SBarry Smith EXTERN int ISIdentity(IS,PetscTruth*); 3808480c60SBarry Smith 39ca44d042SBarry Smith EXTERN int ISGetIndices(IS,int *[]); 40ca44d042SBarry Smith EXTERN int ISRestoreIndices(IS,int *[]); 41ca44d042SBarry Smith EXTERN int ISGetSize(IS,int *); 4205e11b22SBarry Smith EXTERN int ISGetLocalSize(IS,int *); 43ca44d042SBarry Smith EXTERN int ISInvertPermutation(IS,int,IS*); 44b0a32e0cSBarry Smith EXTERN int ISView(IS,PetscViewer); 45ca44d042SBarry Smith EXTERN int ISEqual(IS,IS,PetscTruth *); 46ca44d042SBarry Smith EXTERN int ISSort(IS); 47ca44d042SBarry Smith EXTERN int ISSorted(IS,PetscTruth *); 48ca44d042SBarry Smith EXTERN int ISDifference(IS,IS,IS*); 49ca44d042SBarry Smith EXTERN int ISSum(IS,IS,IS*); 50612dd529SBarry Smith 51ca44d042SBarry Smith EXTERN int ISBlock(IS,PetscTruth*); 52ca44d042SBarry Smith EXTERN int ISBlockGetIndices(IS,int *[]); 53ca44d042SBarry Smith EXTERN int ISBlockRestoreIndices(IS,int *[]); 54ca44d042SBarry Smith EXTERN int ISBlockGetSize(IS,int *); 55ca44d042SBarry Smith EXTERN int ISBlockGetBlockSize(IS,int *); 56c16cb8f2SBarry Smith 57ca44d042SBarry Smith EXTERN int ISStride(IS,PetscTruth*); 58ca44d042SBarry Smith EXTERN int ISStrideGetInfo(IS,int *,int*); 59c16cb8f2SBarry Smith 60ca44d042SBarry Smith EXTERN int ISStrideToGeneral(IS); 6138f40f24SLois Curfman McInnes 62ca44d042SBarry Smith EXTERN int ISDuplicate(IS,IS*); 63ca44d042SBarry Smith EXTERN int ISAllGather(IS,IS*); 64d64ed03dSBarry Smith 6556cd22aeSBarry Smith /* --------------------------------------------------------------------------*/ 66*5c20da3cSBarry Smith #define IS_LTOGM_COOKIE PETSC_COOKIE+12 6756cd22aeSBarry Smith 68*5c20da3cSBarry Smith /*S 69*5c20da3cSBarry Smith ISLocalToGlobalMappings - mappings from an arbitrary 7090f02eecSBarry Smith local ordering from 0 to n-1 to a global PETSc ordering 71d4bb536fSBarry Smith used by a vector or matrix. 72d4bb536fSBarry Smith 73*5c20da3cSBarry Smith Level: intermediate 74*5c20da3cSBarry Smith 75d4bb536fSBarry Smith Note: mapping from Local to Global is scalable; but Global 76eec0b4cfSBarry Smith to Local may not be if the range of global values represented locally 77d4bb536fSBarry Smith is very large. 7874637425SBarry Smith 7974637425SBarry Smith Note: the ISLocalToGlobalMapping is actually a private object; it is included 8074637425SBarry Smith here for the MACRO ISLocalToGlobalMappingApply() to allow it to be inlined since 8174637425SBarry Smith it is used so often. 8274637425SBarry Smith 83*5c20da3cSBarry Smith .seealso: ISLocalToGlobalMappingCreate() 84*5c20da3cSBarry Smith S*/ 8574637425SBarry Smith struct _p_ISLocalToGlobalMapping{ 8674637425SBarry Smith PETSCHEADER(int) 8774637425SBarry Smith int n; /* number of local indices */ 8874637425SBarry Smith int *indices; /* global index of each local index */ 8974637425SBarry Smith int globalstart; /* first global referenced in indices */ 9074637425SBarry Smith int globalend; /* last + 1 global referenced in indices */ 9174637425SBarry Smith int *globals; /* local index for each global index between start and end */ 9274637425SBarry Smith }; 93f09e8eb9SSatish Balay typedef struct _p_ISLocalToGlobalMapping* ISLocalToGlobalMapping; 94*5c20da3cSBarry Smith 95*5c20da3cSBarry Smith /*E 96*5c20da3cSBarry Smith ISGlobalToLocalMappingType - Indicates if missing global indices are 97*5c20da3cSBarry Smith 98*5c20da3cSBarry Smith IS_GTOLM_MASK - missing global indices are replaced with -1 99*5c20da3cSBarry Smith IS_GTOLM_DROP - missing global indices are dropped 100*5c20da3cSBarry Smith 101*5c20da3cSBarry Smith Level: beginner 102*5c20da3cSBarry Smith 103*5c20da3cSBarry Smith .seealso: ISGlobalToLocalMappingApply() 104*5c20da3cSBarry Smith 105*5c20da3cSBarry Smith E*/ 106987e4450SSatish Balay typedef enum {IS_GTOLM_MASK,IS_GTOLM_DROP} ISGlobalToLocalMappingType; 10790f02eecSBarry Smith 108ca44d042SBarry Smith EXTERN int ISLocalToGlobalMappingCreate(MPI_Comm,int,const int[],ISLocalToGlobalMapping*); 109ca44d042SBarry Smith EXTERN int ISLocalToGlobalMappingCreateIS(IS,ISLocalToGlobalMapping *); 110b0a32e0cSBarry Smith EXTERN int ISLocalToGlobalMappingView(ISLocalToGlobalMapping,PetscViewer); 111ca44d042SBarry Smith EXTERN int ISLocalToGlobalMappingDestroy(ISLocalToGlobalMapping); 112ca44d042SBarry Smith EXTERN int ISLocalToGlobalMappingApplyIS(ISLocalToGlobalMapping,IS,IS*); 11374637425SBarry Smith EXTERN int ISGlobalToLocalMappingApply(ISLocalToGlobalMapping,ISGlobalToLocalMappingType,int,const int[],int*,int[]); 11474637425SBarry Smith EXTERN int ISLocalToGlobalMappingGetSize(ISLocalToGlobalMapping,int*); 11574637425SBarry Smith EXTERN int ISLocalToGlobalMappingGetInfo(ISLocalToGlobalMapping,int*,int**,int**,int***); 11674637425SBarry Smith EXTERN int ISLocalToGlobalMappingRestoreInfo(ISLocalToGlobalMapping,int*,int**,int**,int***); 117323b833fSBarry Smith EXTERN int ISLocalToGlobalMappingBlock(ISLocalToGlobalMapping,int,ISLocalToGlobalMapping*); 11874637425SBarry Smith 11974637425SBarry Smith #define ISLocalToGlobalMappingApply(mapping,N,in,out) 0;\ 12074637425SBarry Smith {\ 12174637425SBarry Smith int _i,*_idx = (mapping)->indices,_Nmax = (mapping)->n;\ 12274637425SBarry Smith for (_i=0; _i<N; _i++) {\ 12374637425SBarry Smith if ((in)[_i] < 0) {(out)[_i] = (in)[_i]; continue;}\ 12429bbc08cSBarry Smith if ((in)[_i] >= _Nmax) SETERRQ3(PETSC_ERR_ARG_OUTOFRANGE,"Local index %d too large %d (max) at %d",(in)[_i],_Nmax,_i);\ 12574637425SBarry Smith (out)[_i] = _idx[(in)[_i]];\ 12674637425SBarry Smith }\ 12774637425SBarry Smith } 12890f02eecSBarry Smith 12956cd22aeSBarry Smith /* --------------------------------------------------------------------------*/ 130*5c20da3cSBarry Smith /*S 131*5c20da3cSBarry Smith ISColorings - sets of IS's that define a coloring 132639f9d9dSBarry Smith of the underlying indices 133*5c20da3cSBarry Smith 134*5c20da3cSBarry Smith Level: intermediate 135*5c20da3cSBarry Smith 136*5c20da3cSBarry Smith Notes: 137*5c20da3cSBarry Smith One should not access the is records below because they may not yet 138*5c20da3cSBarry Smith have been created. One should use ISColoringGetIS() to make sure they are 139*5c20da3cSBarry Smith created when needed. 140*5c20da3cSBarry Smith 141*5c20da3cSBarry Smith .seealso: ISColoringCreate(), ISColoringGetIS(), ISColoringView(), ISColoringGetIS() 142*5c20da3cSBarry Smith S*/ 143f09e8eb9SSatish Balay struct _p_ISColoring { 144*5c20da3cSBarry Smith int n; /* number of colors */ 145*5c20da3cSBarry Smith IS *is; /* for each color indicates columns */ 146639f9d9dSBarry Smith MPI_Comm comm; 147*5c20da3cSBarry Smith int *colors; /* for each column indicates color */ 148*5c20da3cSBarry Smith int N; /* number of columns */ 149639f9d9dSBarry Smith }; 150f09e8eb9SSatish Balay typedef struct _p_ISColoring* ISColoring; 151639f9d9dSBarry Smith 152ca44d042SBarry Smith EXTERN int ISColoringCreate(MPI_Comm,int,const int[],ISColoring*); 153ca44d042SBarry Smith EXTERN int ISColoringDestroy(ISColoring); 154b0a32e0cSBarry Smith EXTERN int ISColoringView(ISColoring,PetscViewer); 155ca44d042SBarry Smith EXTERN int ISColoringGetIS(ISColoring,int*,IS*[]); 15622327b12SSatish Balay EXTERN int ISColoringRestoreIS(ISColoring,IS*[]); 157639f9d9dSBarry Smith 158dbef8a1cSBarry Smith /* --------------------------------------------------------------------------*/ 159dbef8a1cSBarry Smith 160ca44d042SBarry Smith EXTERN int ISPartitioningToNumbering(IS,IS*); 161ca44d042SBarry Smith EXTERN int ISPartitioningCount(IS,int[]); 162dbef8a1cSBarry Smith 163a2ce50c7SBarry Smith #endif 1647588ac45SBarry Smith 1657588ac45SBarry Smith 166639f9d9dSBarry Smith 167639f9d9dSBarry Smith 168