xref: /petsc/include/petscis.h (revision df4cd43f92eaa320656440c40edb1046daee8f75)
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
7 
8 #include <petscsys.h>
9 #include <petscsftypes.h>
10 #include <petscsectiontypes.h>
11 #include <petscistypes.h> /*I  "petscis.h" I*/
12 
13 /* SUBMANSEC = IS */
14 
15 #define IS_FILE_CLASSID 1211218
16 PETSC_EXTERN PetscClassId IS_CLASSID;
17 
18 PETSC_EXTERN PetscErrorCode ISInitializePackage(void);
19 
20 /*J
21     ISType - String with the name of a PETSc index set type
22 
23    Level: beginner
24 
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"
31 
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 *);
38 
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 *);
45 
46 /*E
47     ISInfo - Info that may either be computed or set as known for an index set
48 
49     Level: beginner
50 
51    Developer Notes:
52    Entries that are negative need not be called collectively by all processes.
53 
54    Any additions/changes here MUST also be made in include/petsc/finclude/petscis.h
55 
56    Any additions/changes here must also be made in src/vec/vec/interface/dlregisvec.c in ISInfos[]
57 
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;
69 
70 typedef enum {
71   IS_LOCAL,
72   IS_GLOBAL
73 } ISInfoType;
74 
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 *);
102 
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 *);
107 
108 PETSC_EXTERN PetscErrorCode ISGetBlockSize(IS, PetscInt *);
109 PETSC_EXTERN PetscErrorCode ISSetBlockSize(IS, PetscInt);
110 
111 PETSC_EXTERN PetscErrorCode ISToGeneral(IS);
112 
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 *);
126 
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);
132 
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 *);
140 
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 *);
145 
146 /* --------------------------------------------------------------------------*/
147 PETSC_EXTERN PetscClassId IS_LTOGM_CLASSID;
148 
149 /*E
150     ISGlobalToLocalMappingMode - Indicates mapping behavior if global indices are missing
151 
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
154 
155    Level: beginner
156 
157 .seealso: `ISGlobalToLocalMappingApplyBlock()`, `ISGlobalToLocalMappingApply()`
158 
159 E*/
160 typedef enum {
161   IS_GTOLM_MASK,
162   IS_GTOLM_DROP
163 } ISGlobalToLocalMappingMode;
164 
165 /*J
166     ISLocalToGlobalMappingType - String with the name of a mapping method
167 
168    Level: beginner
169 
170 .seealso: `ISLocalToGlobalMappingSetType()`, `ISLocalToGlobalSetFromOptions()`
171 J*/
172 typedef const char *ISLocalToGlobalMappingType;
173 #define ISLOCALTOGLOBALMAPPINGBASIC "basic"
174 #define ISLOCALTOGLOBALMAPPINGHASH  "hash"
175 
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[]);
187 
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 *);
210 
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
215 
216     Level: beginner
217 
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.
225 
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 *[]);
237 
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 **);
248 
249 /* --------------------------------------------------------------------------*/
250 PETSC_EXTERN PetscErrorCode ISBuildTwoSided(IS, IS, IS *);
251 PETSC_EXTERN PetscErrorCode ISPartitioningToNumbering(IS, IS *);
252 PETSC_EXTERN PetscErrorCode ISPartitioningCount(IS, PetscInt, PetscInt[]);
253 
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[]);
257 
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 };
275 
276 /*@C
277      PetscLayoutFindOwner - Find the owning rank for a global index
278 
279     Not Collective
280 
281    Input Parameters:
282 +    map - the layout
283 -    idx - global index to find the owner of
284 
285    Output Parameter:
286 .    owner - the owning rank
287 
288    Level: developer
289 
290     Fortran Note:
291       Not available from Fortran
292 
293 .seealso: `PetscLayoutFindOwnerIndex()`
294 @*/
295 static inline PetscErrorCode PetscLayoutFindOwner(PetscLayout map, PetscInt idx, PetscMPIInt *owner)
296 {
297   PetscMPIInt lo = 0, hi, t;
298 
299   PetscFunctionBegin;
300   *owner = -1; /* GCC erroneously issues warning about possibly uninitialized use when error condition */
301 #if defined(PETSC_USE_DEBUG)
302   PetscCheck((map->n >= 0) && (map->N >= 0) && (map->range), PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscLayoutSetUp() must be called first");
303   PetscCheck(idx >= 0 && idx <= map->N, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Index %" PetscInt_FMT " is out of range", idx);
304 #endif
305   hi = map->size;
306   while (hi - lo > 1) {
307     t = lo + (hi - lo) / 2;
308     if (idx < map->range[t]) hi = t;
309     else lo = t;
310   }
311   *owner = lo;
312   PetscFunctionReturn(PETSC_SUCCESS);
313 }
314 
315 /*@C
316      PetscLayoutFindOwnerIndex - Find the owning rank and the local index for a global index
317 
318     Not Collective
319 
320    Input Parameters:
321 +    map   - the layout
322 -    idx   - global index to find the owner of
323 
324    Output Parameters:
325 +    owner - the owning rank
326 -    lidx  - local index used by the owner for idx
327 
328    Level: developer
329 
330     Fortran Note:
331       Not available from Fortran
332 
333 .seealso: `PetscLayoutFindOwner()`
334 
335 @*/
336 static inline PetscErrorCode PetscLayoutFindOwnerIndex(PetscLayout map, PetscInt idx, PetscMPIInt *owner, PetscInt *lidx)
337 {
338   PetscMPIInt lo = 0, hi, t;
339 
340   PetscFunctionBegin;
341 #if defined(PETSC_USE_DEBUG)
342   PetscCheck((map->n >= 0) && (map->N >= 0) && (map->range), PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscLayoutSetUp() must be called first");
343   PetscCheck(idx >= 0 && idx <= map->N, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Index %" PetscInt_FMT " is out of range", idx);
344 #endif
345   hi = map->size;
346   while (hi - lo > 1) {
347     t = lo + (hi - lo) / 2;
348     if (idx < map->range[t]) hi = t;
349     else lo = t;
350   }
351   if (owner) *owner = lo;
352   if (lidx) *lidx = idx - map->range[lo];
353   PetscFunctionReturn(PETSC_SUCCESS);
354 }
355 
356 PETSC_EXTERN PetscErrorCode PetscLayoutCreate(MPI_Comm, PetscLayout *);
357 PETSC_EXTERN PetscErrorCode PetscLayoutCreateFromSizes(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscLayout *);
358 PETSC_EXTERN PetscErrorCode PetscLayoutCreateFromRanges(MPI_Comm, const PetscInt[], PetscCopyMode, PetscInt, PetscLayout *);
359 PETSC_EXTERN PetscErrorCode PetscLayoutSetUp(PetscLayout);
360 PETSC_EXTERN PetscErrorCode PetscLayoutDestroy(PetscLayout *);
361 PETSC_EXTERN PetscErrorCode PetscLayoutDuplicate(PetscLayout, PetscLayout *);
362 PETSC_EXTERN PetscErrorCode PetscLayoutReference(PetscLayout, PetscLayout *);
363 PETSC_EXTERN PetscErrorCode PetscLayoutSetLocalSize(PetscLayout, PetscInt);
364 PETSC_EXTERN PetscErrorCode PetscLayoutGetLocalSize(PetscLayout, PetscInt *);
365 PETSC_EXTERN PetscErrorCode PetscLayoutSetSize(PetscLayout, PetscInt);
366 PETSC_EXTERN PetscErrorCode PetscLayoutGetSize(PetscLayout, PetscInt *);
367 PETSC_EXTERN PetscErrorCode PetscLayoutSetBlockSize(PetscLayout, PetscInt);
368 PETSC_EXTERN PetscErrorCode PetscLayoutGetBlockSize(PetscLayout, PetscInt *);
369 PETSC_EXTERN PetscErrorCode PetscLayoutGetRange(PetscLayout, PetscInt *, PetscInt *);
370 PETSC_EXTERN PetscErrorCode PetscLayoutGetRanges(PetscLayout, const PetscInt *[]);
371 PETSC_EXTERN PetscErrorCode PetscLayoutCompare(PetscLayout, PetscLayout, PetscBool *);
372 PETSC_EXTERN PetscErrorCode PetscLayoutSetISLocalToGlobalMapping(PetscLayout, ISLocalToGlobalMapping);
373 PETSC_EXTERN PetscErrorCode PetscLayoutMapLocal(PetscLayout, PetscInt, const PetscInt[], PetscInt *, PetscInt **, PetscInt **);
374 
375 PETSC_EXTERN PetscErrorCode PetscParallelSortInt(PetscLayout, PetscLayout, PetscInt *, PetscInt *);
376 
377 PETSC_EXTERN PetscErrorCode ISGetLayout(IS, PetscLayout *);
378 PETSC_EXTERN PetscErrorCode ISSetLayout(IS, PetscLayout);
379 
380 #endif
381