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 1194bacf5dSBarry Smith PetscBTCreate(m,&bt) - creates a bit array with enough room to hold m values 1294bacf5dSBarry 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 28ca71c51bSBarry Smith 2953b8de81SBarry Smith PETSC_STATIC_INLINE PetscInt PetscBTLength(PetscInt m) 3053b8de81SBarry Smith { 3153b8de81SBarry Smith return ((m)/PETSC_BITS_PER_BYTE+1); 3253b8de81SBarry Smith } 3382502324SSatish Balay 3453b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTMemzero(PetscInt m,PetscBT array) 3553b8de81SBarry Smith { 3653b8de81SBarry Smith return PetscMemzero(array,sizeof(char)*((m)/PETSC_BITS_PER_BYTE+1)); 3753b8de81SBarry Smith } 383b71518fSBarry Smith 3994bacf5dSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTDestroy(PetscBT *array) 4053b8de81SBarry Smith { 4194bacf5dSBarry Smith return PetscFree(*array); 4253b8de81SBarry Smith } 43ca71c51bSBarry Smith 44*453bbfedSBarry Smith PETSC_STATIC_INLINE char PetscBTLookup(PetscBT array,PetscInt index) 4553b8de81SBarry Smith { 46fb61c4dcSBarry Smith char BT_mask,BT_c; 47fb61c4dcSBarry Smith PetscInt BT_idx; 48fb61c4dcSBarry Smith 49fb61c4dcSBarry Smith return (BT_idx = (index)/PETSC_BITS_PER_BYTE, 50fb61c4dcSBarry Smith BT_c = array[BT_idx], 51fb61c4dcSBarry Smith BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE), 52*453bbfedSBarry Smith BT_c & BT_mask); 5353b8de81SBarry Smith } 5419fee000SSatish Balay 5553b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTView(PetscInt m,const PetscBT bt,PetscViewer viewer) 5653b8de81SBarry Smith { 5794bacf5dSBarry Smith PetscInt i; 5894bacf5dSBarry Smith PetscErrorCode ierr; 5919fee000SSatish Balay 6094bacf5dSBarry Smith if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF; 6194bacf5dSBarry Smith ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_TRUE);CHKERRQ(ierr); 6294bacf5dSBarry Smith for (i=0; i<m; i++) { 6394bacf5dSBarry Smith ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%D %d\n",i,PetscBTLookup(bt,i));CHKERRQ(ierr); 64*453bbfedSBarry Smith } 65*453bbfedSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 6694bacf5dSBarry Smith ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_FALSE);CHKERRQ(ierr); 6753b8de81SBarry Smith return 0; 6853b8de81SBarry Smith } 69ca71c51bSBarry Smith 7053b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTCreate(PetscInt m,PetscBT *array) 7153b8de81SBarry Smith { 7253b8de81SBarry Smith return (PetscMalloc(((m)/PETSC_BITS_PER_BYTE+1)*sizeof(char),array) || PetscBTMemzero(m,*array)); 7353b8de81SBarry Smith } 7453b8de81SBarry Smith 7553b8de81SBarry Smith PETSC_STATIC_INLINE char PetscBTLookupSet(PetscBT array,PetscInt index) 7653b8de81SBarry Smith { 77fb61c4dcSBarry Smith char BT_mask,BT_c; 78fb61c4dcSBarry Smith PetscInt BT_idx; 79fb61c4dcSBarry Smith 80fb61c4dcSBarry Smith return (BT_idx = (index)/PETSC_BITS_PER_BYTE, 81fb61c4dcSBarry Smith BT_c = array[BT_idx], 82fb61c4dcSBarry Smith BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE), 83fb61c4dcSBarry Smith array[BT_idx] = BT_c | BT_mask, 84fb61c4dcSBarry Smith BT_c & BT_mask); 8553b8de81SBarry Smith } 8653b8de81SBarry Smith 8753b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTSet(PetscBT array,PetscInt index) 8853b8de81SBarry Smith { 89fb61c4dcSBarry Smith char BT_mask,BT_c; 90fb61c4dcSBarry Smith PetscInt BT_idx; 91fb61c4dcSBarry Smith 92*453bbfedSBarry Smith BT_idx = (index)/PETSC_BITS_PER_BYTE; 93*453bbfedSBarry Smith BT_c = array[BT_idx]; 94*453bbfedSBarry Smith BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE); 95*453bbfedSBarry Smith array[BT_idx] = BT_c | BT_mask; 96*453bbfedSBarry Smith return 0; 9753b8de81SBarry Smith } 9853b8de81SBarry Smith 9953b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTClear(PetscBT array,PetscInt index) 10053b8de81SBarry Smith { 101fb61c4dcSBarry Smith char BT_mask,BT_c; 102fb61c4dcSBarry Smith PetscInt BT_idx; 103fb61c4dcSBarry Smith 104*453bbfedSBarry Smith BT_idx = (index)/PETSC_BITS_PER_BYTE; 105*453bbfedSBarry Smith BT_c = array[BT_idx]; 106*453bbfedSBarry Smith BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE); 107*453bbfedSBarry Smith array[BT_idx] = BT_c & (~BT_mask); 108*453bbfedSBarry Smith return 0; 10953b8de81SBarry Smith } 11053b8de81SBarry Smith 111ca71c51bSBarry Smith 112e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END 113ca71c51bSBarry Smith #endif 114