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:    Values:
 24: +  `ISGENERAL` - the values are stored with an array of indices and generally have no structure
 25: .  `ISSTRIDE` - the values have a simple structure of an initial offset and then a step size between values
 26: -  `ISBLOCK` - values are an array of indices, each representing a block of values

 28:    Level: beginner

 30: .seealso: `ISSetType()`, `IS`, `ISCreateGeneral()`, `ISCreateStride()`, `ISCreateBlock()`, `ISCreate()`, `ISRegister()`,
 31:           `VecScatterCreate()`, `MatGetSubMatrices()`
 32: J*/
 33: typedef const char *ISType;
 34: #define ISGENERAL "general"
 35: #define ISSTRIDE  "stride"
 36: #define ISBLOCK   "block"

 38: /* Dynamic creation and loading functions */
 39: PETSC_EXTERN PetscFunctionList ISList;
 40: PETSC_EXTERN PetscErrorCode    ISSetType(IS, ISType);
 41: PETSC_EXTERN PetscErrorCode    ISGetType(IS, ISType *);
 42: PETSC_EXTERN PetscErrorCode    ISRegister(const char[], PetscErrorCode (*)(IS));
 43: PETSC_EXTERN PetscErrorCode    ISCreate(MPI_Comm, IS *);

 45: PETSC_EXTERN PetscErrorCode ISDestroy(IS *);
 46: PETSC_EXTERN PetscErrorCode ISSetPermutation(IS);
 47: PETSC_EXTERN PetscErrorCode ISPermutation(IS, PetscBool *);
 48: PETSC_EXTERN PetscErrorCode ISSetIdentity(IS);
 49: PETSC_EXTERN PetscErrorCode ISIdentity(IS, PetscBool *);
 50: PETSC_EXTERN PetscErrorCode ISContiguousLocal(IS, PetscInt, PetscInt, PetscInt *, PetscBool *);

 52: /*E
 53:     ISInfo - Info that may either be computed or set as known for an index set

 55:     Level: intermediate

 57:    Developer Notes:
 58:    Entries that are negative need not be called collectively by all processes.

 60:    Any additions/changes here MUST also be made in include/petsc/finclude/petscis.h

 62:    Any additions/changes here must also be made in src/vec/vec/interface/dlregisvec.c in ISInfos[]

 64: .seealso: `IS`, `ISType`, `ISSetInfo()`
 65: E*/
 66: typedef enum {
 67:   IS_INFO_MIN    = -1,
 68:   IS_SORTED      = 0,
 69:   IS_UNIQUE      = 1,
 70:   IS_PERMUTATION = 2,
 71:   IS_INTERVAL    = 3,
 72:   IS_IDENTITY    = 4,
 73:   IS_INFO_MAX    = 5
 74: } ISInfo;

 76: typedef enum {
 77:   IS_LOCAL,
 78:   IS_GLOBAL
 79: } ISInfoType;

 81: PETSC_EXTERN PetscErrorCode ISSetInfo(IS, ISInfo, ISInfoType, PetscBool, PetscBool);
 82: PETSC_EXTERN PetscErrorCode ISGetInfo(IS, ISInfo, ISInfoType, PetscBool, PetscBool *);
 83: PETSC_EXTERN PetscErrorCode ISClearInfoCache(IS, PetscBool);
 84: PETSC_EXTERN PetscErrorCode ISGetIndices(IS, const PetscInt *[]);
 85: PETSC_EXTERN PetscErrorCode ISRestoreIndices(IS, const PetscInt *[]);
 86: PETSC_EXTERN PetscErrorCode ISGetTotalIndices(IS, const PetscInt *[]);
 87: PETSC_EXTERN PetscErrorCode ISRestoreTotalIndices(IS, const PetscInt *[]);
 88: PETSC_EXTERN PetscErrorCode ISGetNonlocalIndices(IS, const PetscInt *[]);
 89: PETSC_EXTERN PetscErrorCode ISRestoreNonlocalIndices(IS, const PetscInt *[]);
 90: PETSC_EXTERN PetscErrorCode ISGetNonlocalIS(IS, IS *);
 91: PETSC_EXTERN PetscErrorCode ISRestoreNonlocalIS(IS, IS *);
 92: PETSC_EXTERN PetscErrorCode ISGetSize(IS, PetscInt *);
 93: PETSC_EXTERN PetscErrorCode ISGetLocalSize(IS, PetscInt *);
 94: PETSC_EXTERN PetscErrorCode ISInvertPermutation(IS, PetscInt, IS *);
 95: PETSC_EXTERN PetscErrorCode ISView(IS, PetscViewer);
 96: PETSC_EXTERN PetscErrorCode ISViewFromOptions(IS, PetscObject, const char[]);
 97: PETSC_EXTERN PetscErrorCode ISLoad(IS, PetscViewer);
 98: PETSC_EXTERN PetscErrorCode ISEqual(IS, IS, PetscBool *);
 99: PETSC_EXTERN PetscErrorCode ISEqualUnsorted(IS, IS, PetscBool *);
