127260eb9SSatish Balay 2f621e05eSBarry Smith #if !defined(__PETSCBT_H) 3f621e05eSBarry Smith #define __PETSCBT_H 419fee000SSatish Balay 56420c192SJed Brown #include <petscconf.h> 6665c2dedSJed Brown #include <petscviewer.h> 76420c192SJed Brown 8f621e05eSBarry Smith /*S 9f621e05eSBarry Smith PetscBT - PETSc bitarrays 10f621e05eSBarry Smith 11f621e05eSBarry Smith Level: advanced 1219fee000SSatish Balay 1394bacf5dSBarry Smith PetscBTCreate(m,&bt) - creates a bit array with enough room to hold m values 1494bacf5dSBarry Smith PetscBTDestroy(&bt) - destroys the bit array 156831982aSBarry Smith PetscBTMemzero(m,bt) - zeros the entire bit array (sets all values to false) 166831982aSBarry Smith PetscBTSet(bt,index) - sets a particular entry as true 176831982aSBarry Smith PetscBTClear(bt,index) - sets a particular entry as false 18f1af5d2fSBarry Smith PetscBTLookup(bt,index) - returns the value 19f1af5d2fSBarry Smith PetscBTLookupSet(bt,index) - returns the value and then sets it true 2031b932fcSLisandro Dalcin PetscBTLookupClear(bt,index) - returns the value and then sets it false 216831982aSBarry Smith PetscBTLength(m) - returns number of bytes in array with m bits 226831982aSBarry Smith PetscBTView(m,bt,viewer) - prints all the entries in a bit array 23eec0b4cfSBarry Smith 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 31ca71c51bSBarry Smith 3253b8de81SBarry Smith PETSC_STATIC_INLINE PetscInt PetscBTLength(PetscInt m) 3353b8de81SBarry Smith { 3453b8de81SBarry Smith return ((m)/PETSC_BITS_PER_BYTE+1); 3553b8de81SBarry Smith } 3682502324SSatish Balay 3753b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTMemzero(PetscInt m,PetscBT array) 3853b8de81SBarry Smith { 3953b8de81SBarry Smith return PetscMemzero(array,sizeof(char)*((m)/PETSC_BITS_PER_BYTE+1)); 4053b8de81SBarry Smith } 413b71518fSBarry Smith 4294bacf5dSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTDestroy(PetscBT *array) 4353b8de81SBarry Smith { 4494bacf5dSBarry Smith return PetscFree(*array); 4553b8de81SBarry Smith } 46ca71c51bSBarry Smith 47453bbfedSBarry Smith PETSC_STATIC_INLINE char PetscBTLookup(PetscBT array,PetscInt index) 4853b8de81SBarry Smith { 49fb61c4dcSBarry Smith char BT_mask,BT_c; 50fb61c4dcSBarry Smith PetscInt BT_idx; 51fb61c4dcSBarry Smith 52fb61c4dcSBarry Smith return (BT_idx = (index)/PETSC_BITS_PER_BYTE, 53fb61c4dcSBarry Smith BT_c = array[BT_idx], 54fb61c4dcSBarry Smith BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE), 55453bbfedSBarry Smith BT_c & BT_mask); 5653b8de81SBarry Smith } 5719fee000SSatish Balay 5853b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTView(PetscInt m,const PetscBT bt,PetscViewer viewer) 5953b8de81SBarry Smith { 6094bacf5dSBarry Smith PetscInt i; 6194bacf5dSBarry Smith PetscErrorCode ierr; 6219fee000SSatish Balay 63f431a1bbSBarry Smith ierr = PetscViewerASCIIGetStdout(PETSC_COMM_SELF,&viewer);CHKERRQ(ierr); 6494bacf5dSBarry Smith ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_TRUE);CHKERRQ(ierr); 6594bacf5dSBarry Smith for (i=0; i<m; i++) { 6694bacf5dSBarry Smith ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%D %d\n",i,PetscBTLookup(bt,i));CHKERRQ(ierr); 67453bbfedSBarry Smith } 68453bbfedSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 6994bacf5dSBarry Smith ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_FALSE);CHKERRQ(ierr); 7053b8de81SBarry Smith return 0; 7153b8de81SBarry Smith } 72ca71c51bSBarry Smith 7353b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTCreate(PetscInt m,PetscBT *array) 7453b8de81SBarry Smith { 7553b8de81SBarry Smith return (PetscMalloc(((m)/PETSC_BITS_PER_BYTE+1)*sizeof(char),array) || PetscBTMemzero(m,*array)); 7653b8de81SBarry Smith } 7753b8de81SBarry Smith 7853b8de81SBarry Smith PETSC_STATIC_INLINE char PetscBTLookupSet(PetscBT array,PetscInt index) 7953b8de81SBarry Smith { 80fb61c4dcSBarry Smith char BT_mask,BT_c; 81fb61c4dcSBarry Smith PetscInt BT_idx; 82fb61c4dcSBarry Smith 83fb61c4dcSBarry Smith return (BT_idx = (index)/PETSC_BITS_PER_BYTE, 84fb61c4dcSBarry Smith BT_c = array[BT_idx], 85fb61c4dcSBarry Smith BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE), 86fb61c4dcSBarry Smith array[BT_idx] = BT_c | BT_mask, 87fb61c4dcSBarry Smith BT_c & BT_mask); 8853b8de81SBarry Smith } 8953b8de81SBarry Smith 9053b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTSet(PetscBT array,PetscInt index) 9153b8de81SBarry Smith { 92fb61c4dcSBarry Smith char BT_mask,BT_c; 93fb61c4dcSBarry Smith PetscInt BT_idx; 94fb61c4dcSBarry Smith 95453bbfedSBarry Smith BT_idx = (index)/PETSC_BITS_PER_BYTE; 96453bbfedSBarry Smith BT_c = array[BT_idx]; 97453bbfedSBarry Smith BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE); 98453bbfedSBarry Smith array[BT_idx] = BT_c | BT_mask; 99453bbfedSBarry Smith return 0; 10053b8de81SBarry Smith } 10153b8de81SBarry Smith 102*f47f4e3aSMatthew G. Knepley PETSC_STATIC_INLINE PetscErrorCode PetscBTNegate(PetscBT array,PetscInt index) 103*f47f4e3aSMatthew G. Knepley { 104*f47f4e3aSMatthew G. Knepley const PetscInt BT_idx = (index)/PETSC_BITS_PER_BYTE; 105*f47f4e3aSMatthew G. Knepley const char BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE); 106*f47f4e3aSMatthew G. Knepley 107*f47f4e3aSMatthew G. Knepley array[BT_idx] ^= BT_mask; 108*f47f4e3aSMatthew G. Knepley return 0; 109*f47f4e3aSMatthew G. Knepley } 110*f47f4e3aSMatthew G. Knepley 11131b932fcSLisandro Dalcin PETSC_STATIC_INLINE char PetscBTLookupClear(PetscBT array,PetscInt index) 11231b932fcSLisandro Dalcin { 11331b932fcSLisandro Dalcin char BT_mask,BT_c; 11431b932fcSLisandro Dalcin PetscInt BT_idx; 11531b932fcSLisandro Dalcin 11631b932fcSLisandro Dalcin return (BT_idx = (index)/PETSC_BITS_PER_BYTE, 11731b932fcSLisandro Dalcin BT_c = array[BT_idx], 11831b932fcSLisandro Dalcin BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE), 11931b932fcSLisandro Dalcin array[BT_idx] = BT_c & (~BT_mask), 12031b932fcSLisandro Dalcin BT_c & BT_mask); 12131b932fcSLisandro Dalcin } 12231b932fcSLisandro Dalcin 12353b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTClear(PetscBT array,PetscInt index) 12453b8de81SBarry Smith { 125fb61c4dcSBarry Smith char BT_mask,BT_c; 126fb61c4dcSBarry Smith PetscInt BT_idx; 127fb61c4dcSBarry Smith 128453bbfedSBarry Smith BT_idx = (index)/PETSC_BITS_PER_BYTE; 129453bbfedSBarry Smith BT_c = array[BT_idx]; 130453bbfedSBarry Smith BT_mask = (char)1 << ((index)%PETSC_BITS_PER_BYTE); 131453bbfedSBarry Smith array[BT_idx] = BT_c & (~BT_mask); 132453bbfedSBarry Smith return 0; 13353b8de81SBarry Smith } 13453b8de81SBarry Smith 135ca71c51bSBarry Smith 136ca71c51bSBarry Smith #endif 137