xref: /petsc/include/petscis.h (revision 4bf303fab8706fca5c4c2515917737579b84f96a)
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 */
56524c165SJacob Faibussowitsch #ifndef PETSCIS_H
626bd1501SBarry Smith #define PETSCIS_H
7ac09b921SBarry Smith 
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);
19*4bf303faSJacob 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
2716a05f60SBarry Smith -  `ISBLOCK` - values are an array of indices, each representing a block 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 
592a1da528SToby Isaac    Developer Notes:
602a1da528SToby Isaac    Entries that are negative need not be called collectively by all processes.
612a1da528SToby Isaac 
6287497f52SBarry Smith    Any additions/changes here MUST also be made in include/petsc/finclude/petscis.h
6387497f52SBarry Smith 
6487497f52SBarry Smith    Any additions/changes here must also be made in src/vec/vec/interface/dlregisvec.c in ISInfos[]
6587497f52SBarry Smith 
6616a05f60SBarry Smith .seealso: `IS`, `ISType`, `ISSetInfo()`
672a1da528SToby Isaac E*/
689371c9d4SSatish Balay typedef enum {
699371c9d4SSatish Balay   IS_INFO_MIN    = -1,
702a1da528SToby Isaac   IS_SORTED      = 0,
712a1da528SToby Isaac   IS_UNIQUE      = 1,
722a1da528SToby Isaac   IS_PERMUTATION = 2,
732a1da528SToby Isaac   IS_INTERVAL    = 3,
742a1da528SToby Isaac   IS_IDENTITY    = 4,
759371c9d4SSatish Balay   IS_INFO_MAX    = 5
769371c9d4SSatish Balay } ISInfo;
772a1da528SToby Isaac 
789371c9d4SSatish Balay typedef enum {
799371c9d4SSatish Balay   IS_LOCAL,
809371c9d4SSatish Balay   IS_GLOBAL
819371c9d4SSatish Balay } ISInfoType;
822a1da528SToby Isaac 
832a1da528SToby Isaac PETSC_EXTERN PetscErrorCode ISSetInfo(IS, ISInfo, ISInfoType, PetscBool, PetscBool);
84657dc977SToby Isaac PETSC_EXTERN PetscErrorCode ISGetInfo(IS, ISInfo, ISInfoType, PetscBool, PetscBool *);
852a1da528SToby Isaac PETSC_EXTERN PetscErrorCode ISClearInfoCache(IS, PetscBool);
86014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetIndices(IS, const PetscInt *[]);
87014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISRestoreIndices(IS, const PetscInt *[]);
88014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetTotalIndices(IS, const PetscInt *[]);
89014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISRestoreTotalIndices(IS, const PetscInt *[]);
90014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetNonlocalIndices(IS, const PetscInt *[]);
91014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISRestoreNonlocalIndices(IS, const PetscInt *[]);
92d60670a5SStefano Zampini PETSC_EXTERN PetscErrorCode ISGetNonlocalIS(IS, IS *);
93d60670a5SStefano Zampini PETSC_EXTERN PetscErrorCode ISRestoreNonlocalIS(IS, IS *);
94014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetSize(IS, PetscInt *);
95014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetLocalSize(IS, PetscInt *);
96014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISInvertPermutation(IS, PetscInt, IS *);
97014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISView(IS, PetscViewer);
98fe2efc57SMark PETSC_EXTERN PetscErrorCode ISViewFromOptions(IS, PetscObject, const char[]);
99235f7792SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISLoad(IS, PetscViewer);
100014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISEqual(IS, IS, PetscBool *);
101e8386968SVaclav Hapla PETSC_EXTERN PetscErrorCode ISEqualUnsorted(IS, IS, PetscBool *);
102014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSort(IS);
103b080c0f9SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISSortRemoveDups(IS);
104014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSorted(IS, PetscBool *);
105014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISDifference(IS, IS, IS *);
106014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSum(IS, IS, IS *);
107014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISExpand(IS, IS, IS *);
1083daafeecSToby Isaac PETSC_EXTERN PetscErrorCode ISIntersect(IS, IS, IS *);
109132da990SBarry Smith PETSC_EXTERN PetscErrorCode ISGetMinMax(IS, PetscInt *, PetscInt *);
110612dd529SBarry Smith 
111c3c3c9f4SToby Isaac PETSC_EXTERN PetscErrorCode ISLocate(IS, PetscInt, PetscInt *);
1129305a4c7SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISGetPointRange(IS, PetscInt *, PetscInt *, const PetscInt **);
1139305a4c7SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISRestorePointRange(IS, PetscInt *, PetscInt *, const PetscInt **);
1149305a4c7SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISGetPointSubrange(IS, PetscInt, PetscInt, const PetscInt *);
115c3c3c9f4SToby Isaac 
116014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetBlockSize(IS, PetscInt *);
117014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSetBlockSize(IS, PetscInt);
118c16cb8f2SBarry Smith 
119014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISToGeneral(IS);
12038f40f24SLois Curfman McInnes 
121014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISDuplicate(IS, IS *);
122014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISCopy(IS, IS);
1239fdaf958SVaclav Hapla PETSC_EXTERN PetscErrorCode ISShift(IS, PetscInt, IS);
124014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISAllGather(IS, IS *);
125014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISComplement(IS, PetscInt, PetscInt, IS *);
126014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISConcatenate(MPI_Comm, PetscInt, const IS[], IS *);
127bb74729cSDmitry Karpeev PETSC_EXTERN PetscErrorCode ISListToPair(MPI_Comm, PetscInt, IS[], IS *, IS *);
128bb74729cSDmitry Karpeev PETSC_EXTERN PetscErrorCode ISPairToList(IS, IS, PetscInt *, IS *[]);
129bb74729cSDmitry Karpeev PETSC_EXTERN PetscErrorCode ISEmbed(IS, IS, PetscBool, IS *);
1305ea6c424SDmitry Karpeev PETSC_EXTERN PetscErrorCode ISSortPermutation(IS, PetscBool, IS *);
131014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISOnComm(IS, MPI_Comm, PetscCopyMode, IS *);
1326583bcc1SStefano Zampini PETSC_EXTERN PetscErrorCode ISRenumber(IS, IS, PetscInt *, IS *);
1336c04a3c5SFande Kong PETSC_EXTERN PetscErrorCode ISCreateSubIS(IS, IS, IS *);
134d64ed03dSBarry Smith 
13584933e40SVaclav Hapla /* ISGENERAL specific */
13684933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISCreateGeneral(MPI_Comm, PetscInt, const PetscInt[], PetscCopyMode, IS *);
13784933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISGeneralSetIndices(IS, PetscInt, const PetscInt[], PetscCopyMode);
1389bc6f2f1SVaclav Hapla PETSC_EXTERN PetscErrorCode ISGeneralSetIndicesFromMask(IS, PetscInt, PetscInt, const PetscBool[]);
13953bb9c4cSVaclav Hapla PETSC_EXTERN PetscErrorCode ISGeneralFilter(IS, PetscInt, PetscInt);
14053bb9c4cSVaclav Hapla 
14184933e40SVaclav Hapla /* ISBLOCK specific */
14284933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISCreateBlock(MPI_Comm, PetscInt, PetscInt, const PetscInt[], PetscCopyMode, IS *);
14384933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISBlockSetIndices(IS, PetscInt, PetscInt, const PetscInt[], PetscCopyMode);
14484933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISBlockGetIndices(IS, const PetscInt *[]);
14584933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISBlockRestoreIndices(IS, const PetscInt *[]);
14684933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISBlockGetLocalSize(IS, PetscInt *);
14784933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISBlockGetSize(IS, PetscInt *);
14884933e40SVaclav Hapla 
14984933e40SVaclav Hapla /* ISSTRIDE specific */
15084933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISCreateStride(MPI_Comm, PetscInt, PetscInt, PetscInt, IS *);
15184933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISStrideSetStride(IS, PetscInt, PetscInt, PetscInt);
15284933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISStrideGetInfo(IS, PetscInt *, PetscInt *);
15384933e40SVaclav Hapla 
154014dd563SJed Brown PETSC_EXTERN PetscClassId IS_LTOGM_CLASSID;
15556cd22aeSBarry Smith 
1565c20da3cSBarry Smith /*E
1570040bde1SJunchao Zhang     ISGlobalToLocalMappingMode - Indicates mapping behavior if global indices are missing
1585c20da3cSBarry Smith 
15916a05f60SBarry Smith    Values:
16016a05f60SBarry Smith +   `IS_GTOLM_MASK` - missing global indices are masked by mapping them to a local index of -1
16116a05f60SBarry Smith -   `IS_GTOLM_DROP` - missing global indices are dropped
1625c20da3cSBarry Smith 
1635c20da3cSBarry Smith    Level: beginner
1645c20da3cSBarry Smith 
165db781477SPatrick Sanan .seealso: `ISGlobalToLocalMappingApplyBlock()`, `ISGlobalToLocalMappingApply()`
1665c20da3cSBarry Smith E*/
1679371c9d4SSatish Balay typedef enum {
1689371c9d4SSatish Balay   IS_GTOLM_MASK,
1699371c9d4SSatish Balay   IS_GTOLM_DROP
1709371c9d4SSatish Balay } ISGlobalToLocalMappingMode;
17190f02eecSBarry Smith 
172413f72f0SBarry Smith /*J
173413f72f0SBarry Smith     ISLocalToGlobalMappingType - String with the name of a mapping method
174413f72f0SBarry Smith 
17516a05f60SBarry Smith    Values:
17616a05f60SBarry Smith +  `ISLOCALTOGLOBALMAPPINGBASIC` - a non-memory scalable way of storing `ISLocalToGlobalMapping` that allows applying `ISGlobalToLocalMappingApply()` efficiently
17716a05f60SBarry Smith -  `ISLOCALTOGLOBALMAPPINGHASH` - a memory scalable way of storing `ISLocalToGlobalMapping` that allows applying `ISGlobalToLocalMappingApply()` reasonably efficiently
17816a05f60SBarry Smith 
179413f72f0SBarry Smith   Level: beginner
180413f72f0SBarry Smith 
18116a05f60SBarry Smith .seealso: `ISLocalToGlobalMapping`, `ISLocalToGlobalMappingSetType()`, `ISLocalToGlobalSetFromOptions()`, `ISGlobalToLocalMappingMode`
182413f72f0SBarry Smith J*/
183413f72f0SBarry Smith typedef const char *ISLocalToGlobalMappingType;
184413f72f0SBarry Smith #define ISLOCALTOGLOBALMAPPINGBASIC "basic"
185413f72f0SBarry Smith #define ISLOCALTOGLOBALMAPPINGHASH  "hash"
186413f72f0SBarry Smith 
187413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetType(ISLocalToGlobalMapping, ISLocalToGlobalMappingType);
188a0d79125SStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetType(ISLocalToGlobalMapping, ISLocalToGlobalMappingType *);
1891d36bdfdSBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRegister(const char[], PetscErrorCode (*)(ISLocalToGlobalMapping));
190413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRegisterAll(void);
191f0413b6fSBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreate(MPI_Comm, PetscInt, PetscInt, const PetscInt[], PetscCopyMode, ISLocalToGlobalMapping *);
192014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreateIS(IS, ISLocalToGlobalMapping *);
193014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreateSF(PetscSF, PetscInt, ISLocalToGlobalMapping *);
1947e99dc12SLawrence Mitchell PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetFromOptions(ISLocalToGlobalMapping);
195413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetUp(ISLocalToGlobalMapping);
196014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingView(ISLocalToGlobalMapping, PetscViewer);
197fe2efc57SMark PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingViewFromOptions(ISLocalToGlobalMapping, PetscObject, const char[]);
198662df134SStefano Zampini 
199014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingDestroy(ISLocalToGlobalMapping *);
20004a59952SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApply(ISLocalToGlobalMapping, PetscInt, const PetscInt[], PetscInt[]);
20145b6f7e9SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApplyBlock(ISLocalToGlobalMapping, PetscInt, const PetscInt[], PetscInt[]);
202014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApplyIS(ISLocalToGlobalMapping, IS, IS *);
203413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApply(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, PetscInt, const PetscInt[], PetscInt *, PetscInt[]);
204413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApplyBlock(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, PetscInt, const PetscInt[], PetscInt *, PetscInt[]);
205413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApplyIS(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, IS, IS *);
206014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetSize(ISLocalToGlobalMapping, PetscInt *);
2071bd0b88eSStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]);
2081bd0b88eSStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]);
209014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
210014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
2116a818285SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
2126a818285SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreBlockInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
213014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetIndices(ISLocalToGlobalMapping, const PetscInt **);
214014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreIndices(ISLocalToGlobalMapping, const PetscInt **);
21545b6f7e9SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockIndices(ISLocalToGlobalMapping, const PetscInt **);
21645b6f7e9SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreBlockIndices(ISLocalToGlobalMapping, const PetscInt **);
217014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingConcatenate(MPI_Comm, PetscInt, const ISLocalToGlobalMapping[], ISLocalToGlobalMapping *);
21845b6f7e9SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockSize(ISLocalToGlobalMapping, PetscInt *);
21963fa5c83Sstefano_zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetBlockSize(ISLocalToGlobalMapping, PetscInt);
2206658fb44Sstefano_zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingDuplicate(ISLocalToGlobalMapping, ISLocalToGlobalMapping *);
22145b6f7e9SBarry Smith 
222b9617806SBarry Smith /*E
223b9617806SBarry Smith     ISColoringType - determines if the coloring is for the entire parallel grid/graph/matrix
224b9617806SBarry Smith                      or for just the local ghosted portion
225b9617806SBarry Smith 
22616a05f60SBarry Smith     Values:
22716a05f60SBarry Smith +   `IS_COLORING_GLOBAL` - does not include the colors for ghost points, this is used when the function
22816a05f60SBarry Smith                         is called synchronously in parallel. This requires generating a "parallel coloring".
22916a05f60SBarry Smith -   `IS_COLORING_LOCAL` - includes colors for ghost points, this is used when the function can be called
23016a05f60SBarry Smith                          separately on individual processes with the ghost points already filled in. Does not
23116a05f60SBarry Smith                          require a "parallel coloring", rather each process colors its local + ghost part.
23216a05f60SBarry Smith                          Using this can result in much less parallel communication. Currently only works
23316a05f60SBarry Smith                          with `DMDA` and if you call `MatFDColoringSetFunction()` with the local function.
23416a05f60SBarry Smith 
235b9617806SBarry Smith    Level: beginner
236b9617806SBarry Smith 
23716a05f60SBarry Smith .seealso: `ISColoring`, `ISColoringSetType()`, `ISColoringGetType()`, `DMCreateColoring()`
238b9617806SBarry Smith E*/
2399371c9d4SSatish Balay typedef enum {
2409371c9d4SSatish Balay   IS_COLORING_GLOBAL,
2419371c9d4SSatish Balay   IS_COLORING_LOCAL
2429371c9d4SSatish Balay } ISColoringType;
2436a6fc655SJed Brown PETSC_EXTERN const char *const                ISColoringTypes[];
244569ea7c4SPierre Jolivet typedef unsigned PETSC_IS_COLORING_VALUE_TYPE ISColoringValue;
245569ea7c4SPierre Jolivet #define IS_COLORING_MAX     PETSC_IS_COLORING_MAX
246569ea7c4SPierre Jolivet #define MPIU_COLORING_VALUE PETSC_MPIU_IS_COLORING_VALUE_TYPE
247014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISAllGatherColors(MPI_Comm, PetscInt, ISColoringValue *, PetscInt *, ISColoringValue *[]);
248dde82324SBarry Smith 
249aaf3ff59SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISColoringCreate(MPI_Comm, PetscInt, PetscInt, const ISColoringValue[], PetscCopyMode, ISColoring *);
250014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISColoringDestroy(ISColoring *);
251014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISColoringView(ISColoring, PetscViewer);
2528aec7d55SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringViewFromOptions(ISColoring, PetscObject, const char[]);
253071fcb05SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringGetIS(ISColoring, PetscCopyMode, PetscInt *, IS *[]);
254071fcb05SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringRestoreIS(ISColoring, PetscCopyMode, IS *[]);
25549b734d2SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringReference(ISColoring);
25649b734d2SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringSetType(ISColoring, ISColoringType);
257bdaf1daeSBarry Smith PETSC_EXTERN PetscErrorCode ISColoringGetType(ISColoring, ISColoringType *);
258bdaf1daeSBarry Smith PETSC_EXTERN PetscErrorCode ISColoringGetColors(ISColoring, PetscInt *, PetscInt *, const ISColoringValue **);
2593a7fca6bSBarry Smith 
26094f0491fSFande Kong PETSC_EXTERN PetscErrorCode ISBuildTwoSided(IS, IS, IS *);
261014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISPartitioningToNumbering(IS, IS *);
262014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISPartitioningCount(IS, PetscInt, PetscInt[]);
263dbef8a1cSBarry Smith 
264014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISCompressIndicesGeneral(PetscInt, PetscInt, PetscInt, PetscInt, const IS[], IS[]);
265edd03b47SJacob 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[])
266e37d522bSPierre Jolivet {
267e37d522bSPierre Jolivet   return ISCompressIndicesGeneral(n, bs, n, imax, is_in, is_out);
268e37d522bSPierre Jolivet }
269014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISExpandIndicesGeneral(PetscInt, PetscInt, PetscInt, PetscInt, const IS[], IS[]);
270d9489beaSHong Zhang 
27169ce434fSBarry Smith struct _n_PetscLayout {
27269ce434fSBarry Smith   MPI_Comm               comm;
27338a25198SStefano Zampini   PetscMPIInt            size;
27469ce434fSBarry Smith   PetscInt               n, N;         /* local, global vector size */
27569ce434fSBarry Smith   PetscInt               rstart, rend; /* local start, local end + 1 */
27669ce434fSBarry Smith   PetscInt              *range;        /* the offset of each processor */
2779621ec18SVaclav Hapla   PetscBool              range_alloc;  /* should range be freed in Destroy? */
27833d57670SJed Brown   PetscInt               bs;           /* number of elements in each block (generally for multi-component
27933d57670SJed Brown                                        * problems). Defaults to -1 and can be arbitrarily lazy so always use
28033d57670SJed Brown                                        * PetscAbs(map->bs) when accessing directly and expecting result to be
28133d57670SJed Brown                                        * positive. Do NOT multiply above numbers by bs */
2822a7a6963SBarry Smith   PetscInt               refcnt;       /* MPI Vecs obtained with VecDuplicate() and from MatCreateVecs() reuse map of input object */
28369ce434fSBarry Smith   ISLocalToGlobalMapping mapping;      /* mapping used in Vec/MatSetValuesLocal() */
284ca5434daSLawrence Mitchell   PetscBool              setupcalled;  /* Forbid setup more than once */
285ca5434daSLawrence Mitchell   PetscInt               oldn, oldN;   /* Checking if setup is allowed */
286ca5434daSLawrence Mitchell   PetscInt               oldbs;        /* And again */
28769ce434fSBarry Smith };
28869ce434fSBarry Smith 
2897e3c27c9SBarry Smith /*@C
29069ce434fSBarry Smith      PetscLayoutFindOwner - Find the owning rank for a global index
29169ce434fSBarry Smith 
29220f4b53cSBarry Smith     Not Collective; No Fortran Support
29369ce434fSBarry Smith 
29469ce434fSBarry Smith    Input Parameters:
29569ce434fSBarry Smith +    map - the layout
29669ce434fSBarry Smith -    idx - global index to find the owner of
29769ce434fSBarry Smith 
29869ce434fSBarry Smith    Output Parameter:
29969ce434fSBarry Smith .    owner - the owning rank
30069ce434fSBarry Smith 
30169ce434fSBarry Smith    Level: developer
30269ce434fSBarry Smith 
30316a05f60SBarry Smith .seealso: `PetscLayout`, `PetscLayoutFindOwnerIndex()`
30469ce434fSBarry Smith @*/
305d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscLayoutFindOwner(PetscLayout map, PetscInt idx, PetscMPIInt *owner)
306d71ae5a4SJacob Faibussowitsch {
30769ce434fSBarry Smith   PetscMPIInt lo = 0, hi, t;
30869ce434fSBarry Smith 
30969ce434fSBarry Smith   PetscFunctionBegin;
31069ce434fSBarry Smith   *owner = -1; /* GCC erroneously issues warning about possibly uninitialized use when error condition */
31138a25198SStefano Zampini #if defined(PETSC_USE_DEBUG)
3122c71b3e2SJacob Faibussowitsch   PetscCheck((map->n >= 0) && (map->N >= 0) && (map->range), PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscLayoutSetUp() must be called first");
3132c71b3e2SJacob Faibussowitsch   PetscCheck(idx >= 0 && idx <= map->N, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Index %" PetscInt_FMT " is out of range", idx);
31438a25198SStefano Zampini #endif
31538a25198SStefano Zampini   hi = map->size;
31669ce434fSBarry Smith   while (hi - lo > 1) {
31769ce434fSBarry Smith     t = lo + (hi - lo) / 2;
31869ce434fSBarry Smith     if (idx < map->range[t]) hi = t;
31969ce434fSBarry Smith     else lo = t;
32069ce434fSBarry Smith   }
32169ce434fSBarry Smith   *owner = lo;
3223ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
32369ce434fSBarry Smith }
32469ce434fSBarry Smith 
32569ce434fSBarry Smith /*@C
32616a05f60SBarry Smith      PetscLayoutFindOwnerIndex - Find the owning MPI rank and the local index on that rank for a global index
32769ce434fSBarry Smith 
32820f4b53cSBarry Smith     Not Collective; No Fortran Support
32969ce434fSBarry Smith 
33069ce434fSBarry Smith    Input Parameters:
33169ce434fSBarry Smith +    map   - the layout
33269ce434fSBarry Smith -    idx   - global index to find the owner of
33369ce434fSBarry Smith 
334d8d19677SJose E. Roman    Output Parameters:
33569ce434fSBarry Smith +    owner - the owning rank
33616a05f60SBarry Smith -    lidx  - local index used by the owner for `idx`
33769ce434fSBarry Smith 
33869ce434fSBarry Smith    Level: developer
33969ce434fSBarry Smith 
34016a05f60SBarry Smith .seealso: `PetscLayout`, `PetscLayoutFindOwner()`
34169ce434fSBarry Smith @*/
342d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscLayoutFindOwnerIndex(PetscLayout map, PetscInt idx, PetscMPIInt *owner, PetscInt *lidx)
343d71ae5a4SJacob Faibussowitsch {
34469ce434fSBarry Smith   PetscMPIInt lo = 0, hi, t;
34569ce434fSBarry Smith 
34669ce434fSBarry Smith   PetscFunctionBegin;
34738a25198SStefano Zampini #if defined(PETSC_USE_DEBUG)
3482c71b3e2SJacob Faibussowitsch   PetscCheck((map->n >= 0) && (map->N >= 0) && (map->range), PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscLayoutSetUp() must be called first");
3492c71b3e2SJacob Faibussowitsch   PetscCheck(idx >= 0 && idx <= map->N, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Index %" PetscInt_FMT " is out of range", idx);
35038a25198SStefano Zampini #endif
35138a25198SStefano Zampini   hi = map->size;
35269ce434fSBarry Smith   while (hi - lo > 1) {
35369ce434fSBarry Smith     t = lo + (hi - lo) / 2;
35469ce434fSBarry Smith     if (idx < map->range[t]) hi = t;
35569ce434fSBarry Smith     else lo = t;
35669ce434fSBarry Smith   }
35704799504SMark Adams   if (owner) *owner = lo;
35804799504SMark Adams   if (lidx) *lidx = idx - map->range[lo];
3593ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
36069ce434fSBarry Smith }
3619e03d832SJed Brown 
36201e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutCreate(MPI_Comm, PetscLayout *);
3639621ec18SVaclav Hapla PETSC_EXTERN PetscErrorCode PetscLayoutCreateFromSizes(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscLayout *);
3649621ec18SVaclav Hapla PETSC_EXTERN PetscErrorCode PetscLayoutCreateFromRanges(MPI_Comm, const PetscInt[], PetscCopyMode, PetscInt, PetscLayout *);
36501e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetUp(PetscLayout);
36601e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutDestroy(PetscLayout *);
36701e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutDuplicate(PetscLayout, PetscLayout *);
36801e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutReference(PetscLayout, PetscLayout *);
36901e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetLocalSize(PetscLayout, PetscInt);
37001e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetLocalSize(PetscLayout, PetscInt *);
37101e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetSize(PetscLayout, PetscInt);
37201e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetSize(PetscLayout, PetscInt *);
37301e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetBlockSize(PetscLayout, PetscInt);
37401e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetBlockSize(PetscLayout, PetscInt *);
37501e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetRange(PetscLayout, PetscInt *, PetscInt *);
37601e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetRanges(PetscLayout, const PetscInt *[]);
377f92d6284SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLayoutCompare(PetscLayout, PetscLayout, PetscBool *);
37801e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetISLocalToGlobalMapping(PetscLayout, ISLocalToGlobalMapping);
37907acc2aeSBarry Smith PETSC_EXTERN PetscErrorCode PetscLayoutMapLocal(PetscLayout, PetscInt, const PetscInt[], PetscInt *, PetscInt **, PetscInt **);
38001e13f73SMatthew G. Knepley 
381ce605777SToby Isaac PETSC_EXTERN PetscErrorCode PetscParallelSortInt(PetscLayout, PetscLayout, PetscInt *, PetscInt *);
382ce605777SToby Isaac 
383ce605777SToby Isaac PETSC_EXTERN PetscErrorCode ISGetLayout(IS, PetscLayout *);
3844e1d6e84SVaclav Hapla PETSC_EXTERN PetscErrorCode ISSetLayout(IS, PetscLayout);
385ce605777SToby Isaac 
386a2ce50c7SBarry Smith #endif
387