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: #pragma once

      7: #include <petscsys.h>
      8: #include <petscsftypes.h>
      9: #include <petscsectiontypes.h>
     10: #include <petscistypes.h>

     12: /* SUBMANSEC = IS */

     14: #define IS_FILE_CLASSID 1211218
     15: PETSC_EXTERN PetscClassId IS_CLASSID;

     17: PETSC_EXTERN PetscErrorCode ISInitializePackage(void);
     18: PETSC_EXTERN PetscErrorCode ISFinalizePackage(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 the same common length) 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    ISRegisterAll(void);
     44: PETSC_EXTERN PetscErrorCode    ISCreate(MPI_Comm, IS *);

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

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

     56:    Level: intermediate

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

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

     73: typedef enum {
     74:   IS_LOCAL,
     75:   IS_GLOBAL
     76: } ISInfoType;

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

    106: PETSC_EXTERN PetscErrorCode ISLocate(IS, PetscInt, PetscInt *);
    107: PETSC_EXTERN PetscErrorCode ISGetPointRange(IS, PetscInt *, PetscInt *, const PetscInt **);
    108: PETSC_EXTERN PetscErrorCode ISRestorePointRange(IS, PetscInt *, PetscInt *, const PetscInt **);
    109: PETSC_EXTERN PetscErrorCode ISGetPointSubrange(IS, PetscInt, PetscInt, const PetscInt *);

    111: PETSC_EXTERN PetscErrorCode ISGetBlockSize(IS, PetscInt *);
    112: PETSC_EXTERN PetscErrorCode ISSetBlockSize(IS, PetscInt);

    114: PETSC_EXTERN PetscErrorCode ISToGeneral(IS);

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

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

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

    144: /* ISSTRIDE specific */
    145: PETSC_EXTERN PetscErrorCode ISCreateStride(MPI_Comm, PetscInt, PetscInt, PetscInt, IS *);
    146: PETSC_EXTERN PetscErrorCode ISStrideSetStride(IS, PetscInt, PetscInt, PetscInt);
    147: PETSC_EXTERN PetscErrorCode ISStrideGetInfo(IS, PetscInt *, PetscInt *);

    149: #define IS_LTOGM_FILE_CLASSID 1211217
    150: PETSC_EXTERN PetscClassId IS_LTOGM_CLASSID;

    152: /*E
    153:    ISGlobalToLocalMappingMode - Indicates mapping behavior if global indices are missing

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

    159:    Level: beginner

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

    168: /*J
    169:    ISLocalToGlobalMappingType - String with the name of a mapping method

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

    175:    Level: beginner

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

    183: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetType(ISLocalToGlobalMapping, ISLocalToGlobalMappingType);
    184: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetType(ISLocalToGlobalMapping, ISLocalToGlobalMappingType *);
    185: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRegister(const char[], PetscErrorCode (*)(ISLocalToGlobalMapping));
    186: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRegisterAll(void);
    187: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreate(MPI_Comm, PetscInt, PetscInt, const PetscInt[], PetscCopyMode, ISLocalToGlobalMapping *);
    188: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreateIS(IS, ISLocalToGlobalMapping *);
    189: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreateSF(PetscSF, PetscInt, ISLocalToGlobalMapping *);
    190: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetFromOptions(ISLocalToGlobalMapping);
    191: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetUp(ISLocalToGlobalMapping);
    192: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingView(ISLocalToGlobalMapping, PetscViewer);
    193: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingLoad(ISLocalToGlobalMapping, PetscViewer);
    194: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingViewFromOptions(ISLocalToGlobalMapping, PetscObject, const char[]);
    195: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingConcatenate(MPI_Comm, PetscInt, const ISLocalToGlobalMapping[], ISLocalToGlobalMapping *);
    196: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingDuplicate(ISLocalToGlobalMapping, ISLocalToGlobalMapping *);
    197: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingDestroy(ISLocalToGlobalMapping *);
    198: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetSize(ISLocalToGlobalMapping, PetscInt *);
    199: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetIndices(ISLocalToGlobalMapping, const PetscInt **);
    200: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreIndices(ISLocalToGlobalMapping, const PetscInt **);
    201: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockIndices(ISLocalToGlobalMapping, const PetscInt **);
    202: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreBlockIndices(ISLocalToGlobalMapping, const PetscInt **);
    203: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockSize(ISLocalToGlobalMapping, PetscInt *);
    204: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetBlockSize(ISLocalToGlobalMapping, PetscInt);

    206: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApply(ISLocalToGlobalMapping, PetscInt, const PetscInt[], PetscInt[]);
    207: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApplyBlock(ISLocalToGlobalMapping, PetscInt, const PetscInt[], PetscInt[]);
    208: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApplyIS(ISLocalToGlobalMapping, IS, IS *);
    209: PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApply(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, PetscInt, const PetscInt[], PetscInt *, PetscInt[]);
    210: PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApplyBlock(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, PetscInt, const PetscInt[], PetscInt *, PetscInt[]);
    211: PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApplyIS(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, IS, IS *);

    213: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]);
    214: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]);
    215: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
    216: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
    217: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]);
    218: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreBlockNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]);
    219: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
    220: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreBlockInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]);
    221: PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockMultiLeavesSF(ISLocalToGlobalMapping, PetscSF *);

    223: /*E
    224:    ISColoringType - determines if the coloring is for the entire parallel grid/graph/matrix
    225:                     or for just the local ghosted portion

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

    236:    Level: beginner

    238: .seealso: `ISColoring`, `ISColoringSetType()`, `ISColoringGetType()`, `DMCreateColoring()`
    239: E*/
    240: typedef enum {
    241:   IS_COLORING_GLOBAL,
    242:   IS_COLORING_LOCAL
    243: } ISColoringType;

    245: PETSC_EXTERN const char *const                ISColoringTypes[];
    246: typedef unsigned PETSC_IS_COLORING_VALUE_TYPE ISColoringValue;
    247: #define IS_COLORING_MAX     PETSC_IS_COLORING_MAX
    248: #define MPIU_COLORING_VALUE PETSC_MPIU_IS_COLORING_VALUE_TYPE
    249: PETSC_EXTERN PetscErrorCode ISAllGatherColors(MPI_Comm, PetscInt, ISColoringValue *, PetscInt *, ISColoringValue *[]);

    251: /*@C
    252:    ISColoringValueCast - casts an integer a `ISColoringValue` (which may be 1-bits in size), generates an
    253:    error if the value is too large

    255:    Not Collective; No Fortran Support

    257:    Input Parameter:
    258: .  a - the `PetscCount` value

    260:    Output Parameter:
    261: .  b - the resulting `ISColoringValue` value

    263:    Level: advanced

    265:    Note:
    266:    Errors if the integer is negative

    268: .seealso: `ISColoringValue`, `ISColoringCreate()`, `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscMPIIntCast()`, `PetscIntCast()`
    269: @*/
    270: static inline PetscErrorCode ISColoringValueCast(PetscCount a, ISColoringValue *b)
    271: {
    272:   PetscFunctionBegin;
    273:   *b = 0;
    274:   PetscCheck(a >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Passing negative integer not supported");
    275:   PetscCheck(a < PETSC_IS_COLORING_MAX, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Integer too large to convert");
    276:   *b = (ISColoringValue)a;
    277:   PetscFunctionReturn(PETSC_SUCCESS);
    278: }

    280: PETSC_EXTERN PetscErrorCode ISColoringCreate(MPI_Comm, PetscInt, PetscInt, const ISColoringValue[], PetscCopyMode, ISColoring *);
    281: PETSC_EXTERN PetscErrorCode ISColoringDestroy(ISColoring *);
    282: PETSC_EXTERN PetscErrorCode ISColoringView(ISColoring, PetscViewer);
    283: PETSC_EXTERN PetscErrorCode ISColoringViewFromOptions(ISColoring, PetscObject, const char[]);
    284: PETSC_EXTERN PetscErrorCode ISColoringGetIS(ISColoring, PetscCopyMode, PetscInt *, IS *[]);
    285: PETSC_EXTERN PetscErrorCode ISColoringRestoreIS(ISColoring, PetscCopyMode, IS *[]);
    286: PETSC_EXTERN PetscErrorCode ISColoringReference(ISColoring);
    287: PETSC_EXTERN PetscErrorCode ISColoringSetType(ISColoring, ISColoringType);
    288: PETSC_EXTERN PetscErrorCode ISColoringGetType(ISColoring, ISColoringType *);
    289: PETSC_EXTERN PetscErrorCode ISColoringGetColors(ISColoring, PetscInt *, PetscInt *, const ISColoringValue **);

    291: PETSC_EXTERN PetscErrorCode ISBuildTwoSided(IS, IS, IS *);
    292: PETSC_EXTERN PetscErrorCode ISPartitioningToNumbering(IS, IS *);
    293: PETSC_EXTERN PetscErrorCode ISPartitioningCount(IS, PetscInt, PetscInt[]);

    295: PETSC_EXTERN PetscErrorCode ISCompressIndicesGeneral(PetscInt, PetscInt, PetscInt, PetscInt, const IS[], IS[]);
    296: PETSC_DEPRECATED_FUNCTION(3, 19, 0, "ISCompressIndicesGeneral()", ) static inline PetscErrorCode ISCompressIndicesSorted(PetscInt n, PetscInt bs, PetscInt imax, const IS is_in[], IS is_out[])
    297: {
    298:   return ISCompressIndicesGeneral(n, bs, n, imax, is_in, is_out);
    299: }
    300: PETSC_EXTERN PetscErrorCode ISExpandIndicesGeneral(PetscInt, PetscInt, PetscInt, PetscInt, const IS[], IS[]);

    302: struct _n_PetscLayout {
    303:   MPI_Comm               comm;
    304:   PetscMPIInt            size;
    305:   PetscInt               n, N;         /* local, global vector size */
    306:   PetscInt               rstart, rend; /* local start, local end + 1 */
    307:   PetscInt              *range;        /* the offset of each processor */
    308:   PetscBool              range_alloc;  /* should range be freed in Destroy? */
    309:   PetscInt               bs;           /* number of elements in each block (generally for multi-component
    310:                                        * problems). Defaults to -1 and can be arbitrarily lazy so always use
    311:                                        * PetscAbs(map->bs) when accessing directly and expecting result to be
    312:                                        * positive. Do NOT multiply above numbers by bs */
    313:   PetscInt               refcnt;       /* MPI Vecs obtained with VecDuplicate() and from MatCreateVecs() reuse map of input object */
    314:   ISLocalToGlobalMapping mapping;      /* mapping used in Vec/MatSetValuesLocal() */
    315:   PetscBool              setupcalled;  /* Forbid setup more than once */
    316:   PetscInt               oldn, oldN;   /* Checking if setup is allowed */
    317:   PetscInt               oldbs;        /* And again */
    318: };

    320: PETSC_EXTERN PetscErrorCode PetscLayoutCreate(MPI_Comm, PetscLayout *);
    321: PETSC_EXTERN PetscErrorCode PetscLayoutFindOwner(PetscLayout, PetscInt, PetscMPIInt *);
    322: PETSC_EXTERN PetscErrorCode PetscLayoutFindOwnerIndex(PetscLayout, PetscInt, PetscMPIInt *, PetscInt *);
    323: PETSC_EXTERN PetscErrorCode PetscLayoutCreateFromSizes(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscLayout *);
    324: PETSC_EXTERN PetscErrorCode PetscLayoutCreateFromRanges(MPI_Comm, const PetscInt[], PetscCopyMode, PetscInt, PetscLayout *);
    325: PETSC_EXTERN PetscErrorCode PetscLayoutSetUp(PetscLayout);
    326: PETSC_EXTERN PetscErrorCode PetscLayoutDestroy(PetscLayout *);
    327: PETSC_EXTERN PetscErrorCode PetscLayoutDuplicate(PetscLayout, PetscLayout *);
    328: PETSC_EXTERN PetscErrorCode PetscLayoutReference(PetscLayout, PetscLayout *);
    329: PETSC_EXTERN PetscErrorCode PetscLayoutSetLocalSize(PetscLayout, PetscInt);
    330: PETSC_EXTERN PetscErrorCode PetscLayoutGetLocalSize(PetscLayout, PetscInt *);
    331: PETSC_EXTERN PetscErrorCode PetscLayoutSetSize(PetscLayout, PetscInt);
    332: PETSC_EXTERN PetscErrorCode PetscLayoutGetSize(PetscLayout, PetscInt *);
    333: PETSC_EXTERN PetscErrorCode PetscLayoutSetBlockSize(PetscLayout, PetscInt);
    334: PETSC_EXTERN PetscErrorCode PetscLayoutGetBlockSize(PetscLayout, PetscInt *);
    335: PETSC_EXTERN PetscErrorCode PetscLayoutGetRange(PetscLayout, PetscInt *, PetscInt *);
    336: PETSC_EXTERN PetscErrorCode PetscLayoutGetRanges(PetscLayout, const PetscInt *[]);
    337: PETSC_EXTERN PetscErrorCode PetscLayoutCompare(PetscLayout, PetscLayout, PetscBool *);
    338: PETSC_EXTERN PetscErrorCode PetscLayoutSetISLocalToGlobalMapping(PetscLayout, ISLocalToGlobalMapping);
    339: PETSC_EXTERN PetscErrorCode PetscLayoutMapLocal(PetscLayout, PetscInt, const PetscInt[], PetscInt *, PetscInt **, PetscInt **);

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

    343: PETSC_EXTERN PetscErrorCode ISGetLayout(IS, PetscLayout *);
    344: PETSC_EXTERN PetscErrorCode ISSetLayout(IS, PetscLayout);