Actual source code: petscbt.h

  1: #ifndef PETSCBT_H
  2: #define PETSCBT_H

  4: #include <petscviewer.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:      PetscBTLookupClear(bt,index) - returns the value and then sets it false
 19:      PetscBTLength(m)             - returns number of bytes in array with m bits
 20:      PetscBTView(m,bt,viewer)     - prints all the entries in a bit array

 22:     We do not currently check error flags on PetscBTLookup(), PetcBTLookupSet(), PetscBTLength() cause error checking
 23:     would cost hundreds more cycles then the operation.

 25: S*/
 26: typedef char* PetscBT;

 28: /* convert an index i to an index suitable for indexing a PetscBT, such that
 29:  * bt[PetscBTIndex(i)] returns the i'th value of the bt */
 30: static inline size_t PetscBTIndex_Internal(PetscInt index)
 31: {
 32:   return (size_t)index/PETSC_BITS_PER_BYTE;
 33: }

 35: static inline char PetscBTMask_Internal(PetscInt index)
 36: {
 37:   return 1 << index%PETSC_BITS_PER_BYTE;
 38: }

 40: static inline size_t PetscBTLength(PetscInt m)
 41: {
 42:   return (size_t)m/PETSC_BITS_PER_BYTE+1;
 43: }

 45: static inline PetscErrorCode PetscBTMemzero(PetscInt m, PetscBT array)
 46: {
 47:   return PetscArrayzero(array,PetscBTLength(m));
 48: }

 50: static inline PetscErrorCode PetscBTDestroy(PetscBT *array)
 51: {
 52:   return (*array) ? PetscFree(*array) : 0;
 53: }

 55: static inline PetscErrorCode PetscBTCreate(PetscInt m, PetscBT *array)
 56: {
 57:   return PetscCalloc1(PetscBTLength(m),array);
 58: }

 60: static inline char PetscBTLookup(PetscBT array, PetscInt index)
 61: {
 62:   return array[PetscBTIndex_Internal(index)] & PetscBTMask_Internal(index);
 63: }

 65: static inline PetscErrorCode PetscBTSet(PetscBT array, PetscInt index)
 66: {
 67:   array[PetscBTIndex_Internal(index)] |= PetscBTMask_Internal(index);
 68:   return 0;
 69: }

 71: static inline PetscErrorCode PetscBTNegate(PetscBT array, PetscInt index)
 72: {
 73:   array[PetscBTIndex_Internal(index)] ^= PetscBTMask_Internal(index);
 74:   return 0;
 75: }

 77: static inline PetscErrorCode PetscBTClear(PetscBT array, PetscInt index)
 78: {
 79:   array[PetscBTIndex_Internal(index)] &= (char) ~PetscBTMask_Internal(index);
 80:   return 0;
 81: }

 83: static inline char PetscBTLookupSet(PetscBT array, PetscInt index)
 84: {
 85:   const char ret = PetscBTLookup(array,index);
 86:   PetscBTSet(array,index);
 87:   return ret;
 88: }

 90: static inline char PetscBTLookupClear(PetscBT array, PetscInt index)
 91: {
 92:   const char ret = PetscBTLookup(array,index);
 93:   PetscBTClear(array,index);
 94:   return ret;
 95: }

 97: static inline PetscErrorCode PetscBTView(PetscInt m, const PetscBT bt, PetscViewer viewer)
 98: {
 99:   if (m < 1) return 0;
100:   if (!viewer) PetscViewerASCIIGetStdout(PETSC_COMM_SELF,&viewer);
101:   PetscViewerASCIIPushSynchronized(viewer);
102:   for (PetscInt i = 0; i < m; ++i) {
103:     PetscViewerASCIISynchronizedPrintf(viewer,"%" PetscInt_FMT " %d\n",i,(int)PetscBTLookup(bt,i));
104:   }
105:   PetscViewerFlush(viewer);
106:   PetscViewerASCIIPopSynchronized(viewer);
107:   return 0;
108: }
109: #endif /* PETSCBT_H */