100: PETSC_EXTERN PetscErrorCode ISSort(IS);
101: PETSC_EXTERN PetscErrorCode ISSortRemoveDups(IS);
102: PETSC_EXTERN PetscErrorCode ISSorted(IS, PetscBool *);
103: PETSC_EXTERN PetscErrorCode ISDifference(IS, IS, IS *);
104: PETSC_EXTERN PetscErrorCode ISSum(IS, IS, IS *);
105: PETSC_EXTERN PetscErrorCode ISExpand(IS, IS, IS *);
106: PETSC_EXTERN PetscErrorCode ISIntersect(IS, IS, IS *);
107: PETSC_EXTERN PetscErrorCode ISGetMinMax(IS, PetscInt *, PetscInt *);

109: PETSC_EXTERN PetscErrorCode ISLocate(IS, PetscInt, PetscInt *);
110: PETSC_EXTERN PetscErrorCode ISGetPointRange(IS, PetscInt *, PetscInt *, const PetscInt **);
111: PETSC_EXTERN PetscErrorCode ISRestorePointRange(IS, PetscInt *, PetscInt *, const PetscInt **);
112: PETSC_EXTERN PetscErrorCode ISGetPointSubrange(IS, PetscInt, PetscInt, const PetscInt *);

114: PETSC_EXTERN PetscErrorCode ISGetBlockSize(IS, PetscInt *);
115: PETSC_EXTERN PetscErrorCode ISSetBlockSize(IS, PetscInt);

117: PETSC_EXTERN PetscErrorCode ISToGeneral(IS);

119: PETSC_EXTERN PetscErrorCode ISDuplicate(IS, IS *);
120: PETSC_EXTERN PetscErrorCode ISCopy(IS, IS);
121: PETSC_EXTERN PetscErrorCode ISShift(IS, PetscInt, IS);
122: PETSC_EXTERN PetscErrorCode ISAllGather(IS, IS *);
123: PETSC_EXTERN PetscErrorCode ISComplement(IS, PetscInt, PetscInt, IS *);
124: PETSC_EXTERN PetscErrorCode ISConcatenate(MPI_Comm, PetscInt, const IS[], IS *);
125: PETSC_EXTERN PetscErrorCode ISListToPair(MPI_Comm, PetscInt, IS[], IS *, IS *);
126: PETSC_EXTERN PetscErrorCode ISPairToList(IS, IS, PetscInt *, IS *[]);
127: PETSC_EXTERN PetscErrorCode ISEmbed(IS, IS, PetscBool, IS *);
128: PETSC_EXTERN PetscErrorCode ISSortPermutation(IS, PetscBool, IS *);
129: PETSC_EXTERN PetscErrorCode ISOnComm(IS, MPI_Comm, PetscCopyMode, IS *);
130: PETSC_EXTERN PetscErrorCode ISRenumber(IS, IS, PetscInt *, IS *);
131: PETSC_EXTERN PetscErrorCode ISCreateSubIS(IS, IS, IS *);

