Actual source code: petscis.h
1: /*
2: An index set is a generalization of a subset of integers. Index sets
3: are used for defining scatters and gathers.
4: */
5: #ifndef PETSCIS_H
6: #define PETSCIS_H
8: #include <petscsys.h>
9: #include <petscsftypes.h>
10: #include <petscsectiontypes.h>
11: #include <petscistypes.h>
13: /* SUBMANSEC = IS */
15: #define IS_FILE_CLASSID 1211218
16: PETSC_EXTERN PetscClassId IS_CLASSID;
18: PETSC_EXTERN PetscErrorCode ISInitializePackage(void);
20: /*J
21: ISType - String with the name of a PETSc index set type
23: Level: beginner
25: .seealso: `ISSetType()`, `IS`, `ISCreate()`, `ISRegister()`
26: J*/
27: typedef const char *ISType;
28: #define ISGENERAL "general"
29: #define ISSTRIDE "stride"
30: #define ISBLOCK "block"
32: /* Dynamic creation and loading functions */
33: PETSC_EXTERN PetscFunctionList ISList;
34: PETSC_EXTERN PetscErrorCode ISSetType(IS, ISType);
35: PETSC_EXTERN PetscErrorCode ISGetType(IS, ISType *);
36: PETSC_EXTERN PetscErrorCode ISRegister(const char[], PetscErrorCode (*)(IS));
37: PETSC_EXTERN PetscErrorCode ISCreate(MPI_Comm, IS *);
39: PETSC_EXTERN PetscErrorCode ISDestroy(IS *);
40: PETSC_EXTERN PetscErrorCode ISSetPermutation(IS);
41: PETSC_EXTERN PetscErrorCode ISPermutation(IS, PetscBool *);
42: PETSC_EXTERN PetscErrorCode ISSetIdentity(IS);
43: PETSC_EXTERN PetscErrorCode ISIdentity(IS, PetscBool *);
44: PETSC_EXTERN PetscErrorCode ISContiguousLocal(IS, PetscInt, PetscInt, PetscInt *, PetscBool *);
46: /*E
47: ISInfo - Info that may either be computed or set as known for an index set
49: Level: beginner
51: Developer Notes:
52: Entries that are negative need not be called collectively by all processes.
54: Any additions/changes here MUST also be made in include/petsc/finclude/petscis.h
56: Any additions/changes here must also be made in src/vec/vec/interface/dlregisvec.c in ISInfos[]
58: .seealso: `ISSetInfo()`
59: E*/
60: typedef enum {
61: IS_INFO_MIN = -1,
62: IS_SORTED = 0,
63: IS_UNIQUE = 1,
64: IS_PERMUTATION = 2,
65: IS_INTERVAL = 3,
66: IS_IDENTITY = 4,
67: IS_INFO_MAX = 5
68: } ISInfo;
70: typedef enum {
71: IS_LOCAL,
72: IS_GLOBAL
73: } ISInfoType;
75: PETSC_EXTERN PetscErrorCode ISSetInfo(IS, ISInfo, ISInfoType, PetscBool, PetscBool);
76: PETSC_EXTERN PetscErrorCode ISGetInfo(IS, ISInfo, ISInfoType, PetscBool, PetscBool *);
77: PETSC_EXTERN PetscErrorCode ISClearInfoCache(IS, PetscBool);
78: PETSC_EXTERN PetscErrorCode ISGetIndices(IS, const PetscInt *[]);
79: PETSC_EXTERN PetscErrorCode ISRestoreIndices(IS, const PetscInt *[]);
80: PETSC_EXTERN PetscErrorCode ISGetTotalIndices(IS, const PetscInt *[]);
81: PETSC_EXTERN PetscErrorCode ISRestoreTotalIndices(IS, const PetscInt *[]);
82: PETSC_EXTERN PetscErrorCode ISGetNonlocalIndices(IS, const PetscInt *[]);
83: PETSC_EXTERN PetscErrorCode ISRestoreNonlocalIndices(IS, const PetscInt *[]);
84: PETSC_EXTERN PetscErrorCode ISGetNonlocalIS(IS, IS *);
85: PETSC_EXTERN PetscErrorCode ISRestoreNonlocalIS(IS, IS *);
86: PETSC_EXTERN PetscErrorCode ISGetSize(IS, PetscInt *);
87: PETSC_EXTERN PetscErrorCode ISGetLocalSize(IS, PetscInt *);
88: PETSC_EXTERN PetscErrorCode ISInvertPermutation(IS, PetscInt, IS *);
89: PETSC_EXTERN PetscErrorCode ISView(IS, PetscViewer);
90: PETSC_EXTERN PetscErrorCode ISViewFromOptions(IS, PetscObject, const char[]);
91: PETSC_EXTERN PetscErrorCode ISLoad(IS, PetscViewer);
92: PETSC_EXTERN PetscErrorCode ISEqual(IS, IS, PetscBool *);
93: PETSC_EXTERN PetscErrorCode ISEqualUnsorted(IS, IS, PetscBool *);
94: PETSC_EXTERN PetscErrorCode ISSort(IS);
95: PETSC_EXTERN PetscErrorCode ISSortRemoveDups(IS);
96: PETSC_EXTERN PetscErrorCode ISSorted(IS, PetscBool *);
97: PETSC_EXTERN PetscErrorCode ISDifference(IS, IS, IS *);
98: PETSC_EXTERN PetscErrorCode ISSum(IS, IS, IS *);
99: PETSC_EXTERN PetscErrorCode ISExpand(IS, IS, IS *);
100: PETSC_EXTERN PetscErrorCode ISIntersect(IS, IS, IS *);
101: PETSC_EXTERN PetscErrorCode ISGetMinMax(IS, PetscInt *, PetscInt *);
103: PETSC_EXTERN PetscErrorCode ISLocate(IS, PetscInt, PetscInt *);
104: PETSC_EXTERN PetscErrorCode ISGetPointRange(IS, PetscInt *, PetscInt *, const PetscInt **);
105: PETSC_EXTERN PetscErrorCode ISRestorePointRange(IS, PetscInt *, PetscInt *, const PetscInt **);
106: PETSC_EXTERN PetscErrorCode ISGetPointSubrange(IS, PetscInt, PetscInt, const PetscInt *);
108: PETSC_EXTERN PetscErrorCode ISGetBlockSize(IS, PetscInt *);
109: PETSC_EXTERN PetscErrorCode ISSetBlockSize(IS, PetscInt);
111: PETSC_EXTERN PetscErrorCode ISToGeneral(IS);
113: PETSC_EXTERN PetscErrorCode ISDuplicate(IS, IS *);
114: PETSC_EXTERN PetscErrorCode ISCopy(IS, IS);
115: PETSC_EXTERN PetscErrorCode ISShift(IS, PetscInt, IS);
116: PETSC_EXTERN PetscErrorCode ISAllGather(IS, IS *);
117: PETSC_EXTERN PetscErrorCode ISComplement(IS, PetscInt, PetscInt, IS *);
118: PETSC_EXTERN PetscErrorCode ISConcatenate(MPI_Comm, PetscInt, const IS[], IS *);
119: PETSC_EXTERN PetscErrorCode ISListToPair(MPI_Comm, PetscInt, IS[], IS *, IS *);
120: PETSC_EXTERN PetscErrorCode ISPairToList(IS, IS, PetscInt *, IS *[]);
121: PETSC_EXTERN PetscErrorCode ISEmbed(IS, IS, PetscBool, IS *);
122: PETSC_EXTERN PetscErrorCode ISSortPermutation(IS, PetscBool, IS *);
123: PETSC_EXTERN PetscErrorCode ISOnComm(IS, MPI_Comm, PetscCopyMode, IS *);
124: PETSC_EXTERN PetscErrorCode ISRenumber(IS, IS, PetscInt *, IS *);
125: PETSC_EXTERN PetscErrorCode ISCreateSubIS(IS, IS, IS *);
127: /* ISGENERAL specific */
128: PETSC_EXTERN PetscErrorCode ISCreateGeneral(MPI_Comm, PetscInt, const PetscInt[], PetscCopyMode, IS *);
129: PETSC_EXTERN PetscErrorCode ISGeneralSetIndices(IS, PetscInt, const PetscInt[], PetscCopyMode);
130: PETSC_EXTERN PetscErrorCode ISGeneralSetIndicesFromMask(IS, PetscInt, PetscInt, const PetscBool[]);
131: PETSC_EXTERN PetscErrorCode ISGeneralFilter(IS, PetscInt, PetscInt);
133: /* ISBLOCK specific */
134: PETSC_EXTERN PetscErrorCode ISCreateBlock(MPI_Comm, PetscInt, PetscInt, const PetscInt[], PetscCopyMode, IS *);
135: PETSC_EXTERN PetscErrorCode ISBlockSetIndices(IS, PetscInt, PetscInt, const PetscInt[], PetscCopyMode);
136: PETSC_EXTERN PetscErrorCode ISBlockGetIndices(IS, const PetscInt *[]);
137: PETSC_EXTERN PetscErrorCode ISBlockRestoreIndices(IS, const PetscInt *[]);
138: PETSC_EXTERN PetscErrorCode ISBlockGetLocalSize(IS, PetscInt *);
139: PETSC_EXTERN PetscErrorCode ISBlockGetSize(IS, PetscInt *);
141: /* ISSTRIDE specific */
142: PETSC_EXTERN PetscErrorCode ISCreateStride(MPI_Comm, PetscInt, PetscInt, PetscInt, IS *);
143: PETSC_EXTERN PetscErrorCode ISStrideSetStride(IS, PetscInt, PetscInt, PetscInt);
144: PETSC_EXTERN PetscErrorCode ISStrideGetInfo(IS, PetscInt *, PetscInt *);
146: /* --------------------------------------------------------------------------*/
147: PETSC_EXTERN PetscClassId IS_LTOGM_CLASSID;
149: /*E
150: ISGlobalToLocalMappingMode - Indicates mapping behavior if global indices are missing
152: `IS_GTOLM_MASK` - missing global indices are masked by mapping them to a local index of -1
153: `IS_GTOLM_DROP` - missing global indices are dropped
155: Level: beginner
157: .seealso: `ISGlobalToLocalMappingApplyBlock()`, `ISGlobalToLocalMappingApply()`
159: E*/
160: typedef enum {
161: IS_GTOLM_MASK,
162: IS_GTOLM_DROP
163: } ISGlobalToLocalMappingMode;
165: /*J
166: ISLocalToGlobalMappingType - String with the name of a mapping method
168: Level: beginner
170: .seealso: `ISLocalToGlobalMappingSetType()`, `ISLocalToGlobalSetFromOptions()`
171: J*/
172: typedef const char *ISLocalToGlobalMappingType;
173: #define ISLOCALTOGLOBALMAPPINGBASIC "basic"
174: #define ISLOCALTOGLOBALMAPPINGHASH "hash"
176: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetType(ISLocalToGlobalMapping, ISLocalToGlobalMappingType);
177: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetType(ISLocalToGlobalMapping, ISLocalToGlobalMappingType *);
178: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRegister(const char[], PetscErrorCode (*)(ISLocalToGlobalMapping));
179: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRegisterAll(void);
180: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreate(MPI_Comm, PetscInt, PetscInt, const PetscInt[], PetscCopyMode, ISLocalToGlobalMapping *);
181: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreateIS(IS, ISLocalToGlobalMapping *);
182: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreateSF(PetscSF, PetscInt, ISLocalToGlobalMapping *);
183: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetFromOptions(ISLocalToGlobalMapping);
184: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetUp(ISLocalToGlobalMapping);
185: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingView(ISLocalToGlobalMapping, PetscViewer);
186: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingViewFromOptions(ISLocalToGlobalMapping, PetscObject, const char[]);
188: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingDestroy(ISLocalToGlobalMapping *);
189: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApply(ISLocalToGlobalMapping, PetscInt, const PetscInt[], PetscInt[]);
190: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApplyBlock(ISLocalToGlobalMapping, PetscInt, const PetscInt[], PetscInt[]);
191: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApplyIS(ISLocalToGlobalMapping, IS, IS *);
192: PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApply(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, PetscInt, const PetscInt[], PetscInt *, PetscInt[]);
193: PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApplyBlock(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, PetscInt, const PetscInt[], PetscInt *, PetscInt[]);
194: PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApplyIS(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, IS, IS *);
195: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetSize(ISLocalToGlobalMapping, PetscInt *);
196: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]);
197: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]);
198: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
199: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
200: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
201: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreBlockInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
202: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetIndices(ISLocalToGlobalMapping, const PetscInt **);
203: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreIndices(ISLocalToGlobalMapping, const PetscInt **);
204: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockIndices(ISLocalToGlobalMapping, const PetscInt **);
205: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreBlockIndices(ISLocalToGlobalMapping, const PetscInt **);
206: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingConcatenate(MPI_Comm, PetscInt, const ISLocalToGlobalMapping[], ISLocalToGlobalMapping *);
207: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockSize(ISLocalToGlobalMapping, PetscInt *);
208: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetBlockSize(ISLocalToGlobalMapping, PetscInt);
209: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingDuplicate(ISLocalToGlobalMapping, ISLocalToGlobalMapping *);
211: /* --------------------------------------------------------------------------*/
212: /*E
213: ISColoringType - determines if the coloring is for the entire parallel grid/graph/matrix
214: or for just the local ghosted portion
216: Level: beginner
218: $ `IS_COLORING_GLOBAL` - does not include the colors for ghost points, this is used when the function
219: $ is called synchronously in parallel. This requires generating a "parallel coloring".
220: $ `IS_COLORING_LOCAL` - includes colors for ghost points, this is used when the function can be called
221: $ separately on individual processes with the ghost points already filled in. Does not
222: $ require a "parallel coloring", rather each process colors its local + ghost part.
223: $ Using this can result in much less parallel communication. Currently only works
224: $ with DMDA and if you call MatFDColoringSetFunction() with the local function.
226: .seealso: `DMCreateColoring()`
227: E*/
228: typedef enum {
229: IS_COLORING_GLOBAL,
230: IS_COLORING_LOCAL
231: } ISColoringType;
232: PETSC_EXTERN const char *const ISColoringTypes[];
233: typedef unsigned PETSC_IS_COLORING_VALUE_TYPE ISColoringValue;
234: #define IS_COLORING_MAX PETSC_IS_COLORING_MAX
235: #define MPIU_COLORING_VALUE PETSC_MPIU_IS_COLORING_VALUE_TYPE
236: PETSC_EXTERN PetscErrorCode ISAllGatherColors(MPI_Comm, PetscInt, ISColoringValue *, PetscInt *, ISColoringValue *[]);
238: PETSC_EXTERN PetscErrorCode ISColoringCreate(MPI_Comm, PetscInt, PetscInt, const ISColoringValue[], PetscCopyMode, ISColoring *);
239: PETSC_EXTERN PetscErrorCode ISColoringDestroy(ISColoring *);
240: PETSC_EXTERN PetscErrorCode ISColoringView(ISColoring, PetscViewer);
241: PETSC_EXTERN PetscErrorCode ISColoringViewFromOptions(ISColoring, PetscObject, const char[]);
242: PETSC_EXTERN PetscErrorCode ISColoringGetIS(ISColoring, PetscCopyMode, PetscInt *, IS *[]);
243: PETSC_EXTERN PetscErrorCode ISColoringRestoreIS(ISColoring, PetscCopyMode, IS *[]);
244: PETSC_EXTERN PetscErrorCode ISColoringReference(ISColoring);
245: PETSC_EXTERN PetscErrorCode ISColoringSetType(ISColoring, ISColoringType);
246: PETSC_EXTERN PetscErrorCode ISColoringGetType(ISColoring, ISColoringType *);
247: PETSC_EXTERN PetscErrorCode ISColoringGetColors(ISColoring, PetscInt *, PetscInt *, const ISColoringValue **);
249: /* --------------------------------------------------------------------------*/
250: PETSC_EXTERN PetscErrorCode ISBuildTwoSided(IS, IS, IS *);
251: PETSC_EXTERN PetscErrorCode ISPartitioningToNumbering(IS, IS *);
252: PETSC_EXTERN PetscErrorCode ISPartitioningCount(IS, PetscInt, PetscInt[]);
254: PETSC_EXTERN PetscErrorCode ISCompressIndicesGeneral(PetscInt, PetscInt, PetscInt, PetscInt, const IS[], IS[]);
255: PETSC_EXTERN PetscErrorCode ISCompressIndicesSorted(PetscInt, PetscInt, PetscInt, const IS[], IS[]);
256: PETSC_EXTERN PetscErrorCode ISExpandIndicesGeneral(PetscInt, PetscInt, PetscInt, PetscInt, const IS[], IS[]);
258: struct _n_PetscLayout {
259: MPI_Comm comm;
260: PetscMPIInt size;
261: PetscInt n, N; /* local, global vector size */
262: PetscInt rstart, rend; /* local start, local end + 1 */
263: PetscInt *range; /* the offset of each processor */
264: PetscBool range_alloc; /* should range be freed in Destroy? */
265: PetscInt bs; /* number of elements in each block (generally for multi-component
266: * problems). Defaults to -1 and can be arbitrarily lazy so always use
267: * PetscAbs(map->bs) when accessing directly and expecting result to be
268: * positive. Do NOT multiply above numbers by bs */
269: PetscInt refcnt; /* MPI Vecs obtained with VecDuplicate() and from MatCreateVecs() reuse map of input object */
270: ISLocalToGlobalMapping mapping; /* mapping used in Vec/MatSetValuesLocal() */
271: PetscBool setupcalled; /* Forbid setup more than once */
272: PetscInt oldn, oldN; /* Checking if setup is allowed */
273: PetscInt oldbs; /* And again */
274: };
276: /*@C
277: PetscLayoutFindOwner - Find the owning rank for a global index
279: Not Collective
281: Input Parameters:
282: + map - the layout
283: - idx - global index to find the owner of
285: Output Parameter:
286: . owner - the owning rank
288: Level: developer
290: Fortran Note:
291: Not available from Fortran
293: .seealso: `PetscLayoutFindOwnerIndex()`
294: @*/
295: static inline PetscErrorCode PetscLayoutFindOwner(PetscLayout map, PetscInt idx, PetscMPIInt *owner)
296: {
297: PetscMPIInt lo = 0, hi, t;
299: *owner = -1; /* GCC erroneously issues warning about possibly uninitialized use when error condition */
300: #if defined(PETSC_USE_DEBUG)
303: #endif
304: hi = map->size;
305: while (hi - lo > 1) {
306: t = lo + (hi - lo) / 2;
307: if (idx < map->range[t]) hi = t;
308: else lo = t;
309: }
310: *owner = lo;
311: return 0;
312: }
314: /*@C
315: PetscLayoutFindOwnerIndex - Find the owning rank and the local index for a global index
317: Not Collective
319: Input Parameters:
320: + map - the layout
321: - idx - global index to find the owner of
323: Output Parameters:
324: + owner - the owning rank
325: - lidx - local index used by the owner for idx
327: Level: developer
329: Fortran Note:
330: Not available from Fortran
332: .seealso: `PetscLayoutFindOwner()`
334: @*/
335: static inline PetscErrorCode PetscLayoutFindOwnerIndex(PetscLayout map, PetscInt idx, PetscMPIInt *owner, PetscInt *lidx)
336: {
337: PetscMPIInt lo = 0, hi, t;
339: #if defined(PETSC_USE_DEBUG)
342: #endif
343: hi = map->size;
344: while (hi - lo > 1) {
345: t = lo + (hi - lo) / 2;
346: if (idx < map->range[t]) hi = t;
347: else lo = t;
348: }
349: if (owner) *owner = lo;
350: if (lidx) *lidx = idx - map->range[lo];
351: return 0;
352: }
354: PETSC_EXTERN PetscErrorCode PetscLayoutCreate(MPI_Comm, PetscLayout *);
355: PETSC_EXTERN PetscErrorCode PetscLayoutCreateFromSizes(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscLayout *);
356: PETSC_EXTERN PetscErrorCode PetscLayoutCreateFromRanges(MPI_Comm, const PetscInt[], PetscCopyMode, PetscInt, PetscLayout *);
357: PETSC_EXTERN PetscErrorCode PetscLayoutSetUp(PetscLayout);
358: PETSC_EXTERN PetscErrorCode PetscLayoutDestroy(PetscLayout *);
359: PETSC_EXTERN PetscErrorCode PetscLayoutDuplicate(PetscLayout, PetscLayout *);
360: PETSC_EXTERN PetscErrorCode PetscLayoutReference(PetscLayout, PetscLayout *);
361: PETSC_EXTERN PetscErrorCode PetscLayoutSetLocalSize(PetscLayout, PetscInt);
362: PETSC_EXTERN PetscErrorCode PetscLayoutGetLocalSize(PetscLayout, PetscInt *);
363: PETSC_EXTERN PetscErrorCode PetscLayoutSetSize(PetscLayout, PetscInt);
364: PETSC_EXTERN PetscErrorCode PetscLayoutGetSize(PetscLayout, PetscInt *);
365: PETSC_EXTERN PetscErrorCode PetscLayoutSetBlockSize(PetscLayout, PetscInt);
366: PETSC_EXTERN PetscErrorCode PetscLayoutGetBlockSize(PetscLayout, PetscInt *);
367: PETSC_EXTERN PetscErrorCode PetscLayoutGetRange(PetscLayout, PetscInt *, PetscInt *);
368: PETSC_EXTERN PetscErrorCode PetscLayoutGetRanges(PetscLayout, const PetscInt *[]);
369: PETSC_EXTERN PetscErrorCode PetscLayoutCompare(PetscLayout, PetscLayout, PetscBool *);
370: PETSC_EXTERN PetscErrorCode PetscLayoutSetISLocalToGlobalMapping(PetscLayout, ISLocalToGlobalMapping);
371: PETSC_EXTERN PetscErrorCode PetscLayoutMapLocal(PetscLayout, PetscInt, const PetscInt[], PetscInt *, PetscInt **, PetscInt **);
373: PETSC_EXTERN PetscErrorCode PetscParallelSortInt(PetscLayout, PetscLayout, PetscInt *, PetscInt *);
375: PETSC_EXTERN PetscErrorCode ISGetLayout(IS, PetscLayout *);
376: PETSC_EXTERN PetscErrorCode ISSetLayout(IS, PetscLayout);
378: #endif