xref: /petsc/include/petscis.h (revision ccfb0f9f40a0131988d7995ed9679700dae2a75a)
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 #pragma once
6 
7 #include "petscsystypes.h"
8 #include <petscsys.h>
9 #include <petscsftypes.h>
10 #include <petscsectiontypes.h>
11 #include <petscistypes.h> /*I  "petscis.h" I*/
12 
13 /* MANSEC = Vec */
14 /* SUBMANSEC = IS */
15 
16 #define IS_FILE_CLASSID 1211218
17 PETSC_EXTERN PetscClassId IS_CLASSID;
18 
19 PETSC_EXTERN PetscErrorCode ISInitializePackage(void);
20 PETSC_EXTERN PetscErrorCode ISFinalizePackage(void);
21 
22 /*J
23     ISType - String with the name of a PETSc index set type
24 
25    Values:
26 +  `ISGENERAL` - the values are stored with an array of indices and generally have no structure
27 .  `ISSTRIDE`  - the values have a simple structure of an initial offset and then a step size between values
28 -  `ISBLOCK`   - values are an array of indices, each representing a block (of the same common length) of values
29 
30    Level: beginner
31 
32 .seealso: `ISSetType()`, `IS`, `ISCreateGeneral()`, `ISCreateStride()`, `ISCreateBlock()`, `ISCreate()`, `ISRegister()`,
33           `VecScatterCreate()`, `MatGetSubMatrices()`
34 J*/
35 typedef const char *ISType;
36 #define ISGENERAL "general"
37 #define ISSTRIDE  "stride"
38 #define ISBLOCK   "block"
39 
40 /* Dynamic creation and loading functions */
41 PETSC_EXTERN PetscFunctionList ISList;
42 PETSC_EXTERN PetscErrorCode    ISSetType(IS, ISType);
43 PETSC_EXTERN PetscErrorCode    ISGetType(IS, ISType *);
44 PETSC_EXTERN PetscErrorCode    ISRegister(const char[], PetscErrorCode (*)(IS));
45 PETSC_EXTERN PetscErrorCode    ISRegisterAll(void);
46 PETSC_EXTERN PetscErrorCode    ISCreate(MPI_Comm, IS *);
47 
48 PETSC_EXTERN PetscErrorCode ISDestroy(IS *);
49 PETSC_EXTERN PetscErrorCode ISSetPermutation(IS);
50 PETSC_EXTERN PetscErrorCode ISPermutation(IS, PetscBool *);
51 PETSC_EXTERN PetscErrorCode ISSetIdentity(IS);
52 PETSC_EXTERN PetscErrorCode ISIdentity(IS, PetscBool *);
53 PETSC_EXTERN PetscErrorCode ISContiguousLocal(IS, PetscInt, PetscInt, PetscInt *, PetscBool *);
54 
55 /*E
56    ISInfo - Info that may either be computed or set as known for an index set
57 
58    Level: intermediate
59 
60    Developer Note:
61    Entries that are negative need not be called collectively by all processes.
62 
63 .seealso: `IS`, `ISType`, `ISSetInfo()`
64 E*/
65 typedef enum {
66   IS_INFO_MIN    = -1,
67   IS_SORTED      = 0,
68   IS_UNIQUE      = 1,
69   IS_PERMUTATION = 2,
70   IS_INTERVAL    = 3,
71   IS_IDENTITY    = 4,
72   IS_INFO_MAX    = 5
73 } ISInfo;
74 
75 typedef enum {
76   IS_LOCAL,
77   IS_GLOBAL
78 } ISInfoType;
79 
80 PETSC_EXTERN PetscErrorCode ISSetInfo(IS, ISInfo, ISInfoType, PetscBool, PetscBool);
81 PETSC_EXTERN PetscErrorCode ISGetInfo(IS, ISInfo, ISInfoType, PetscBool, PetscBool *);
82 PETSC_EXTERN PetscErrorCode ISClearInfoCache(IS, PetscBool);
83 PETSC_EXTERN PetscErrorCode ISGetIndices(IS, const PetscInt *[]);
84 PETSC_EXTERN PetscErrorCode ISRestoreIndices(IS, const PetscInt *[]);
85 PETSC_EXTERN PetscErrorCode ISGetTotalIndices(IS, const PetscInt *[]);
86 PETSC_EXTERN PetscErrorCode ISRestoreTotalIndices(IS, const PetscInt *[]);
87 PETSC_EXTERN PetscErrorCode ISGetNonlocalIndices(IS, const PetscInt *[]);
88 PETSC_EXTERN PetscErrorCode ISRestoreNonlocalIndices(IS, const PetscInt *[]);
89 PETSC_EXTERN PetscErrorCode ISGetNonlocalIS(IS, IS *);
90 PETSC_EXTERN PetscErrorCode ISRestoreNonlocalIS(IS, IS *);
91 PETSC_EXTERN PetscErrorCode ISGetSize(IS, PetscInt *);
92 PETSC_EXTERN PetscErrorCode ISGetLocalSize(IS, PetscInt *);
93 PETSC_EXTERN PetscErrorCode ISInvertPermutation(IS, PetscInt, IS *);
94 PETSC_EXTERN PetscErrorCode ISView(IS, PetscViewer);
95 PETSC_EXTERN PetscErrorCode ISViewFromOptions(IS, PetscObject, const char[]);
96 PETSC_EXTERN PetscErrorCode ISLoad(IS, PetscViewer);
97 PETSC_EXTERN PetscErrorCode ISEqual(IS, IS, PetscBool *);
98 PETSC_EXTERN PetscErrorCode ISEqualUnsorted(IS, IS, PetscBool *);
99 PETSC_EXTERN PetscErrorCode ISSort(IS);
100 PETSC_EXTERN PetscErrorCode ISSortRemoveDups(IS);
101 PETSC_EXTERN PetscErrorCode ISSorted(IS, PetscBool *);
102 PETSC_EXTERN PetscErrorCode ISDifference(IS, IS, IS *);
103 PETSC_EXTERN PetscErrorCode ISSum(IS, IS, IS *);
104 PETSC_EXTERN PetscErrorCode ISExpand(IS, IS, IS *);
105 PETSC_EXTERN PetscErrorCode ISIntersect(IS, IS, IS *);
106 PETSC_EXTERN PetscErrorCode ISGetMinMax(IS, PetscInt *, PetscInt *);
107 
108 PETSC_EXTERN PetscErrorCode ISLocate(IS, PetscInt, PetscInt *);
109 PETSC_EXTERN PetscErrorCode ISGetPointRange(IS, PetscInt *, PetscInt *, const PetscInt *[]);
110 PETSC_EXTERN PetscErrorCode ISRestorePointRange(IS, PetscInt *, PetscInt *, const PetscInt *[]);
111 PETSC_EXTERN PetscErrorCode ISGetPointSubrange(IS, PetscInt, PetscInt, const PetscInt *);
112 
113 PETSC_EXTERN PetscErrorCode ISGetBlockSize(IS, PetscInt *);
114 PETSC_EXTERN PetscErrorCode ISSetBlockSize(IS, PetscInt);
115 PETSC_EXTERN PetscErrorCode ISGetCompressOutput(IS, PetscBool *);
116 PETSC_EXTERN PetscErrorCode ISSetCompressOutput(IS, PetscBool);
117 
118 PETSC_EXTERN PetscErrorCode ISToGeneral(IS);
119 
120 PETSC_EXTERN PetscErrorCode ISDuplicate(IS, IS *);
121 PETSC_EXTERN PetscErrorCode ISCopy(IS, IS);
122 PETSC_EXTERN PetscErrorCode ISShift(IS, PetscInt, IS);
123 PETSC_EXTERN PetscErrorCode ISAllGather(IS, IS *);
124 PETSC_EXTERN PetscErrorCode ISComplement(IS, PetscInt, PetscInt, IS *);
125 PETSC_EXTERN PetscErrorCode ISConcatenate(MPI_Comm, PetscInt, const IS[], IS *);
126 PETSC_EXTERN PetscErrorCode ISListToPair(MPI_Comm, PetscInt, IS[], IS *, IS *);
127 PETSC_EXTERN PetscErrorCode ISPairToList(IS, IS, PetscInt *, IS *[]);
128 PETSC_EXTERN PetscErrorCode ISEmbed(IS, IS, PetscBool, IS *);
129 PETSC_EXTERN PetscErrorCode ISSortPermutation(IS, PetscBool, IS *);
130 PETSC_EXTERN PetscErrorCode ISOnComm(IS, MPI_Comm, PetscCopyMode, IS *);
131 PETSC_EXTERN PetscErrorCode ISRenumber(IS, IS, PetscInt *, IS *);
132 PETSC_EXTERN PetscErrorCode ISCreateSubIS(IS, IS, IS *);
133 
134 /* ISGENERAL specific */
135 PETSC_EXTERN PetscErrorCode ISCreateGeneral(MPI_Comm, PetscInt, const PetscInt[], PetscCopyMode, IS *);
136 PETSC_EXTERN PetscErrorCode ISGeneralSetIndices(IS, PetscInt, const PetscInt[], PetscCopyMode);
137 PETSC_EXTERN PetscErrorCode ISGeneralSetIndicesFromMask(IS, PetscInt, PetscInt, const PetscBool[]);
138 PETSC_EXTERN PetscErrorCode ISGeneralFilter(IS, PetscInt, PetscInt);
139 
140 /* ISBLOCK specific */
141 PETSC_EXTERN PetscErrorCode ISCreateBlock(MPI_Comm, PetscInt, PetscInt, const PetscInt[], PetscCopyMode, IS *);
142 PETSC_EXTERN PetscErrorCode ISBlockSetIndices(IS, PetscInt, PetscInt, const PetscInt[], PetscCopyMode);
143 PETSC_EXTERN PetscErrorCode ISBlockGetIndices(IS, const PetscInt *[]);
144 PETSC_EXTERN PetscErrorCode ISBlockRestoreIndices(IS, const PetscInt *[]);
145 PETSC_EXTERN PetscErrorCode ISBlockGetLocalSize(IS, PetscInt *);
146 PETSC_EXTERN PetscErrorCode ISBlockGetSize(IS, PetscInt *);
147 
148 /* ISSTRIDE specific */
149 PETSC_EXTERN PetscErrorCode ISCreateStride(MPI_Comm, PetscInt, PetscInt, PetscInt, IS *);
150 PETSC_EXTERN PetscErrorCode ISStrideSetStride(IS, PetscInt, PetscInt, PetscInt);
151 PETSC_EXTERN PetscErrorCode ISStrideGetInfo(IS, PetscInt *, PetscInt *);
152 
153 #define IS_LTOGM_FILE_CLASSID 1211217
154 PETSC_EXTERN PetscClassId IS_LTOGM_CLASSID;
155 
156 /*E
157    ISGlobalToLocalMappingMode - Indicates mapping behavior if global indices are missing
158 
159    Values:
160 +  `IS_GTOLM_MASK` - missing global indices are masked by mapping them to a local index of -1
161 -  `IS_GTOLM_DROP` - missing global indices are dropped
162 
163    Level: beginner
164 
165 .seealso: `ISGlobalToLocalMappingApplyBlock()`, `ISGlobalToLocalMappingApply()`
166 E*/
167 typedef enum {
168   IS_GTOLM_MASK,
169   IS_GTOLM_DROP
170 } ISGlobalToLocalMappingMode;
171 
172 /*J
173    ISLocalToGlobalMappingType - String with the name of a mapping method
174 
175    Values:
176 +  `ISLOCALTOGLOBALMAPPINGBASIC` - a non-memory scalable way of storing `ISLocalToGlobalMapping` that allows applying `ISGlobalToLocalMappingApply()` efficiently
177 -  `ISLOCALTOGLOBALMAPPINGHASH`  - a memory scalable way of storing `ISLocalToGlobalMapping` that allows applying `ISGlobalToLocalMappingApply()` reasonably efficiently
178 
179    Level: beginner
180 
181 .seealso: `ISLocalToGlobalMapping`, `ISLocalToGlobalMappingSetType()`, `ISLocalToGlobalSetFromOptions()`, `ISGlobalToLocalMappingMode`
182 J*/
183 typedef const char *ISLocalToGlobalMappingType;
184 #define ISLOCALTOGLOBALMAPPINGBASIC "basic"
185 #define ISLOCALTOGLOBALMAPPINGHASH  "hash"
186 
187 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetType(ISLocalToGlobalMapping, ISLocalToGlobalMappingType);
188 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetType(ISLocalToGlobalMapping, ISLocalToGlobalMappingType *);
189 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRegister(const char[], PetscErrorCode (*)(ISLocalToGlobalMapping));
190 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRegisterAll(void);
191 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreate(MPI_Comm, PetscInt, PetscInt, const PetscInt[], PetscCopyMode, ISLocalToGlobalMapping *);
192 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreateIS(IS, ISLocalToGlobalMapping *);
193 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreateSF(PetscSF, PetscInt, ISLocalToGlobalMapping *);
194 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetFromOptions(ISLocalToGlobalMapping);
195 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetUp(ISLocalToGlobalMapping);
196 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingView(ISLocalToGlobalMapping, PetscViewer);
197 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingLoad(ISLocalToGlobalMapping, PetscViewer);
198 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingViewFromOptions(ISLocalToGlobalMapping, PetscObject, const char[]);
199 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingConcatenate(MPI_Comm, PetscInt, const ISLocalToGlobalMapping[], ISLocalToGlobalMapping *);
200 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingDuplicate(ISLocalToGlobalMapping, ISLocalToGlobalMapping *);
201 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingDestroy(ISLocalToGlobalMapping *);
202 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetSize(ISLocalToGlobalMapping, PetscInt *);
203 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetIndices(ISLocalToGlobalMapping, const PetscInt *[]);
204 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreIndices(ISLocalToGlobalMapping, const PetscInt *[]);
205 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockIndices(ISLocalToGlobalMapping, const PetscInt *[]);
206 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreBlockIndices(ISLocalToGlobalMapping, const PetscInt *[]);
207 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockSize(ISLocalToGlobalMapping, PetscInt *);
208 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetBlockSize(ISLocalToGlobalMapping, PetscInt);
209 
210 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApply(ISLocalToGlobalMapping, PetscInt, const PetscInt[], PetscInt[]);
211 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApplyBlock(ISLocalToGlobalMapping, PetscInt, const PetscInt[], PetscInt[]);
212 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApplyIS(ISLocalToGlobalMapping, IS, IS *);
213 PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApply(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, PetscInt, const PetscInt[], PetscInt *, PetscInt[]);
214 PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApplyBlock(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, PetscInt, const PetscInt[], PetscInt *, PetscInt[]);
215 PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApplyIS(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, IS, IS *);
216 
217 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]);
218 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]);
219 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
220 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
221 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]);
222 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreBlockNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]);
223 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
224 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreBlockInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
225 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockMultiLeavesSF(ISLocalToGlobalMapping, PetscSF *);
226 
227 /*E
228    ISColoringType - determines if the coloring is for the entire parallel grid/graph/matrix
229                     or for just the local ghosted portion
230 
231    Values:
232 +  `IS_COLORING_GLOBAL` - does not include the colors for ghost points, this is used when the function
233                           is called synchronously in parallel. This requires generating a "parallel coloring".
234 -  `IS_COLORING_LOCAL`  - includes colors for ghost points, this is used when the function can be called
235                           separately on individual processes with the ghost points already filled in. Does not
236                           require a "parallel coloring", rather each process colors its local + ghost part.
237                           Using this can result in much less parallel communication. Currently only works
238                           with `DMDA` and if you call `MatFDColoringSetFunction()` with the local function.
239 
240    Level: beginner
241 
242 .seealso: `ISColoring`, `ISColoringSetType()`, `ISColoringGetType()`, `DMCreateColoring()`
243 E*/
244 typedef enum {
245   IS_COLORING_GLOBAL,
246   IS_COLORING_LOCAL
247 } ISColoringType;
248 
249 PETSC_EXTERN const char *const                ISColoringTypes[];
250 typedef unsigned PETSC_IS_COLORING_VALUE_TYPE ISColoringValue;
251 #define IS_COLORING_MAX     PETSC_IS_COLORING_MAX
252 #define MPIU_COLORING_VALUE PETSC_MPIU_IS_COLORING_VALUE_TYPE
253 PETSC_EXTERN PetscErrorCode ISAllGatherColors(MPI_Comm, PetscInt, ISColoringValue *, PetscInt *, ISColoringValue *[]);
254 
255 /*@C
256    ISColoringValueCast - casts an integer a `ISColoringValue` (which may be 1-bits in size), generates an
257    error if the value is too large
258 
259    Not Collective; No Fortran Support
260 
261    Input Parameter:
262 .  a - the `PetscCount` value
263 
264    Output Parameter:
265 .  b - the resulting `ISColoringValue` value, optional, pass `NULL` if not needed
266 
267    Level: advanced
268 
269    Note:
270    Errors if the integer is negative
271 
272 .seealso: `ISColoringValue`, `ISColoringCreate()`, `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscMPIIntCast()`, `PetscIntCast()`
273 @*/
274 static inline PetscErrorCode ISColoringValueCast(PetscCount a, ISColoringValue *b)
275 {
276   PetscFunctionBegin;
277   if (b) *b = 0;
278   PetscCheck(a >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Passing negative integer not supported");
279   PetscCheck(a < PETSC_IS_COLORING_MAX, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Integer too large to convert");
280   if (b) *b = (ISColoringValue)a;
281   PetscFunctionReturn(PETSC_SUCCESS);
282 }
283 
284 PETSC_EXTERN PetscErrorCode ISColoringCreate(MPI_Comm, PetscInt, PetscInt, const ISColoringValue[], PetscCopyMode, ISColoring *);
285 PETSC_EXTERN PetscErrorCode ISColoringDestroy(ISColoring *);
286 PETSC_EXTERN PetscErrorCode ISColoringView(ISColoring, PetscViewer);
287 PETSC_EXTERN PetscErrorCode ISColoringViewFromOptions(ISColoring, PetscObject, const char[]);
288 PETSC_EXTERN PetscErrorCode ISColoringGetIS(ISColoring, PetscCopyMode, PetscInt *, IS *[]);
289 PETSC_EXTERN PetscErrorCode ISColoringRestoreIS(ISColoring, PetscCopyMode, IS *[]);
290 PETSC_EXTERN PetscErrorCode ISColoringReference(ISColoring);
291 PETSC_EXTERN PetscErrorCode ISColoringSetType(ISColoring, ISColoringType);
292 PETSC_EXTERN PetscErrorCode ISColoringGetType(ISColoring, ISColoringType *);
293 PETSC_EXTERN PetscErrorCode ISColoringGetColors(ISColoring, PetscInt *, PetscInt *, const ISColoringValue *[]);
294 
295 PETSC_EXTERN PetscErrorCode ISBuildTwoSided(IS, IS, IS *);
296 PETSC_EXTERN PetscErrorCode ISPartitioningToNumbering(IS, IS *);
297 PETSC_EXTERN PetscErrorCode ISPartitioningCount(IS, PetscInt, PetscInt[]);
298 
299 PETSC_EXTERN PetscErrorCode ISCompressIndicesGeneral(PetscInt, PetscInt, PetscInt, PetscInt, const IS[], IS[]);
300 PETSC_DEPRECATED_FUNCTION(3, 19, 0, "ISCompressIndicesGeneral()", ) static inline PetscErrorCode ISCompressIndicesSorted(PetscInt n, PetscInt bs, PetscInt imax, const IS is_in[], IS is_out[])
301 {
302   return ISCompressIndicesGeneral(n, bs, n, imax, is_in, is_out);
303 }
304 PETSC_EXTERN PetscErrorCode ISExpandIndicesGeneral(PetscInt, PetscInt, PetscInt, PetscInt, const IS[], IS[]);
305 
306 struct _n_PetscLayout {
307   MPI_Comm               comm;
308   PetscMPIInt            size;
309   PetscInt               n, N;         /* local, global vector size */
310   PetscInt               rstart, rend; /* local start, local end + 1 */
311   PetscInt              *range;        /* the offset of each processor */
312   PetscBool              range_alloc;  /* should range be freed in Destroy? */
313   PetscInt               bs;           /* number of elements in each block (generally for multi-component problems) */
314   PetscInt               refcnt;       /* MPI Vecs obtained with VecDuplicate() and from MatCreateVecs() reuse map of input object */
315   ISLocalToGlobalMapping mapping;      /* mapping used in Vec/MatSetValuesLocal() */
316   PetscBool              setupcalled;  /* Forbid setup more than once */
317   PetscInt               oldn, oldN;   /* Checking if setup is allowed */
318   PetscInt               oldbs;        /* And again */
319 };
320 
321 PETSC_EXTERN PetscErrorCode PetscLayoutCreate(MPI_Comm, PetscLayout *);
322 PETSC_EXTERN PetscErrorCode PetscLayoutFindOwner(PetscLayout, PetscInt, PetscMPIInt *);
323 PETSC_EXTERN PetscErrorCode PetscLayoutFindOwnerIndex(PetscLayout, PetscInt, PetscMPIInt *, PetscInt *);
324 PETSC_EXTERN PetscErrorCode PetscLayoutCreateFromSizes(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscLayout *);
325 PETSC_EXTERN PetscErrorCode PetscLayoutCreateFromRanges(MPI_Comm, const PetscInt[], PetscCopyMode, PetscInt, PetscLayout *);
326 PETSC_EXTERN PetscErrorCode PetscLayoutSetUp(PetscLayout);
327 PETSC_EXTERN PetscErrorCode PetscLayoutDestroy(PetscLayout *);
328 PETSC_EXTERN PetscErrorCode PetscLayoutDuplicate(PetscLayout, PetscLayout *);
329 PETSC_EXTERN PetscErrorCode PetscLayoutReference(PetscLayout, PetscLayout *);
330 PETSC_EXTERN PetscErrorCode PetscLayoutSetLocalSize(PetscLayout, PetscInt);
331 PETSC_EXTERN PetscErrorCode PetscLayoutGetLocalSize(PetscLayout, PetscInt *);
332 PETSC_EXTERN PetscErrorCode PetscLayoutSetSize(PetscLayout, PetscInt);
333 PETSC_EXTERN PetscErrorCode PetscLayoutGetSize(PetscLayout, PetscInt *);
334 PETSC_EXTERN PetscErrorCode PetscLayoutSetBlockSize(PetscLayout, PetscInt);
335 PETSC_EXTERN PetscErrorCode PetscLayoutGetBlockSize(PetscLayout, PetscInt *);
336 PETSC_EXTERN PetscErrorCode PetscLayoutGetRange(PetscLayout, PetscInt *, PetscInt *);
337 PETSC_EXTERN PetscErrorCode PetscLayoutGetRanges(PetscLayout, const PetscInt *[]);
338 PETSC_EXTERN PetscErrorCode PetscLayoutCompare(PetscLayout, PetscLayout, PetscBool *);
339 PETSC_EXTERN PetscErrorCode PetscLayoutSetISLocalToGlobalMapping(PetscLayout, ISLocalToGlobalMapping);
340 PETSC_EXTERN PetscErrorCode PetscLayoutMapLocal(PetscLayout, PetscInt, const PetscInt[], PetscInt *, PetscInt *[], PetscInt *[]);
341 
342 PETSC_EXTERN PetscErrorCode PetscParallelSortInt(PetscLayout, PetscLayout, PetscInt *, PetscInt *);
343 
344 /*S
345   PetscKDTree - Implementation of KDTree for efficiently querying spatial points
346 
347   Level: advanced
348 
349   Note:
350   See <https://en.wikipedia.org/wiki/K-d_tree> for a description of K-d trees
351 
352 .seealso: `PetscKDTreeCreate()`, `PetscKDTreeDestroy()`, `PetscKDTreeView()`, `PetscKDTreeQueryPointsNearestNeighbor()`
353 S*/
354 typedef struct _n_PetscKDTree *PetscKDTree;
355 
356 PETSC_EXTERN PetscErrorCode PetscKDTreeCreate(PetscCount, PetscInt, const PetscReal[], PetscCopyMode, PetscInt, PetscKDTree *);
357 PETSC_EXTERN PetscErrorCode PetscKDTreeDestroy(PetscKDTree *);
358 PETSC_EXTERN PetscErrorCode PetscKDTreeView(PetscKDTree, PetscViewer);
359 PETSC_EXTERN PetscErrorCode PetscKDTreeQueryPointsNearestNeighbor(PetscKDTree, PetscCount, const PetscReal[], PetscReal, PetscCount[], PetscReal[]);
360 
361 PETSC_EXTERN PetscErrorCode ISGetLayout(IS, PetscLayout *);
362 PETSC_EXTERN PetscErrorCode ISSetLayout(IS, PetscLayout);
363