1a4963045SJacob Faibussowitsch #pragma once 219fee000SSatish Balay 3778ae69aSToby Isaac #include <petscsystypes.h> 4778ae69aSToby Isaac #include <petscviewertypes.h> 5778ae69aSToby Isaac #include <petscstring.h> 66420c192SJed Brown 7ac09b921SBarry Smith /* SUBMANSEC = Sys */ 8ac09b921SBarry Smith 9652f91beSJacob Faibussowitsch /* convert an index i to an index suitable for indexing a PetscBT, such that 10652f91beSJacob Faibussowitsch * bt[PetscBTIndex(i)] returns the i'th value of the bt */ 11*6497c311SBarry Smith static inline size_t PetscBTIndex_Internal(PetscCount index) 12d71ae5a4SJacob Faibussowitsch { 13c133393eSBarry Smith return (size_t)index / PETSC_BITS_PER_BYTE; 14652f91beSJacob Faibussowitsch } 15652f91beSJacob Faibussowitsch 16*6497c311SBarry Smith static inline char PetscBTMask_Internal(PetscCount index) 17d71ae5a4SJacob Faibussowitsch { 18d00ed860SLisandro Dalcin return (char)(1 << index % PETSC_BITS_PER_BYTE); 19652f91beSJacob Faibussowitsch } 20652f91beSJacob Faibussowitsch 21*6497c311SBarry Smith static inline size_t PetscBTLength(PetscCount m) 22d71ae5a4SJacob Faibussowitsch { 23c133393eSBarry Smith return (size_t)m / PETSC_BITS_PER_BYTE + 1; 2453b8de81SBarry Smith } 2582502324SSatish Balay 26*6497c311SBarry Smith static inline PetscErrorCode PetscBTMemzero(PetscCount m, PetscBT array) 27d71ae5a4SJacob Faibussowitsch { 28652f91beSJacob Faibussowitsch return PetscArrayzero(array, PetscBTLength(m)); 2953b8de81SBarry Smith } 303b71518fSBarry Smith 31d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscBTDestroy(PetscBT *array) 32d71ae5a4SJacob Faibussowitsch { 333ba16761SJacob Faibussowitsch return (*array) ? PetscFree(*array) : PETSC_SUCCESS; 3453b8de81SBarry Smith } 35ca71c51bSBarry Smith 36*6497c311SBarry Smith static inline PetscErrorCode PetscBTCreate(PetscCount m, PetscBT *array) 37d71ae5a4SJacob Faibussowitsch { 38652f91beSJacob Faibussowitsch return PetscCalloc1(PetscBTLength(m), array); 3953b8de81SBarry Smith } 4053b8de81SBarry Smith 41*6497c311SBarry Smith static inline char PetscBTLookup(PetscBT array, PetscCount index) 42d71ae5a4SJacob Faibussowitsch { 43652f91beSJacob Faibussowitsch return array[PetscBTIndex_Internal(index)] & PetscBTMask_Internal(index); 4453b8de81SBarry Smith } 4553b8de81SBarry Smith 46*6497c311SBarry Smith static inline PetscErrorCode PetscBTSet(PetscBT array, PetscCount index) 47d71ae5a4SJacob Faibussowitsch { 48652f91beSJacob Faibussowitsch PetscFunctionBegin; 49652f91beSJacob Faibussowitsch array[PetscBTIndex_Internal(index)] |= PetscBTMask_Internal(index); 503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5153b8de81SBarry Smith } 5253b8de81SBarry Smith 53*6497c311SBarry Smith static inline PetscErrorCode PetscBTNegate(PetscBT array, PetscCount index) 54d71ae5a4SJacob Faibussowitsch { 55652f91beSJacob Faibussowitsch PetscFunctionBegin; 56652f91beSJacob Faibussowitsch array[PetscBTIndex_Internal(index)] ^= PetscBTMask_Internal(index); 573ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5831b932fcSLisandro Dalcin } 5931b932fcSLisandro Dalcin 60*6497c311SBarry Smith static inline PetscErrorCode PetscBTClear(PetscBT array, PetscCount index) 61d71ae5a4SJacob Faibussowitsch { 62652f91beSJacob Faibussowitsch PetscFunctionBegin; 63090438c4SLisandro Dalcin array[PetscBTIndex_Internal(index)] &= (char)~PetscBTMask_Internal(index); 643ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6553b8de81SBarry Smith } 6653b8de81SBarry Smith 67*6497c311SBarry Smith static inline char PetscBTLookupSet(PetscBT array, PetscCount index) 68d71ae5a4SJacob Faibussowitsch { 69652f91beSJacob Faibussowitsch const char ret = PetscBTLookup(array, index); 709566063dSJacob Faibussowitsch PetscCallContinue(PetscBTSet(array, index)); 71652f91beSJacob Faibussowitsch return ret; 72652f91beSJacob Faibussowitsch } 73652f91beSJacob Faibussowitsch 74*6497c311SBarry Smith static inline char PetscBTLookupClear(PetscBT array, PetscCount index) 75d71ae5a4SJacob Faibussowitsch { 76652f91beSJacob Faibussowitsch const char ret = PetscBTLookup(array, index); 779566063dSJacob Faibussowitsch PetscCallContinue(PetscBTClear(array, index)); 78652f91beSJacob Faibussowitsch return ret; 79652f91beSJacob Faibussowitsch } 80652f91beSJacob Faibussowitsch 81*6497c311SBarry Smith PETSC_EXTERN PetscErrorCode PetscBTView(PetscCount, const PetscBT, PetscViewer); 82