xref: /petsc/include/petscbt.h (revision 9fbee5477fd88ea4536ebb185f3c80da15fb55c0)
1652f91beSJacob 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 
22652f91beSJacob Faibussowitsch     We do not currently check error flags on PetscBTLookup(), PetcBTLookupSet(), PetscBTLength() cause error checking
23652f91beSJacob Faibussowitsch     would cost hundreds more cycles then the operation.
246831982aSBarry Smith 
25b9617806SBarry Smith S*/
26521d7252SBarry Smith typedef char* PetscBT;
27ca71c51bSBarry Smith 
28652f91beSJacob Faibussowitsch /* convert an index i to an index suitable for indexing a PetscBT, such that
29652f91beSJacob Faibussowitsch  * bt[PetscBTIndex(i)] returns the i'th value of the bt */
30*9fbee547SJacob Faibussowitsch static inline PetscInt PetscBTIndex_Internal(PetscInt index)
31652f91beSJacob Faibussowitsch {
32652f91beSJacob Faibussowitsch   return index/PETSC_BITS_PER_BYTE;
33652f91beSJacob Faibussowitsch }
34652f91beSJacob Faibussowitsch 
35*9fbee547SJacob Faibussowitsch static inline char PetscBTMask_Internal(PetscInt index)
36652f91beSJacob Faibussowitsch {
37652f91beSJacob Faibussowitsch   return 1 << index%PETSC_BITS_PER_BYTE;
38652f91beSJacob Faibussowitsch }
39652f91beSJacob Faibussowitsch 
40*9fbee547SJacob Faibussowitsch static inline PetscInt PetscBTLength(PetscInt m)
4153b8de81SBarry Smith {
4235005c2bSLisandro Dalcin   return m/PETSC_BITS_PER_BYTE+1;
4353b8de81SBarry Smith }
4482502324SSatish Balay 
45*9fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTMemzero(PetscInt m, PetscBT array)
4653b8de81SBarry Smith {
47652f91beSJacob Faibussowitsch   return PetscArrayzero(array,PetscBTLength(m));
4853b8de81SBarry Smith }
493b71518fSBarry Smith 
50*9fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTDestroy(PetscBT *array)
5153b8de81SBarry Smith {
52652f91beSJacob Faibussowitsch   return (*array) ? PetscFree(*array) : 0;
5353b8de81SBarry Smith }
54ca71c51bSBarry Smith 
55*9fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTCreate(PetscInt m, PetscBT *array)
5653b8de81SBarry Smith {
57652f91beSJacob Faibussowitsch   return PetscCalloc1(PetscBTLength(m),array);
5853b8de81SBarry Smith }
5953b8de81SBarry Smith 
60*9fbee547SJacob Faibussowitsch static inline char PetscBTLookup(PetscBT array, PetscInt index)
6153b8de81SBarry Smith {
62652f91beSJacob Faibussowitsch   return array[PetscBTIndex_Internal(index)] & PetscBTMask_Internal(index);
6353b8de81SBarry Smith }
6453b8de81SBarry Smith 
65*9fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTSet(PetscBT array, PetscInt index)
6653b8de81SBarry Smith {
67652f91beSJacob Faibussowitsch   PetscFunctionBegin;
68652f91beSJacob Faibussowitsch   array[PetscBTIndex_Internal(index)] |= PetscBTMask_Internal(index);
69652f91beSJacob Faibussowitsch   PetscFunctionReturn(0);
7053b8de81SBarry Smith }
7153b8de81SBarry Smith 
72*9fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTNegate(PetscBT array, PetscInt index)
73f47f4e3aSMatthew G. Knepley {
74652f91beSJacob Faibussowitsch   PetscFunctionBegin;
75652f91beSJacob Faibussowitsch   array[PetscBTIndex_Internal(index)] ^= PetscBTMask_Internal(index);
76652f91beSJacob Faibussowitsch   PetscFunctionReturn(0);
7731b932fcSLisandro Dalcin }
7831b932fcSLisandro Dalcin 
79*9fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTClear(PetscBT array, PetscInt index)
8053b8de81SBarry Smith {
81652f91beSJacob Faibussowitsch   PetscFunctionBegin;
82652f91beSJacob Faibussowitsch   array[PetscBTIndex_Internal(index)] &= ~PetscBTMask_Internal(index);
83652f91beSJacob Faibussowitsch   PetscFunctionReturn(0);
8453b8de81SBarry Smith }
8553b8de81SBarry Smith 
86*9fbee547SJacob Faibussowitsch static inline char PetscBTLookupSet(PetscBT array, PetscInt index)
87652f91beSJacob Faibussowitsch {
88652f91beSJacob Faibussowitsch   const char ret = PetscBTLookup(array,index);
89652f91beSJacob Faibussowitsch   CHKERRCONTINUE(PetscBTSet(array,index));
90652f91beSJacob Faibussowitsch   return ret;
91652f91beSJacob Faibussowitsch }
92652f91beSJacob Faibussowitsch 
93*9fbee547SJacob Faibussowitsch static inline char PetscBTLookupClear(PetscBT array, PetscInt index)
94652f91beSJacob Faibussowitsch {
95652f91beSJacob Faibussowitsch   const char ret = PetscBTLookup(array,index);
96652f91beSJacob Faibussowitsch   CHKERRCONTINUE(PetscBTClear(array,index));
97652f91beSJacob Faibussowitsch   return ret;
98652f91beSJacob Faibussowitsch }
99652f91beSJacob Faibussowitsch 
100*9fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTView(PetscInt m, const PetscBT bt, PetscViewer viewer)
101652f91beSJacob Faibussowitsch {
102652f91beSJacob Faibussowitsch   PetscErrorCode ierr;
103652f91beSJacob Faibussowitsch 
104652f91beSJacob Faibussowitsch   PetscFunctionBegin;
105652f91beSJacob Faibussowitsch   if (m < 1) PetscFunctionReturn(0);
106652f91beSJacob Faibussowitsch   if (!viewer) {ierr = PetscViewerASCIIGetStdout(PETSC_COMM_SELF,&viewer);CHKERRQ(ierr);}
107652f91beSJacob Faibussowitsch   ierr = PetscViewerASCIIPushSynchronized(viewer);CHKERRQ(ierr);
108652f91beSJacob Faibussowitsch   for (PetscInt i = 0; i < m; ++i) {
109652f91beSJacob Faibussowitsch     ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%" PetscInt_FMT " %d\n",i,(int)PetscBTLookup(bt,i));CHKERRQ(ierr);
110652f91beSJacob Faibussowitsch   }
111652f91beSJacob Faibussowitsch   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
112652f91beSJacob Faibussowitsch   ierr = PetscViewerASCIIPopSynchronized(viewer);CHKERRQ(ierr);
113652f91beSJacob Faibussowitsch   PetscFunctionReturn(0);
114652f91beSJacob Faibussowitsch }
115652f91beSJacob Faibussowitsch #endif /* PETSCBT_H */
116