xref: /petsc/include/petscbt.h (revision f621e05e188db6fe8da961e5af0df981dcc81528)
1*f621e05eSBarry Smith #if !defined(__PETSCBT_H)
2*f621e05eSBarry Smith #define __PETSCBT_H
3*f621e05eSBarry Smith PETSC_EXTERN_CXX_BEGIN
419fee000SSatish Balay 
5*f621e05eSBarry Smith /*S
6*f621e05eSBarry Smith      PetscBT - PETSc bitarrays
7*f621e05eSBarry Smith 
8*f621e05eSBarry Smith      Level: advanced
919fee000SSatish Balay 
106831982aSBarry Smith      PetscBTCreate(m,bt)        - creates a bit array with enough room to hold m values
116831982aSBarry Smith      PetscBTDestroy(bt)         - destroys the bit array
126831982aSBarry Smith      PetscBTMemzero(m,bt)       - zeros the entire bit array (sets all values to false)
136831982aSBarry Smith      PetscBTSet(bt,index)       - sets a particular entry as true
146831982aSBarry Smith      PetscBTClear(bt,index)     - sets a particular entry as false
15f1af5d2fSBarry Smith      PetscBTLookup(bt,index)    - returns the value
16f1af5d2fSBarry Smith      PetscBTLookupSet(bt,index) - returns the value and then sets it true
176831982aSBarry Smith      PetscBTLength(m)           - returns number of bytes in array with m bits
186831982aSBarry Smith      PetscBTView(m,bt,viewer)   - prints all the entries in a bit array
19eec0b4cfSBarry Smith 
20eec0b4cfSBarry Smith     The are all implemented as macros with the trivial data structure for efficiency.
21eec0b4cfSBarry Smith 
22eec0b4cfSBarry Smith     These are not thread safe since they use a few global variables.
2319fee000SSatish Balay 
246831982aSBarry Smith     We do not currently check error flags on PetscBTSet(), PetscBTClear(), PetscBTLookup(),
256831982aSBarry Smith     PetcBTLookupSet(), PetscBTLength() cause error checking would cost hundreds more cycles then
266831982aSBarry Smith     the operation.
276831982aSBarry Smith 
28b9617806SBarry Smith S*/
29521d7252SBarry Smith typedef char* PetscBT;
30ca71c51bSBarry Smith 
31ff73aad6SKris Buschelman extern PETSC_DLLEXPORT char      _BT_mask;
32ff73aad6SKris Buschelman extern PETSC_DLLEXPORT char      _BT_c;
33ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscInt  _BT_idx;
34ca71c51bSBarry Smith 
35ccd8e176SBarry Smith #define PetscBTLength(m)        ((m)/PETSC_BITS_PER_BYTE+1)
36521d7252SBarry Smith #define PetscBTMemzero(m,array) PetscMemzero(array,sizeof(char)*((m)/PETSC_BITS_PER_BYTE+1))
3782502324SSatish Balay #define PetscBTDestroy(array)   PetscFree(array)
3882502324SSatish Balay 
3982502324SSatish Balay #define PetscBTView(m,bt,viewer) 0; {\
4077431f27SBarry Smith   PetscInt __i; PetscErrorCode _8_ierr; \
41b0a32e0cSBarry Smith   PetscViewer __viewer = viewer; \
42b0a32e0cSBarry Smith   if (!__viewer) __viewer = PETSC_VIEWER_STDOUT_SELF;\
433b71518fSBarry Smith   for (__i=0; __i<m; __i++) { \
4477431f27SBarry Smith     _8_ierr = PetscPrintf(((PetscObject)__viewer)->comm,"%D %d\n",__i,PetscBTLookup(bt,__i));CHKERRQ(_8_ierr);\
453b71518fSBarry Smith   }}
463b71518fSBarry Smith 
471d73ed98SBarry Smith #define PetscBTCreate(m,array)  \
481d73ed98SBarry Smith   (PetscMalloc(((m)/PETSC_BITS_PER_BYTE+1)*sizeof(char),&(array)) || PetscBTMemzero(m,array))
49ca71c51bSBarry Smith 
50f1144a30SSatish Balay #define PetscBTLookupSet(array,index) \
51f1144a30SSatish Balay   (_BT_idx        = (index)/PETSC_BITS_PER_BYTE, \
5219fee000SSatish Balay    _BT_c          = array[_BT_idx], \
53b6410449SSatish Balay    _BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE), \
541a89f835SSatish Balay    array[_BT_idx] = _BT_c | _BT_mask, \
551a89f835SSatish Balay    _BT_c & _BT_mask)
5619fee000SSatish Balay 
57f1144a30SSatish Balay #define PetscBTSet(array,index)  \
58f1144a30SSatish Balay   (_BT_idx        = (index)/PETSC_BITS_PER_BYTE, \
59ca71c51bSBarry Smith    _BT_c          = array[_BT_idx], \
60b6410449SSatish Balay    _BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE), \
611929aaefSSatish Balay    array[_BT_idx] = _BT_c | _BT_mask,0)
6219fee000SSatish Balay 
63f1144a30SSatish Balay #define PetscBTClear(array,index) \
64f1144a30SSatish Balay   (_BT_idx        = (index)/PETSC_BITS_PER_BYTE, \
65ca71c51bSBarry Smith    _BT_c          = array[_BT_idx], \
66b6410449SSatish Balay    _BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE), \
671929aaefSSatish Balay    array[_BT_idx] = _BT_c & (~_BT_mask),0)
68ca71c51bSBarry Smith 
69f1144a30SSatish Balay #define PetscBTLookup(array,index) \
70f1144a30SSatish Balay   (_BT_idx        = (index)/PETSC_BITS_PER_BYTE, \
71ca71c51bSBarry Smith    _BT_c          = array[_BT_idx], \
72b6410449SSatish Balay    _BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE), \
731a89f835SSatish Balay    (_BT_c & _BT_mask) != 0)
74ca71c51bSBarry Smith 
75e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END
76ca71c51bSBarry Smith #endif
77