133: /* ISGENERAL specific */
134: PETSC_EXTERN PetscErrorCode ISCreateGeneral(MPI_Comm, PetscInt, const PetscInt[], PetscCopyMode, IS *);
135: PETSC_EXTERN PetscErrorCode ISGeneralSetIndices(IS, PetscInt, const PetscInt[], PetscCopyMode);
136: PETSC_EXTERN PetscErrorCode ISGeneralSetIndicesFromMask(IS, PetscInt, PetscInt, const PetscBool[]);
137: PETSC_EXTERN PetscErrorCode ISGeneralFilter(IS, PetscInt, PetscInt);

139: /* ISBLOCK specific */
140: PETSC_EXTERN PetscErrorCode ISCreateBlock(MPI_Comm, PetscInt, PetscInt, const PetscInt[], PetscCopyMode, IS *);
141: PETSC_EXTERN PetscErrorCode ISBlockSetIndices(IS, PetscInt, PetscInt, const PetscInt[], PetscCopyMode);
142: PETSC_EXTERN PetscErrorCode ISBlockGetIndices(IS, const PetscInt *[]);
143: PETSC_EXTERN PetscErrorCode ISBlockRestoreIndices(IS, const PetscInt *[]);
144: PETSC_EXTERN PetscErrorCode ISBlockGetLocalSize(IS, PetscInt *);
145: PETSC_EXTERN PetscErrorCode ISBlockGetSize(IS, PetscInt *);

147: /* ISSTRIDE specific */
148: PETSC_EXTERN PetscErrorCode ISCreateStride(MPI_Comm, PetscInt, PetscInt, PetscInt, IS *);
149: PETSC_EXTERN PetscErrorCode ISStrideSetStride(IS, PetscInt, PetscInt, PetscInt);
150: PETSC_EXTERN PetscErrorCode ISStrideGetInfo(IS, PetscInt *, PetscInt *);

152: PETSC_EXTERN PetscClassId IS_LTOGM_CLASSID;

154: /*E
155:     ISGlobalToLocalMappingMode - Indicates mapping behavior if global indices are missing

157:    Values:
158: +   `IS_GTOLM_MASK` - missing global indices are masked by mapping them to a local index of -1
159: -   `IS_GTOLM_DROP` - missing global indices are dropped

161:    Level: beginner

163: .seealso: `ISGlobalToLocalMappingApplyBlock()`, `ISGlobalToLocalMappingApply()`
164: E*/
165: typedef enum {
166:   IS_GTOLM_MASK,
167:   IS_GTOLM_DROP
168: } ISGlobalToLocalMappingMode;

170: /*J
171:     ISLocalToGlobalMappingType - String with the name of a mapping method

173:    Values:
174: +  `ISLOCALTOGLOBALMAPPINGBASIC` - a non-memory scalable way of storing `ISLocalToGlobalMapping` that allows applying `ISGlobalToLocalMappingApply()` efficiently
175: -  `ISLOCALTOGLOBALMAPPINGHASH` - a memory scalable way of storing `ISLocalToGlobalMapping` that allows applying `ISGlobalToLocalMappingApply()` reasonably efficiently

177:   Level: beginner

179: .seealso: `ISLocalToGlobalMapping`, `ISLocalToGlobalMappingSetType()`, `ISLocalToGlobalSetFromOptions()`, `ISGlobalToLocalMappingMode`
180: J*/
181: typedef const char *ISLocalToGlobalMappingType;
182: #define ISLOCALTOGLOBALMAPPINGBASIC "basic"
183: #define ISLOCALTOGLOBALMAPPINGHASH  "hash"

185: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetType(ISLocalToGlobalMapping, ISLocalToGlobalMappingType);
186: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetType(ISLocalToGlobalMapping, ISLocalToGlobalMappingType *);
187: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRegister(const char[], PetscErrorCode (*)(ISLocalToGlobalMapping));
188: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRegisterAll(void);
189: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreate(MPI_Comm, PetscInt, PetscInt, const PetscInt[], PetscCopyMode, ISLocalToGlobalMapping *);
190: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreateIS(IS, ISLocalToGlobalMapping *);
191: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreateSF(PetscSF, PetscInt, ISLocalToGlobalMapping *);
192: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetFromOptions(ISLocalToGlobalMapping);
193: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetUp(ISLocalToGlobalMapping);
194: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingView(ISLocalToGlobalMapping, PetscViewer);
195: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingViewFromOptions(ISLocalToGlobalMapping, PetscObject, const char[]);

