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