xref: /petsc/include/petscbt.h (revision 35005c2b4cd71c0ddfaed3d05963c6ce29912306)
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 {
34*35005c2bSLisandro Dalcin   return  m/PETSC_BITS_PER_BYTE+1;
3553b8de81SBarry Smith }
3682502324SSatish Balay 
3753b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTMemzero(PetscInt m,PetscBT array)
3853b8de81SBarry Smith {
39*35005c2bSLisandro Dalcin   return PetscMemzero(array,sizeof(char)*((size_t)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 
52*35005c2bSLisandro Dalcin  return  (BT_idx        = index/PETSC_BITS_PER_BYTE,
53fb61c4dcSBarry Smith           BT_c          = array[BT_idx],
54*35005c2bSLisandro Dalcin           BT_mask       = (char)(1 << index%PETSC_BITS_PER_BYTE),
55*35005c2bSLisandro Dalcin           (char)(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 
6383dc2128SMatthew G. Knepley   if (!viewer) {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++) {
66*35005c2bSLisandro Dalcin     ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%D %d\n",i,(int)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 {
75*35005c2bSLisandro Dalcin   return PetscMalloc1((size_t)m/PETSC_BITS_PER_BYTE+1,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 
83*35005c2bSLisandro Dalcin   return (BT_idx        = index/PETSC_BITS_PER_BYTE,
84fb61c4dcSBarry Smith           BT_c          = array[BT_idx],
85*35005c2bSLisandro Dalcin           BT_mask       = (char)(1 << index%PETSC_BITS_PER_BYTE),
86*35005c2bSLisandro Dalcin           array[BT_idx] = (char)(BT_c | BT_mask),
87*35005c2bSLisandro Dalcin           (char)(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 
95*35005c2bSLisandro Dalcin   BT_idx        = index/PETSC_BITS_PER_BYTE;
96453bbfedSBarry Smith   BT_c          = array[BT_idx];
97*35005c2bSLisandro Dalcin   BT_mask       = (char)(1 << index%PETSC_BITS_PER_BYTE);
98*35005c2bSLisandro Dalcin   array[BT_idx] = (char)(BT_c | BT_mask);
99453bbfedSBarry Smith   return 0;
10053b8de81SBarry Smith }
10153b8de81SBarry Smith 
102f47f4e3aSMatthew G. Knepley PETSC_STATIC_INLINE PetscErrorCode PetscBTNegate(PetscBT array,PetscInt index)
103f47f4e3aSMatthew G. Knepley {
104*35005c2bSLisandro Dalcin   const PetscInt BT_idx  = index/PETSC_BITS_PER_BYTE;
105*35005c2bSLisandro Dalcin   const char     BT_mask = (char)(1 << index%PETSC_BITS_PER_BYTE);
106f47f4e3aSMatthew G. Knepley 
107f47f4e3aSMatthew G. Knepley   array[BT_idx] ^= BT_mask;
108f47f4e3aSMatthew G. Knepley   return 0;
109f47f4e3aSMatthew G. Knepley }
110f47f4e3aSMatthew 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 
116*35005c2bSLisandro Dalcin   return (BT_idx        = index/PETSC_BITS_PER_BYTE,
11731b932fcSLisandro Dalcin           BT_c          = array[BT_idx],
118*35005c2bSLisandro Dalcin           BT_mask       = (char)(1 << index%PETSC_BITS_PER_BYTE),
119*35005c2bSLisandro Dalcin           array[BT_idx] = (char)(BT_c & ~BT_mask),
120*35005c2bSLisandro Dalcin           (char)(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 
128*35005c2bSLisandro Dalcin   BT_idx        = index/PETSC_BITS_PER_BYTE;
129453bbfedSBarry Smith   BT_c          = array[BT_idx];
130*35005c2bSLisandro Dalcin   BT_mask       = (char)(1 << index%PETSC_BITS_PER_BYTE);
131*35005c2bSLisandro Dalcin   array[BT_idx] = (char)(BT_c & ~BT_mask);
132453bbfedSBarry Smith  return 0;
13353b8de81SBarry Smith }
13453b8de81SBarry Smith 
135ca71c51bSBarry Smith 
136ca71c51bSBarry Smith #endif
137