197: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingDestroy(ISLocalToGlobalMapping *);
198: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApply(ISLocalToGlobalMapping, PetscInt, const PetscInt[], PetscInt[]);
199: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApplyBlock(ISLocalToGlobalMapping, PetscInt, const PetscInt[], PetscInt[]);
200: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApplyIS(ISLocalToGlobalMapping, IS, IS *);
201: PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApply(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, PetscInt, const PetscInt[], PetscInt *, PetscInt[]);
202: PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApplyBlock(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, PetscInt, const PetscInt[], PetscInt *, PetscInt[]);
203: PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApplyIS(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, IS, IS *);
204: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetSize(ISLocalToGlobalMapping, PetscInt *);
205: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]);
206: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]);
207: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
208: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
209: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
210: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreBlockInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
211: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetIndices(ISLocalToGlobalMapping, const PetscInt **);
212: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreIndices(ISLocalToGlobalMapping, const PetscInt **);
213: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockIndices(ISLocalToGlobalMapping, const PetscInt **);
214: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreBlockIndices(ISLocalToGlobalMapping, const PetscInt **);
215: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingConcatenate(MPI_Comm, PetscInt, const ISLocalToGlobalMapping[], ISLocalToGlobalMapping *);
216: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockSize(ISLocalToGlobalMapping, PetscInt *);
217: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetBlockSize(ISLocalToGlobalMapping, PetscInt);
218: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingDuplicate(ISLocalToGlobalMapping, ISLocalToGlobalMapping *);

220: /*E
221:     ISColoringType - determines if the coloring is for the entire parallel grid/graph/matrix
222:                      or for just the local ghosted portion

224:     Values:
225: +   `IS_COLORING_GLOBAL` - does not include the colors for ghost points, this is used when the function
226:                         is called synchronously in parallel. This requires generating a "parallel coloring".
227: -   `IS_COLORING_LOCAL` - includes colors for ghost points, this is used when the function can be called
228:                          separately on individual processes with the ghost points already filled in. Does not
229:                          require a "parallel coloring", rather each process colors its local + ghost part.
230:                          Using this can result in much less parallel communication. Currently only works
231:                          with `DMDA` and if you call `MatFDColoringSetFunction()` with the local function.

233:    Level: beginner

235: .seealso: `ISColoring`, `ISColoringSetType()`, `ISColoringGetType()`, `DMCreateColoring()`
236: E*/
237: typedef enum {
238:   IS_COLORING_GLOBAL,
239:   IS_COLORING_LOCAL
240: } ISColoringType;
241: PETSC_EXTERN const char *const                ISColoringTypes[];
242: typedef unsigned PETSC_IS_COLORING_VALUE_TYPE ISColoringValue;
243: #define IS_COLORING_MAX     PETSC_IS_COLORING_MAX
244: #define MPIU_COLORING_VALUE PETSC_MPIU_IS_COLORING_VALUE_TYPE
245: PETSC_EXTERN PetscErrorCode ISAllGatherColors(MPI_Comm, PetscInt, ISColoringValue *, PetscInt *, ISColoringValue *[]);

247: PETSC_EXTERN PetscErrorCode ISColoringCreate(MPI_Comm, PetscInt, PetscInt, const ISColoringValue[], PetscCopyMode, ISColoring *);
248: PETSC_EXTERN PetscErrorCode ISColoringDestroy(ISColoring *);
249: PETSC_EXTERN PetscErrorCode ISColoringView(ISColoring, PetscViewer);
250: PETSC_EXTERN PetscErrorCode ISColoringViewFromOptions(ISColoring, PetscObject, const char[]);
251: PETSC_EXTERN PetscErrorCode ISColoringGetIS(ISColoring, PetscCopyMode, PetscInt *, IS *[]);
252: PETSC_EXTERN PetscErrorCode ISColoringRestoreIS(ISColoring, PetscCopyMode, IS *[]);
253: PETSC_EXTERN PetscErrorCode ISColoringReference(ISColoring);
254: PETSC_EXTERN PetscErrorCode ISColoringSetType(ISColoring, ISColoringType);
255: PETSC_EXTERN PetscErrorCode ISColoringGetType(ISColoring, ISColoringType *);
256: PETSC_EXTERN PetscErrorCode ISColoringGetColors(ISColoring, PetscInt *, PetscInt *, const ISColoringValue **);

