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