xref: /petsc/include/petscis.h (revision 5c20da3c4bf18073d34993a13657ec212a42adf8)
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