258: PETSC_EXTERN PetscErrorCode ISBuildTwoSided(IS, IS, IS *);
259: PETSC_EXTERN PetscErrorCode ISPartitioningToNumbering(IS, IS *);
260: PETSC_EXTERN PetscErrorCode ISPartitioningCount(IS, PetscInt, PetscInt[]);

262: PETSC_EXTERN PetscErrorCode ISCompressIndicesGeneral(PetscInt, PetscInt, PetscInt, PetscInt, const IS[], IS[]);
263: 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[])
264: {
265:   return ISCompressIndicesGeneral(n, bs, n, imax, is_in, is_out);
266: }
267: PETSC_EXTERN PetscErrorCode ISExpandIndicesGeneral(PetscInt, PetscInt, PetscInt, PetscInt, const IS[], IS[]);

269: struct _n_PetscLayout {
270:   MPI_Comm               comm;
271:   PetscMPIInt            size;
272:   PetscInt               n, N;         /* local, global vector size */
273:   PetscInt               rstart, rend; /* local start, local end + 1 */
274:   PetscInt              *range;        /* the offset of each processor */
275:   PetscBool              range_alloc;  /* should range be freed in Destroy? */
276:   PetscInt               bs;           /* number of elements in each block (generally for multi-component
277:                                        * problems). Defaults to -1 and can be arbitrarily lazy so always use
278:                                        * PetscAbs(map->bs) when accessing directly and expecting result to be
279:                                        * positive. Do NOT multiply above numbers by bs */
280:   PetscInt               refcnt;       /* MPI Vecs obtained with VecDuplicate() and from MatCreateVecs() reuse map of input object */
281:   ISLocalToGlobalMapping mapping;      /* mapping used in Vec/MatSetValuesLocal() */
282:   PetscBool              setupcalled;  /* Forbid setup more than once */
283:   PetscInt               oldn, oldN;   /* Checking if setup is allowed */
284:   PetscInt               oldbs;        /* And again */
285: };

