xref: /petsc/include/petscbt.h (revision 53b8de81863f01213b9aa72ec63aee37a63d8cb9)
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