xref: /petsc/include/petscis.h (revision 323b833ffd2abbc021b1f705dc98117c2173689c)
1*323b833fSBarry Smith /* $Id: petscis.h,v 1.58 2001/01/15 21:44:24 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*);
35b0a32e0cSBarry Smith EXTERN int   ISView(IS,PetscViewer);
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 *);
86b0a32e0cSBarry Smith EXTERN int ISLocalToGlobalMappingView(ISLocalToGlobalMapping,PetscViewer);
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***);
93*323b833fSBarry Smith EXTERN int ISLocalToGlobalMappingBlock(ISLocalToGlobalMapping,int,ISLocalToGlobalMapping*);
9474637425SBarry Smith 
9574637425SBarry Smith #define ISLocalToGlobalMappingApply(mapping,N,in,out) 0;\
9674637425SBarry Smith {\
9774637425SBarry Smith   int _i,*_idx = (mapping)->indices,_Nmax = (mapping)->n;\
9874637425SBarry Smith   for (_i=0; _i<N; _i++) {\
9974637425SBarry Smith     if ((in)[_i] < 0) {(out)[_i] = (in)[_i]; continue;}\
10029bbc08cSBarry Smith     if ((in)[_i] >= _Nmax) SETERRQ3(PETSC_ERR_ARG_OUTOFRANGE,"Local index %d too large %d (max) at %d",(in)[_i],_Nmax,_i);\
10174637425SBarry Smith     (out)[_i] = _idx[(in)[_i]];\
10274637425SBarry Smith   }\
10374637425SBarry Smith }
10490f02eecSBarry Smith 
10556cd22aeSBarry Smith /* --------------------------------------------------------------------------*/
10656cd22aeSBarry Smith 
10790f02eecSBarry Smith /*
108639f9d9dSBarry Smith      ISColorings are sets of IS's that define a coloring
109639f9d9dSBarry Smith    of the underlying indices
110639f9d9dSBarry Smith */
111f09e8eb9SSatish Balay struct _p_ISColoring {
112639f9d9dSBarry Smith   int      n;
113639f9d9dSBarry Smith   IS       *is;
114639f9d9dSBarry Smith   MPI_Comm comm;
115639f9d9dSBarry Smith };
116f09e8eb9SSatish Balay typedef struct _p_ISColoring* ISColoring;
117639f9d9dSBarry Smith 
118ca44d042SBarry Smith EXTERN int ISColoringCreate(MPI_Comm,int,const int[],ISColoring*);
119ca44d042SBarry Smith EXTERN int ISColoringDestroy(ISColoring);
120b0a32e0cSBarry Smith EXTERN int ISColoringView(ISColoring,PetscViewer);
121ca44d042SBarry Smith EXTERN int ISColoringGetIS(ISColoring,int*,IS*[]);
12222327b12SSatish Balay EXTERN int ISColoringRestoreIS(ISColoring,IS*[]);
123639f9d9dSBarry Smith 
124dbef8a1cSBarry Smith /* --------------------------------------------------------------------------*/
125dbef8a1cSBarry Smith 
126ca44d042SBarry Smith EXTERN int ISPartitioningToNumbering(IS,IS*);
127ca44d042SBarry Smith EXTERN int ISPartitioningCount(IS,int[]);
128dbef8a1cSBarry Smith 
129a2ce50c7SBarry Smith #endif
1307588ac45SBarry Smith 
1317588ac45SBarry Smith 
132639f9d9dSBarry Smith 
133639f9d9dSBarry Smith 
134