1*652f91beSJacob 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 22*652f91beSJacob Faibussowitsch We do not currently check error flags on PetscBTLookup(), PetcBTLookupSet(), PetscBTLength() cause error checking 23*652f91beSJacob Faibussowitsch would cost hundreds more cycles then the operation. 246831982aSBarry Smith 25b9617806SBarry Smith S*/ 26521d7252SBarry Smith typedef char* PetscBT; 27ca71c51bSBarry Smith 28*652f91beSJacob Faibussowitsch /* convert an index i to an index suitable for indexing a PetscBT, such that 29*652f91beSJacob Faibussowitsch * bt[PetscBTIndex(i)] returns the i'th value of the bt */ 30*652f91beSJacob Faibussowitsch PETSC_STATIC_INLINE PetscInt PetscBTIndex_Internal(PetscInt index) 31*652f91beSJacob Faibussowitsch { 32*652f91beSJacob Faibussowitsch return index/PETSC_BITS_PER_BYTE; 33*652f91beSJacob Faibussowitsch } 34*652f91beSJacob Faibussowitsch 35*652f91beSJacob Faibussowitsch PETSC_STATIC_INLINE char PetscBTMask_Internal(PetscInt index) 36*652f91beSJacob Faibussowitsch { 37*652f91beSJacob Faibussowitsch return 1 << index%PETSC_BITS_PER_BYTE; 38*652f91beSJacob Faibussowitsch } 39*652f91beSJacob Faibussowitsch 4053b8de81SBarry Smith PETSC_STATIC_INLINE PetscInt PetscBTLength(PetscInt m) 4153b8de81SBarry Smith { 4235005c2bSLisandro Dalcin return m/PETSC_BITS_PER_BYTE+1; 4353b8de81SBarry Smith } 4482502324SSatish Balay 4553b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTMemzero(PetscInt m, PetscBT array) 4653b8de81SBarry Smith { 47*652f91beSJacob Faibussowitsch return PetscArrayzero(array,PetscBTLength(m)); 4853b8de81SBarry Smith } 493b71518fSBarry Smith 5094bacf5dSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTDestroy(PetscBT *array) 5153b8de81SBarry Smith { 52*652f91beSJacob Faibussowitsch return (*array) ? PetscFree(*array) : 0; 5353b8de81SBarry Smith } 54ca71c51bSBarry Smith 5553b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTCreate(PetscInt m, PetscBT *array) 5653b8de81SBarry Smith { 57*652f91beSJacob Faibussowitsch return PetscCalloc1(PetscBTLength(m),array); 5853b8de81SBarry Smith } 5953b8de81SBarry Smith 60*652f91beSJacob Faibussowitsch PETSC_STATIC_INLINE char PetscBTLookup(PetscBT array, PetscInt index) 6153b8de81SBarry Smith { 62*652f91beSJacob Faibussowitsch return array[PetscBTIndex_Internal(index)] & PetscBTMask_Internal(index); 6353b8de81SBarry Smith } 6453b8de81SBarry Smith 6553b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTSet(PetscBT array, PetscInt index) 6653b8de81SBarry Smith { 67*652f91beSJacob Faibussowitsch PetscFunctionBegin; 68*652f91beSJacob Faibussowitsch array[PetscBTIndex_Internal(index)] |= PetscBTMask_Internal(index); 69*652f91beSJacob Faibussowitsch PetscFunctionReturn(0); 7053b8de81SBarry Smith } 7153b8de81SBarry Smith 72f47f4e3aSMatthew G. Knepley PETSC_STATIC_INLINE PetscErrorCode PetscBTNegate(PetscBT array, PetscInt index) 73f47f4e3aSMatthew G. Knepley { 74*652f91beSJacob Faibussowitsch PetscFunctionBegin; 75*652f91beSJacob Faibussowitsch array[PetscBTIndex_Internal(index)] ^= PetscBTMask_Internal(index); 76*652f91beSJacob Faibussowitsch PetscFunctionReturn(0); 7731b932fcSLisandro Dalcin } 7831b932fcSLisandro Dalcin 7953b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTClear(PetscBT array, PetscInt index) 8053b8de81SBarry Smith { 81*652f91beSJacob Faibussowitsch PetscFunctionBegin; 82*652f91beSJacob Faibussowitsch array[PetscBTIndex_Internal(index)] &= ~PetscBTMask_Internal(index); 83*652f91beSJacob Faibussowitsch PetscFunctionReturn(0); 8453b8de81SBarry Smith } 8553b8de81SBarry Smith 86*652f91beSJacob Faibussowitsch PETSC_STATIC_INLINE char PetscBTLookupSet(PetscBT array, PetscInt index) 87*652f91beSJacob Faibussowitsch { 88*652f91beSJacob Faibussowitsch const char ret = PetscBTLookup(array,index); 89*652f91beSJacob Faibussowitsch CHKERRCONTINUE(PetscBTSet(array,index)); 90*652f91beSJacob Faibussowitsch return ret; 91*652f91beSJacob Faibussowitsch } 92*652f91beSJacob Faibussowitsch 93*652f91beSJacob Faibussowitsch PETSC_STATIC_INLINE char PetscBTLookupClear(PetscBT array, PetscInt index) 94*652f91beSJacob Faibussowitsch { 95*652f91beSJacob Faibussowitsch const char ret = PetscBTLookup(array,index); 96*652f91beSJacob Faibussowitsch CHKERRCONTINUE(PetscBTClear(array,index)); 97*652f91beSJacob Faibussowitsch return ret; 98*652f91beSJacob Faibussowitsch } 99*652f91beSJacob Faibussowitsch 100*652f91beSJacob Faibussowitsch PETSC_STATIC_INLINE PetscErrorCode PetscBTView(PetscInt m, const PetscBT bt, PetscViewer viewer) 101*652f91beSJacob Faibussowitsch { 102*652f91beSJacob Faibussowitsch PetscErrorCode ierr; 103*652f91beSJacob Faibussowitsch 104*652f91beSJacob Faibussowitsch PetscFunctionBegin; 105*652f91beSJacob Faibussowitsch if (m < 1) PetscFunctionReturn(0); 106*652f91beSJacob Faibussowitsch if (!viewer) {ierr = PetscViewerASCIIGetStdout(PETSC_COMM_SELF,&viewer);CHKERRQ(ierr);} 107*652f91beSJacob Faibussowitsch ierr = PetscViewerASCIIPushSynchronized(viewer);CHKERRQ(ierr); 108*652f91beSJacob Faibussowitsch for (PetscInt i = 0; i < m; ++i) { 109*652f91beSJacob Faibussowitsch ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%" PetscInt_FMT " %d\n",i,(int)PetscBTLookup(bt,i));CHKERRQ(ierr); 110*652f91beSJacob Faibussowitsch } 111*652f91beSJacob Faibussowitsch ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 112*652f91beSJacob Faibussowitsch ierr = PetscViewerASCIIPopSynchronized(viewer);CHKERRQ(ierr); 113*652f91beSJacob Faibussowitsch PetscFunctionReturn(0); 114*652f91beSJacob Faibussowitsch } 115*652f91beSJacob Faibussowitsch #endif /* PETSCBT_H */ 116