xref: /petsc/include/petscbt.h (revision f431a1bbf998a7abd7e24ebe9f5aab1ef73a4301)
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
206831982aSBarry Smith      PetscBTLength(m)           - returns number of bytes in array with m bits
216831982aSBarry Smith      PetscBTView(m,bt,viewer)   - prints all the entries in a bit array
22eec0b4cfSBarry Smith 
236831982aSBarry Smith     We do not currently check error flags on PetscBTSet(), PetscBTClear(), PetscBTLookup(),
246831982aSBarry Smith     PetcBTLookupSet(), PetscBTLength() cause error checking would cost hundreds more cycles then
256831982aSBarry Smith     the operation.
266831982aSBarry Smith 
27b9617806SBarry Smith S*/
28521d7252SBarry Smith typedef char* PetscBT;
29ca71c51bSBarry Smith 
30ca71c51bSBarry Smith 
3153b8de81SBarry Smith PETSC_STATIC_INLINE PetscInt  PetscBTLength(PetscInt m)
3253b8de81SBarry Smith {
3353b8de81SBarry Smith   return  ((m)/PETSC_BITS_PER_BYTE+1);
3453b8de81SBarry Smith }
3582502324SSatish Balay 
3653b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTMemzero(PetscInt m,PetscBT array)
3753b8de81SBarry Smith {
3853b8de81SBarry Smith   return PetscMemzero(array,sizeof(char)*((m)/PETSC_BITS_PER_BYTE+1));
3953b8de81SBarry Smith }
403b71518fSBarry Smith 
4194bacf5dSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTDestroy(PetscBT *array)
4253b8de81SBarry Smith {
4394bacf5dSBarry Smith   return PetscFree(*array);
4453b8de81SBarry Smith }
45ca71c51bSBarry Smith 
46453bbfedSBarry Smith PETSC_STATIC_INLINE char PetscBTLookup(PetscBT array,PetscInt index)
4753b8de81SBarry Smith {
48fb61c4dcSBarry Smith   char      BT_mask,BT_c;
49fb61c4dcSBarry Smith   PetscInt  BT_idx;
50fb61c4dcSBarry Smith 
51fb61c4dcSBarry Smith  return  (BT_idx        = (index)/PETSC_BITS_PER_BYTE,
52fb61c4dcSBarry Smith           BT_c          = array[BT_idx],
53fb61c4dcSBarry Smith           BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE),
54453bbfedSBarry Smith           BT_c & BT_mask);
5553b8de81SBarry Smith }
5619fee000SSatish Balay 
5753b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTView(PetscInt m,const PetscBT bt,PetscViewer viewer)
5853b8de81SBarry Smith {
5994bacf5dSBarry Smith   PetscInt       i;
6094bacf5dSBarry Smith   PetscErrorCode ierr;
6119fee000SSatish Balay 
62*f431a1bbSBarry Smith   ierr = PetscViewerASCIIGetStdout(PETSC_COMM_SELF,&viewer);CHKERRQ(ierr);
6394bacf5dSBarry Smith   ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_TRUE);CHKERRQ(ierr);
6494bacf5dSBarry Smith   for (i=0; i<m; i++) {
6594bacf5dSBarry Smith     ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%D %d\n",i,PetscBTLookup(bt,i));CHKERRQ(ierr);
66453bbfedSBarry Smith   }
67453bbfedSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
6894bacf5dSBarry Smith   ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_FALSE);CHKERRQ(ierr);
6953b8de81SBarry Smith   return 0;
7053b8de81SBarry Smith }
71ca71c51bSBarry Smith 
7253b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTCreate(PetscInt m,PetscBT *array)
7353b8de81SBarry Smith {
7453b8de81SBarry Smith   return (PetscMalloc(((m)/PETSC_BITS_PER_BYTE+1)*sizeof(char),array) || PetscBTMemzero(m,*array));
7553b8de81SBarry Smith }
7653b8de81SBarry Smith 
7753b8de81SBarry Smith PETSC_STATIC_INLINE char PetscBTLookupSet(PetscBT array,PetscInt index)
7853b8de81SBarry Smith {
79fb61c4dcSBarry Smith   char      BT_mask,BT_c;
80fb61c4dcSBarry Smith   PetscInt  BT_idx;
81fb61c4dcSBarry Smith 
82fb61c4dcSBarry Smith   return (BT_idx        = (index)/PETSC_BITS_PER_BYTE,
83fb61c4dcSBarry Smith           BT_c          = array[BT_idx],
84fb61c4dcSBarry Smith           BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE),
85fb61c4dcSBarry Smith           array[BT_idx] = BT_c | BT_mask,
86fb61c4dcSBarry Smith           BT_c & BT_mask);
8753b8de81SBarry Smith }
8853b8de81SBarry Smith 
8953b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTSet(PetscBT array,PetscInt index)
9053b8de81SBarry Smith {
91fb61c4dcSBarry Smith   char      BT_mask,BT_c;
92fb61c4dcSBarry Smith   PetscInt  BT_idx;
93fb61c4dcSBarry Smith 
94453bbfedSBarry Smith   BT_idx        = (index)/PETSC_BITS_PER_BYTE;
95453bbfedSBarry Smith   BT_c          = array[BT_idx];
96453bbfedSBarry Smith   BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE);
97453bbfedSBarry Smith   array[BT_idx] = BT_c | BT_mask;
98453bbfedSBarry Smith   return 0;
9953b8de81SBarry Smith }
10053b8de81SBarry Smith 
10153b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTClear(PetscBT array,PetscInt index)
10253b8de81SBarry Smith {
103fb61c4dcSBarry Smith   char      BT_mask,BT_c;
104fb61c4dcSBarry Smith   PetscInt  BT_idx;
105fb61c4dcSBarry Smith 
106453bbfedSBarry Smith   BT_idx        = (index)/PETSC_BITS_PER_BYTE;
107453bbfedSBarry Smith   BT_c          = array[BT_idx];
108453bbfedSBarry Smith   BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE);
109453bbfedSBarry Smith   array[BT_idx] = BT_c & (~BT_mask);
110453bbfedSBarry Smith  return 0;
11153b8de81SBarry Smith }
11253b8de81SBarry Smith 
113ca71c51bSBarry Smith 
114ca71c51bSBarry Smith #endif
115