xref: /petsc/include/petscbt.h (revision fb61c4dc4c69eb53d9f7475a937d144a2573d507)
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 
4453b8de81SBarry Smith PETSC_STATIC_INLINE PetscInt PetscBTLookup(PetscBT array,PetscInt index)
4553b8de81SBarry Smith {
46*fb61c4dcSBarry Smith   char      BT_mask,BT_c;
47*fb61c4dcSBarry Smith   PetscInt  BT_idx;
48*fb61c4dcSBarry Smith 
49*fb61c4dcSBarry Smith  return  (BT_idx        = (index)/PETSC_BITS_PER_BYTE,
50*fb61c4dcSBarry Smith           BT_c          = array[BT_idx],
51*fb61c4dcSBarry Smith           BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE),
52*fb61c4dcSBarry Smith           (BT_c & BT_mask) != 0);
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);
6494bacf5dSBarry Smith   }  ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
6594bacf5dSBarry Smith   ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_FALSE);CHKERRQ(ierr);
6653b8de81SBarry Smith   return 0;
6753b8de81SBarry Smith }
68ca71c51bSBarry Smith 
6953b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTCreate(PetscInt m,PetscBT *array)
7053b8de81SBarry Smith {
7153b8de81SBarry Smith   return (PetscMalloc(((m)/PETSC_BITS_PER_BYTE+1)*sizeof(char),array) || PetscBTMemzero(m,*array));
7253b8de81SBarry Smith }
7353b8de81SBarry Smith 
7453b8de81SBarry Smith PETSC_STATIC_INLINE char PetscBTLookupSet(PetscBT array,PetscInt index)
7553b8de81SBarry Smith {
76*fb61c4dcSBarry Smith   char      BT_mask,BT_c;
77*fb61c4dcSBarry Smith   PetscInt  BT_idx;
78*fb61c4dcSBarry Smith 
79*fb61c4dcSBarry Smith   return (BT_idx        = (index)/PETSC_BITS_PER_BYTE,
80*fb61c4dcSBarry Smith           BT_c          = array[BT_idx],
81*fb61c4dcSBarry Smith           BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE),
82*fb61c4dcSBarry Smith           array[BT_idx] = BT_c | BT_mask,
83*fb61c4dcSBarry Smith           BT_c & BT_mask);
8453b8de81SBarry Smith }
8553b8de81SBarry Smith 
8653b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTSet(PetscBT array,PetscInt index)
8753b8de81SBarry Smith {
88*fb61c4dcSBarry Smith   char      BT_mask,BT_c;
89*fb61c4dcSBarry Smith   PetscInt  BT_idx;
90*fb61c4dcSBarry Smith 
91*fb61c4dcSBarry Smith   return  (BT_idx        = (index)/PETSC_BITS_PER_BYTE,
92*fb61c4dcSBarry Smith            BT_c          = array[BT_idx],
93*fb61c4dcSBarry Smith            BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE),
94*fb61c4dcSBarry Smith            array[BT_idx] = BT_c | BT_mask,0);
9553b8de81SBarry Smith }
9653b8de81SBarry Smith 
9753b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTClear(PetscBT array,PetscInt index)
9853b8de81SBarry Smith {
99*fb61c4dcSBarry Smith   char      BT_mask,BT_c;
100*fb61c4dcSBarry Smith   PetscInt  BT_idx;
101*fb61c4dcSBarry Smith 
102*fb61c4dcSBarry Smith  return (BT_idx        = (index)/PETSC_BITS_PER_BYTE,
103*fb61c4dcSBarry Smith          BT_c          = array[BT_idx],
104*fb61c4dcSBarry Smith          BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE),
105*fb61c4dcSBarry Smith          array[BT_idx] = BT_c & (~BT_mask),0);
10653b8de81SBarry Smith }
10753b8de81SBarry Smith 
108ca71c51bSBarry Smith 
109e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END
110ca71c51bSBarry Smith #endif
111