1652f91beSJacob Faibussowitsch #ifndef PETSCBT_H 226bd1501SBarry Smith #define PETSCBT_H 319fee000SSatish Balay 4665c2dedSJed Brown #include <petscviewer.h> 56420c192SJed Brown 6f621e05eSBarry Smith /*S 7f621e05eSBarry Smith PetscBT - PETSc bitarrays 8f621e05eSBarry Smith 9f621e05eSBarry Smith Level: advanced 1019fee000SSatish Balay 1194bacf5dSBarry Smith PetscBTCreate(m,&bt) - creates a bit array with enough room to hold m values 1294bacf5dSBarry Smith PetscBTDestroy(&bt) - destroys the bit array 136831982aSBarry Smith PetscBTMemzero(m,bt) - zeros the entire bit array (sets all values to false) 146831982aSBarry Smith PetscBTSet(bt,index) - sets a particular entry as true 156831982aSBarry Smith PetscBTClear(bt,index) - sets a particular entry as false 16f1af5d2fSBarry Smith PetscBTLookup(bt,index) - returns the value 17f1af5d2fSBarry Smith PetscBTLookupSet(bt,index) - returns the value and then sets it true 1831b932fcSLisandro Dalcin PetscBTLookupClear(bt,index) - returns the value and then sets it false 196831982aSBarry Smith PetscBTLength(m) - returns number of bytes in array with m bits 206831982aSBarry Smith PetscBTView(m,bt,viewer) - prints all the entries in a bit array 21eec0b4cfSBarry Smith 22652f91beSJacob Faibussowitsch We do not currently check error flags on PetscBTLookup(), PetcBTLookupSet(), PetscBTLength() cause error checking 23652f91beSJacob Faibussowitsch would cost hundreds more cycles then the operation. 246831982aSBarry Smith 25b9617806SBarry Smith S*/ 26521d7252SBarry Smith typedef char* PetscBT; 27ca71c51bSBarry Smith 28652f91beSJacob Faibussowitsch /* convert an index i to an index suitable for indexing a PetscBT, such that 29652f91beSJacob Faibussowitsch * bt[PetscBTIndex(i)] returns the i'th value of the bt */ 30*9fbee547SJacob Faibussowitsch static inline PetscInt PetscBTIndex_Internal(PetscInt index) 31652f91beSJacob Faibussowitsch { 32652f91beSJacob Faibussowitsch return index/PETSC_BITS_PER_BYTE; 33652f91beSJacob Faibussowitsch } 34652f91beSJacob Faibussowitsch 35*9fbee547SJacob Faibussowitsch static inline char PetscBTMask_Internal(PetscInt index) 36652f91beSJacob Faibussowitsch { 37652f91beSJacob Faibussowitsch return 1 << index%PETSC_BITS_PER_BYTE; 38652f91beSJacob Faibussowitsch } 39652f91beSJacob Faibussowitsch 40*9fbee547SJacob Faibussowitsch static inline PetscInt PetscBTLength(PetscInt m) 4153b8de81SBarry Smith { 4235005c2bSLisandro Dalcin return m/PETSC_BITS_PER_BYTE+1; 4353b8de81SBarry Smith } 4482502324SSatish Balay 45*9fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTMemzero(PetscInt m, PetscBT array) 4653b8de81SBarry Smith { 47652f91beSJacob Faibussowitsch return PetscArrayzero(array,PetscBTLength(m)); 4853b8de81SBarry Smith } 493b71518fSBarry Smith 50*9fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTDestroy(PetscBT *array) 5153b8de81SBarry Smith { 52652f91beSJacob Faibussowitsch return (*array) ? PetscFree(*array) : 0; 5353b8de81SBarry Smith } 54ca71c51bSBarry Smith 55*9fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTCreate(PetscInt m, PetscBT *array) 5653b8de81SBarry Smith { 57652f91beSJacob Faibussowitsch return PetscCalloc1(PetscBTLength(m),array); 5853b8de81SBarry Smith } 5953b8de81SBarry Smith 60*9fbee547SJacob Faibussowitsch static inline char PetscBTLookup(PetscBT array, PetscInt index) 6153b8de81SBarry Smith { 62652f91beSJacob Faibussowitsch return array[PetscBTIndex_Internal(index)] & PetscBTMask_Internal(index); 6353b8de81SBarry Smith } 6453b8de81SBarry Smith 65*9fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTSet(PetscBT array, PetscInt index) 6653b8de81SBarry Smith { 67652f91beSJacob Faibussowitsch PetscFunctionBegin; 68652f91beSJacob Faibussowitsch array[PetscBTIndex_Internal(index)] |= PetscBTMask_Internal(index); 69652f91beSJacob Faibussowitsch PetscFunctionReturn(0); 7053b8de81SBarry Smith } 7153b8de81SBarry Smith 72*9fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTNegate(PetscBT array, PetscInt index) 73f47f4e3aSMatthew G. Knepley { 74652f91beSJacob Faibussowitsch PetscFunctionBegin; 75652f91beSJacob Faibussowitsch array[PetscBTIndex_Internal(index)] ^= PetscBTMask_Internal(index); 76652f91beSJacob Faibussowitsch PetscFunctionReturn(0); 7731b932fcSLisandro Dalcin } 7831b932fcSLisandro Dalcin 79*9fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTClear(PetscBT array, PetscInt index) 8053b8de81SBarry Smith { 81652f91beSJacob Faibussowitsch PetscFunctionBegin; 82652f91beSJacob Faibussowitsch array[PetscBTIndex_Internal(index)] &= ~PetscBTMask_Internal(index); 83652f91beSJacob Faibussowitsch PetscFunctionReturn(0); 8453b8de81SBarry Smith } 8553b8de81SBarry Smith 86*9fbee547SJacob Faibussowitsch static inline char PetscBTLookupSet(PetscBT array, PetscInt index) 87652f91beSJacob Faibussowitsch { 88652f91beSJacob Faibussowitsch const char ret = PetscBTLookup(array,index); 89652f91beSJacob Faibussowitsch CHKERRCONTINUE(PetscBTSet(array,index)); 90652f91beSJacob Faibussowitsch return ret; 91652f91beSJacob Faibussowitsch } 92652f91beSJacob Faibussowitsch 93*9fbee547SJacob Faibussowitsch static inline char PetscBTLookupClear(PetscBT array, PetscInt index) 94652f91beSJacob Faibussowitsch { 95652f91beSJacob Faibussowitsch const char ret = PetscBTLookup(array,index); 96652f91beSJacob Faibussowitsch CHKERRCONTINUE(PetscBTClear(array,index)); 97652f91beSJacob Faibussowitsch return ret; 98652f91beSJacob Faibussowitsch } 99652f91beSJacob Faibussowitsch 100*9fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTView(PetscInt m, const PetscBT bt, PetscViewer viewer) 101652f91beSJacob Faibussowitsch { 102652f91beSJacob Faibussowitsch PetscErrorCode ierr; 103652f91beSJacob Faibussowitsch 104652f91beSJacob Faibussowitsch PetscFunctionBegin; 105652f91beSJacob Faibussowitsch if (m < 1) PetscFunctionReturn(0); 106652f91beSJacob Faibussowitsch if (!viewer) {ierr = PetscViewerASCIIGetStdout(PETSC_COMM_SELF,&viewer);CHKERRQ(ierr);} 107652f91beSJacob Faibussowitsch ierr = PetscViewerASCIIPushSynchronized(viewer);CHKERRQ(ierr); 108652f91beSJacob Faibussowitsch for (PetscInt i = 0; i < m; ++i) { 109652f91beSJacob Faibussowitsch ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%" PetscInt_FMT " %d\n",i,(int)PetscBTLookup(bt,i));CHKERRQ(ierr); 110652f91beSJacob Faibussowitsch } 111652f91beSJacob Faibussowitsch ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 112652f91beSJacob Faibussowitsch ierr = PetscViewerASCIIPopSynchronized(viewer);CHKERRQ(ierr); 113652f91beSJacob Faibussowitsch PetscFunctionReturn(0); 114652f91beSJacob Faibussowitsch } 115652f91beSJacob Faibussowitsch #endif /* PETSCBT_H */ 116