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