12eac72dbSBarry Smith /* 2f8256253SLois Curfman McInnes An index set is a generalization of a subset of integers. Index sets 3f8256253SLois Curfman McInnes are used for defining scatters and gathers. 42eac72dbSBarry Smith */ 56524c165SJacob Faibussowitsch #ifndef PETSCIS_H 626bd1501SBarry Smith #define PETSCIS_H 7ac09b921SBarry Smith 82c8e378dSBarry Smith #include <petscsys.h> 90c312b8eSJed Brown #include <petscsftypes.h> 10ea844a1aSMatthew Knepley #include <petscsectiontypes.h> 114914ba2bSBarry Smith #include <petscistypes.h> /*I "petscis.h" I*/ 122eac72dbSBarry Smith 13ac09b921SBarry Smith /* SUBMANSEC = IS */ 14ac09b921SBarry Smith 1597b48c8fSBarry Smith #define IS_FILE_CLASSID 1211218 16014dd563SJed Brown PETSC_EXTERN PetscClassId IS_CLASSID; 17f0479e8cSBarry Smith 18607a6623SBarry Smith PETSC_EXTERN PetscErrorCode ISInitializePackage(void); 192b6de112SBarry Smith 2076bdecfbSBarry Smith /*J 218f6c3df8SBarry Smith ISType - String with the name of a PETSc index set type 2227bdab1eSBarry Smith 2316a05f60SBarry Smith Values: 249c89aa79SPierre Jolivet + `ISGENERAL` - the values are stored with an array of indices and generally have no structure 2516a05f60SBarry Smith . `ISSTRIDE` - the values have a simple structure of an initial offset and then a step size between values 2616a05f60SBarry Smith - `ISBLOCK` - values are an array of indices, each representing a block of values 2716a05f60SBarry Smith 2827bdab1eSBarry Smith Level: beginner 2927bdab1eSBarry Smith 3016a05f60SBarry Smith .seealso: `ISSetType()`, `IS`, `ISCreateGeneral()`, `ISCreateStride()`, `ISCreateBlock()`, `ISCreate()`, `ISRegister()`, 3116a05f60SBarry Smith `VecScatterCreate()`, `MatGetSubMatrices()` 3276bdecfbSBarry Smith J*/ 3319fd82e9SBarry Smith typedef const char *ISType; 3427bdab1eSBarry Smith #define ISGENERAL "general" 3527bdab1eSBarry Smith #define ISSTRIDE "stride" 3627bdab1eSBarry Smith #define ISBLOCK "block" 3727bdab1eSBarry Smith 3827bdab1eSBarry Smith /* Dynamic creation and loading functions */ 39140e18c1SBarry Smith PETSC_EXTERN PetscFunctionList ISList; 4019fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode ISSetType(IS, ISType); 4119fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode ISGetType(IS, ISType *); 42bdf89e91SBarry Smith PETSC_EXTERN PetscErrorCode ISRegister(const char[], PetscErrorCode (*)(IS)); 43014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISCreate(MPI_Comm, IS *); 4427bdab1eSBarry Smith 45014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISDestroy(IS *); 46014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSetPermutation(IS); 47014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISPermutation(IS, PetscBool *); 48014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSetIdentity(IS); 49014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISIdentity(IS, PetscBool *); 50014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISContiguousLocal(IS, PetscInt, PetscInt, PetscInt *, PetscBool *); 5108480c60SBarry Smith 522a1da528SToby Isaac /*E 532a1da528SToby Isaac ISInfo - Info that may either be computed or set as known for an index set 542a1da528SToby Isaac 5516a05f60SBarry Smith Level: intermediate 562a1da528SToby Isaac 572a1da528SToby Isaac Developer Notes: 582a1da528SToby Isaac Entries that are negative need not be called collectively by all processes. 592a1da528SToby Isaac 6087497f52SBarry Smith Any additions/changes here MUST also be made in include/petsc/finclude/petscis.h 6187497f52SBarry Smith 6287497f52SBarry Smith Any additions/changes here must also be made in src/vec/vec/interface/dlregisvec.c in ISInfos[] 6387497f52SBarry Smith 6416a05f60SBarry Smith .seealso: `IS`, `ISType`, `ISSetInfo()` 652a1da528SToby Isaac E*/ 669371c9d4SSatish Balay typedef enum { 679371c9d4SSatish Balay IS_INFO_MIN = -1, 682a1da528SToby Isaac IS_SORTED = 0, 692a1da528SToby Isaac IS_UNIQUE = 1, 702a1da528SToby Isaac IS_PERMUTATION = 2, 712a1da528SToby Isaac IS_INTERVAL = 3, 722a1da528SToby Isaac IS_IDENTITY = 4, 739371c9d4SSatish Balay IS_INFO_MAX = 5 749371c9d4SSatish Balay } ISInfo; 752a1da528SToby Isaac 769371c9d4SSatish Balay typedef enum { 779371c9d4SSatish Balay IS_LOCAL, 789371c9d4SSatish Balay IS_GLOBAL 799371c9d4SSatish Balay } ISInfoType; 802a1da528SToby Isaac 812a1da528SToby Isaac PETSC_EXTERN PetscErrorCode ISSetInfo(IS, ISInfo, ISInfoType, PetscBool, PetscBool); 82657dc977SToby Isaac PETSC_EXTERN PetscErrorCode ISGetInfo(IS, ISInfo, ISInfoType, PetscBool, PetscBool *); 832a1da528SToby Isaac PETSC_EXTERN PetscErrorCode ISClearInfoCache(IS, PetscBool); 84014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetIndices(IS, const PetscInt *[]); 85014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISRestoreIndices(IS, const PetscInt *[]); 86014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetTotalIndices(IS, const PetscInt *[]); 87014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISRestoreTotalIndices(IS, const PetscInt *[]); 88014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetNonlocalIndices(IS, const PetscInt *[]); 89014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISRestoreNonlocalIndices(IS, const PetscInt *[]); 90d60670a5SStefano Zampini PETSC_EXTERN PetscErrorCode ISGetNonlocalIS(IS, IS *); 91d60670a5SStefano Zampini PETSC_EXTERN PetscErrorCode ISRestoreNonlocalIS(IS, IS *); 92014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetSize(IS, PetscInt *); 93014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetLocalSize(IS, PetscInt *); 94014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISInvertPermutation(IS, PetscInt, IS *); 95014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISView(IS, PetscViewer); 96fe2efc57SMark PETSC_EXTERN PetscErrorCode ISViewFromOptions(IS, PetscObject, const char[]); 97235f7792SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISLoad(IS, PetscViewer); 98014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISEqual(IS, IS, PetscBool *); 99e8386968SVaclav Hapla PETSC_EXTERN PetscErrorCode ISEqualUnsorted(IS, IS, PetscBool *); 100014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSort(IS); 101b080c0f9SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISSortRemoveDups(IS); 102014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSorted(IS, PetscBool *); 103014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISDifference(IS, IS, IS *); 104014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSum(IS, IS, IS *); 105014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISExpand(IS, IS, IS *); 1063daafeecSToby Isaac PETSC_EXTERN PetscErrorCode ISIntersect(IS, IS, IS *); 107132da990SBarry Smith PETSC_EXTERN PetscErrorCode ISGetMinMax(IS, PetscInt *, PetscInt *); 108612dd529SBarry Smith 109c3c3c9f4SToby Isaac PETSC_EXTERN PetscErrorCode ISLocate(IS, PetscInt, PetscInt *); 1109305a4c7SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISGetPointRange(IS, PetscInt *, PetscInt *, const PetscInt **); 1119305a4c7SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISRestorePointRange(IS, PetscInt *, PetscInt *, const PetscInt **); 1129305a4c7SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISGetPointSubrange(IS, PetscInt, PetscInt, const PetscInt *); 113c3c3c9f4SToby Isaac 114014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetBlockSize(IS, PetscInt *); 115014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSetBlockSize(IS, PetscInt); 116c16cb8f2SBarry Smith 117014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISToGeneral(IS); 11838f40f24SLois Curfman McInnes 119014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISDuplicate(IS, IS *); 120014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISCopy(IS, IS); 1219fdaf958SVaclav Hapla PETSC_EXTERN PetscErrorCode ISShift(IS, PetscInt, IS); 122014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISAllGather(IS, IS *); 123014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISComplement(IS, PetscInt, PetscInt, IS *); 124014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISConcatenate(MPI_Comm, PetscInt, const IS[], IS *); 125bb74729cSDmitry Karpeev PETSC_EXTERN PetscErrorCode ISListToPair(MPI_Comm, PetscInt, IS[], IS *, IS *); 126bb74729cSDmitry Karpeev PETSC_EXTERN PetscErrorCode ISPairToList(IS, IS, PetscInt *, IS *[]); 127bb74729cSDmitry Karpeev PETSC_EXTERN PetscErrorCode ISEmbed(IS, IS, PetscBool, IS *); 1285ea6c424SDmitry Karpeev PETSC_EXTERN PetscErrorCode ISSortPermutation(IS, PetscBool, IS *); 129014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISOnComm(IS, MPI_Comm, PetscCopyMode, IS *); 1306583bcc1SStefano Zampini PETSC_EXTERN PetscErrorCode ISRenumber(IS, IS, PetscInt *, IS *); 1316c04a3c5SFande Kong PETSC_EXTERN PetscErrorCode ISCreateSubIS(IS, IS, IS *); 132d64ed03dSBarry Smith 13384933e40SVaclav Hapla /* ISGENERAL specific */ 13484933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISCreateGeneral(MPI_Comm, PetscInt, const PetscInt[], PetscCopyMode, IS *); 13584933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISGeneralSetIndices(IS, PetscInt, const PetscInt[], PetscCopyMode); 1369bc6f2f1SVaclav Hapla PETSC_EXTERN PetscErrorCode ISGeneralSetIndicesFromMask(IS, PetscInt, PetscInt, const PetscBool[]); 13753bb9c4cSVaclav Hapla PETSC_EXTERN PetscErrorCode ISGeneralFilter(IS, PetscInt, PetscInt); 13853bb9c4cSVaclav Hapla 13984933e40SVaclav Hapla /* ISBLOCK specific */ 14084933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISCreateBlock(MPI_Comm, PetscInt, PetscInt, const PetscInt[], PetscCopyMode, IS *); 14184933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISBlockSetIndices(IS, PetscInt, PetscInt, const PetscInt[], PetscCopyMode); 14284933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISBlockGetIndices(IS, const PetscInt *[]); 14384933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISBlockRestoreIndices(IS, const PetscInt *[]); 14484933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISBlockGetLocalSize(IS, PetscInt *); 14584933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISBlockGetSize(IS, PetscInt *); 14684933e40SVaclav Hapla 14784933e40SVaclav Hapla /* ISSTRIDE specific */ 14884933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISCreateStride(MPI_Comm, PetscInt, PetscInt, PetscInt, IS *); 14984933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISStrideSetStride(IS, PetscInt, PetscInt, PetscInt); 15084933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISStrideGetInfo(IS, PetscInt *, PetscInt *); 15184933e40SVaclav Hapla 152014dd563SJed Brown PETSC_EXTERN PetscClassId IS_LTOGM_CLASSID; 15356cd22aeSBarry Smith 1545c20da3cSBarry Smith /*E 1550040bde1SJunchao Zhang ISGlobalToLocalMappingMode - Indicates mapping behavior if global indices are missing 1565c20da3cSBarry Smith 15716a05f60SBarry Smith Values: 15816a05f60SBarry Smith + `IS_GTOLM_MASK` - missing global indices are masked by mapping them to a local index of -1 15916a05f60SBarry Smith - `IS_GTOLM_DROP` - missing global indices are dropped 1605c20da3cSBarry Smith 1615c20da3cSBarry Smith Level: beginner 1625c20da3cSBarry Smith 163db781477SPatrick Sanan .seealso: `ISGlobalToLocalMappingApplyBlock()`, `ISGlobalToLocalMappingApply()` 1645c20da3cSBarry Smith E*/ 1659371c9d4SSatish Balay typedef enum { 1669371c9d4SSatish Balay IS_GTOLM_MASK, 1679371c9d4SSatish Balay IS_GTOLM_DROP 1689371c9d4SSatish Balay } ISGlobalToLocalMappingMode; 16990f02eecSBarry Smith 170413f72f0SBarry Smith /*J 171413f72f0SBarry Smith ISLocalToGlobalMappingType - String with the name of a mapping method 172413f72f0SBarry Smith 17316a05f60SBarry Smith Values: 17416a05f60SBarry Smith + `ISLOCALTOGLOBALMAPPINGBASIC` - a non-memory scalable way of storing `ISLocalToGlobalMapping` that allows applying `ISGlobalToLocalMappingApply()` efficiently 17516a05f60SBarry Smith - `ISLOCALTOGLOBALMAPPINGHASH` - a memory scalable way of storing `ISLocalToGlobalMapping` that allows applying `ISGlobalToLocalMappingApply()` reasonably efficiently 17616a05f60SBarry Smith 177413f72f0SBarry Smith Level: beginner 178413f72f0SBarry Smith 17916a05f60SBarry Smith .seealso: `ISLocalToGlobalMapping`, `ISLocalToGlobalMappingSetType()`, `ISLocalToGlobalSetFromOptions()`, `ISGlobalToLocalMappingMode` 180413f72f0SBarry Smith J*/ 181413f72f0SBarry Smith typedef const char *ISLocalToGlobalMappingType; 182413f72f0SBarry Smith #define ISLOCALTOGLOBALMAPPINGBASIC "basic" 183413f72f0SBarry Smith #define ISLOCALTOGLOBALMAPPINGHASH "hash" 184413f72f0SBarry Smith 185413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetType(ISLocalToGlobalMapping, ISLocalToGlobalMappingType); 186a0d79125SStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetType(ISLocalToGlobalMapping, ISLocalToGlobalMappingType *); 1871d36bdfdSBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRegister(const char[], PetscErrorCode (*)(ISLocalToGlobalMapping)); 188413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRegisterAll(void); 189f0413b6fSBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreate(MPI_Comm, PetscInt, PetscInt, const PetscInt[], PetscCopyMode, ISLocalToGlobalMapping *); 190014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreateIS(IS, ISLocalToGlobalMapping *); 191014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreateSF(PetscSF, PetscInt, ISLocalToGlobalMapping *); 1927e99dc12SLawrence Mitchell PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetFromOptions(ISLocalToGlobalMapping); 193413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetUp(ISLocalToGlobalMapping); 194014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingView(ISLocalToGlobalMapping, PetscViewer); 195fe2efc57SMark PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingViewFromOptions(ISLocalToGlobalMapping, PetscObject, const char[]); 196662df134SStefano Zampini 197014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingDestroy(ISLocalToGlobalMapping *); 19804a59952SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApply(ISLocalToGlobalMapping, PetscInt, const PetscInt[], PetscInt[]); 19945b6f7e9SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApplyBlock(ISLocalToGlobalMapping, PetscInt, const PetscInt[], PetscInt[]); 200014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApplyIS(ISLocalToGlobalMapping, IS, IS *); 201413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApply(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, PetscInt, const PetscInt[], PetscInt *, PetscInt[]); 202413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApplyBlock(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, PetscInt, const PetscInt[], PetscInt *, PetscInt[]); 203413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApplyIS(ISLocalToGlobalMapping, ISGlobalToLocalMappingMode, IS, IS *); 204014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetSize(ISLocalToGlobalMapping, PetscInt *); 2051bd0b88eSStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]); 2061bd0b88eSStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreNodeInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt **[]); 207014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]); 208014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]); 2096a818285SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]); 2106a818285SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreBlockInfo(ISLocalToGlobalMapping, PetscInt *, PetscInt *[], PetscInt *[], PetscInt **[]); 211014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetIndices(ISLocalToGlobalMapping, const PetscInt **); 212014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreIndices(ISLocalToGlobalMapping, const PetscInt **); 21345b6f7e9SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockIndices(ISLocalToGlobalMapping, const PetscInt **); 21445b6f7e9SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreBlockIndices(ISLocalToGlobalMapping, const PetscInt **); 215014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingConcatenate(MPI_Comm, PetscInt, const ISLocalToGlobalMapping[], ISLocalToGlobalMapping *); 21645b6f7e9SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockSize(ISLocalToGlobalMapping, PetscInt *); 21763fa5c83Sstefano_zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetBlockSize(ISLocalToGlobalMapping, PetscInt); 2186658fb44Sstefano_zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingDuplicate(ISLocalToGlobalMapping, ISLocalToGlobalMapping *); 21945b6f7e9SBarry Smith 220b9617806SBarry Smith /*E 221b9617806SBarry Smith ISColoringType - determines if the coloring is for the entire parallel grid/graph/matrix 222b9617806SBarry Smith or for just the local ghosted portion 223b9617806SBarry Smith 22416a05f60SBarry Smith Values: 22516a05f60SBarry Smith + `IS_COLORING_GLOBAL` - does not include the colors for ghost points, this is used when the function 22616a05f60SBarry Smith is called synchronously in parallel. This requires generating a "parallel coloring". 22716a05f60SBarry Smith - `IS_COLORING_LOCAL` - includes colors for ghost points, this is used when the function can be called 22816a05f60SBarry Smith separately on individual processes with the ghost points already filled in. Does not 22916a05f60SBarry Smith require a "parallel coloring", rather each process colors its local + ghost part. 23016a05f60SBarry Smith Using this can result in much less parallel communication. Currently only works 23116a05f60SBarry Smith with `DMDA` and if you call `MatFDColoringSetFunction()` with the local function. 23216a05f60SBarry Smith 233b9617806SBarry Smith Level: beginner 234b9617806SBarry Smith 23516a05f60SBarry Smith .seealso: `ISColoring`, `ISColoringSetType()`, `ISColoringGetType()`, `DMCreateColoring()` 236b9617806SBarry Smith E*/ 2379371c9d4SSatish Balay typedef enum { 2389371c9d4SSatish Balay IS_COLORING_GLOBAL, 2399371c9d4SSatish Balay IS_COLORING_LOCAL 2409371c9d4SSatish Balay } ISColoringType; 2416a6fc655SJed Brown PETSC_EXTERN const char *const ISColoringTypes[]; 242569ea7c4SPierre Jolivet typedef unsigned PETSC_IS_COLORING_VALUE_TYPE ISColoringValue; 243569ea7c4SPierre Jolivet #define IS_COLORING_MAX PETSC_IS_COLORING_MAX 244569ea7c4SPierre Jolivet #define MPIU_COLORING_VALUE PETSC_MPIU_IS_COLORING_VALUE_TYPE 245014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISAllGatherColors(MPI_Comm, PetscInt, ISColoringValue *, PetscInt *, ISColoringValue *[]); 246dde82324SBarry Smith 247aaf3ff59SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISColoringCreate(MPI_Comm, PetscInt, PetscInt, const ISColoringValue[], PetscCopyMode, ISColoring *); 248014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISColoringDestroy(ISColoring *); 249014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISColoringView(ISColoring, PetscViewer); 2508aec7d55SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringViewFromOptions(ISColoring, PetscObject, const char[]); 251071fcb05SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringGetIS(ISColoring, PetscCopyMode, PetscInt *, IS *[]); 252071fcb05SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringRestoreIS(ISColoring, PetscCopyMode, IS *[]); 25349b734d2SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringReference(ISColoring); 25449b734d2SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringSetType(ISColoring, ISColoringType); 255bdaf1daeSBarry Smith PETSC_EXTERN PetscErrorCode ISColoringGetType(ISColoring, ISColoringType *); 256bdaf1daeSBarry Smith PETSC_EXTERN PetscErrorCode ISColoringGetColors(ISColoring, PetscInt *, PetscInt *, const ISColoringValue **); 2573a7fca6bSBarry Smith 25894f0491fSFande Kong PETSC_EXTERN PetscErrorCode ISBuildTwoSided(IS, IS, IS *); 259014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISPartitioningToNumbering(IS, IS *); 260014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISPartitioningCount(IS, PetscInt, PetscInt[]); 261dbef8a1cSBarry Smith 262014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISCompressIndicesGeneral(PetscInt, PetscInt, PetscInt, PetscInt, const IS[], IS[]); 263*edd03b47SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION(3, 19, 0, "ISCompressIndicesGeneral()", ) static inline PetscErrorCode ISCompressIndicesSorted(PetscInt n, PetscInt bs, PetscInt imax, const IS is_in[], IS is_out[]) 264e37d522bSPierre Jolivet { 265e37d522bSPierre Jolivet return ISCompressIndicesGeneral(n, bs, n, imax, is_in, is_out); 266e37d522bSPierre Jolivet } 267014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISExpandIndicesGeneral(PetscInt, PetscInt, PetscInt, PetscInt, const IS[], IS[]); 268d9489beaSHong Zhang 26969ce434fSBarry Smith struct _n_PetscLayout { 27069ce434fSBarry Smith MPI_Comm comm; 27138a25198SStefano Zampini PetscMPIInt size; 27269ce434fSBarry Smith PetscInt n, N; /* local, global vector size */ 27369ce434fSBarry Smith PetscInt rstart, rend; /* local start, local end + 1 */ 27469ce434fSBarry Smith PetscInt *range; /* the offset of each processor */ 2759621ec18SVaclav Hapla PetscBool range_alloc; /* should range be freed in Destroy? */ 27633d57670SJed Brown PetscInt bs; /* number of elements in each block (generally for multi-component 27733d57670SJed Brown * problems). Defaults to -1 and can be arbitrarily lazy so always use 27833d57670SJed Brown * PetscAbs(map->bs) when accessing directly and expecting result to be 27933d57670SJed Brown * positive. Do NOT multiply above numbers by bs */ 2802a7a6963SBarry Smith PetscInt refcnt; /* MPI Vecs obtained with VecDuplicate() and from MatCreateVecs() reuse map of input object */ 28169ce434fSBarry Smith ISLocalToGlobalMapping mapping; /* mapping used in Vec/MatSetValuesLocal() */ 282ca5434daSLawrence Mitchell PetscBool setupcalled; /* Forbid setup more than once */ 283ca5434daSLawrence Mitchell PetscInt oldn, oldN; /* Checking if setup is allowed */ 284ca5434daSLawrence Mitchell PetscInt oldbs; /* And again */ 28569ce434fSBarry Smith }; 28669ce434fSBarry Smith 2877e3c27c9SBarry Smith /*@C 28869ce434fSBarry Smith PetscLayoutFindOwner - Find the owning rank for a global index 28969ce434fSBarry Smith 29020f4b53cSBarry Smith Not Collective; No Fortran Support 29169ce434fSBarry Smith 29269ce434fSBarry Smith Input Parameters: 29369ce434fSBarry Smith + map - the layout 29469ce434fSBarry Smith - idx - global index to find the owner of 29569ce434fSBarry Smith 29669ce434fSBarry Smith Output Parameter: 29769ce434fSBarry Smith . owner - the owning rank 29869ce434fSBarry Smith 29969ce434fSBarry Smith Level: developer 30069ce434fSBarry Smith 30116a05f60SBarry Smith .seealso: `PetscLayout`, `PetscLayoutFindOwnerIndex()` 30269ce434fSBarry Smith @*/ 303d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscLayoutFindOwner(PetscLayout map, PetscInt idx, PetscMPIInt *owner) 304d71ae5a4SJacob Faibussowitsch { 30569ce434fSBarry Smith PetscMPIInt lo = 0, hi, t; 30669ce434fSBarry Smith 30769ce434fSBarry Smith PetscFunctionBegin; 30869ce434fSBarry Smith *owner = -1; /* GCC erroneously issues warning about possibly uninitialized use when error condition */ 30938a25198SStefano Zampini #if defined(PETSC_USE_DEBUG) 3102c71b3e2SJacob Faibussowitsch PetscCheck((map->n >= 0) && (map->N >= 0) && (map->range), PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscLayoutSetUp() must be called first"); 3112c71b3e2SJacob Faibussowitsch PetscCheck(idx >= 0 && idx <= map->N, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Index %" PetscInt_FMT " is out of range", idx); 31238a25198SStefano Zampini #endif 31338a25198SStefano Zampini hi = map->size; 31469ce434fSBarry Smith while (hi - lo > 1) { 31569ce434fSBarry Smith t = lo + (hi - lo) / 2; 31669ce434fSBarry Smith if (idx < map->range[t]) hi = t; 31769ce434fSBarry Smith else lo = t; 31869ce434fSBarry Smith } 31969ce434fSBarry Smith *owner = lo; 3203ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 32169ce434fSBarry Smith } 32269ce434fSBarry Smith 32369ce434fSBarry Smith /*@C 32416a05f60SBarry Smith PetscLayoutFindOwnerIndex - Find the owning MPI rank and the local index on that rank for a global index 32569ce434fSBarry Smith 32620f4b53cSBarry Smith Not Collective; No Fortran Support 32769ce434fSBarry Smith 32869ce434fSBarry Smith Input Parameters: 32969ce434fSBarry Smith + map - the layout 33069ce434fSBarry Smith - idx - global index to find the owner of 33169ce434fSBarry Smith 332d8d19677SJose E. Roman Output Parameters: 33369ce434fSBarry Smith + owner - the owning rank 33416a05f60SBarry Smith - lidx - local index used by the owner for `idx` 33569ce434fSBarry Smith 33669ce434fSBarry Smith Level: developer 33769ce434fSBarry Smith 33816a05f60SBarry Smith .seealso: `PetscLayout`, `PetscLayoutFindOwner()` 33969ce434fSBarry Smith @*/ 340d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscLayoutFindOwnerIndex(PetscLayout map, PetscInt idx, PetscMPIInt *owner, PetscInt *lidx) 341d71ae5a4SJacob Faibussowitsch { 34269ce434fSBarry Smith PetscMPIInt lo = 0, hi, t; 34369ce434fSBarry Smith 34469ce434fSBarry Smith PetscFunctionBegin; 34538a25198SStefano Zampini #if defined(PETSC_USE_DEBUG) 3462c71b3e2SJacob Faibussowitsch PetscCheck((map->n >= 0) && (map->N >= 0) && (map->range), PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscLayoutSetUp() must be called first"); 3472c71b3e2SJacob Faibussowitsch PetscCheck(idx >= 0 && idx <= map->N, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Index %" PetscInt_FMT " is out of range", idx); 34838a25198SStefano Zampini #endif 34938a25198SStefano Zampini hi = map->size; 35069ce434fSBarry Smith while (hi - lo > 1) { 35169ce434fSBarry Smith t = lo + (hi - lo) / 2; 35269ce434fSBarry Smith if (idx < map->range[t]) hi = t; 35369ce434fSBarry Smith else lo = t; 35469ce434fSBarry Smith } 35504799504SMark Adams if (owner) *owner = lo; 35604799504SMark Adams if (lidx) *lidx = idx - map->range[lo]; 3573ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 35869ce434fSBarry Smith } 3599e03d832SJed Brown 36001e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutCreate(MPI_Comm, PetscLayout *); 3619621ec18SVaclav Hapla PETSC_EXTERN PetscErrorCode PetscLayoutCreateFromSizes(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscLayout *); 3629621ec18SVaclav Hapla PETSC_EXTERN PetscErrorCode PetscLayoutCreateFromRanges(MPI_Comm, const PetscInt[], PetscCopyMode, PetscInt, PetscLayout *); 36301e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetUp(PetscLayout); 36401e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutDestroy(PetscLayout *); 36501e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutDuplicate(PetscLayout, PetscLayout *); 36601e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutReference(PetscLayout, PetscLayout *); 36701e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetLocalSize(PetscLayout, PetscInt); 36801e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetLocalSize(PetscLayout, PetscInt *); 36901e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetSize(PetscLayout, PetscInt); 37001e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetSize(PetscLayout, PetscInt *); 37101e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetBlockSize(PetscLayout, PetscInt); 37201e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetBlockSize(PetscLayout, PetscInt *); 37301e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetRange(PetscLayout, PetscInt *, PetscInt *); 37401e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetRanges(PetscLayout, const PetscInt *[]); 375f92d6284SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLayoutCompare(PetscLayout, PetscLayout, PetscBool *); 37601e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetISLocalToGlobalMapping(PetscLayout, ISLocalToGlobalMapping); 37707acc2aeSBarry Smith PETSC_EXTERN PetscErrorCode PetscLayoutMapLocal(PetscLayout, PetscInt, const PetscInt[], PetscInt *, PetscInt **, PetscInt **); 37801e13f73SMatthew G. Knepley 379ce605777SToby Isaac PETSC_EXTERN PetscErrorCode PetscParallelSortInt(PetscLayout, PetscLayout, PetscInt *, PetscInt *); 380ce605777SToby Isaac 381ce605777SToby Isaac PETSC_EXTERN PetscErrorCode ISGetLayout(IS, PetscLayout *); 3824e1d6e84SVaclav Hapla PETSC_EXTERN PetscErrorCode ISSetLayout(IS, PetscLayout); 383ce605777SToby Isaac 384a2ce50c7SBarry Smith #endif 385