127260eb9SSatish Balay 2f621e05eSBarry Smith #if !defined(__PETSCBT_H) 3f621e05eSBarry Smith #define __PETSCBT_H 4f621e05eSBarry Smith PETSC_EXTERN_CXX_BEGIN 519fee000SSatish Balay 6f621e05eSBarry Smith /*S 7f621e05eSBarry Smith PetscBT - PETSc bitarrays 8f621e05eSBarry Smith 9f621e05eSBarry Smith Level: advanced 1019fee000SSatish Balay 116831982aSBarry Smith PetscBTCreate(m,bt) - creates a bit array with enough room to hold m values 126831982aSBarry 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 186831982aSBarry Smith PetscBTLength(m) - returns number of bytes in array with m bits 196831982aSBarry Smith PetscBTView(m,bt,viewer) - prints all the entries in a bit array 20eec0b4cfSBarry Smith 216831982aSBarry Smith We do not currently check error flags on PetscBTSet(), PetscBTClear(), PetscBTLookup(), 226831982aSBarry Smith PetcBTLookupSet(), PetscBTLength() cause error checking would cost hundreds more cycles then 236831982aSBarry Smith the operation. 246831982aSBarry Smith 25b9617806SBarry Smith S*/ 26521d7252SBarry Smith typedef char* PetscBT; 27ca71c51bSBarry Smith 287087cfbeSBarry Smith extern char _BT_mask; 297087cfbeSBarry Smith extern char _BT_c; 307087cfbeSBarry Smith extern PetscInt _BT_idx; 31ca71c51bSBarry Smith 32*53b8de81SBarry Smith PETSC_STATIC_INLINE PetscInt PetscBTLength(PetscInt m) 33*53b8de81SBarry Smith { 34*53b8de81SBarry Smith return ((m)/PETSC_BITS_PER_BYTE+1); 35*53b8de81SBarry Smith } 3682502324SSatish Balay 37*53b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTMemzero(PetscInt m,PetscBT array) 38*53b8de81SBarry Smith { 39*53b8de81SBarry Smith return PetscMemzero(array,sizeof(char)*((m)/PETSC_BITS_PER_BYTE+1)); 40*53b8de81SBarry Smith } 413b71518fSBarry Smith 42*53b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTDestroy(PetscBT array) 43*53b8de81SBarry Smith { 44*53b8de81SBarry Smith return PetscFree(array); 45*53b8de81SBarry Smith } 46ca71c51bSBarry Smith 47*53b8de81SBarry Smith PETSC_STATIC_INLINE PetscInt PetscBTLookup(PetscBT array,PetscInt index) 48*53b8de81SBarry Smith { 49*53b8de81SBarry Smith return (_BT_idx = (index)/PETSC_BITS_PER_BYTE, 50*53b8de81SBarry Smith _BT_c = array[_BT_idx], 51*53b8de81SBarry Smith _BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE), 52*53b8de81SBarry Smith (_BT_c & _BT_mask) != 0); 53*53b8de81SBarry Smith } 5419fee000SSatish Balay 55*53b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTView(PetscInt m,const PetscBT bt,PetscViewer viewer) 56*53b8de81SBarry Smith { 57*53b8de81SBarry Smith PetscInt __i; PetscErrorCode _8_ierr; 58*53b8de81SBarry Smith PetscViewer __viewer = viewer; 5919fee000SSatish Balay 60*53b8de81SBarry Smith if (!__viewer) __viewer = PETSC_VIEWER_STDOUT_SELF; 61*53b8de81SBarry Smith _8_ierr = PetscViewerASCIISynchronizedAllow(__viewer,PETSC_TRUE);CHKERRQ(_8_ierr); 62*53b8de81SBarry Smith for (__i=0; __i<m; __i++) { 63*53b8de81SBarry Smith _8_ierr = PetscViewerASCIISynchronizedPrintf(__viewer,"%D %d\n",__i,PetscBTLookup(bt,__i));CHKERRQ(_8_ierr); 64*53b8de81SBarry Smith } _8_ierr = PetscViewerFlush(__viewer);CHKERRQ(_8_ierr); 65*53b8de81SBarry Smith _8_ierr = PetscViewerASCIISynchronizedAllow(__viewer,PETSC_FALSE);CHKERRQ(_8_ierr); 66*53b8de81SBarry Smith return 0; 67*53b8de81SBarry Smith } 68ca71c51bSBarry Smith 69*53b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTCreate(PetscInt m,PetscBT *array) 70*53b8de81SBarry Smith { 71*53b8de81SBarry Smith return (PetscMalloc(((m)/PETSC_BITS_PER_BYTE+1)*sizeof(char),array) || PetscBTMemzero(m,*array)); 72*53b8de81SBarry Smith } 73*53b8de81SBarry Smith 74*53b8de81SBarry Smith PETSC_STATIC_INLINE char PetscBTLookupSet(PetscBT array,PetscInt index) 75*53b8de81SBarry Smith { 76*53b8de81SBarry Smith return (_BT_idx = (index)/PETSC_BITS_PER_BYTE, 77*53b8de81SBarry Smith _BT_c = array[_BT_idx], 78*53b8de81SBarry Smith _BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE), 79*53b8de81SBarry Smith array[_BT_idx] = _BT_c | _BT_mask, 80*53b8de81SBarry Smith _BT_c & _BT_mask); 81*53b8de81SBarry Smith } 82*53b8de81SBarry Smith 83*53b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTSet(PetscBT array,PetscInt index) 84*53b8de81SBarry Smith { 85*53b8de81SBarry Smith return (_BT_idx = (index)/PETSC_BITS_PER_BYTE, 86*53b8de81SBarry Smith _BT_c = array[_BT_idx], 87*53b8de81SBarry Smith _BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE), 88*53b8de81SBarry Smith array[_BT_idx] = _BT_c | _BT_mask,0); 89*53b8de81SBarry Smith } 90*53b8de81SBarry Smith 91*53b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTClear(PetscBT array,PetscInt index) 92*53b8de81SBarry Smith { 93*53b8de81SBarry Smith return (_BT_idx = (index)/PETSC_BITS_PER_BYTE, 94*53b8de81SBarry Smith _BT_c = array[_BT_idx], 95*53b8de81SBarry Smith _BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE), 96*53b8de81SBarry Smith array[_BT_idx] = _BT_c & (~_BT_mask),0); 97*53b8de81SBarry Smith } 98*53b8de81SBarry Smith 99ca71c51bSBarry Smith 100e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END 101ca71c51bSBarry Smith #endif 102