1 2 #if !defined(__PETSCBT_H) 3 #define __PETSCBT_H 4 PETSC_EXTERN_CXX_BEGIN 5 6 /*S 7 PetscBT - PETSc bitarrays 8 9 Level: advanced 10 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 PetscBTLength(m) - returns number of bytes in array with m bits 19 PetscBTView(m,bt,viewer) - prints all the entries in a bit array 20 21 We do not currently check error flags on PetscBTSet(), PetscBTClear(), PetscBTLookup(), 22 PetcBTLookupSet(), PetscBTLength() cause error checking would cost hundreds more cycles then 23 the operation. 24 25 S*/ 26 typedef char* PetscBT; 27 28 29 PETSC_STATIC_INLINE PetscInt PetscBTLength(PetscInt m) 30 { 31 return ((m)/PETSC_BITS_PER_BYTE+1); 32 } 33 34 PETSC_STATIC_INLINE PetscErrorCode PetscBTMemzero(PetscInt m,PetscBT array) 35 { 36 return PetscMemzero(array,sizeof(char)*((m)/PETSC_BITS_PER_BYTE+1)); 37 } 38 39 PETSC_STATIC_INLINE PetscErrorCode PetscBTDestroy(PetscBT *array) 40 { 41 return PetscFree(*array); 42 } 43 44 PETSC_STATIC_INLINE PetscInt PetscBTLookup(PetscBT array,PetscInt index) 45 { 46 char BT_mask,BT_c; 47 PetscInt BT_idx; 48 49 return (BT_idx = (index)/PETSC_BITS_PER_BYTE, 50 BT_c = array[BT_idx], 51 BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE), 52 (BT_c & BT_mask) != 0); 53 } 54 55 PETSC_STATIC_INLINE PetscErrorCode PetscBTView(PetscInt m,const PetscBT bt,PetscViewer viewer) 56 { 57 PetscInt i; 58 PetscErrorCode ierr; 59 60 if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF; 61 ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_TRUE);CHKERRQ(ierr); 62 for (i=0; i<m; i++) { 63 ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%D %d\n",i,PetscBTLookup(bt,i));CHKERRQ(ierr); 64 } ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 65 ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_FALSE);CHKERRQ(ierr); 66 return 0; 67 } 68 69 PETSC_STATIC_INLINE PetscErrorCode PetscBTCreate(PetscInt m,PetscBT *array) 70 { 71 return (PetscMalloc(((m)/PETSC_BITS_PER_BYTE+1)*sizeof(char),array) || PetscBTMemzero(m,*array)); 72 } 73 74 PETSC_STATIC_INLINE char PetscBTLookupSet(PetscBT array,PetscInt index) 75 { 76 char BT_mask,BT_c; 77 PetscInt BT_idx; 78 79 return (BT_idx = (index)/PETSC_BITS_PER_BYTE, 80 BT_c = array[BT_idx], 81 BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE), 82 array[BT_idx] = BT_c | BT_mask, 83 BT_c & BT_mask); 84 } 85 86 PETSC_STATIC_INLINE PetscErrorCode PetscBTSet(PetscBT array,PetscInt index) 87 { 88 char BT_mask,BT_c; 89 PetscInt BT_idx; 90 91 return (BT_idx = (index)/PETSC_BITS_PER_BYTE, 92 BT_c = array[BT_idx], 93 BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE), 94 array[BT_idx] = BT_c | BT_mask,0); 95 } 96 97 PETSC_STATIC_INLINE PetscErrorCode PetscBTClear(PetscBT array,PetscInt index) 98 { 99 char BT_mask,BT_c; 100 PetscInt BT_idx; 101 102 return (BT_idx = (index)/PETSC_BITS_PER_BYTE, 103 BT_c = array[BT_idx], 104 BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE), 105 array[BT_idx] = BT_c & (~BT_mask),0); 106 } 107 108 109 PETSC_EXTERN_CXX_END 110 #endif 111