1652f91beSJacob Faibussowitsch #ifndef PETSCBT_H 226bd1501SBarry Smith #define PETSCBT_H 319fee000SSatish Balay 4665c2dedSJed Brown #include <petscviewer.h> 56420c192SJed Brown 6*ac09b921SBarry Smith /* SUBMANSEC = Sys */ 7*ac09b921SBarry Smith 8f621e05eSBarry Smith /*S 9f621e05eSBarry Smith PetscBT - PETSc bitarrays 10f621e05eSBarry Smith 11f621e05eSBarry Smith Level: advanced 1219fee000SSatish Balay 1394bacf5dSBarry Smith PetscBTCreate(m,&bt) - creates a bit array with enough room to hold m values 1494bacf5dSBarry Smith PetscBTDestroy(&bt) - destroys the bit array 156831982aSBarry Smith PetscBTMemzero(m,bt) - zeros the entire bit array (sets all values to false) 166831982aSBarry Smith PetscBTSet(bt,index) - sets a particular entry as true 176831982aSBarry Smith PetscBTClear(bt,index) - sets a particular entry as false 18f1af5d2fSBarry Smith PetscBTLookup(bt,index) - returns the value 19f1af5d2fSBarry Smith PetscBTLookupSet(bt,index) - returns the value and then sets it true 2031b932fcSLisandro Dalcin PetscBTLookupClear(bt,index) - returns the value and then sets it false 216831982aSBarry Smith PetscBTLength(m) - returns number of bytes in array with m bits 226831982aSBarry Smith PetscBTView(m,bt,viewer) - prints all the entries in a bit array 23eec0b4cfSBarry Smith 24652f91beSJacob Faibussowitsch We do not currently check error flags on PetscBTLookup(), PetcBTLookupSet(), PetscBTLength() cause error checking 25652f91beSJacob Faibussowitsch would cost hundreds more cycles then the operation. 266831982aSBarry Smith 27b9617806SBarry Smith S*/ 28521d7252SBarry Smith typedef char* PetscBT; 29ca71c51bSBarry Smith 30652f91beSJacob Faibussowitsch /* convert an index i to an index suitable for indexing a PetscBT, such that 31652f91beSJacob Faibussowitsch * bt[PetscBTIndex(i)] returns the i'th value of the bt */ 32c133393eSBarry Smith static inline size_t PetscBTIndex_Internal(PetscInt index) 33652f91beSJacob Faibussowitsch { 34c133393eSBarry Smith return (size_t)index/PETSC_BITS_PER_BYTE; 35652f91beSJacob Faibussowitsch } 36652f91beSJacob Faibussowitsch 379fbee547SJacob Faibussowitsch static inline char PetscBTMask_Internal(PetscInt index) 38652f91beSJacob Faibussowitsch { 39652f91beSJacob Faibussowitsch return 1 << index%PETSC_BITS_PER_BYTE; 40652f91beSJacob Faibussowitsch } 41652f91beSJacob Faibussowitsch 42c133393eSBarry Smith static inline size_t PetscBTLength(PetscInt m) 4353b8de81SBarry Smith { 44c133393eSBarry Smith return (size_t)m/PETSC_BITS_PER_BYTE+1; 4553b8de81SBarry Smith } 4682502324SSatish Balay 479fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTMemzero(PetscInt m, PetscBT array) 4853b8de81SBarry Smith { 49652f91beSJacob Faibussowitsch return PetscArrayzero(array,PetscBTLength(m)); 5053b8de81SBarry Smith } 513b71518fSBarry Smith 529fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTDestroy(PetscBT *array) 5353b8de81SBarry Smith { 54652f91beSJacob Faibussowitsch return (*array) ? PetscFree(*array) : 0; 5553b8de81SBarry Smith } 56ca71c51bSBarry Smith 579fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTCreate(PetscInt m, PetscBT *array) 5853b8de81SBarry Smith { 59652f91beSJacob Faibussowitsch return PetscCalloc1(PetscBTLength(m),array); 6053b8de81SBarry Smith } 6153b8de81SBarry Smith 629fbee547SJacob Faibussowitsch static inline char PetscBTLookup(PetscBT array, PetscInt index) 6353b8de81SBarry Smith { 64652f91beSJacob Faibussowitsch return array[PetscBTIndex_Internal(index)] & PetscBTMask_Internal(index); 6553b8de81SBarry Smith } 6653b8de81SBarry Smith 679fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTSet(PetscBT array, PetscInt index) 6853b8de81SBarry Smith { 69652f91beSJacob Faibussowitsch PetscFunctionBegin; 70652f91beSJacob Faibussowitsch array[PetscBTIndex_Internal(index)] |= PetscBTMask_Internal(index); 71652f91beSJacob Faibussowitsch PetscFunctionReturn(0); 7253b8de81SBarry Smith } 7353b8de81SBarry Smith 749fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTNegate(PetscBT array, PetscInt index) 75f47f4e3aSMatthew G. Knepley { 76652f91beSJacob Faibussowitsch PetscFunctionBegin; 77652f91beSJacob Faibussowitsch array[PetscBTIndex_Internal(index)] ^= PetscBTMask_Internal(index); 78652f91beSJacob Faibussowitsch PetscFunctionReturn(0); 7931b932fcSLisandro Dalcin } 8031b932fcSLisandro Dalcin 819fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTClear(PetscBT array, PetscInt index) 8253b8de81SBarry Smith { 83652f91beSJacob Faibussowitsch PetscFunctionBegin; 84090438c4SLisandro Dalcin array[PetscBTIndex_Internal(index)] &= (char) ~PetscBTMask_Internal(index); 85652f91beSJacob Faibussowitsch PetscFunctionReturn(0); 8653b8de81SBarry Smith } 8753b8de81SBarry Smith 889fbee547SJacob Faibussowitsch static inline char PetscBTLookupSet(PetscBT array, PetscInt index) 89652f91beSJacob Faibussowitsch { 90652f91beSJacob Faibussowitsch const char ret = PetscBTLookup(array,index); 919566063dSJacob Faibussowitsch PetscCallContinue(PetscBTSet(array,index)); 92652f91beSJacob Faibussowitsch return ret; 93652f91beSJacob Faibussowitsch } 94652f91beSJacob Faibussowitsch 959fbee547SJacob Faibussowitsch static inline char PetscBTLookupClear(PetscBT array, PetscInt index) 96652f91beSJacob Faibussowitsch { 97652f91beSJacob Faibussowitsch const char ret = PetscBTLookup(array,index); 989566063dSJacob Faibussowitsch PetscCallContinue(PetscBTClear(array,index)); 99652f91beSJacob Faibussowitsch return ret; 100652f91beSJacob Faibussowitsch } 101652f91beSJacob Faibussowitsch 1029fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTView(PetscInt m, const PetscBT bt, PetscViewer viewer) 103652f91beSJacob Faibussowitsch { 104652f91beSJacob Faibussowitsch PetscFunctionBegin; 105652f91beSJacob Faibussowitsch if (m < 1) PetscFunctionReturn(0); 1069566063dSJacob Faibussowitsch if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PETSC_COMM_SELF,&viewer)); 1079566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushSynchronized(viewer)); 108652f91beSJacob Faibussowitsch for (PetscInt i = 0; i < m; ++i) { 1099566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer,"%" PetscInt_FMT " %d\n",i,(int)PetscBTLookup(bt,i))); 110652f91beSJacob Faibussowitsch } 1119566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(viewer)); 1129566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopSynchronized(viewer)); 113652f91beSJacob Faibussowitsch PetscFunctionReturn(0); 114652f91beSJacob Faibussowitsch } 115652f91beSJacob Faibussowitsch #endif /* PETSCBT_H */ 116