xref: /petsc/include/petscis.h (revision 16a05f60a523f53ab316acaac9f77b7425611adc)
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);
192b6de112SBarry Smith 
2076bdecfbSBarry Smith /*J
218f6c3df8SBarry Smith     ISType - String with the name of a PETSc index set type
2227bdab1eSBarry Smith 
23*16a05f60SBarry Smith    Values:
24*16a05f60SBarry Smith +  `ISGENERAL` - the values are stored with an arry of indices and generally have no structure
25*16a05f60SBarry Smith .  `ISSTRIDE` - the values have a simple structure of an initial offset and then a step size between values
26*16a05f60SBarry Smith -  `ISBLOCK` - values are an array of indices, each representing a block of values
27*16a05f60SBarry Smith 
2827bdab1eSBarry Smith    Level: beginner
2927bdab1eSBarry Smith 
30*16a05f60SBarry Smith .seealso: `ISSetType()`, `IS`, `ISCreateGeneral()`, `ISCreateStride()`, `ISCreateBlock()`, `ISCreate()`, `ISRegister()`,
31*16a05f60SBarry Smith           `VecScatterCreate()`, `MatGetSubMatrices()`
3276bdecfbSBarry Smith J*/
3319fd82e9SBarry Smith typedef const char *ISType;
3427bdab1eSBarry Smith #define ISGENERAL "general"
3527bdab1eSBarry Smith #define ISSTRIDE  "stride"
3627bdab1eSBarry Smith #define ISBLOCK   "block"
3727bdab1eSBarry Smith 
3827bdab1eSBarry Smith /* Dynamic creation and loading functions */
39140e18c1SBarry Smith PETSC_EXTERN PetscFunctionList ISList;
4019fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode    ISSetType(IS, ISType);
4119fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode    ISGetType(IS, ISType *);
42bdf89e91SBarry Smith PETSC_EXTERN PetscErrorCode    ISRegister(const char[], PetscErrorCode (*)(IS));
43014dd563SJed Brown PETSC_EXTERN PetscErrorCode    ISCreate(MPI_Comm, IS *);
4427bdab1eSBarry Smith 
45014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISDestroy(IS *);
46014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSetPermutation(IS);
47014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISPermutation(IS, PetscBool *);
48014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSetIdentity(IS);
49014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISIdentity(IS, PetscBool *);
50014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISContiguousLocal(IS, PetscInt, PetscInt, PetscInt *, PetscBool *);
5108480c60SBarry Smith 
522a1da528SToby Isaac /*E
532a1da528SToby Isaac     ISInfo - Info that may either be computed or set as known for an index set
542a1da528SToby Isaac 
55*16a05f60SBarry Smith     Level: intermediate
562a1da528SToby Isaac 
572a1da528SToby Isaac    Developer Notes:
582a1da528SToby Isaac    Entries that are negative need not be called collectively by all processes.
592a1da528SToby Isaac 
6087497f52SBarry Smith    Any additions/changes here MUST also be made in include/petsc/finclude/petscis.h
6187497f52SBarry Smith 
6287497f52SBarry Smith    Any additions/changes here must also be made in src/vec/vec/interface/dlregisvec.c in ISInfos[]
6387497f52SBarry Smith 
64*16a05f60SBarry Smith .seealso: `IS`, `ISType`, `ISSetInfo()`
652a1da528SToby Isaac E*/
669371c9d4SSatish Balay typedef enum {
679371c9d4SSatish Balay   IS_INFO_MIN    = -1,
682a1da528SToby Isaac   IS_SORTED      = 0,
692a1da528SToby Isaac   IS_UNIQUE      = 1,
702a1da528SToby Isaac   IS_PERMUTATION = 2,
712a1da528SToby Isaac   IS_INTERVAL    = 3,
722a1da528SToby Isaac   IS_IDENTITY    = 4,
739371c9d4SSatish Balay   IS_INFO_MAX    = 5
749371c9d4SSatish Balay } ISInfo;
752a1da528SToby Isaac 
769371c9d4SSatish Balay typedef enum {
779371c9d4SSatish Balay   IS_LOCAL,
789371c9d4SSatish Balay   IS_GLOBAL
799371c9d4SSatish Balay } ISInfoType;
802a1da528SToby Isaac 
812a1da528SToby Isaac PETSC_EXTERN PetscErrorCode ISSetInfo(IS, ISInfo, ISInfoType, PetscBool, PetscBool);
82657dc977SToby Isaac PETSC_EXTERN PetscErrorCode ISGetInfo(IS, ISInfo, ISInfoType, PetscBool, PetscBool *);
832a1da528SToby Isaac PETSC_EXTERN PetscErrorCode ISClearInfoCache(IS, PetscBool);
84014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetIndices(IS, const PetscInt *[]);
85014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISRestoreIndices(IS, const PetscInt *[]);
86014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetTotalIndices(IS, const PetscInt *[]);
87014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISRestoreTotalIndices(IS, const PetscInt *[]);
88014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetNonlocalIndices(IS, const PetscInt *[]);
89014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISRestoreNonlocalIndices(IS, const PetscInt *[]);
90d60670a5SStefano Zampini PETSC_EXTERN PetscErrorCode ISGetNonlocalIS(IS, IS *);
91d60670a5SStefano Zampini PETSC_EXTERN PetscErrorCode ISRestoreNonlocalIS(IS, IS *);
92014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetSize(IS, PetscInt *);
93014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetLocalSize(IS, PetscInt *);
94014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISInvertPermutation(IS, PetscInt, IS *);
95014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISView(IS, PetscViewer);
96fe2efc57SMark PETSC_EXTERN PetscErrorCode ISViewFromOptions(IS, PetscObject, const char[]);
97235f7792SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISLoad(IS, PetscViewer);
98014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISEqual(IS, IS, PetscBool *);
99e8386968SVaclav Hapla PETSC_EXTERN PetscErrorCode ISEqualUnsorted(IS, IS, PetscBool *);
100014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSort(IS);
101b080c0f9SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISSortRemoveDups(IS);
102014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSorted(IS, PetscBool *);
103014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISDifference(IS, IS, IS *);
104014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSum(IS, IS, IS *);
105014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISExpand(IS, IS, IS *);
1063daafeecSToby Isaac PETSC_EXTERN PetscErrorCode ISIntersect(IS, IS, IS *);
107132da990SBarry Smith PETSC_EXTERN PetscErrorCode ISGetMinMax(IS, PetscInt *, PetscInt *);
108612dd529SBarry Smith 
109c3c3c9f4SToby Isaac PETSC_EXTERN PetscErrorCode ISLocate(IS, PetscInt, PetscInt *);
1109305a4c7SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISGetPointRange(IS, PetscInt *, PetscInt *, const PetscInt **);
1119305a4c7SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISRestorePointRange(IS, PetscInt *, PetscInt *, const PetscInt **);
1129305a4c7SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISGetPointSubrange(IS, PetscInt, PetscInt, const PetscInt *);
113c3c3c9f4SToby Isaac 
114014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetBlockSize(IS, PetscInt *);
115014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSetBlockSize(IS, PetscInt);
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 
152014dd563SJed Brown PETSC_EXTERN PetscClassId IS_LTOGM_CLASSID;
15356cd22aeSBarry Smith 
1545c20da3cSBarry Smith /*E
1550040bde1SJunchao Zhang     ISGlobalToLocalMappingMode - Indicates mapping behavior if global indices are missing
1565c20da3cSBarry Smith 
157*16a05f60SBarry Smith    Values:
158*16a05f60SBarry Smith +   `IS_GTOLM_MASK` - missing global indices are masked by mapping them to a local index of -1
159*16a05f60SBarry Smith -   `IS_GTOLM_DROP` - missing global indices are dropped
1605c20da3cSBarry Smith 
1615c20da3cSBarry Smith    Level: beginner
1625c20da3cSBarry Smith 
163db781477SPatrick Sanan .seealso: `ISGlobalToLocalMappingApplyBlock()`, `ISGlobalToLocalMappingApply()`
1645c20da3cSBarry Smith E*/
1659371c9d4SSatish Balay typedef enum {
1669371c9d4SSatish Balay   IS_GTOLM_MASK,
1679371c9d4SSatish Balay   IS_GTOLM_DROP
1689371c9d4SSatish Balay } ISGlobalToLocalMappingMode;
16990f02eecSBarry Smith 
170413f72f0SBarry Smith /*J
171413f72f0SBarry Smith     ISLocalToGlobalMappingType - String with the name of a mapping method
172413f72f0SBarry Smith 
173*16a05f60SBarry Smith    Values:
174*16a05f60SBarry Smith +  `ISLOCALTOGLOBALMAPPINGBASIC` - a non-memory scalable way of storing `ISLocalToGlobalMapping` that allows applying `ISGlobalToLocalMappingApply()` efficiently
175*16a05f60SBarry Smith -  `ISLOCALTOGLOBALMAPPINGHASH` - a memory scalable way of storing `ISLocalToGlobalMapping` that allows applying `ISGlobalToLocalMappingApply()` reasonably efficiently
176*16a05f60SBarry Smith 
177413f72f0SBarry Smith   Level: beginner
178413f72f0SBarry Smith 
179*16a05f60SBarry Smith .seealso: `ISLocalToGlobalMapping`, `ISLocalToGlobalMappingSetType()`, `ISLocalToGlobalSetFromOptions()`, `ISGlobalToLocalMappingMode`
180413f72f0SBarry Smith J*/
181413f72f0SBarry Smith typedef const char *ISLocalToGlobalMappingType;
182413f72f0SBarry Smith #define ISLOCALTOGLOBALMAPPINGBASIC "basic"
183413f72f0SBarry Smith #define ISLOCALTOGLOBALMAPPINGHASH  "hash"
184413f72f0SBarry Smith 
185413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetType(ISLocalToGlobalMapping, ISLocalToGlobalMappingType);
186a0d79125SStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetType(ISLocalToGlobalMapping, ISLocalToGlobalMappingType *);
1871d36bdfdSBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRegister(const char[], PetscErrorCode (*)(ISLocalToGlobalMapping));
188413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRegisterAll(void);
189f0413b6fSBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreate(MPI_Comm, PetscInt, PetscInt, const PetscInt[], PetscCopyMode, ISLocalToGlobalMapping *);
190014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreateIS(IS, ISLocalToGlobalMapping *);
191014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreateSF(PetscSF, PetscInt, ISLocalToGlobalMapping *);
1927e99dc12SLawrence Mitchell PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetFromOptions(ISLocalToGlobalMapping);
193413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetUp(ISLocalToGlobalMapping);
194014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingView(ISLocalToGlobalMapping, PetscViewer);
195fe2efc57SMark PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingViewFromOptions(ISLocalToGlobalMapping, PetscObject, const char[]);
196662df134SStefano Zampini 
197014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingDestroy(ISLocalToGlobalMapping *);
19804a59952SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApply(ISLocalToGlobalMapping, PetscInt, const PetscInt[], PetscInt[]);
19945b6f7e9SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApplyBlock(ISLocalToGlobalMapping, PetscInt, const PetscInt[], PetscInt[]);
200014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApplyIS(ISLocalToGlobalMapping, IS, IS *);
201413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApply(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, PetscInt, const PetscInt[], PetscInt *, PetscInt[]);
202413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApplyBlock(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, PetscInt, const PetscInt[], PetscInt *, PetscInt[]);
203413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApplyIS(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, IS, IS *);
204014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetSize(ISLocalToGlobalMapping, PetscInt *);
2051bd0b88eSStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]);
2061bd0b88eSStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]);
207014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
208014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
2096a818285SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
2106a818285SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreBlockInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
211014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetIndices(ISLocalToGlobalMapping, const PetscInt **);
212014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreIndices(ISLocalToGlobalMapping, const PetscInt **);
21345b6f7e9SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockIndices(ISLocalToGlobalMapping, const PetscInt **);
21445b6f7e9SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreBlockIndices(ISLocalToGlobalMapping, const PetscInt **);
215014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingConcatenate(MPI_Comm, PetscInt, const ISLocalToGlobalMapping[], ISLocalToGlobalMapping *);
21645b6f7e9SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockSize(ISLocalToGlobalMapping, PetscInt *);
21763fa5c83Sstefano_zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetBlockSize(ISLocalToGlobalMapping, PetscInt);
2186658fb44Sstefano_zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingDuplicate(ISLocalToGlobalMapping, ISLocalToGlobalMapping *);
21945b6f7e9SBarry Smith 
220b9617806SBarry Smith /*E
221b9617806SBarry Smith     ISColoringType - determines if the coloring is for the entire parallel grid/graph/matrix
222b9617806SBarry Smith                      or for just the local ghosted portion
223b9617806SBarry Smith 
224*16a05f60SBarry Smith     Values:
225*16a05f60SBarry Smith +   `IS_COLORING_GLOBAL` - does not include the colors for ghost points, this is used when the function
226*16a05f60SBarry Smith                         is called synchronously in parallel. This requires generating a "parallel coloring".
227*16a05f60SBarry Smith -   `IS_COLORING_LOCAL` - includes colors for ghost points, this is used when the function can be called
228*16a05f60SBarry Smith                          separately on individual processes with the ghost points already filled in. Does not
229*16a05f60SBarry Smith                          require a "parallel coloring", rather each process colors its local + ghost part.
230*16a05f60SBarry Smith                          Using this can result in much less parallel communication. Currently only works
231*16a05f60SBarry Smith                          with `DMDA` and if you call `MatFDColoringSetFunction()` with the local function.
232*16a05f60SBarry Smith 
233b9617806SBarry Smith    Level: beginner
234b9617806SBarry Smith 
235*16a05f60SBarry Smith .seealso: `ISColoring`, `ISColoringSetType()`, `ISColoringGetType()`, `DMCreateColoring()`
236b9617806SBarry Smith E*/
2379371c9d4SSatish Balay typedef enum {
2389371c9d4SSatish Balay   IS_COLORING_GLOBAL,
2399371c9d4SSatish Balay   IS_COLORING_LOCAL
2409371c9d4SSatish Balay } ISColoringType;
2416a6fc655SJed Brown PETSC_EXTERN const char *const                ISColoringTypes[];
242569ea7c4SPierre Jolivet typedef unsigned PETSC_IS_COLORING_VALUE_TYPE ISColoringValue;
243569ea7c4SPierre Jolivet #define IS_COLORING_MAX     PETSC_IS_COLORING_MAX
244569ea7c4SPierre Jolivet #define MPIU_COLORING_VALUE PETSC_MPIU_IS_COLORING_VALUE_TYPE
245014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISAllGatherColors(MPI_Comm, PetscInt, ISColoringValue *, PetscInt *, ISColoringValue *[]);
246dde82324SBarry Smith 
247aaf3ff59SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISColoringCreate(MPI_Comm, PetscInt, PetscInt, const ISColoringValue[], PetscCopyMode, ISColoring *);
248014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISColoringDestroy(ISColoring *);
249014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISColoringView(ISColoring, PetscViewer);
2508aec7d55SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringViewFromOptions(ISColoring, PetscObject, const char[]);
251071fcb05SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringGetIS(ISColoring, PetscCopyMode, PetscInt *, IS *[]);
252071fcb05SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringRestoreIS(ISColoring, PetscCopyMode, IS *[]);
25349b734d2SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringReference(ISColoring);
25449b734d2SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringSetType(ISColoring, ISColoringType);
255bdaf1daeSBarry Smith PETSC_EXTERN PetscErrorCode ISColoringGetType(ISColoring, ISColoringType *);
256bdaf1daeSBarry Smith PETSC_EXTERN PetscErrorCode ISColoringGetColors(ISColoring, PetscInt *, PetscInt *, const ISColoringValue **);
2573a7fca6bSBarry Smith 
25894f0491fSFande Kong PETSC_EXTERN PetscErrorCode ISBuildTwoSided(IS, IS, IS *);
259014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISPartitioningToNumbering(IS, IS *);
260014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISPartitioningCount(IS, PetscInt, PetscInt[]);
261dbef8a1cSBarry Smith 
262014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISCompressIndicesGeneral(PetscInt, PetscInt, PetscInt, PetscInt, const IS[], IS[]);
263e37d522bSPierre Jolivet PETSC_DEPRECATED_FUNCTION("Use ISCompressIndicesGeneral() (since version 3.19)") static inline PetscErrorCode ISCompressIndicesSorted(PetscInt n, PetscInt bs, PetscInt imax, const IS is_in[], IS is_out[])
264e37d522bSPierre Jolivet {
265e37d522bSPierre Jolivet   return ISCompressIndicesGeneral(n, bs, n, imax, is_in, is_out);
266e37d522bSPierre Jolivet }
267014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISExpandIndicesGeneral(PetscInt, PetscInt, PetscInt, PetscInt, const IS[], IS[]);
268d9489beaSHong Zhang 
26969ce434fSBarry Smith struct _n_PetscLayout {
27069ce434fSBarry Smith   MPI_Comm               comm;
27138a25198SStefano Zampini   PetscMPIInt            size;
27269ce434fSBarry Smith   PetscInt               n, N;         /* local, global vector size */
27369ce434fSBarry Smith   PetscInt               rstart, rend; /* local start, local end + 1 */
27469ce434fSBarry Smith   PetscInt              *range;        /* the offset of each processor */
2759621ec18SVaclav Hapla   PetscBool              range_alloc;  /* should range be freed in Destroy? */
27633d57670SJed Brown   PetscInt               bs;           /* number of elements in each block (generally for multi-component
27733d57670SJed Brown                                        * problems). Defaults to -1 and can be arbitrarily lazy so always use
27833d57670SJed Brown                                        * PetscAbs(map->bs) when accessing directly and expecting result to be
27933d57670SJed Brown                                        * positive. Do NOT multiply above numbers by bs */
2802a7a6963SBarry Smith   PetscInt               refcnt;       /* MPI Vecs obtained with VecDuplicate() and from MatCreateVecs() reuse map of input object */
28169ce434fSBarry Smith   ISLocalToGlobalMapping mapping;      /* mapping used in Vec/MatSetValuesLocal() */
282ca5434daSLawrence Mitchell   PetscBool              setupcalled;  /* Forbid setup more than once */
283ca5434daSLawrence Mitchell   PetscInt               oldn, oldN;   /* Checking if setup is allowed */
284ca5434daSLawrence Mitchell   PetscInt               oldbs;        /* And again */
28569ce434fSBarry Smith };
28669ce434fSBarry Smith 
2877e3c27c9SBarry Smith /*@C
28869ce434fSBarry Smith      PetscLayoutFindOwner - Find the owning rank for a global index
28969ce434fSBarry Smith 
29020f4b53cSBarry Smith     Not Collective; No Fortran Support
29169ce434fSBarry Smith 
29269ce434fSBarry Smith    Input Parameters:
29369ce434fSBarry Smith +    map - the layout
29469ce434fSBarry Smith -    idx - global index to find the owner of
29569ce434fSBarry Smith 
29669ce434fSBarry Smith    Output Parameter:
29769ce434fSBarry Smith .    owner - the owning rank
29869ce434fSBarry Smith 
29969ce434fSBarry Smith    Level: developer
30069ce434fSBarry Smith 
301*16a05f60SBarry Smith .seealso: `PetscLayout`, `PetscLayoutFindOwnerIndex()`
30269ce434fSBarry Smith @*/
303d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscLayoutFindOwner(PetscLayout map, PetscInt idx, PetscMPIInt *owner)
304d71ae5a4SJacob Faibussowitsch {
30569ce434fSBarry Smith   PetscMPIInt lo = 0, hi, t;
30669ce434fSBarry Smith 
30769ce434fSBarry Smith   PetscFunctionBegin;
30869ce434fSBarry Smith   *owner = -1; /* GCC erroneously issues warning about possibly uninitialized use when error condition */
30938a25198SStefano Zampini #if defined(PETSC_USE_DEBUG)
3102c71b3e2SJacob Faibussowitsch   PetscCheck((map->n >= 0) && (map->N >= 0) && (map->range), PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscLayoutSetUp() must be called first");
3112c71b3e2SJacob Faibussowitsch   PetscCheck(idx >= 0 && idx <= map->N, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Index %" PetscInt_FMT " is out of range", idx);
31238a25198SStefano Zampini #endif
31338a25198SStefano Zampini   hi = map->size;
31469ce434fSBarry Smith   while (hi - lo > 1) {
31569ce434fSBarry Smith     t = lo + (hi - lo) / 2;
31669ce434fSBarry Smith     if (idx < map->range[t]) hi = t;
31769ce434fSBarry Smith     else lo = t;
31869ce434fSBarry Smith   }
31969ce434fSBarry Smith   *owner = lo;
3203ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
32169ce434fSBarry Smith }
32269ce434fSBarry Smith 
32369ce434fSBarry Smith /*@C
324*16a05f60SBarry Smith      PetscLayoutFindOwnerIndex - Find the owning MPI rank and the local index on that rank for a global index
32569ce434fSBarry Smith 
32620f4b53cSBarry Smith     Not Collective; No Fortran Support
32769ce434fSBarry Smith 
32869ce434fSBarry Smith    Input Parameters:
32969ce434fSBarry Smith +    map   - the layout
33069ce434fSBarry Smith -    idx   - global index to find the owner of
33169ce434fSBarry Smith 
332d8d19677SJose E. Roman    Output Parameters:
33369ce434fSBarry Smith +    owner - the owning rank
334*16a05f60SBarry Smith -    lidx  - local index used by the owner for `idx`
33569ce434fSBarry Smith 
33669ce434fSBarry Smith    Level: developer
33769ce434fSBarry Smith 
338*16a05f60SBarry Smith .seealso: `PetscLayout`, `PetscLayoutFindOwner()`
33969ce434fSBarry Smith @*/
340d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscLayoutFindOwnerIndex(PetscLayout map, PetscInt idx, PetscMPIInt *owner, PetscInt *lidx)
341d71ae5a4SJacob Faibussowitsch {
34269ce434fSBarry Smith   PetscMPIInt lo = 0, hi, t;
34369ce434fSBarry Smith 
34469ce434fSBarry Smith   PetscFunctionBegin;
34538a25198SStefano Zampini #if defined(PETSC_USE_DEBUG)
3462c71b3e2SJacob Faibussowitsch   PetscCheck((map->n >= 0) && (map->N >= 0) && (map->range), PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscLayoutSetUp() must be called first");
3472c71b3e2SJacob Faibussowitsch   PetscCheck(idx >= 0 && idx <= map->N, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Index %" PetscInt_FMT " is out of range", idx);
34838a25198SStefano Zampini #endif
34938a25198SStefano Zampini   hi = map->size;
35069ce434fSBarry Smith   while (hi - lo > 1) {
35169ce434fSBarry Smith     t = lo + (hi - lo) / 2;
35269ce434fSBarry Smith     if (idx < map->range[t]) hi = t;
35369ce434fSBarry Smith     else lo = t;
35469ce434fSBarry Smith   }
35504799504SMark Adams   if (owner) *owner = lo;
35604799504SMark Adams   if (lidx) *lidx = idx - map->range[lo];
3573ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
35869ce434fSBarry Smith }
3599e03d832SJed Brown 
36001e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutCreate(MPI_Comm, PetscLayout *);
3619621ec18SVaclav Hapla PETSC_EXTERN PetscErrorCode PetscLayoutCreateFromSizes(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscLayout *);
3629621ec18SVaclav Hapla PETSC_EXTERN PetscErrorCode PetscLayoutCreateFromRanges(MPI_Comm, const PetscInt[], PetscCopyMode, PetscInt, PetscLayout *);
36301e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetUp(PetscLayout);
36401e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutDestroy(PetscLayout *);
36501e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutDuplicate(PetscLayout, PetscLayout *);
36601e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutReference(PetscLayout, PetscLayout *);
36701e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetLocalSize(PetscLayout, PetscInt);
36801e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetLocalSize(PetscLayout, PetscInt *);
36901e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetSize(PetscLayout, PetscInt);
37001e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetSize(PetscLayout, PetscInt *);
37101e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetBlockSize(PetscLayout, PetscInt);
37201e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetBlockSize(PetscLayout, PetscInt *);
37301e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetRange(PetscLayout, PetscInt *, PetscInt *);
37401e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetRanges(PetscLayout, const PetscInt *[]);
375f92d6284SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLayoutCompare(PetscLayout, PetscLayout, PetscBool *);
37601e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetISLocalToGlobalMapping(PetscLayout, ISLocalToGlobalMapping);
37707acc2aeSBarry Smith PETSC_EXTERN PetscErrorCode PetscLayoutMapLocal(PetscLayout, PetscInt, const PetscInt[], PetscInt *, PetscInt **, PetscInt **);
37801e13f73SMatthew G. Knepley 
379ce605777SToby Isaac PETSC_EXTERN PetscErrorCode PetscParallelSortInt(PetscLayout, PetscLayout, PetscInt *, PetscInt *);
380ce605777SToby Isaac 
381ce605777SToby Isaac PETSC_EXTERN PetscErrorCode ISGetLayout(IS, PetscLayout *);
3824e1d6e84SVaclav Hapla PETSC_EXTERN PetscErrorCode ISSetLayout(IS, PetscLayout);
383ce605777SToby Isaac 
384a2ce50c7SBarry Smith #endif
385