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 */ 116497c311SBarry 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*73bc78fdSLisandro Dalcin static inline PetscByte PetscBTMask_Internal(PetscCount index) 17d71ae5a4SJacob Faibussowitsch { 18*73bc78fdSLisandro Dalcin return (PetscByte)(1 << index % PETSC_BITS_PER_BYTE); 19652f91beSJacob Faibussowitsch } 20652f91beSJacob Faibussowitsch 216497c311SBarry 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 266497c311SBarry 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 366497c311SBarry Smith static inline PetscErrorCode PetscBTCreate(PetscCount m, PetscBT *array) 37d71ae5a4SJacob Faibussowitsch { 38652f91beSJacob Faibussowitsch return PetscCalloc1(PetscBTLength(m), array); 3953b8de81SBarry Smith } 4053b8de81SBarry Smith 419d633c0cSMatthew G. Knepley static inline PetscErrorCode PetscBTCopy(PetscBT dest, PetscCount m, PetscBT source) 429d633c0cSMatthew G. Knepley { 439d633c0cSMatthew G. Knepley return PetscArraycpy(dest, source, PetscBTLength(m)); 449d633c0cSMatthew G. Knepley } 459d633c0cSMatthew G. Knepley 46*73bc78fdSLisandro Dalcin static inline PetscByte PetscBTLookup(PetscBT array, PetscCount index) 47d71ae5a4SJacob Faibussowitsch { 48652f91beSJacob Faibussowitsch return array[PetscBTIndex_Internal(index)] & PetscBTMask_Internal(index); 4953b8de81SBarry Smith } 5053b8de81SBarry Smith 516497c311SBarry Smith static inline PetscErrorCode PetscBTSet(PetscBT array, PetscCount index) 52d71ae5a4SJacob Faibussowitsch { 53652f91beSJacob Faibussowitsch PetscFunctionBegin; 54652f91beSJacob Faibussowitsch array[PetscBTIndex_Internal(index)] |= PetscBTMask_Internal(index); 553ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5653b8de81SBarry Smith } 5753b8de81SBarry Smith 586497c311SBarry Smith static inline PetscErrorCode PetscBTNegate(PetscBT array, PetscCount index) 59d71ae5a4SJacob Faibussowitsch { 60652f91beSJacob Faibussowitsch PetscFunctionBegin; 61652f91beSJacob Faibussowitsch array[PetscBTIndex_Internal(index)] ^= PetscBTMask_Internal(index); 623ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6331b932fcSLisandro Dalcin } 6431b932fcSLisandro Dalcin 656497c311SBarry Smith static inline PetscErrorCode PetscBTClear(PetscBT array, PetscCount index) 66d71ae5a4SJacob Faibussowitsch { 67652f91beSJacob Faibussowitsch PetscFunctionBegin; 68*73bc78fdSLisandro Dalcin array[PetscBTIndex_Internal(index)] &= (PetscByte)~PetscBTMask_Internal(index); 693ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 7053b8de81SBarry Smith } 7153b8de81SBarry Smith 72*73bc78fdSLisandro Dalcin static inline PetscByte PetscBTLookupSet(PetscBT array, PetscCount index) 73d71ae5a4SJacob Faibussowitsch { 74*73bc78fdSLisandro Dalcin const PetscByte ret = PetscBTLookup(array, index); 759566063dSJacob Faibussowitsch PetscCallContinue(PetscBTSet(array, index)); 76652f91beSJacob Faibussowitsch return ret; 77652f91beSJacob Faibussowitsch } 78652f91beSJacob Faibussowitsch 79*73bc78fdSLisandro Dalcin static inline PetscByte PetscBTLookupClear(PetscBT array, PetscCount index) 80d71ae5a4SJacob Faibussowitsch { 81*73bc78fdSLisandro Dalcin const PetscByte ret = PetscBTLookup(array, index); 829566063dSJacob Faibussowitsch PetscCallContinue(PetscBTClear(array, index)); 83652f91beSJacob Faibussowitsch return ret; 84652f91beSJacob Faibussowitsch } 85652f91beSJacob Faibussowitsch 869844c891SJames Wright static inline PetscCount PetscBTCountSet(PetscBT array, PetscCount m) 879844c891SJames Wright { 889844c891SJames Wright PetscCount cnt = 0; 899844c891SJames Wright for (size_t j = 0; j < PetscBTLength(m); j++) { 90*73bc78fdSLisandro Dalcin PetscByte byte = array[j]; 91*73bc78fdSLisandro Dalcin const PetscByte c1 = 0x55; 92*73bc78fdSLisandro Dalcin const PetscByte c2 = 0x33; 93*73bc78fdSLisandro Dalcin const PetscByte c4 = 0x0F; 949844c891SJames Wright 959844c891SJames Wright byte -= (byte >> 1) & c1; 969844c891SJames Wright byte = ((byte >> 2) & c2) + (byte & c2); 979844c891SJames Wright cnt += (byte + (byte >> 4)) & c4; 989844c891SJames Wright } 999844c891SJames Wright return cnt; 1009844c891SJames Wright } 1019844c891SJames Wright 1026497c311SBarry Smith PETSC_EXTERN PetscErrorCode PetscBTView(PetscCount, const PetscBT, PetscViewer); 103