xref: /petsc/include/petscbt.h (revision 652f91be9c120c378817a05050631c936b95a688)
1*652f91beSJacob Faibussowitsch #ifndef PETSCBT_H
226bd1501SBarry Smith #define PETSCBT_H
319fee000SSatish Balay 
4665c2dedSJed Brown #include <petscviewer.h>
56420c192SJed Brown 
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
1831b932fcSLisandro Dalcin      PetscBTLookupClear(bt,index) - returns the value and then sets it false
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 
22*652f91beSJacob Faibussowitsch     We do not currently check error flags on PetscBTLookup(), PetcBTLookupSet(), PetscBTLength() cause error checking
23*652f91beSJacob Faibussowitsch     would cost hundreds more cycles then the operation.
246831982aSBarry Smith 
25b9617806SBarry Smith S*/
26521d7252SBarry Smith typedef char* PetscBT;
27ca71c51bSBarry Smith 
28*652f91beSJacob Faibussowitsch /* convert an index i to an index suitable for indexing a PetscBT, such that
29*652f91beSJacob Faibussowitsch  * bt[PetscBTIndex(i)] returns the i'th value of the bt */
30*652f91beSJacob Faibussowitsch PETSC_STATIC_INLINE PetscInt PetscBTIndex_Internal(PetscInt index)
31*652f91beSJacob Faibussowitsch {
32*652f91beSJacob Faibussowitsch   return index/PETSC_BITS_PER_BYTE;
33*652f91beSJacob Faibussowitsch }
34*652f91beSJacob Faibussowitsch 
35*652f91beSJacob Faibussowitsch PETSC_STATIC_INLINE char PetscBTMask_Internal(PetscInt index)
36*652f91beSJacob Faibussowitsch {
37*652f91beSJacob Faibussowitsch   return 1 << index%PETSC_BITS_PER_BYTE;
38*652f91beSJacob Faibussowitsch }
39*652f91beSJacob Faibussowitsch 
4053b8de81SBarry Smith PETSC_STATIC_INLINE PetscInt PetscBTLength(PetscInt m)
4153b8de81SBarry Smith {
4235005c2bSLisandro Dalcin   return m/PETSC_BITS_PER_BYTE+1;
4353b8de81SBarry Smith }
4482502324SSatish Balay 
4553b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTMemzero(PetscInt m, PetscBT array)
4653b8de81SBarry Smith {
47*652f91beSJacob Faibussowitsch   return PetscArrayzero(array,PetscBTLength(m));
4853b8de81SBarry Smith }
493b71518fSBarry Smith 
5094bacf5dSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTDestroy(PetscBT *array)
5153b8de81SBarry Smith {
52*652f91beSJacob Faibussowitsch   return (*array) ? PetscFree(*array) : 0;
5353b8de81SBarry Smith }
54ca71c51bSBarry Smith 
5553b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTCreate(PetscInt m, PetscBT *array)
5653b8de81SBarry Smith {
57*652f91beSJacob Faibussowitsch   return PetscCalloc1(PetscBTLength(m),array);
5853b8de81SBarry Smith }
5953b8de81SBarry Smith 
60*652f91beSJacob Faibussowitsch PETSC_STATIC_INLINE char PetscBTLookup(PetscBT array, PetscInt index)
6153b8de81SBarry Smith {
62*652f91beSJacob Faibussowitsch   return array[PetscBTIndex_Internal(index)] & PetscBTMask_Internal(index);
6353b8de81SBarry Smith }
6453b8de81SBarry Smith 
6553b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTSet(PetscBT array, PetscInt index)
6653b8de81SBarry Smith {
67*652f91beSJacob Faibussowitsch   PetscFunctionBegin;
68*652f91beSJacob Faibussowitsch   array[PetscBTIndex_Internal(index)] |= PetscBTMask_Internal(index);
69*652f91beSJacob Faibussowitsch   PetscFunctionReturn(0);
7053b8de81SBarry Smith }
7153b8de81SBarry Smith 
72f47f4e3aSMatthew G. Knepley PETSC_STATIC_INLINE PetscErrorCode PetscBTNegate(PetscBT array, PetscInt index)
73f47f4e3aSMatthew G. Knepley {
74*652f91beSJacob Faibussowitsch   PetscFunctionBegin;
75*652f91beSJacob Faibussowitsch   array[PetscBTIndex_Internal(index)] ^= PetscBTMask_Internal(index);
76*652f91beSJacob Faibussowitsch   PetscFunctionReturn(0);
7731b932fcSLisandro Dalcin }
7831b932fcSLisandro Dalcin 
7953b8de81SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBTClear(PetscBT array, PetscInt index)
8053b8de81SBarry Smith {
81*652f91beSJacob Faibussowitsch   PetscFunctionBegin;
82*652f91beSJacob Faibussowitsch   array[PetscBTIndex_Internal(index)] &= ~PetscBTMask_Internal(index);
83*652f91beSJacob Faibussowitsch   PetscFunctionReturn(0);
8453b8de81SBarry Smith }
8553b8de81SBarry Smith 
86*652f91beSJacob Faibussowitsch PETSC_STATIC_INLINE char PetscBTLookupSet(PetscBT array, PetscInt index)
87*652f91beSJacob Faibussowitsch {
88*652f91beSJacob Faibussowitsch   const char ret = PetscBTLookup(array,index);
89*652f91beSJacob Faibussowitsch   CHKERRCONTINUE(PetscBTSet(array,index));
90*652f91beSJacob Faibussowitsch   return ret;
91*652f91beSJacob Faibussowitsch }
92*652f91beSJacob Faibussowitsch 
93*652f91beSJacob Faibussowitsch PETSC_STATIC_INLINE char PetscBTLookupClear(PetscBT array, PetscInt index)
94*652f91beSJacob Faibussowitsch {
95*652f91beSJacob Faibussowitsch   const char ret = PetscBTLookup(array,index);
96*652f91beSJacob Faibussowitsch   CHKERRCONTINUE(PetscBTClear(array,index));
97*652f91beSJacob Faibussowitsch   return ret;
98*652f91beSJacob Faibussowitsch }
99*652f91beSJacob Faibussowitsch 
100*652f91beSJacob Faibussowitsch PETSC_STATIC_INLINE PetscErrorCode PetscBTView(PetscInt m, const PetscBT bt, PetscViewer viewer)
101*652f91beSJacob Faibussowitsch {
102*652f91beSJacob Faibussowitsch   PetscErrorCode ierr;
103*652f91beSJacob Faibussowitsch 
104*652f91beSJacob Faibussowitsch   PetscFunctionBegin;
105*652f91beSJacob Faibussowitsch   if (m < 1) PetscFunctionReturn(0);
106*652f91beSJacob Faibussowitsch   if (!viewer) {ierr = PetscViewerASCIIGetStdout(PETSC_COMM_SELF,&viewer);CHKERRQ(ierr);}
107*652f91beSJacob Faibussowitsch   ierr = PetscViewerASCIIPushSynchronized(viewer);CHKERRQ(ierr);
108*652f91beSJacob Faibussowitsch   for (PetscInt i = 0; i < m; ++i) {
109*652f91beSJacob Faibussowitsch     ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%" PetscInt_FMT " %d\n",i,(int)PetscBTLookup(bt,i));CHKERRQ(ierr);
110*652f91beSJacob Faibussowitsch   }
111*652f91beSJacob Faibussowitsch   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
112*652f91beSJacob Faibussowitsch   ierr = PetscViewerASCIIPopSynchronized(viewer);CHKERRQ(ierr);
113*652f91beSJacob Faibussowitsch   PetscFunctionReturn(0);
114*652f91beSJacob Faibussowitsch }
115*652f91beSJacob Faibussowitsch #endif /* PETSCBT_H */
116