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 */ 526bd1501SBarry Smith #if !defined(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 2327bdab1eSBarry Smith Level: beginner 2427bdab1eSBarry Smith 25db781477SPatrick Sanan .seealso: `ISSetType()`, `IS`, `ISCreate()`, `ISRegister()` 2676bdecfbSBarry Smith J*/ 2719fd82e9SBarry Smith typedef const char* ISType; 2827bdab1eSBarry Smith #define ISGENERAL "general" 2927bdab1eSBarry Smith #define ISSTRIDE "stride" 3027bdab1eSBarry Smith #define ISBLOCK "block" 3127bdab1eSBarry Smith 3227bdab1eSBarry Smith /* Dynamic creation and loading functions */ 33140e18c1SBarry Smith PETSC_EXTERN PetscFunctionList ISList; 3419fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode ISSetType(IS,ISType); 3519fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode ISGetType(IS,ISType*); 36bdf89e91SBarry Smith PETSC_EXTERN PetscErrorCode ISRegister(const char[],PetscErrorCode (*)(IS)); 37014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISCreate(MPI_Comm,IS*); 3827bdab1eSBarry Smith 39014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISDestroy(IS*); 40014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSetPermutation(IS); 41014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISPermutation(IS,PetscBool*); 42014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSetIdentity(IS); 43014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISIdentity(IS,PetscBool*); 44014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISContiguousLocal(IS,PetscInt,PetscInt,PetscInt*,PetscBool*); 4508480c60SBarry Smith 462a1da528SToby Isaac /*E 472a1da528SToby Isaac ISInfo - Info that may either be computed or set as known for an index set 482a1da528SToby Isaac 492a1da528SToby Isaac Level: beginner 502a1da528SToby Isaac 512a1da528SToby Isaac Developer Notes: 522a1da528SToby Isaac Entries that are negative need not be called collectively by all processes. 532a1da528SToby Isaac 54*87497f52SBarry Smith Any additions/changes here MUST also be made in include/petsc/finclude/petscis.h 55*87497f52SBarry Smith 56*87497f52SBarry Smith Any additions/changes here must also be made in src/vec/vec/interface/dlregisvec.c in ISInfos[] 57*87497f52SBarry Smith 58db781477SPatrick Sanan .seealso: `ISSetInfo()` 592a1da528SToby Isaac E*/ 602a1da528SToby Isaac typedef enum {IS_INFO_MIN = -1, 612a1da528SToby Isaac IS_SORTED = 0, 622a1da528SToby Isaac IS_UNIQUE = 1, 632a1da528SToby Isaac IS_PERMUTATION = 2, 642a1da528SToby Isaac IS_INTERVAL = 3, 652a1da528SToby Isaac IS_IDENTITY = 4, 662a1da528SToby Isaac IS_INFO_MAX = 5} ISInfo; 672a1da528SToby Isaac 682a1da528SToby Isaac typedef enum {IS_LOCAL, IS_GLOBAL} ISInfoType; 692a1da528SToby Isaac 702a1da528SToby Isaac PETSC_EXTERN PetscErrorCode ISSetInfo(IS,ISInfo,ISInfoType,PetscBool,PetscBool); 71657dc977SToby Isaac PETSC_EXTERN PetscErrorCode ISGetInfo(IS,ISInfo,ISInfoType,PetscBool,PetscBool*); 722a1da528SToby Isaac PETSC_EXTERN PetscErrorCode ISClearInfoCache(IS,PetscBool); 73014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetIndices(IS,const PetscInt*[]); 74014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISRestoreIndices(IS,const PetscInt*[]); 75014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetTotalIndices(IS,const PetscInt*[]); 76014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISRestoreTotalIndices(IS,const PetscInt*[]); 77014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetNonlocalIndices(IS,const PetscInt*[]); 78014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISRestoreNonlocalIndices(IS,const PetscInt*[]); 79d60670a5SStefano Zampini PETSC_EXTERN PetscErrorCode ISGetNonlocalIS(IS,IS*); 80d60670a5SStefano Zampini PETSC_EXTERN PetscErrorCode ISRestoreNonlocalIS(IS,IS*); 81014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetSize(IS,PetscInt*); 82014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetLocalSize(IS,PetscInt*); 83014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISInvertPermutation(IS,PetscInt,IS*); 84014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISView(IS,PetscViewer); 85fe2efc57SMark PETSC_EXTERN PetscErrorCode ISViewFromOptions(IS,PetscObject,const char[]); 86235f7792SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISLoad(IS,PetscViewer); 87014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISEqual(IS,IS,PetscBool*); 88e8386968SVaclav Hapla PETSC_EXTERN PetscErrorCode ISEqualUnsorted(IS,IS,PetscBool *); 89014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSort(IS); 90b080c0f9SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISSortRemoveDups(IS); 91014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSorted(IS,PetscBool*); 92014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISDifference(IS,IS,IS*); 93014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSum(IS,IS,IS*); 94014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISExpand(IS,IS,IS*); 953daafeecSToby Isaac PETSC_EXTERN PetscErrorCode ISIntersect(IS,IS,IS*); 96132da990SBarry Smith PETSC_EXTERN PetscErrorCode ISGetMinMax(IS,PetscInt*,PetscInt*); 97612dd529SBarry Smith 98c3c3c9f4SToby Isaac PETSC_EXTERN PetscErrorCode ISLocate(IS,PetscInt,PetscInt*); 999305a4c7SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISGetPointRange(IS,PetscInt*,PetscInt*,const PetscInt**); 1009305a4c7SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISRestorePointRange(IS,PetscInt*,PetscInt*,const PetscInt**); 1019305a4c7SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISGetPointSubrange(IS,PetscInt,PetscInt,const PetscInt*); 102c3c3c9f4SToby Isaac 103014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISGetBlockSize(IS,PetscInt*); 104014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISSetBlockSize(IS,PetscInt); 105c16cb8f2SBarry Smith 106014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISToGeneral(IS); 10738f40f24SLois Curfman McInnes 108014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISDuplicate(IS,IS*); 109014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISCopy(IS,IS); 1109fdaf958SVaclav Hapla PETSC_EXTERN PetscErrorCode ISShift(IS,PetscInt,IS); 111014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISAllGather(IS,IS*); 112014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISComplement(IS,PetscInt,PetscInt,IS*); 113014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISConcatenate(MPI_Comm,PetscInt,const IS[],IS*); 114bb74729cSDmitry Karpeev PETSC_EXTERN PetscErrorCode ISListToPair(MPI_Comm,PetscInt,IS[],IS*,IS*); 115bb74729cSDmitry Karpeev PETSC_EXTERN PetscErrorCode ISPairToList(IS,IS,PetscInt*,IS*[]); 116bb74729cSDmitry Karpeev PETSC_EXTERN PetscErrorCode ISEmbed(IS,IS,PetscBool,IS*); 1175ea6c424SDmitry Karpeev PETSC_EXTERN PetscErrorCode ISSortPermutation(IS,PetscBool,IS*); 118014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISOnComm(IS,MPI_Comm,PetscCopyMode,IS*); 1196583bcc1SStefano Zampini PETSC_EXTERN PetscErrorCode ISRenumber(IS,IS,PetscInt*,IS*); 1206c04a3c5SFande Kong PETSC_EXTERN PetscErrorCode ISCreateSubIS(IS,IS,IS*); 121d64ed03dSBarry Smith 12284933e40SVaclav Hapla /* ISGENERAL specific */ 12384933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISCreateGeneral(MPI_Comm,PetscInt,const PetscInt[],PetscCopyMode,IS*); 12484933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISGeneralSetIndices(IS,PetscInt,const PetscInt[],PetscCopyMode); 1259bc6f2f1SVaclav Hapla PETSC_EXTERN PetscErrorCode ISGeneralSetIndicesFromMask(IS,PetscInt,PetscInt,const PetscBool[]); 12653bb9c4cSVaclav Hapla PETSC_EXTERN PetscErrorCode ISGeneralFilter(IS,PetscInt,PetscInt); 12753bb9c4cSVaclav Hapla 12884933e40SVaclav Hapla /* ISBLOCK specific */ 12984933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISCreateBlock(MPI_Comm,PetscInt,PetscInt,const PetscInt[],PetscCopyMode,IS*); 13084933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISBlockSetIndices(IS,PetscInt,PetscInt,const PetscInt[],PetscCopyMode); 13184933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISBlockGetIndices(IS,const PetscInt*[]); 13284933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISBlockRestoreIndices(IS,const PetscInt*[]); 13384933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISBlockGetLocalSize(IS,PetscInt*); 13484933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISBlockGetSize(IS,PetscInt*); 13584933e40SVaclav Hapla 13684933e40SVaclav Hapla /* ISSTRIDE specific */ 13784933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISCreateStride(MPI_Comm,PetscInt,PetscInt,PetscInt,IS*); 13884933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISStrideSetStride(IS,PetscInt,PetscInt,PetscInt); 13984933e40SVaclav Hapla PETSC_EXTERN PetscErrorCode ISStrideGetInfo(IS,PetscInt*,PetscInt*); 14084933e40SVaclav Hapla 14156cd22aeSBarry Smith /* --------------------------------------------------------------------------*/ 142014dd563SJed Brown PETSC_EXTERN PetscClassId IS_LTOGM_CLASSID; 14356cd22aeSBarry Smith 1445c20da3cSBarry Smith /*E 1450040bde1SJunchao Zhang ISGlobalToLocalMappingMode - Indicates mapping behavior if global indices are missing 1465c20da3cSBarry Smith 147*87497f52SBarry Smith `IS_GTOLM_MASK` - missing global indices are masked by mapping them to a local index of -1 148*87497f52SBarry Smith `IS_GTOLM_DROP` - missing global indices are dropped 1495c20da3cSBarry Smith 1505c20da3cSBarry Smith Level: beginner 1515c20da3cSBarry Smith 152db781477SPatrick Sanan .seealso: `ISGlobalToLocalMappingApplyBlock()`, `ISGlobalToLocalMappingApply()` 1535c20da3cSBarry Smith 1545c20da3cSBarry Smith E*/ 155413f72f0SBarry Smith typedef enum {IS_GTOLM_MASK,IS_GTOLM_DROP} ISGlobalToLocalMappingMode; 15690f02eecSBarry Smith 157413f72f0SBarry Smith /*J 158413f72f0SBarry Smith ISLocalToGlobalMappingType - String with the name of a mapping method 159413f72f0SBarry Smith 160413f72f0SBarry Smith Level: beginner 161413f72f0SBarry Smith 162db781477SPatrick Sanan .seealso: `ISLocalToGlobalMappingSetType()`, `ISLocalToGlobalSetFromOptions()` 163413f72f0SBarry Smith J*/ 164413f72f0SBarry Smith typedef const char* ISLocalToGlobalMappingType; 165413f72f0SBarry Smith #define ISLOCALTOGLOBALMAPPINGBASIC "basic" 166413f72f0SBarry Smith #define ISLOCALTOGLOBALMAPPINGHASH "hash" 167413f72f0SBarry Smith 168413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetType(ISLocalToGlobalMapping,ISLocalToGlobalMappingType); 169a0d79125SStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetType(ISLocalToGlobalMapping,ISLocalToGlobalMappingType*); 1701d36bdfdSBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRegister(const char[],PetscErrorCode (*)(ISLocalToGlobalMapping)); 171413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRegisterAll(void); 172f0413b6fSBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreate(MPI_Comm,PetscInt,PetscInt,const PetscInt[],PetscCopyMode,ISLocalToGlobalMapping*); 173014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreateIS(IS,ISLocalToGlobalMapping *); 174014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreateSF(PetscSF,PetscInt,ISLocalToGlobalMapping*); 1757e99dc12SLawrence Mitchell PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetFromOptions(ISLocalToGlobalMapping); 176413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetUp(ISLocalToGlobalMapping); 177014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingView(ISLocalToGlobalMapping,PetscViewer); 178fe2efc57SMark PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingViewFromOptions(ISLocalToGlobalMapping,PetscObject,const char[]); 179662df134SStefano Zampini 180014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingDestroy(ISLocalToGlobalMapping*); 18104a59952SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApply(ISLocalToGlobalMapping,PetscInt,const PetscInt[],PetscInt[]); 18245b6f7e9SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApplyBlock(ISLocalToGlobalMapping,PetscInt,const PetscInt[],PetscInt[]); 183014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApplyIS(ISLocalToGlobalMapping,IS,IS*); 184413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApply(ISLocalToGlobalMapping,ISGlobalToLocalMappingMode,PetscInt,const PetscInt[],PetscInt*,PetscInt[]); 185413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApplyBlock(ISLocalToGlobalMapping,ISGlobalToLocalMappingMode,PetscInt,const PetscInt[],PetscInt*,PetscInt[]); 186413f72f0SBarry Smith PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApplyIS(ISLocalToGlobalMapping,ISGlobalToLocalMappingMode,IS,IS*); 187014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetSize(ISLocalToGlobalMapping,PetscInt*); 1881bd0b88eSStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetNodeInfo(ISLocalToGlobalMapping,PetscInt*,PetscInt*[],PetscInt**[]); 1891bd0b88eSStefano Zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreNodeInfo(ISLocalToGlobalMapping,PetscInt*,PetscInt*[],PetscInt**[]); 190014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetInfo(ISLocalToGlobalMapping,PetscInt*,PetscInt*[],PetscInt*[],PetscInt**[]); 191014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreInfo(ISLocalToGlobalMapping,PetscInt*,PetscInt*[],PetscInt*[],PetscInt**[]); 1926a818285SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockInfo(ISLocalToGlobalMapping,PetscInt*,PetscInt*[],PetscInt*[],PetscInt**[]); 1936a818285SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreBlockInfo(ISLocalToGlobalMapping,PetscInt*,PetscInt*[],PetscInt*[],PetscInt**[]); 194014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetIndices(ISLocalToGlobalMapping,const PetscInt**); 195014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreIndices(ISLocalToGlobalMapping,const PetscInt**); 19645b6f7e9SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockIndices(ISLocalToGlobalMapping,const PetscInt**); 19745b6f7e9SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreBlockIndices(ISLocalToGlobalMapping,const PetscInt**); 198014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingConcatenate(MPI_Comm,PetscInt,const ISLocalToGlobalMapping[],ISLocalToGlobalMapping*); 19945b6f7e9SBarry Smith PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetBlockSize(ISLocalToGlobalMapping,PetscInt*); 20063fa5c83Sstefano_zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingSetBlockSize(ISLocalToGlobalMapping,PetscInt); 2016658fb44Sstefano_zampini PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingDuplicate(ISLocalToGlobalMapping,ISLocalToGlobalMapping*); 20245b6f7e9SBarry Smith 20356cd22aeSBarry Smith /* --------------------------------------------------------------------------*/ 204b9617806SBarry Smith /*E 205b9617806SBarry Smith ISColoringType - determines if the coloring is for the entire parallel grid/graph/matrix 206b9617806SBarry Smith or for just the local ghosted portion 207b9617806SBarry Smith 208b9617806SBarry Smith Level: beginner 209b9617806SBarry Smith 210*87497f52SBarry Smith $ `IS_COLORING_GLOBAL` - does not include the colors for ghost points, this is used when the function 2118ee2e534SBarry Smith $ is called synchronously in parallel. This requires generating a "parallel coloring". 212*87497f52SBarry Smith $ `IS_COLORING_LOCAL` - includes colors for ghost points, this is used when the function can be called 213bebe2cf6SSatish Balay $ separately on individual processes with the ghost points already filled in. Does not 2148ee2e534SBarry Smith $ require a "parallel coloring", rather each process colors its local + ghost part. 2155bdb020cSBarry Smith $ Using this can result in much less parallel communication. Currently only works 2165bdb020cSBarry Smith $ with DMDA and if you call MatFDColoringSetFunction() with the local function. 21773d7d85fSBarry Smith 218db781477SPatrick Sanan .seealso: `DMCreateColoring()` 219b9617806SBarry Smith E*/ 2205bdb020cSBarry Smith typedef enum {IS_COLORING_GLOBAL,IS_COLORING_LOCAL} ISColoringType; 2216a6fc655SJed Brown PETSC_EXTERN const char *const ISColoringTypes[]; 222569ea7c4SPierre Jolivet typedef unsigned PETSC_IS_COLORING_VALUE_TYPE ISColoringValue; 223569ea7c4SPierre Jolivet #define IS_COLORING_MAX PETSC_IS_COLORING_MAX 224569ea7c4SPierre Jolivet #define MPIU_COLORING_VALUE PETSC_MPIU_IS_COLORING_VALUE_TYPE 225014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISAllGatherColors(MPI_Comm,PetscInt,ISColoringValue*,PetscInt*,ISColoringValue*[]); 226dde82324SBarry Smith 227aaf3ff59SMatthew G. Knepley PETSC_EXTERN PetscErrorCode ISColoringCreate(MPI_Comm,PetscInt,PetscInt,const ISColoringValue[],PetscCopyMode,ISColoring*); 228014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISColoringDestroy(ISColoring*); 229014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISColoringView(ISColoring,PetscViewer); 2308aec7d55SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringViewFromOptions(ISColoring,PetscObject,const char[]); 231071fcb05SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringGetIS(ISColoring,PetscCopyMode,PetscInt*,IS*[]); 232071fcb05SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringRestoreIS(ISColoring,PetscCopyMode,IS*[]); 23349b734d2SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringReference(ISColoring); 23449b734d2SBarry Smith PETSC_EXTERN PetscErrorCode ISColoringSetType(ISColoring,ISColoringType); 235bdaf1daeSBarry Smith PETSC_EXTERN PetscErrorCode ISColoringGetType(ISColoring,ISColoringType*); 236bdaf1daeSBarry Smith PETSC_EXTERN PetscErrorCode ISColoringGetColors(ISColoring,PetscInt*,PetscInt*,const ISColoringValue**); 2373a7fca6bSBarry Smith 238dbef8a1cSBarry Smith /* --------------------------------------------------------------------------*/ 23994f0491fSFande Kong PETSC_EXTERN PetscErrorCode ISBuildTwoSided(IS,IS,IS*); 240014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISPartitioningToNumbering(IS,IS*); 241014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISPartitioningCount(IS,PetscInt,PetscInt[]); 242dbef8a1cSBarry Smith 243014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISCompressIndicesGeneral(PetscInt,PetscInt,PetscInt,PetscInt,const IS[],IS[]); 244014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISCompressIndicesSorted(PetscInt,PetscInt,PetscInt,const IS[],IS[]); 245014dd563SJed Brown PETSC_EXTERN PetscErrorCode ISExpandIndicesGeneral(PetscInt,PetscInt,PetscInt,PetscInt,const IS[],IS[]); 246d9489beaSHong Zhang 24769ce434fSBarry Smith struct _n_PetscLayout{ 24869ce434fSBarry Smith MPI_Comm comm; 24938a25198SStefano Zampini PetscMPIInt size; 25069ce434fSBarry Smith PetscInt n,N; /* local, global vector size */ 25169ce434fSBarry Smith PetscInt rstart,rend; /* local start, local end + 1 */ 25269ce434fSBarry Smith PetscInt *range; /* the offset of each processor */ 2539621ec18SVaclav Hapla PetscBool range_alloc; /* should range be freed in Destroy? */ 25433d57670SJed Brown PetscInt bs; /* number of elements in each block (generally for multi-component 25533d57670SJed Brown * problems). Defaults to -1 and can be arbitrarily lazy so always use 25633d57670SJed Brown * PetscAbs(map->bs) when accessing directly and expecting result to be 25733d57670SJed Brown * positive. Do NOT multiply above numbers by bs */ 2582a7a6963SBarry Smith PetscInt refcnt; /* MPI Vecs obtained with VecDuplicate() and from MatCreateVecs() reuse map of input object */ 25969ce434fSBarry Smith ISLocalToGlobalMapping mapping; /* mapping used in Vec/MatSetValuesLocal() */ 260ca5434daSLawrence Mitchell PetscBool setupcalled; /* Forbid setup more than once */ 261ca5434daSLawrence Mitchell PetscInt oldn,oldN; /* Checking if setup is allowed */ 262ca5434daSLawrence Mitchell PetscInt oldbs; /* And again */ 26369ce434fSBarry Smith }; 26469ce434fSBarry Smith 2657e3c27c9SBarry Smith /*@C 26669ce434fSBarry Smith PetscLayoutFindOwner - Find the owning rank for a global index 26769ce434fSBarry Smith 26869ce434fSBarry Smith Not Collective 26969ce434fSBarry Smith 27069ce434fSBarry Smith Input Parameters: 27169ce434fSBarry Smith + map - the layout 27269ce434fSBarry Smith - idx - global index to find the owner of 27369ce434fSBarry Smith 27469ce434fSBarry Smith Output Parameter: 27569ce434fSBarry Smith . owner - the owning rank 27669ce434fSBarry Smith 27769ce434fSBarry Smith Level: developer 27869ce434fSBarry Smith 279*87497f52SBarry Smith Fortran Note: 28069ce434fSBarry Smith Not available from Fortran 28169ce434fSBarry Smith 282*87497f52SBarry Smith .seealso: `PetscLayoutFindOwnerIndex()` 28369ce434fSBarry Smith @*/ 2849fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscLayoutFindOwner(PetscLayout map,PetscInt idx,PetscMPIInt *owner) 28569ce434fSBarry Smith { 28669ce434fSBarry Smith PetscMPIInt lo = 0,hi,t; 28769ce434fSBarry Smith 28869ce434fSBarry Smith PetscFunctionBegin; 28969ce434fSBarry Smith *owner = -1; /* GCC erroneously issues warning about possibly uninitialized use when error condition */ 29038a25198SStefano Zampini #if defined(PETSC_USE_DEBUG) 2912c71b3e2SJacob Faibussowitsch PetscCheck((map->n >= 0) && (map->N >= 0) && (map->range),PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"PetscLayoutSetUp() must be called first"); 2922c71b3e2SJacob Faibussowitsch PetscCheck(idx >= 0 && idx <= map->N,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Index %" PetscInt_FMT " is out of range",idx); 29338a25198SStefano Zampini #endif 29438a25198SStefano Zampini hi = map->size; 29569ce434fSBarry Smith while (hi - lo > 1) { 29669ce434fSBarry Smith t = lo + (hi - lo) / 2; 29769ce434fSBarry Smith if (idx < map->range[t]) hi = t; 29869ce434fSBarry Smith else lo = t; 29969ce434fSBarry Smith } 30069ce434fSBarry Smith *owner = lo; 30169ce434fSBarry Smith PetscFunctionReturn(0); 30269ce434fSBarry Smith } 30369ce434fSBarry Smith 30469ce434fSBarry Smith /*@C 30569ce434fSBarry Smith PetscLayoutFindOwnerIndex - Find the owning rank and the local index for a global index 30669ce434fSBarry Smith 30769ce434fSBarry Smith Not Collective 30869ce434fSBarry Smith 30969ce434fSBarry Smith Input Parameters: 31069ce434fSBarry Smith + map - the layout 31169ce434fSBarry Smith - idx - global index to find the owner of 31269ce434fSBarry Smith 313d8d19677SJose E. Roman Output Parameters: 31469ce434fSBarry Smith + owner - the owning rank 31569ce434fSBarry Smith - lidx - local index used by the owner for idx 31669ce434fSBarry Smith 31769ce434fSBarry Smith Level: developer 31869ce434fSBarry Smith 319*87497f52SBarry Smith Fortran Note: 32069ce434fSBarry Smith Not available from Fortran 32169ce434fSBarry Smith 322*87497f52SBarry Smith .seealso: `PetscLayoutFindOwner()` 323*87497f52SBarry Smith 32469ce434fSBarry Smith @*/ 3259fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscLayoutFindOwnerIndex(PetscLayout map,PetscInt idx,PetscMPIInt *owner,PetscInt *lidx) 32669ce434fSBarry Smith { 32769ce434fSBarry Smith PetscMPIInt lo = 0,hi,t; 32869ce434fSBarry Smith 32969ce434fSBarry Smith PetscFunctionBegin; 33038a25198SStefano Zampini #if defined(PETSC_USE_DEBUG) 3312c71b3e2SJacob Faibussowitsch PetscCheck((map->n >= 0) && (map->N >= 0) && (map->range),PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"PetscLayoutSetUp() must be called first"); 3322c71b3e2SJacob Faibussowitsch PetscCheck(idx >= 0 && idx <= map->N,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Index %" PetscInt_FMT " is out of range",idx); 33338a25198SStefano Zampini #endif 33438a25198SStefano Zampini hi = map->size; 33569ce434fSBarry Smith while (hi - lo > 1) { 33669ce434fSBarry Smith t = lo + (hi - lo) / 2; 33769ce434fSBarry Smith if (idx < map->range[t]) hi = t; 33869ce434fSBarry Smith else lo = t; 33969ce434fSBarry Smith } 34004799504SMark Adams if (owner) *owner = lo; 34104799504SMark Adams if (lidx) *lidx = idx - map->range[lo]; 34269ce434fSBarry Smith PetscFunctionReturn(0); 34369ce434fSBarry Smith } 3449e03d832SJed Brown 34501e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutCreate(MPI_Comm,PetscLayout*); 3469621ec18SVaclav Hapla PETSC_EXTERN PetscErrorCode PetscLayoutCreateFromSizes(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscLayout*); 3479621ec18SVaclav Hapla PETSC_EXTERN PetscErrorCode PetscLayoutCreateFromRanges(MPI_Comm,const PetscInt[],PetscCopyMode,PetscInt,PetscLayout*); 34801e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetUp(PetscLayout); 34901e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutDestroy(PetscLayout*); 35001e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutDuplicate(PetscLayout,PetscLayout*); 35101e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutReference(PetscLayout,PetscLayout*); 35201e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetLocalSize(PetscLayout,PetscInt); 35301e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetLocalSize(PetscLayout,PetscInt *); 35401e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetSize(PetscLayout,PetscInt); 35501e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetSize(PetscLayout,PetscInt*); 35601e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetBlockSize(PetscLayout,PetscInt); 35701e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetBlockSize(PetscLayout,PetscInt*); 35801e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetRange(PetscLayout,PetscInt*,PetscInt*); 35901e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutGetRanges(PetscLayout,const PetscInt*[]); 360f92d6284SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLayoutCompare(PetscLayout,PetscLayout,PetscBool*); 36101e13f73SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLayoutSetISLocalToGlobalMapping(PetscLayout,ISLocalToGlobalMapping); 36207acc2aeSBarry Smith PETSC_EXTERN PetscErrorCode PetscLayoutMapLocal(PetscLayout,PetscInt,const PetscInt[],PetscInt*,PetscInt**,PetscInt**); 36301e13f73SMatthew G. Knepley 364ce605777SToby Isaac PETSC_EXTERN PetscErrorCode PetscParallelSortInt(PetscLayout, PetscLayout, PetscInt*, PetscInt*); 365ce605777SToby Isaac 366ce605777SToby Isaac PETSC_EXTERN PetscErrorCode ISGetLayout(IS,PetscLayout*); 3674e1d6e84SVaclav Hapla PETSC_EXTERN PetscErrorCode ISSetLayout(IS,PetscLayout); 368ce605777SToby Isaac 369a2ce50c7SBarry Smith #endif 370