287: /*@C
288:      PetscLayoutFindOwner - Find the owning rank for a global index

290:     Not Collective; No Fortran Support

292:    Input Parameters:
293: +    map - the layout
294: -    idx - global index to find the owner of

296:    Output Parameter:
297: .    owner - the owning rank

299:    Level: developer

301: .seealso: `PetscLayout`, `PetscLayoutFindOwnerIndex()`
302: @*/
303: static inline PetscErrorCode PetscLayoutFindOwner(PetscLayout map, PetscInt idx, PetscMPIInt *owner)
304: {
305:   PetscMPIInt lo = 0, hi, t;

307:   PetscFunctionBegin;
308:   *owner = -1; /* GCC erroneously issues warning about possibly uninitialized use when error condition */
309: #if defined(PETSC_USE_DEBUG)
310:   PetscCheck((map->n >= 0) && (map->N >= 0) && (map->range), PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscLayoutSetUp() must be called first");
311:   PetscCheck(idx >= 0 && idx <= map->N, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Index %" PetscInt_FMT " is out of range", idx);
312: #endif
313:   hi = map->size;
314:   while (hi - lo > 1) {
315:     t = lo + (hi - lo) / 2;
316:     if (idx < map->range[t]) hi = t;
317:     else lo = t;
318:   }
319:   *owner = lo;
320:   PetscFunctionReturn(PETSC_SUCCESS);
321: }

323: /*@C
324:      PetscLayoutFindOwnerIndex - Find the owning MPI rank and the local index on that rank for a global index

326:     Not Collective; No Fortran Support

328:    Input Parameters:
329: +    map   - the layout
330: -    idx   - global index to find the owner of

332:    Output Parameters:
333: +    owner - the owning rank
334: -    lidx  - local index used by the owner for `idx`

336:    Level: developer

338: .seealso: `PetscLayout`, `PetscLayoutFindOwner()`
339: @*/
340: static inline PetscErrorCode PetscLayoutFindOwnerIndex(PetscLayout map, PetscInt idx, PetscMPIInt *owner, PetscInt *lidx)
341: {
342:   PetscMPIInt lo = 0, hi, t;

344:   PetscFunctionBegin;
345: #if defined(PETSC_USE_DEBUG)
346:   PetscCheck((map->n >= 0) && (map->N >= 0) && (map->range), PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscLayoutSetUp() must be called first");
347:   PetscCheck(idx >= 0 && idx <= map->N, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Index %" PetscInt_FMT " is out of range", idx);
348: #endif
349:   hi = map->size;
350:   while (hi - lo > 1) {
351:     t = lo + (hi - lo) / 2;
352:     if (idx < map->range[t]) hi = t;
353:     else lo = t;
354:   }
355:   if (owner) *owner = lo;
356:   if (lidx) *lidx = idx - map->range[lo];
357:   PetscFunctionReturn(PETSC_SUCCESS);
358: }

360: PETSC_EXTERN PetscErrorCode PetscLayoutCreate(MPI_Comm, PetscLayout *);
361: PETSC_EXTERN PetscErrorCode PetscLayoutCreateFromSizes(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscLayout *);
362: PETSC_EXTERN PetscErrorCode PetscLayoutCreateFromRanges(MPI_Comm, const PetscInt[], PetscCopyMode, PetscInt, PetscLayout *);
363: PETSC_EXTERN PetscErrorCode PetscLayoutSetUp(PetscLayout);
364: PETSC_EXTERN PetscErrorCode PetscLayoutDestroy(PetscLayout *);
365: PETSC_EXTERN PetscErrorCode PetscLayoutDuplicate(PetscLayout, PetscLayout *);
366: PETSC_EXTERN PetscErrorCode PetscLayoutReference(PetscLayout, PetscLayout *);
367: PETSC_EXTERN PetscErrorCode PetscLayoutSetLocalSize(PetscLayout, PetscInt);
368: PETSC_EXTERN PetscErrorCode PetscLayoutGetLocalSize(PetscLayout, PetscInt *);
369: PETSC_EXTERN PetscErrorCode PetscLayoutSetSize(PetscLayout, PetscInt);
370: PETSC_EXTERN PetscErrorCode PetscLayoutGetSize(PetscLayout, PetscInt *);
371: PETSC_EXTERN PetscErrorCode PetscLayoutSetBlockSize(PetscLayout, PetscInt);
372: PETSC_EXTERN PetscErrorCode PetscLayoutGetBlockSize(PetscLayout, PetscInt *);
373: PETSC_EXTERN PetscErrorCode PetscLayoutGetRange(PetscLayout, PetscInt *, PetscInt *);
374: PETSC_EXTERN PetscErrorCode PetscLayoutGetRanges(PetscLayout, const PetscInt *[]);
375: PETSC_EXTERN PetscErrorCode PetscLayoutCompare(PetscLayout, PetscLayout, PetscBool *);
376: PETSC_EXTERN PetscErrorCode PetscLayoutSetISLocalToGlobalMapping(PetscLayout, ISLocalToGlobalMapping);
377: PETSC_EXTERN PetscErrorCode PetscLayoutMapLocal(PetscLayout, PetscInt, const PetscInt[], PetscInt *, PetscInt **, PetscInt **);

379: PETSC_EXTERN PetscErrorCode PetscParallelSortInt(PetscLayout, PetscLayout, PetscInt *, PetscInt *);

381: PETSC_EXTERN PetscErrorCode ISGetLayout(IS, PetscLayout *);
382: PETSC_EXTERN PetscErrorCode ISSetLayout(IS, PetscLayout);

384: #endif