Actual source code: petscbt.h


  6: /*S
  7:      PetscBT - PETSc bitarrays

  9:      Level: advanced

 11:      PetscBTCreate(m,bt)        - creates a bit array with enough room to hold m values
 12:      PetscBTDestroy(bt)         - destroys the bit array
 13:      PetscBTMemzero(m,bt)       - zeros the entire bit array (sets all values to false)
 14:      PetscBTSet(bt,index)       - sets a particular entry as true
 15:      PetscBTClear(bt,index)     - sets a particular entry as false
 16:      PetscBTLookup(bt,index)    - returns the value 
 17:      PetscBTLookupSet(bt,index) - returns the value and then sets it true
 18:      PetscBTLength(m)           - returns number of bytes in array with m bits
 19:      PetscBTView(m,bt,viewer)   - prints all the entries in a bit array

 21:     The are all implemented as macros with the trivial data structure for efficiency.

 23:     These are not thread safe since they use a few global variables.

 25:     We do not currently check error flags on PetscBTSet(), PetscBTClear(), PetscBTLookup(),
 26:     PetcBTLookupSet(), PetscBTLength() cause error checking would cost hundreds more cycles then
 27:     the operation.

 29: S*/
 30: typedef char* PetscBT;


 36: #define PetscBTLength(m)        ((m)/PETSC_BITS_PER_BYTE+1)
 37: #define PetscBTMemzero(m,array) PetscMemzero(array,sizeof(char)*((m)/PETSC_BITS_PER_BYTE+1))
 38: #define PetscBTDestroy(array)   PetscFree(array)

 40: #define PetscBTView(m,bt,viewer) 0; {\
 41:   PetscInt __i; PetscErrorCode _8_ierr; \
 42:   PetscViewer __viewer = viewer; \
 43:   if (!__viewer) __viewer = PETSC_VIEWER_STDOUT_SELF;\
 44:   for (__i=0; __i<m; __i++) { \
 45:     _8_PetscPrintf(((PetscObject)__viewer)->comm,"%D %d\n",__i,PetscBTLookup(bt,__i));CHKERRQ(_8_ierr);\
 46:   }}

 48: #define PetscBTCreate(m,array)  \
 49:   (PetscMalloc(((m)/PETSC_BITS_PER_BYTE+1)*sizeof(char),&(array)) || PetscBTMemzero(m,array))

 51: #define PetscBTLookupSet(array,index) \
 52:   (_BT_idx        = (index)/PETSC_BITS_PER_BYTE, \
 53:    _BT_c          = array[_BT_idx], \
 54:    _BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE), \
 55:    array[_BT_idx] = _BT_c | _BT_mask, \
 56:    _BT_c & _BT_mask)

 58: #define PetscBTSet(array,index)  \
 59:   (_BT_idx        = (index)/PETSC_BITS_PER_BYTE, \
 60:    _BT_c          = array[_BT_idx], \
 61:    _BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE), \
 62:    array[_BT_idx] = _BT_c | _BT_mask,0)

 64: #define PetscBTClear(array,index) \
 65:   (_BT_idx        = (index)/PETSC_BITS_PER_BYTE, \
 66:    _BT_c          = array[_BT_idx], \
 67:    _BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE), \
 68:    array[_BT_idx] = _BT_c & (~_BT_mask),0)

 70: #define PetscBTLookup(array,index) \
 71:   (_BT_idx        = (index)/PETSC_BITS_PER_BYTE, \
 72:    _BT_c          = array[_BT_idx], \
 73:    _BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE), \
 74:    (_BT_c & _BT_mask) != 0)

 77: #endif