xref: /petsc/include/petscbt.h (revision 6420c19281ee0880fb5717e304a454f0a35b05f0)
127260eb9SSatish Balay 
2f621e05eSBarry Smith #if !defined(__PETSCBT_H)
3f621e05eSBarry Smith #define __PETSCBT_H
419fee000SSatish Balay 
5*6420c192SJed Brown #include <petscconf.h>
6*6420c192SJed Brown 
7f621e05eSBarry Smith /*S
8f621e05eSBarry Smith      PetscBT - PETSc bitarrays
9f621e05eSBarry Smith 
10f621e05eSBarry Smith      Level: advanced
1119fee000SSatish Balay 
1294bacf5dSBarry Smith      PetscBTCreate(m,&bt)       - creates a bit array with enough room to hold m values
1394bacf5dSBarry Smith      PetscBTDestroy(&bt)        - destroys the bit array
146831982aSBarry Smith      PetscBTMemzero(m,bt)       - zeros the entire bit array (sets all values to false)
156831982aSBarry Smith      PetscBTSet(bt,index)       - sets a particular entry as true
166831982aSBarry Smith      PetscBTClear(bt,index)     - sets a particular entry as false
17f1af5d2fSBarry Smith      PetscBTLookup(bt,index)    - returns the value
18f1af5d2fSBarry Smith      PetscBTLookupSet(bt,index) - returns the value and then sets it true
196831982aSBarry Smith      PetscBTLength(m)           - returns number of bytes in array with m bits
206831982aSBarry Smith      PetscBTView(m,bt,viewer)   - prints all the entries in a bit array
21eec0b4cfSBarry Smith 
226831982aSBarry Smith     We do not currently check error flags on PetscBTSet(), PetscBTClear(), PetscBTLookup(),
236831982aSBarry Smith     PetcBTLookupSet(), PetscBTLength() cause error checking would cost hundreds more cycles then
246831982aSBarry Smith     the operation.
256831982aSBarry Smith 
26b9617806SBarry Smith S*/
27521d7252SBarry Smith typedef char* PetscBT;
28ca71c51bSBarry Smith 
29ca71c51bSBarry Smith 
3053b8de81SBarry Smith PETSC_STATIC_INLINE PetscInt  PetscBTLength(PetscInt m)
3153b8de81SBarry Smith {
3253b8de81SBarry Smith   return  ((m)/PETSC_BITS_PER_BYTE+1);
3353b8de81SBarry Smith }
3482502324SSatish Balay 
3553b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTMemzero(PetscInt m,PetscBT array)
3653b8de81SBarry Smith {
3753b8de81SBarry Smith   return PetscMemzero(array,sizeof(char)*((m)/PETSC_BITS_PER_BYTE+1));
3853b8de81SBarry Smith }
393b71518fSBarry Smith 
4094bacf5dSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTDestroy(PetscBT *array)
4153b8de81SBarry Smith {
4294bacf5dSBarry Smith   return PetscFree(*array);
4353b8de81SBarry Smith }
44ca71c51bSBarry Smith 
45453bbfedSBarry Smith PETSC_STATIC_INLINE char PetscBTLookup(PetscBT array,PetscInt index)
4653b8de81SBarry Smith {
47fb61c4dcSBarry Smith   char      BT_mask,BT_c;
48fb61c4dcSBarry Smith   PetscInt  BT_idx;
49fb61c4dcSBarry Smith 
50fb61c4dcSBarry Smith  return  (BT_idx        = (index)/PETSC_BITS_PER_BYTE,
51fb61c4dcSBarry Smith           BT_c          = array[BT_idx],
52fb61c4dcSBarry Smith           BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE),
53453bbfedSBarry Smith           BT_c & BT_mask);
5453b8de81SBarry Smith }
5519fee000SSatish Balay 
5653b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTView(PetscInt m,const PetscBT bt,PetscViewer viewer)
5753b8de81SBarry Smith {
5894bacf5dSBarry Smith   PetscInt       i;
5994bacf5dSBarry Smith   PetscErrorCode ierr;
6019fee000SSatish Balay 
6194bacf5dSBarry Smith   if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF;
6294bacf5dSBarry Smith   ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_TRUE);CHKERRQ(ierr);
6394bacf5dSBarry Smith   for (i=0; i<m; i++) {
6494bacf5dSBarry Smith     ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%D %d\n",i,PetscBTLookup(bt,i));CHKERRQ(ierr);
65453bbfedSBarry Smith   }
66453bbfedSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
6794bacf5dSBarry Smith   ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_FALSE);CHKERRQ(ierr);
6853b8de81SBarry Smith   return 0;
6953b8de81SBarry Smith }
70ca71c51bSBarry Smith 
7153b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTCreate(PetscInt m,PetscBT *array)
7253b8de81SBarry Smith {
7353b8de81SBarry Smith   return (PetscMalloc(((m)/PETSC_BITS_PER_BYTE+1)*sizeof(char),array) || PetscBTMemzero(m,*array));
7453b8de81SBarry Smith }
7553b8de81SBarry Smith 
7653b8de81SBarry Smith PETSC_STATIC_INLINE char PetscBTLookupSet(PetscBT array,PetscInt index)
7753b8de81SBarry Smith {
78fb61c4dcSBarry Smith   char      BT_mask,BT_c;
79fb61c4dcSBarry Smith   PetscInt  BT_idx;
80fb61c4dcSBarry Smith 
81fb61c4dcSBarry Smith   return (BT_idx        = (index)/PETSC_BITS_PER_BYTE,
82fb61c4dcSBarry Smith           BT_c          = array[BT_idx],
83fb61c4dcSBarry Smith           BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE),
84fb61c4dcSBarry Smith           array[BT_idx] = BT_c | BT_mask,
85fb61c4dcSBarry Smith           BT_c & BT_mask);
8653b8de81SBarry Smith }
8753b8de81SBarry Smith 
8853b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTSet(PetscBT array,PetscInt index)
8953b8de81SBarry Smith {
90fb61c4dcSBarry Smith   char      BT_mask,BT_c;
91fb61c4dcSBarry Smith   PetscInt  BT_idx;
92fb61c4dcSBarry Smith 
93453bbfedSBarry Smith   BT_idx        = (index)/PETSC_BITS_PER_BYTE;
94453bbfedSBarry Smith   BT_c          = array[BT_idx];
95453bbfedSBarry Smith   BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE);
96453bbfedSBarry Smith   array[BT_idx] = BT_c | BT_mask;
97453bbfedSBarry Smith   return 0;
9853b8de81SBarry Smith }
9953b8de81SBarry Smith 
10053b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTClear(PetscBT array,PetscInt index)
10153b8de81SBarry Smith {
102fb61c4dcSBarry Smith   char      BT_mask,BT_c;
103fb61c4dcSBarry Smith   PetscInt  BT_idx;
104fb61c4dcSBarry Smith 
105453bbfedSBarry Smith   BT_idx        = (index)/PETSC_BITS_PER_BYTE;
106453bbfedSBarry Smith   BT_c          = array[BT_idx];
107453bbfedSBarry Smith   BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE);
108453bbfedSBarry Smith   array[BT_idx] = BT_c & (~BT_mask);
109453bbfedSBarry Smith  return 0;
11053b8de81SBarry Smith }
11153b8de81SBarry Smith 
112ca71c51bSBarry Smith 
113ca71c51bSBarry Smith #endif
114