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 <petscsys.h> 8 #include <petscsftypes.h> 9 #include <petscsectiontypes.h> 10 #include <petscistypes.h> /*I "petscis.h" I*/ 11 12 /* SUBMANSEC = IS */ 13 14 #define IS_FILE_CLASSID 1211218 15 PETSC_EXTERN PetscClassId IS_CLASSID; 16 17 PETSC_EXTERN PetscErrorCode ISInitializePackage(void); 18 PETSC_EXTERN PetscErrorCode ISFinalizePackage(void); 19 20 /*J 21 ISType - String with the name of a PETSc index set type 22 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 27 28 Level: beginner 29 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" 37 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 *); 45 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 *); 52 53 /*E 54 ISInfo - Info that may either be computed or set as known for an index set 55 56 Level: intermediate 57 58 Developer Note: 59 Entries that are negative need not be called collectively by all processes. 60 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; 72 73 typedef enum { 74 IS_LOCAL, 75 IS_GLOBAL 76 } ISInfoType; 77 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 *); 105 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 *); 110 111 PETSC_EXTERN PetscErrorCode ISGetBlockSize(IS, PetscInt *); 112 PETSC_EXTERN PetscErrorCode ISSetBlockSize(IS, PetscInt); 113 114 PETSC_EXTERN PetscErrorCode ISToGeneral(IS); 115 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 *); 129 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); 135 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 *); 143 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 *); 148 149 #define IS_LTOGM_FILE_CLASSID 1211217 150 PETSC_EXTERN PetscClassId IS_LTOGM_CLASSID; 151 152 /*E 153 ISGlobalToLocalMappingMode - Indicates mapping behavior if global indices are missing 154 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 158 159 Level: beginner 160 161 .seealso: `ISGlobalToLocalMappingApplyBlock()`, `ISGlobalToLocalMappingApply()` 162 E*/ 163 typedef enum { 164 IS_GTOLM_MASK, 165 IS_GTOLM_DROP 166 } ISGlobalToLocalMappingMode; 167 168 /*J 169 ISLocalToGlobalMappingType - String with the name of a mapping method 170 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 174 175 Level: beginner 176 177 .seealso: `ISLocalToGlobalMapping`, `ISLocalToGlobalMappingSetType()`, `ISLocalToGlobalSetFromOptions()`, `ISGlobalToLocalMappingMode` 178 J*/ 179 typedef const char *ISLocalToGlobalMappingType; 180 #define ISLOCALTOGLOBALMAPPINGBASIC "basic" 181 #define ISLOCALTOGLOBALMAPPINGHASH "hash" 182 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); 205 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 *); 212 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 *); 222 223 /*E 224 ISColoringType - determines if the coloring is for the entire parallel grid/graph/matrix 225 or for just the local ghosted portion 226 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. 235 236 Level: beginner 237 238 .seealso: `ISColoring`, `ISColoringSetType()`, `ISColoringGetType()`, `DMCreateColoring()` 239 E*/ 240 typedef enum { 241 IS_COLORING_GLOBAL, 242 IS_COLORING_LOCAL 243 } ISColoringType; 244 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 *[]); 250 251 PETSC_EXTERN PetscErrorCode ISColoringCreate(MPI_Comm, PetscInt, PetscInt, const ISColoringValue[], PetscCopyMode, ISColoring *); 252 PETSC_EXTERN PetscErrorCode ISColoringDestroy(ISColoring *); 253 PETSC_EXTERN PetscErrorCode ISColoringView(ISColoring, PetscViewer); 254 PETSC_EXTERN PetscErrorCode ISColoringViewFromOptions(ISColoring, PetscObject, const char[]); 255 PETSC_EXTERN PetscErrorCode ISColoringGetIS(ISColoring, PetscCopyMode, PetscInt *, IS *[]); 256 PETSC_EXTERN PetscErrorCode ISColoringRestoreIS(ISColoring, PetscCopyMode, IS *[]); 257 PETSC_EXTERN PetscErrorCode ISColoringReference(ISColoring); 258 PETSC_EXTERN PetscErrorCode ISColoringSetType(ISColoring, ISColoringType); 259 PETSC_EXTERN PetscErrorCode ISColoringGetType(ISColoring, ISColoringType *); 260 PETSC_EXTERN PetscErrorCode ISColoringGetColors(ISColoring, PetscInt *, PetscInt *, const ISColoringValue **); 261 262 PETSC_EXTERN PetscErrorCode ISBuildTwoSided(IS, IS, IS *); 263 PETSC_EXTERN PetscErrorCode ISPartitioningToNumbering(IS, IS *); 264 PETSC_EXTERN PetscErrorCode ISPartitioningCount(IS, PetscInt, PetscInt[]); 265 266 PETSC_EXTERN PetscErrorCode ISCompressIndicesGeneral(PetscInt, PetscInt, PetscInt, PetscInt, const IS[], IS[]); 267 PETSC_DEPRECATED_FUNCTION(3, 19, 0, "ISCompressIndicesGeneral()", ) static inline PetscErrorCode ISCompressIndicesSorted(PetscInt n, PetscInt bs, PetscInt imax, const IS is_in[], IS is_out[]) 268 { 269 return ISCompressIndicesGeneral(n, bs, n, imax, is_in, is_out); 270 } 271 PETSC_EXTERN PetscErrorCode ISExpandIndicesGeneral(PetscInt, PetscInt, PetscInt, PetscInt, const IS[], IS[]); 272 273 struct _n_PetscLayout { 274 MPI_Comm comm; 275 PetscMPIInt size; 276 PetscInt n, N; /* local, global vector size */ 277 PetscInt rstart, rend; /* local start, local end + 1 */ 278 PetscInt *range; /* the offset of each processor */ 279 PetscBool range_alloc; /* should range be freed in Destroy? */ 280 PetscInt bs; /* number of elements in each block (generally for multi-component 281 * problems). Defaults to -1 and can be arbitrarily lazy so always use 282 * PetscAbs(map->bs) when accessing directly and expecting result to be 283 * positive. Do NOT multiply above numbers by bs */ 284 PetscInt refcnt; /* MPI Vecs obtained with VecDuplicate() and from MatCreateVecs() reuse map of input object */ 285 ISLocalToGlobalMapping mapping; /* mapping used in Vec/MatSetValuesLocal() */ 286 PetscBool setupcalled; /* Forbid setup more than once */ 287 PetscInt oldn, oldN; /* Checking if setup is allowed */ 288 PetscInt oldbs; /* And again */ 289 }; 290 291 /*@C 292 PetscLayoutFindOwner - Find the owning MPI process for a global index 293 294 Not Collective; No Fortran Support 295 296 Input Parameters: 297 + map - the layout 298 - idx - global index to find the owner of 299 300 Output Parameter: 301 . owner - the owning rank 302 303 Level: developer 304 305 .seealso: `PetscLayout`, `PetscLayoutFindOwnerIndex()` 306 @*/ 307 static inline PetscErrorCode PetscLayoutFindOwner(PetscLayout map, PetscInt idx, PetscMPIInt *owner) 308 { 309 PetscMPIInt lo = 0, hi, t; 310 311 PetscFunctionBegin; 312 *owner = -1; /* GCC erroneously issues warning about possibly uninitialized use when error condition */ 313 PetscAssert((map->n >= 0) && (map->N >= 0) && (map->range), PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscLayoutSetUp() must be called first"); 314 PetscAssert(idx >= 0 && idx <= map->N, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Index %" PetscInt_FMT " is out of range", idx); 315 hi = map->size; 316 while (hi - lo > 1) { 317 t = lo + (hi - lo) / 2; 318 if (idx < map->range[t]) hi = t; 319 else lo = t; 320 } 321 *owner = lo; 322 PetscFunctionReturn(PETSC_SUCCESS); 323 } 324 325 /*@C 326 PetscLayoutFindOwnerIndex - Find the owning MPI process and the local index on that process for a global index 327 328 Not Collective; No Fortran Support 329 330 Input Parameters: 331 + map - the layout 332 - idx - global index to find the owner of 333 334 Output Parameters: 335 + owner - the owning rank 336 - lidx - local index used by the owner for `idx` 337 338 Level: developer 339 340 .seealso: `PetscLayout`, `PetscLayoutFindOwner()` 341 @*/ 342 static inline PetscErrorCode PetscLayoutFindOwnerIndex(PetscLayout map, PetscInt idx, PetscMPIInt *owner, PetscInt *lidx) 343 { 344 PetscMPIInt lo = 0, hi, t; 345 346 PetscFunctionBegin; 347 PetscAssert((map->n >= 0) && (map->N >= 0) && (map->range), PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscLayoutSetUp() must be called first"); 348 PetscAssert(idx >= 0 && idx <= map->N, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Index %" PetscInt_FMT " is out of range", idx); 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 } 359 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 **); 378 379 PETSC_EXTERN PetscErrorCode PetscParallelSortInt(PetscLayout, PetscLayout, PetscInt *, PetscInt *); 380 381 PETSC_EXTERN PetscErrorCode ISGetLayout(IS, PetscLayout *); 382 PETSC_EXTERN PetscErrorCode ISSetLayout(IS, PetscLayout); 383