1652f91beSJacob Faibussowitsch #ifndef PETSCBT_H 226bd1501SBarry Smith #define PETSCBT_H 319fee000SSatish Balay 4*778ae69aSToby Isaac #include <petscsystypes.h> 5*778ae69aSToby Isaac #include <petscviewertypes.h> 6*778ae69aSToby Isaac #include <petscstring.h> 76420c192SJed Brown 8ac09b921SBarry Smith /* SUBMANSEC = Sys */ 9ac09b921SBarry Smith 10652f91beSJacob Faibussowitsch /* convert an index i to an index suitable for indexing a PetscBT, such that 11652f91beSJacob Faibussowitsch * bt[PetscBTIndex(i)] returns the i'th value of the bt */ 12d71ae5a4SJacob Faibussowitsch static inline size_t PetscBTIndex_Internal(PetscInt index) 13d71ae5a4SJacob Faibussowitsch { 14c133393eSBarry Smith return (size_t)index / PETSC_BITS_PER_BYTE; 15652f91beSJacob Faibussowitsch } 16652f91beSJacob Faibussowitsch 17d71ae5a4SJacob Faibussowitsch static inline char PetscBTMask_Internal(PetscInt index) 18d71ae5a4SJacob Faibussowitsch { 19d00ed860SLisandro Dalcin return (char)(1 << index % PETSC_BITS_PER_BYTE); 20652f91beSJacob Faibussowitsch } 21652f91beSJacob Faibussowitsch 22d71ae5a4SJacob Faibussowitsch static inline size_t PetscBTLength(PetscInt m) 23d71ae5a4SJacob Faibussowitsch { 24c133393eSBarry Smith return (size_t)m / PETSC_BITS_PER_BYTE + 1; 2553b8de81SBarry Smith } 2682502324SSatish Balay 27d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscBTMemzero(PetscInt m, PetscBT array) 28d71ae5a4SJacob Faibussowitsch { 29652f91beSJacob Faibussowitsch return PetscArrayzero(array, PetscBTLength(m)); 3053b8de81SBarry Smith } 313b71518fSBarry Smith 32d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscBTDestroy(PetscBT *array) 33d71ae5a4SJacob Faibussowitsch { 343ba16761SJacob Faibussowitsch return (*array) ? PetscFree(*array) : PETSC_SUCCESS; 3553b8de81SBarry Smith } 36ca71c51bSBarry Smith 37d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscBTCreate(PetscInt m, PetscBT *array) 38d71ae5a4SJacob Faibussowitsch { 39652f91beSJacob Faibussowitsch return PetscCalloc1(PetscBTLength(m), array); 4053b8de81SBarry Smith } 4153b8de81SBarry Smith 42d71ae5a4SJacob Faibussowitsch static inline char PetscBTLookup(PetscBT array, PetscInt index) 43d71ae5a4SJacob Faibussowitsch { 44652f91beSJacob Faibussowitsch return array[PetscBTIndex_Internal(index)] & PetscBTMask_Internal(index); 4553b8de81SBarry Smith } 4653b8de81SBarry Smith 47d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscBTSet(PetscBT array, PetscInt index) 48d71ae5a4SJacob Faibussowitsch { 49652f91beSJacob Faibussowitsch PetscFunctionBegin; 50652f91beSJacob Faibussowitsch array[PetscBTIndex_Internal(index)] |= PetscBTMask_Internal(index); 513ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5253b8de81SBarry Smith } 5353b8de81SBarry Smith 54d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscBTNegate(PetscBT array, PetscInt index) 55d71ae5a4SJacob Faibussowitsch { 56652f91beSJacob Faibussowitsch PetscFunctionBegin; 57652f91beSJacob Faibussowitsch array[PetscBTIndex_Internal(index)] ^= PetscBTMask_Internal(index); 583ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5931b932fcSLisandro Dalcin } 6031b932fcSLisandro Dalcin 61d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscBTClear(PetscBT array, PetscInt index) 62d71ae5a4SJacob Faibussowitsch { 63652f91beSJacob Faibussowitsch PetscFunctionBegin; 64090438c4SLisandro Dalcin array[PetscBTIndex_Internal(index)] &= (char)~PetscBTMask_Internal(index); 653ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6653b8de81SBarry Smith } 6753b8de81SBarry Smith 68d71ae5a4SJacob Faibussowitsch static inline char PetscBTLookupSet(PetscBT array, PetscInt index) 69d71ae5a4SJacob Faibussowitsch { 70652f91beSJacob Faibussowitsch const char ret = PetscBTLookup(array, index); 719566063dSJacob Faibussowitsch PetscCallContinue(PetscBTSet(array, index)); 72652f91beSJacob Faibussowitsch return ret; 73652f91beSJacob Faibussowitsch } 74652f91beSJacob Faibussowitsch 75d71ae5a4SJacob Faibussowitsch static inline char PetscBTLookupClear(PetscBT array, PetscInt index) 76d71ae5a4SJacob Faibussowitsch { 77652f91beSJacob Faibussowitsch const char ret = PetscBTLookup(array, index); 789566063dSJacob Faibussowitsch PetscCallContinue(PetscBTClear(array, index)); 79652f91beSJacob Faibussowitsch return ret; 80652f91beSJacob Faibussowitsch } 81652f91beSJacob Faibussowitsch 82*778ae69aSToby Isaac PETSC_EXTERN PetscErrorCode PetscBTView(PetscInt, const PetscBT, PetscViewer); 83*778ae69aSToby Isaac 84652f91beSJacob Faibussowitsch #endif /* PETSCBT_H */ 85