xref: /petsc/include/petscis.h (revision 55502333aa32ee843c8fc0e1ed50cec97f161660)
12eac72dbSBarry Smith /*
2f8256253SLois Curfman McInnes    An index set is a generalization of a subset of integers.  Index sets
3f8256253SLois Curfman McInnes    are used for defining scatters and gathers.
42eac72dbSBarry Smith */
5a4963045SJacob Faibussowitsch #pragma once
6ac09b921SBarry Smith 
7*55502333SMatthew G. Knepley #include "petscsystypes.h"
82c8e378dSBarry Smith #include <petscsys.h>
90c312b8eSJed Brown #include <petscsftypes.h>
10ea844a1aSMatthew Knepley #include <petscsectiontypes.h>
114914ba2bSBarry Smith #include <petscistypes.h> /*I  "petscis.h" I*/
122eac72dbSBarry Smith 
13ac09b921SBarry Smith /* SUBMANSEC = IS */
14ac09b921SBarry Smith 
1597b48c8fSBarry Smith #define IS_FILE_CLASSID 1211218
16014dd563SJed Brown PETSC_EXTERN PetscClassId IS_CLASSID;
17f0479e8cSBarry Smith 
18607a6623SBarry Smith PETSC_EXTERN PetscErrorCode ISInitializePackage(void);
194bf303faSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode ISFinalizePackage(void);
202b6de112SBarry Smith 
2176bdecfbSBarry Smith /*J
228f6c3df8SBarry Smith     ISType - String with the name of a PETSc index set type
2327bdab1eSBarry Smith 
2416a05f60SBarry Smith    Values:
259c89aa79SPierre Jolivet +  `ISGENERAL` - the values are stored with an array of indices and generally have no structure
2616a05f60SBarry Smith .  `ISSTRIDE`  - the values have a simple structure of an initial offset and then a step size between values
27af27ebaaSBarry Smith -  `ISBLOCK`   - values are an array of indices, each representing a block (of the same common length) of values
2816a05f60SBarry Smith 
2927bdab1eSBarry Smith    Level: beginner
3027bdab1eSBarry Smith 
3116a05f60SBarry Smith .seealso: `ISSetType()`, `IS`, `ISCreateGeneral()`, `ISCreateStride()`, `ISCreateBlock()`, `ISCreate()`, `ISRegister()`,
3216a05f60SBarry Smith           `VecScatterCreate()`, `MatGetSubMatrices()`
3376bdecfbSBarry Smith J*/
3419fd82e9SBarry Smith typedef const char *ISType;
3527bdab1eSBarry Smith #define ISGENERAL "general"
3627bdab1eSBarry Smith #define ISSTRIDE  "stride"
3727bdab1eSBarry Smith #define ISBLOCK   "block"
3827bdab1eSBarry Smith 
3927bdab1eSBarry Smith /* Dynamic creation and loading functions */
40140e18c1SBarry Smith PETSC_EXTERN PetscFunctionList ISList;
4119fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode    ISSetType(IS, ISType);
4219fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode    ISGetType(IS, ISType *);
43bdf89e91SBarry Smith PETSC_EXTERN PetscErrorCode    ISRegister(const char[], PetscErrorCode (*)(IS));
44da8c939bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    ISRegisterAll(void);
45014dd563SJed Brown PETSC_EXTERN PetscErrorCode    ISCreate(MPI_Comm, IS *);
4627bdab1eSBarry Smith 
47014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISDestroy(IS *);
48014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSetPermutation(IS);
49014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISPermutation(IS, PetscBool *);
50014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSetIdentity(IS);
51014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISIdentity(IS, PetscBool *);
52014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISContiguousLocal(IS, PetscInt, PetscInt, PetscInt *, PetscBool *);
5308480c60SBarry Smith 
542a1da528SToby Isaac /*E
552a1da528SToby Isaac    ISInfo - Info that may either be computed or set as known for an index set
562a1da528SToby Isaac 
5716a05f60SBarry Smith    Level: intermediate
582a1da528SToby Isaac 
5995bd0b28SBarry Smith    Developer Note:
602a1da528SToby Isaac    Entries that are negative need not be called collectively by all processes.
612a1da528SToby Isaac 
6216a05f60SBarry Smith .seealso: `IS`, `ISType`, `ISSetInfo()`
632a1da528SToby Isaac E*/
649371c9d4SSatish Balay typedef enum {
659371c9d4SSatish Balay   IS_INFO_MIN    = -1,
662a1da528SToby Isaac   IS_SORTED      = 0,
672a1da528SToby Isaac   IS_UNIQUE      = 1,
682a1da528SToby Isaac   IS_PERMUTATION = 2,
692a1da528SToby Isaac   IS_INTERVAL    = 3,
702a1da528SToby Isaac   IS_IDENTITY    = 4,
719371c9d4SSatish Balay   IS_INFO_MAX    = 5
729371c9d4SSatish Balay } ISInfo;
732a1da528SToby Isaac 
749371c9d4SSatish Balay typedef enum {
759371c9d4SSatish Balay   IS_LOCAL,
769371c9d4SSatish Balay   IS_GLOBAL
779371c9d4SSatish Balay } ISInfoType;
782a1da528SToby Isaac 
792a1da528SToby Isaac PETSC_EXTERN PetscErrorCode ISSetInfo(IS, ISInfo, ISInfoType, PetscBool, PetscBool);
80657dc977SToby Isaac PETSC_EXTERN PetscErrorCode ISGetInfo(IS, ISInfo, ISInfoType, PetscBool, PetscBool *);
812a1da528SToby Isaac PETSC_EXTERN PetscErrorCode ISClearInfoCache(IS, PetscBool);
82014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetIndices(IS, const PetscInt *[]);
83014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISRestoreIndices(IS, const PetscInt *[]);
84014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetTotalIndices(IS, const PetscInt *[]);
85014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISRestoreTotalIndices(IS, const PetscInt *[]);
86014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetNonlocalIndices(IS, const PetscInt *[]);
87014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISRestoreNonlocalIndices(IS, const PetscInt *[]);
88d60670a5SStefano Zampini PETSC_EXTERN PetscErrorCode ISGetNonlocalIS(IS, IS *);
89d60670a5SStefano Zampini PETSC_EXTERN PetscErrorCode ISRestoreNonlocalIS(IS, IS *);
90014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetSize(IS, PetscInt *);
91014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetLocalSize(IS, PetscInt *);
92014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISInvertPermutation(IS, PetscInt, IS *);
93014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISView(IS, PetscViewer);
94fe2efc57SMark PETSC_EXTERN PetscErrorCode ISViewFromOptions(IS, PetscObject, const char[]);
95235f7792SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISLoad(IS, PetscViewer);
96014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISEqual(IS, IS, PetscBool *);
97e8386968SVaclav Hapla PETSC_EXTERN PetscErrorCode ISEqualUnsorted(IS, IS, PetscBool *);
98014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSort(IS);
99b080c0f9SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISSortRemoveDups(IS);
100014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSorted(IS, PetscBool *);
101014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISDifference(IS, IS, IS *);
102014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSum(IS, IS, IS *);
103014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISExpand(IS, IS, IS *);
1043daafeecSToby Isaac PETSC_EXTERN PetscErrorCode ISIntersect(IS, IS, IS *);
105132da990SBarry Smith PETSC_EXTERN PetscErrorCode ISGetMinMax(IS, PetscInt *, PetscInt *);
106612dd529SBarry Smith 
107c3c3c9f4SToby Isaac PETSC_EXTERN PetscErrorCode ISLocate(IS, PetscInt, PetscInt *);
1089305a4c7SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISGetPointRange(IS, PetscInt *, PetscInt *, const PetscInt **);
1099305a4c7SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISRestorePointRange(IS, PetscInt *, PetscInt *, const PetscInt **);
1109305a4c7SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISGetPointSubrange(IS, PetscInt, PetscInt, const PetscInt *);
111c3c3c9f4SToby Isaac 
112014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetBlockSize(IS, PetscInt *);
113014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSetBlockSize(IS, PetscInt);
114*55502333SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISGetCompressOutput(IS, PetscBool *);
115*55502333SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISSetCompressOutput(IS, PetscBool);
116c16cb8f2SBarry Smith 
117014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISToGeneral(IS);
11838f40f24SLois Curfman McInnes 
119014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISDuplicate(IS, IS *);
120014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISCopy(IS, IS);
1219fdaf958SVaclav Hapla PETSC_EXTERN PetscErrorCode ISShift(IS, PetscInt, IS);
122014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISAllGather(IS, IS *);
123014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISComplement(IS, PetscInt, PetscInt, IS *);
124014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISConcatenate(MPI_Comm, PetscInt, const IS[], IS *);
125bb74729cSDmitry Karpeev PETSC_EXTERN PetscErrorCode ISListToPair(MPI_Comm, PetscInt, IS[], IS *, IS *);
126bb74729cSDmitry Karpeev PETSC_EXTERN PetscErrorCode ISPairToList(IS, IS, PetscInt *, IS *[]);
127bb74729cSDmitry Karpeev PETSC_EXTERN PetscErrorCode ISEmbed(IS, IS, PetscBool, IS *);
1285ea6c424SDmitry Karpeev PETSC_EXTERN PetscErrorCode ISSortPermutation(IS, PetscBool, IS *);
129014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISOnComm(IS, MPI_Comm, PetscCopyMode, IS *);
1306583bcc1SStefano Zampini PETSC_EXTERN PetscErrorCode ISRenumber(IS, IS, PetscInt *, IS *);
1316c04a3c5SFande Kong PETSC_EXTERN PetscErrorCode ISCreateSubIS(IS, IS, IS *);
132d64ed03dSBarry Smith 
13384933e40SVaclav Hapla /* ISGENERAL specific */
13484933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISCreateGeneral(MPI_Comm, PetscInt, const PetscInt[], PetscCopyMode, IS *);
13584933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISGeneralSetIndices(IS, PetscInt, const PetscInt[], PetscCopyMode);
1369bc6f2f1SVaclav Hapla PETSC_EXTERN PetscErrorCode ISGeneralSetIndicesFromMask(IS, PetscInt, PetscInt, const PetscBool[]);
13753bb9c4cSVaclav Hapla PETSC_EXTERN PetscErrorCode ISGeneralFilter(IS, PetscInt, PetscInt);
13853bb9c4cSVaclav Hapla 
13984933e40SVaclav Hapla /* ISBLOCK specific */
14084933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISCreateBlock(MPI_Comm, PetscInt, PetscInt, const PetscInt[], PetscCopyMode, IS *);
14184933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISBlockSetIndices(IS, PetscInt, PetscInt, const PetscInt[], PetscCopyMode);
14284933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISBlockGetIndices(IS, const PetscInt *[]);
14384933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISBlockRestoreIndices(IS, const PetscInt *[]);
14484933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISBlockGetLocalSize(IS, PetscInt *);
14584933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISBlockGetSize(IS, PetscInt *);
14684933e40SVaclav Hapla 
14784933e40SVaclav Hapla /* ISSTRIDE specific */
14884933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISCreateStride(MPI_Comm, PetscInt, PetscInt, PetscInt, IS *);
14984933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISStrideSetStride(IS, PetscInt, PetscInt, PetscInt);
15084933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISStrideGetInfo(IS, PetscInt *, PetscInt *);
15184933e40SVaclav Hapla 
1527de13914SStefano Zampini #define IS_LTOGM_FILE_CLASSID 1211217
153014dd563SJed Brown PETSC_EXTERN PetscClassId IS_LTOGM_CLASSID;
15456cd22aeSBarry Smith 
1555c20da3cSBarry Smith /*E
1560040bde1SJunchao Zhang    ISGlobalToLocalMappingMode - Indicates mapping behavior if global indices are missing
1575c20da3cSBarry Smith 
15816a05f60SBarry Smith    Values:
15916a05f60SBarry Smith +  `IS_GTOLM_MASK` - missing global indices are masked by mapping them to a local index of -1
16016a05f60SBarry Smith -  `IS_GTOLM_DROP` - missing global indices are dropped
1615c20da3cSBarry Smith 
1625c20da3cSBarry Smith    Level: beginner
1635c20da3cSBarry Smith 
164db781477SPatrick Sanan .seealso: `ISGlobalToLocalMappingApplyBlock()`, `ISGlobalToLocalMappingApply()`
1655c20da3cSBarry Smith E*/
1669371c9d4SSatish Balay typedef enum {
1679371c9d4SSatish Balay   IS_GTOLM_MASK,
1689371c9d4SSatish Balay   IS_GTOLM_DROP
1699371c9d4SSatish Balay } ISGlobalToLocalMappingMode;
17090f02eecSBarry Smith 
171413f72f0SBarry Smith /*J
172413f72f0SBarry Smith    ISLocalToGlobalMappingType - String with the name of a mapping method
173413f72f0SBarry Smith 
17416a05f60SBarry Smith    Values:
17516a05f60SBarry Smith +  `ISLOCALTOGLOBALMAPPINGBASIC` - a non-memory scalable way of storing `ISLocalToGlobalMapping` that allows applying `ISGlobalToLocalMappingApply()` efficiently
17616a05f60SBarry Smith -  `ISLOCALTOGLOBALMAPPINGHASH`  - a memory scalable way of storing `ISLocalToGlobalMapping` that allows applying `ISGlobalToLocalMappingApply()` reasonably efficiently
17716a05f60SBarry Smith 
178413f72f0SBarry Smith    Level: beginner
179413f72f0SBarry Smith 
18016a05f60SBarry Smith .seealso: `ISLocalToGlobalMapping`, `ISLocalToGlobalMappingSetType()`, `ISLocalToGlobalSetFromOptions()`, `ISGlobalToLocalMappingMode`
181413f72f0SBarry Smith J*/
182413f72f0SBarry Smith typedef const char *ISLocalToGlobalMappingType;
183413f72f0SBarry Smith #define ISLOCALTOGLOBALMAPPINGBASIC "basic"
184413f72f0SBarry Smith #define ISLOCALTOGLOBALMAPPINGHASH  "hash"
185413f72f0SBarry Smith 
186413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetType(ISLocalToGlobalMapping, ISLocalToGlobalMappingType);
187a0d79125SStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetType(ISLocalToGlobalMapping, ISLocalToGlobalMappingType *);
1881d36bdfdSBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRegister(const char[], PetscErrorCode (*)(ISLocalToGlobalMapping));
189413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRegisterAll(void);
190f0413b6fSBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreate(MPI_Comm, PetscInt, PetscInt, const PetscInt[], PetscCopyMode, ISLocalToGlobalMapping *);
191014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreateIS(IS, ISLocalToGlobalMapping *);
192014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreateSF(PetscSF, PetscInt, ISLocalToGlobalMapping *);
1937e99dc12SLawrence Mitchell PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetFromOptions(ISLocalToGlobalMapping);
194413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetUp(ISLocalToGlobalMapping);
195014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingView(ISLocalToGlobalMapping, PetscViewer);
1967de13914SStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingLoad(ISLocalToGlobalMapping, PetscViewer);
197fe2efc57SMark PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingViewFromOptions(ISLocalToGlobalMapping, PetscObject, const char[]);
198d4df40f3SStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingConcatenate(MPI_Comm, PetscInt, const ISLocalToGlobalMapping[], ISLocalToGlobalMapping *);
199d4df40f3SStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingDuplicate(ISLocalToGlobalMapping, ISLocalToGlobalMapping *);
200014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingDestroy(ISLocalToGlobalMapping *);
201d4df40f3SStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetSize(ISLocalToGlobalMapping, PetscInt *);
202d4df40f3SStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetIndices(ISLocalToGlobalMapping, const PetscInt **);
203d4df40f3SStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreIndices(ISLocalToGlobalMapping, const PetscInt **);
204d4df40f3SStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockIndices(ISLocalToGlobalMapping, const PetscInt **);
205d4df40f3SStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreBlockIndices(ISLocalToGlobalMapping, const PetscInt **);
206d4df40f3SStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockSize(ISLocalToGlobalMapping, PetscInt *);
207d4df40f3SStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetBlockSize(ISLocalToGlobalMapping, PetscInt);
208d4df40f3SStefano Zampini 
20904a59952SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApply(ISLocalToGlobalMapping, PetscInt, const PetscInt[], PetscInt[]);
21045b6f7e9SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApplyBlock(ISLocalToGlobalMapping, PetscInt, const PetscInt[], PetscInt[]);
211014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApplyIS(ISLocalToGlobalMapping, IS, IS *);
212413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApply(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, PetscInt, const PetscInt[], PetscInt *, PetscInt[]);
213413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApplyBlock(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, PetscInt, const PetscInt[], PetscInt *, PetscInt[]);
214413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApplyIS(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, IS, IS *);
215d4df40f3SStefano Zampini 
2161bd0b88eSStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]);
2171bd0b88eSStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]);
218014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
219014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
220633354d9SStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]);
221633354d9SStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreBlockNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]);
2226a818285SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
2236a818285SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreBlockInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
224d4df40f3SStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockMultiLeavesSF(ISLocalToGlobalMapping, PetscSF *);
22545b6f7e9SBarry Smith 
226b9617806SBarry Smith /*E
227b9617806SBarry Smith    ISColoringType - determines if the coloring is for the entire parallel grid/graph/matrix
228b9617806SBarry Smith                     or for just the local ghosted portion
229b9617806SBarry Smith 
23016a05f60SBarry Smith    Values:
23116a05f60SBarry Smith +  `IS_COLORING_GLOBAL` - does not include the colors for ghost points, this is used when the function
23216a05f60SBarry Smith                           is called synchronously in parallel. This requires generating a "parallel coloring".
23316a05f60SBarry Smith -  `IS_COLORING_LOCAL`  - includes colors for ghost points, this is used when the function can be called
23416a05f60SBarry Smith                           separately on individual processes with the ghost points already filled in. Does not
23516a05f60SBarry Smith                           require a "parallel coloring", rather each process colors its local + ghost part.
23616a05f60SBarry Smith                           Using this can result in much less parallel communication. Currently only works
23716a05f60SBarry Smith                           with `DMDA` and if you call `MatFDColoringSetFunction()` with the local function.
23816a05f60SBarry Smith 
239b9617806SBarry Smith    Level: beginner
240b9617806SBarry Smith 
24116a05f60SBarry Smith .seealso: `ISColoring`, `ISColoringSetType()`, `ISColoringGetType()`, `DMCreateColoring()`
242b9617806SBarry Smith E*/
2439371c9d4SSatish Balay typedef enum {
2449371c9d4SSatish Balay   IS_COLORING_GLOBAL,
2459371c9d4SSatish Balay   IS_COLORING_LOCAL
2469371c9d4SSatish Balay } ISColoringType;
247af27ebaaSBarry Smith 
2486a6fc655SJed Brown PETSC_EXTERN const char *const                ISColoringTypes[];
249569ea7c4SPierre Jolivet typedef unsigned PETSC_IS_COLORING_VALUE_TYPE ISColoringValue;
250569ea7c4SPierre Jolivet #define IS_COLORING_MAX     PETSC_IS_COLORING_MAX
251569ea7c4SPierre Jolivet #define MPIU_COLORING_VALUE PETSC_MPIU_IS_COLORING_VALUE_TYPE
252014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISAllGatherColors(MPI_Comm, PetscInt, ISColoringValue *, PetscInt *, ISColoringValue *[]);
253dde82324SBarry Smith 
2546497c311SBarry Smith /*@C
2556497c311SBarry Smith    ISColoringValueCast - casts an integer a `ISColoringValue` (which may be 1-bits in size), generates an
2566497c311SBarry Smith    error if the value is too large
2576497c311SBarry Smith 
2586497c311SBarry Smith    Not Collective; No Fortran Support
2596497c311SBarry Smith 
2606497c311SBarry Smith    Input Parameter:
2616497c311SBarry Smith .  a - the `PetscCount` value
2626497c311SBarry Smith 
2636497c311SBarry Smith    Output Parameter:
2646497c311SBarry Smith .  b - the resulting `ISColoringValue` value
2656497c311SBarry Smith 
2666497c311SBarry Smith    Level: advanced
2676497c311SBarry Smith 
2686497c311SBarry Smith    Note:
2696497c311SBarry Smith    Errors if the integer is negative
2706497c311SBarry Smith 
2716497c311SBarry Smith .seealso: `ISColoringValue`, `ISColoringCreate()`, `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscMPIIntCast()`, `PetscIntCast()`
2726497c311SBarry Smith @*/
2736497c311SBarry Smith static inline PetscErrorCode ISColoringValueCast(PetscCount a, ISColoringValue *b)
2746497c311SBarry Smith {
2756497c311SBarry Smith   PetscFunctionBegin;
2766497c311SBarry Smith   *b = 0;
2776497c311SBarry Smith   PetscCheck(a >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Passing negative integer not supported");
2786497c311SBarry Smith   PetscCheck(a < PETSC_IS_COLORING_MAX, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Integer too large to convert");
2796497c311SBarry Smith   *b = (ISColoringValue)a;
2806497c311SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
2816497c311SBarry Smith }
2826497c311SBarry Smith 
283aaf3ff59SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISColoringCreate(MPI_Comm, PetscInt, PetscInt, const ISColoringValue[], PetscCopyMode, ISColoring *);
284014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISColoringDestroy(ISColoring *);
285014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISColoringView(ISColoring, PetscViewer);
2868aec7d55SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringViewFromOptions(ISColoring, PetscObject, const char[]);
287071fcb05SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringGetIS(ISColoring, PetscCopyMode, PetscInt *, IS *[]);
288071fcb05SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringRestoreIS(ISColoring, PetscCopyMode, IS *[]);
28949b734d2SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringReference(ISColoring);
29049b734d2SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringSetType(ISColoring, ISColoringType);
291bdaf1daeSBarry Smith PETSC_EXTERN PetscErrorCode ISColoringGetType(ISColoring, ISColoringType *);
292bdaf1daeSBarry Smith PETSC_EXTERN PetscErrorCode ISColoringGetColors(ISColoring, PetscInt *, PetscInt *, const ISColoringValue **);
2933a7fca6bSBarry Smith 
29494f0491fSFande Kong PETSC_EXTERN PetscErrorCode ISBuildTwoSided(IS, IS, IS *);
295014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISPartitioningToNumbering(IS, IS *);
296014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISPartitioningCount(IS, PetscInt, PetscInt[]);
297dbef8a1cSBarry Smith 
298014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISCompressIndicesGeneral(PetscInt, PetscInt, PetscInt, PetscInt, const IS[], IS[]);
299edd03b47SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION(3, 19, 0, "ISCompressIndicesGeneral()", ) static inline PetscErrorCode ISCompressIndicesSorted(PetscInt n, PetscInt bs, PetscInt imax, const IS is_in[], IS is_out[])
300e37d522bSPierre Jolivet {
301e37d522bSPierre Jolivet   return ISCompressIndicesGeneral(n, bs, n, imax, is_in, is_out);
302e37d522bSPierre Jolivet }
303014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISExpandIndicesGeneral(PetscInt, PetscInt, PetscInt, PetscInt, const IS[], IS[]);
304d9489beaSHong Zhang 
30569ce434fSBarry Smith struct _n_PetscLayout {
30669ce434fSBarry Smith   MPI_Comm               comm;
30738a25198SStefano Zampini   PetscMPIInt            size;
30869ce434fSBarry Smith   PetscInt               n, N;         /* local, global vector size */
30969ce434fSBarry Smith   PetscInt               rstart, rend; /* local start, local end + 1 */
31069ce434fSBarry Smith   PetscInt              *range;        /* the offset of each processor */
3119621ec18SVaclav Hapla   PetscBool              range_alloc;  /* should range be freed in Destroy? */
31233d57670SJed Brown   PetscInt               bs;           /* number of elements in each block (generally for multi-component
31333d57670SJed Brown                                        * problems). Defaults to -1 and can be arbitrarily lazy so always use
31433d57670SJed Brown                                        * PetscAbs(map->bs) when accessing directly and expecting result to be
31533d57670SJed Brown                                        * positive. Do NOT multiply above numbers by bs */
3162a7a6963SBarry Smith   PetscInt               refcnt;       /* MPI Vecs obtained with VecDuplicate() and from MatCreateVecs() reuse map of input object */
31769ce434fSBarry Smith   ISLocalToGlobalMapping mapping;      /* mapping used in Vec/MatSetValuesLocal() */
318ca5434daSLawrence Mitchell   PetscBool              setupcalled;  /* Forbid setup more than once */
319ca5434daSLawrence Mitchell   PetscInt               oldn, oldN;   /* Checking if setup is allowed */
320ca5434daSLawrence Mitchell   PetscInt               oldbs;        /* And again */
32169ce434fSBarry Smith };
32269ce434fSBarry Smith 
32301e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutCreate(MPI_Comm, PetscLayout *);
3245d83a8b1SBarry Smith PETSC_EXTERN PetscErrorCode PetscLayoutFindOwner(PetscLayout, PetscInt, PetscMPIInt *);
3255d83a8b1SBarry Smith PETSC_EXTERN PetscErrorCode PetscLayoutFindOwnerIndex(PetscLayout, PetscInt, PetscMPIInt *, PetscInt *);
3269621ec18SVaclav Hapla PETSC_EXTERN PetscErrorCode PetscLayoutCreateFromSizes(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscLayout *);
3279621ec18SVaclav Hapla PETSC_EXTERN PetscErrorCode PetscLayoutCreateFromRanges(MPI_Comm, const PetscInt[], PetscCopyMode, PetscInt, PetscLayout *);
32801e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetUp(PetscLayout);
32901e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutDestroy(PetscLayout *);
33001e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutDuplicate(PetscLayout, PetscLayout *);
33101e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutReference(PetscLayout, PetscLayout *);
33201e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetLocalSize(PetscLayout, PetscInt);
33301e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetLocalSize(PetscLayout, PetscInt *);
33401e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetSize(PetscLayout, PetscInt);
33501e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetSize(PetscLayout, PetscInt *);
33601e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetBlockSize(PetscLayout, PetscInt);
33701e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetBlockSize(PetscLayout, PetscInt *);
33801e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetRange(PetscLayout, PetscInt *, PetscInt *);
33901e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetRanges(PetscLayout, const PetscInt *[]);
340f92d6284SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLayoutCompare(PetscLayout, PetscLayout, PetscBool *);
34101e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetISLocalToGlobalMapping(PetscLayout, ISLocalToGlobalMapping);
34207acc2aeSBarry Smith PETSC_EXTERN PetscErrorCode PetscLayoutMapLocal(PetscLayout, PetscInt, const PetscInt[], PetscInt *, PetscInt **, PetscInt **);
34301e13f73SMatthew G. Knepley 
344ce605777SToby Isaac PETSC_EXTERN PetscErrorCode PetscParallelSortInt(PetscLayout, PetscLayout, PetscInt *, PetscInt *);
345ce605777SToby Isaac 
346ce605777SToby Isaac PETSC_EXTERN PetscErrorCode ISGetLayout(IS, PetscLayout *);
3474e1d6e84SVaclav Hapla PETSC_EXTERN PetscErrorCode ISSetLayout(IS, PetscLayout);
348