xref: /petsc/include/petscbt.h (revision ac09b9214d23ea9ad238aa607de9fa447fd4e91b)
1652f91beSJacob Faibussowitsch #ifndef PETSCBT_H
226bd1501SBarry Smith #define PETSCBT_H
319fee000SSatish Balay 
4665c2dedSJed Brown #include <petscviewer.h>
56420c192SJed Brown 
6*ac09b921SBarry Smith /* SUBMANSEC = Sys */
7*ac09b921SBarry Smith 
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 
24652f91beSJacob Faibussowitsch     We do not currently check error flags on PetscBTLookup(), PetcBTLookupSet(), PetscBTLength() cause error checking
25652f91beSJacob Faibussowitsch     would cost hundreds more cycles then the operation.
266831982aSBarry Smith 
27b9617806SBarry Smith S*/
28521d7252SBarry Smith typedef char* PetscBT;
29ca71c51bSBarry Smith 
30652f91beSJacob Faibussowitsch /* convert an index i to an index suitable for indexing a PetscBT, such that
31652f91beSJacob Faibussowitsch  * bt[PetscBTIndex(i)] returns the i'th value of the bt */
32c133393eSBarry Smith static inline size_t PetscBTIndex_Internal(PetscInt index)
33652f91beSJacob Faibussowitsch {
34c133393eSBarry Smith   return (size_t)index/PETSC_BITS_PER_BYTE;
35652f91beSJacob Faibussowitsch }
36652f91beSJacob Faibussowitsch 
379fbee547SJacob Faibussowitsch static inline char PetscBTMask_Internal(PetscInt index)
38652f91beSJacob Faibussowitsch {
39652f91beSJacob Faibussowitsch   return 1 << index%PETSC_BITS_PER_BYTE;
40652f91beSJacob Faibussowitsch }
41652f91beSJacob Faibussowitsch 
42c133393eSBarry Smith static inline size_t PetscBTLength(PetscInt m)
4353b8de81SBarry Smith {
44c133393eSBarry Smith   return (size_t)m/PETSC_BITS_PER_BYTE+1;
4553b8de81SBarry Smith }
4682502324SSatish Balay 
479fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTMemzero(PetscInt m, PetscBT array)
4853b8de81SBarry Smith {
49652f91beSJacob Faibussowitsch   return PetscArrayzero(array,PetscBTLength(m));
5053b8de81SBarry Smith }
513b71518fSBarry Smith 
529fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTDestroy(PetscBT *array)
5353b8de81SBarry Smith {
54652f91beSJacob Faibussowitsch   return (*array) ? PetscFree(*array) : 0;
5553b8de81SBarry Smith }
56ca71c51bSBarry Smith 
579fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTCreate(PetscInt m, PetscBT *array)
5853b8de81SBarry Smith {
59652f91beSJacob Faibussowitsch   return PetscCalloc1(PetscBTLength(m),array);
6053b8de81SBarry Smith }
6153b8de81SBarry Smith 
629fbee547SJacob Faibussowitsch static inline char PetscBTLookup(PetscBT array, PetscInt index)
6353b8de81SBarry Smith {
64652f91beSJacob Faibussowitsch   return array[PetscBTIndex_Internal(index)] & PetscBTMask_Internal(index);
6553b8de81SBarry Smith }
6653b8de81SBarry Smith 
679fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTSet(PetscBT array, PetscInt index)
6853b8de81SBarry Smith {
69652f91beSJacob Faibussowitsch   PetscFunctionBegin;
70652f91beSJacob Faibussowitsch   array[PetscBTIndex_Internal(index)] |= PetscBTMask_Internal(index);
71652f91beSJacob Faibussowitsch   PetscFunctionReturn(0);
7253b8de81SBarry Smith }
7353b8de81SBarry Smith 
749fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTNegate(PetscBT array, PetscInt index)
75f47f4e3aSMatthew G. Knepley {
76652f91beSJacob Faibussowitsch   PetscFunctionBegin;
77652f91beSJacob Faibussowitsch   array[PetscBTIndex_Internal(index)] ^= PetscBTMask_Internal(index);
78652f91beSJacob Faibussowitsch   PetscFunctionReturn(0);
7931b932fcSLisandro Dalcin }
8031b932fcSLisandro Dalcin 
819fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTClear(PetscBT array, PetscInt index)
8253b8de81SBarry Smith {
83652f91beSJacob Faibussowitsch   PetscFunctionBegin;
84090438c4SLisandro Dalcin   array[PetscBTIndex_Internal(index)] &= (char) ~PetscBTMask_Internal(index);
85652f91beSJacob Faibussowitsch   PetscFunctionReturn(0);
8653b8de81SBarry Smith }
8753b8de81SBarry Smith 
889fbee547SJacob Faibussowitsch static inline char PetscBTLookupSet(PetscBT array, PetscInt index)
89652f91beSJacob Faibussowitsch {
90652f91beSJacob Faibussowitsch   const char ret = PetscBTLookup(array,index);
919566063dSJacob Faibussowitsch   PetscCallContinue(PetscBTSet(array,index));
92652f91beSJacob Faibussowitsch   return ret;
93652f91beSJacob Faibussowitsch }
94652f91beSJacob Faibussowitsch 
959fbee547SJacob Faibussowitsch static inline char PetscBTLookupClear(PetscBT array, PetscInt index)
96652f91beSJacob Faibussowitsch {
97652f91beSJacob Faibussowitsch   const char ret = PetscBTLookup(array,index);
989566063dSJacob Faibussowitsch   PetscCallContinue(PetscBTClear(array,index));
99652f91beSJacob Faibussowitsch   return ret;
100652f91beSJacob Faibussowitsch }
101652f91beSJacob Faibussowitsch 
1029fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscBTView(PetscInt m, const PetscBT bt, PetscViewer viewer)
103652f91beSJacob Faibussowitsch {
104652f91beSJacob Faibussowitsch   PetscFunctionBegin;
105652f91beSJacob Faibussowitsch   if (m < 1) PetscFunctionReturn(0);
1069566063dSJacob Faibussowitsch   if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PETSC_COMM_SELF,&viewer));
1079566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushSynchronized(viewer));
108652f91beSJacob Faibussowitsch   for (PetscInt i = 0; i < m; ++i) {
1099566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIISynchronizedPrintf(viewer,"%" PetscInt_FMT " %d\n",i,(int)PetscBTLookup(bt,i)));
110652f91beSJacob Faibussowitsch   }
1119566063dSJacob Faibussowitsch   PetscCall(PetscViewerFlush(viewer));
1129566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopSynchronized(viewer));
113652f91beSJacob Faibussowitsch   PetscFunctionReturn(0);
114652f91beSJacob Faibussowitsch }
115652f91beSJacob Faibussowitsch #endif /* PETSCBT_H */
116