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 23*16a05f60SBarry Smith Values: 24*16a05f60SBarry Smith + `ISGENERAL` - the values are stored with an arry of indices and generally have no structure 25*16a05f60SBarry Smith . `ISSTRIDE` - the values have a simple structure of an initial offset and then a step size between values 26*16a05f60SBarry Smith - `ISBLOCK` - values are an array of indices, each representing a block of values 27*16a05f60SBarry Smith 2827bdab1eSBarry Smith Level: beginner 2927bdab1eSBarry Smith 30*16a05f60SBarry Smith .seealso: `ISSetType()`, `IS`, `ISCreateGeneral()`, `ISCreateStride()`, `ISCreateBlock()`, `ISCreate()`, `ISRegister()`, 31*16a05f60SBarry 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 55*16a05f60SBarry 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 64*16a05f60SBarry 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 157*16a05f60SBarry Smith Values: 158*16a05f60SBarry Smith + `IS_GTOLM_MASK` - missing global indices are masked by mapping them to a local index of -1 159*16a05f60SBarry 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 173*16a05f60SBarry Smith Values: 174*16a05f60SBarry Smith + `ISLOCALTOGLOBALMAPPINGBASIC` - a non-memory scalable way of storing `ISLocalToGlobalMapping` that allows applying `ISGlobalToLocalMappingApply()` efficiently 175*16a05f60SBarry Smith - `ISLOCALTOGLOBALMAPPINGHASH` - a memory scalable way of storing `ISLocalToGlobalMapping` that allows applying `ISGlobalToLocalMappingApply()` reasonably efficiently 176*16a05f60SBarry Smith 177413f72f0SBarry Smith Level: beginner 178413f72f0SBarry Smith 179*16a05f60SBarry 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 224*16a05f60SBarry Smith Values: 225*16a05f60SBarry Smith + `IS_COLORING_GLOBAL` - does not include the colors for ghost points, this is used when the function 226*16a05f60SBarry Smith is called synchronously in parallel. This requires generating a "parallel coloring". 227*16a05f60SBarry Smith - `IS_COLORING_LOCAL` - includes colors for ghost points, this is used when the function can be called 228*16a05f60SBarry Smith separately on individual processes with the ghost points already filled in. Does not 229*16a05f60SBarry Smith require a "parallel coloring", rather each process colors its local + ghost part. 230*16a05f60SBarry Smith Using this can result in much less parallel communication. Currently only works 231*16a05f60SBarry Smith with `DMDA` and if you call `MatFDColoringSetFunction()` with the local function. 232*16a05f60SBarry Smith 233b9617806SBarry Smith Level: beginner 234b9617806SBarry Smith 235*16a05f60SBarry 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[]); 263e37d522bSPierre Jolivet PETSC_DEPRECATED_FUNCTION("Use ISCompressIndicesGeneral() (since version 3.19)") 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 301*16a05f60SBarry 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 324*16a05f60SBarry 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 334*16a05f60SBarry Smith - lidx - local index used by the owner for `idx` 33569ce434fSBarry Smith 33669ce434fSBarry Smith Level: developer 33769ce434fSBarry Smith 338*16a05f60SBarry 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