xref: /petsc/include/petscbt.h (revision 2235c4e21094f57f73a5851b0c05b8ecf6dffc6d)
1a4963045SJacob Faibussowitsch #pragma once
219fee000SSatish Balay 
3778ae69aSToby Isaac #include <petscsystypes.h>
4778ae69aSToby Isaac #include <petscviewertypes.h>
5778ae69aSToby Isaac #include <petscstring.h>
66420c192SJed Brown 
7ac09b921SBarry Smith /* SUBMANSEC = Sys */
8ac09b921SBarry Smith 
9652f91beSJacob Faibussowitsch /* convert an index i to an index suitable for indexing a PetscBT, such that
10652f91beSJacob Faibussowitsch  * bt[PetscBTIndex(i)] returns the i'th value of the bt */
PetscBTIndex_Internal(PetscCount index)116497c311SBarry Smith static inline size_t PetscBTIndex_Internal(PetscCount index)
12d71ae5a4SJacob Faibussowitsch {
13c133393eSBarry Smith   return (size_t)index / PETSC_BITS_PER_BYTE;
14652f91beSJacob Faibussowitsch }
15652f91beSJacob Faibussowitsch 
PetscBTMask_Internal(PetscCount index)16*73bc78fdSLisandro Dalcin static inline PetscByte PetscBTMask_Internal(PetscCount index)
17d71ae5a4SJacob Faibussowitsch {
18*73bc78fdSLisandro Dalcin   return (PetscByte)(1 << index % PETSC_BITS_PER_BYTE);
19652f91beSJacob Faibussowitsch }
20652f91beSJacob Faibussowitsch 
PetscBTLength(PetscCount m)216497c311SBarry Smith static inline size_t PetscBTLength(PetscCount m)
22d71ae5a4SJacob Faibussowitsch {
23c133393eSBarry Smith   return (size_t)m / PETSC_BITS_PER_BYTE + 1;
2453b8de81SBarry Smith }
2582502324SSatish Balay 
PetscBTMemzero(PetscCount m,PetscBT array)266497c311SBarry Smith static inline PetscErrorCode PetscBTMemzero(PetscCount m, PetscBT array)
27d71ae5a4SJacob Faibussowitsch {
28652f91beSJacob Faibussowitsch   return PetscArrayzero(array, PetscBTLength(m));
2953b8de81SBarry Smith }
303b71518fSBarry Smith 
PetscBTDestroy(PetscBT * array)31d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscBTDestroy(PetscBT *array)
32d71ae5a4SJacob Faibussowitsch {
333ba16761SJacob Faibussowitsch   return (*array) ? PetscFree(*array) : PETSC_SUCCESS;
3453b8de81SBarry Smith }
35ca71c51bSBarry Smith 
PetscBTCreate(PetscCount m,PetscBT * array)366497c311SBarry Smith static inline PetscErrorCode PetscBTCreate(PetscCount m, PetscBT *array)
37d71ae5a4SJacob Faibussowitsch {
38652f91beSJacob Faibussowitsch   return PetscCalloc1(PetscBTLength(m), array);
3953b8de81SBarry Smith }
4053b8de81SBarry Smith 
PetscBTCopy(PetscBT dest,PetscCount m,PetscBT source)419d633c0cSMatthew G. Knepley static inline PetscErrorCode PetscBTCopy(PetscBT dest, PetscCount m, PetscBT source)
429d633c0cSMatthew G. Knepley {
439d633c0cSMatthew G. Knepley   return PetscArraycpy(dest, source, PetscBTLength(m));
449d633c0cSMatthew G. Knepley }
459d633c0cSMatthew G. Knepley 
PetscBTLookup(PetscBT array,PetscCount index)46*73bc78fdSLisandro Dalcin static inline PetscByte PetscBTLookup(PetscBT array, PetscCount index)
47d71ae5a4SJacob Faibussowitsch {
48652f91beSJacob Faibussowitsch   return array[PetscBTIndex_Internal(index)] & PetscBTMask_Internal(index);
4953b8de81SBarry Smith }
5053b8de81SBarry Smith 
PetscBTSet(PetscBT array,PetscCount index)516497c311SBarry Smith static inline PetscErrorCode PetscBTSet(PetscBT array, PetscCount index)
52d71ae5a4SJacob Faibussowitsch {
53652f91beSJacob Faibussowitsch   PetscFunctionBegin;
54652f91beSJacob Faibussowitsch   array[PetscBTIndex_Internal(index)] |= PetscBTMask_Internal(index);
553ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5653b8de81SBarry Smith }
5753b8de81SBarry Smith 
PetscBTNegate(PetscBT array,PetscCount index)586497c311SBarry Smith static inline PetscErrorCode PetscBTNegate(PetscBT array, PetscCount index)
59d71ae5a4SJacob Faibussowitsch {
60652f91beSJacob Faibussowitsch   PetscFunctionBegin;
61652f91beSJacob Faibussowitsch   array[PetscBTIndex_Internal(index)] ^= PetscBTMask_Internal(index);
623ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6331b932fcSLisandro Dalcin }
6431b932fcSLisandro Dalcin 
PetscBTClear(PetscBT array,PetscCount index)656497c311SBarry Smith static inline PetscErrorCode PetscBTClear(PetscBT array, PetscCount index)
66d71ae5a4SJacob Faibussowitsch {
67652f91beSJacob Faibussowitsch   PetscFunctionBegin;
68*73bc78fdSLisandro Dalcin   array[PetscBTIndex_Internal(index)] &= (PetscByte)~PetscBTMask_Internal(index);
693ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7053b8de81SBarry Smith }
7153b8de81SBarry Smith 
PetscBTLookupSet(PetscBT array,PetscCount index)72*73bc78fdSLisandro Dalcin static inline PetscByte PetscBTLookupSet(PetscBT array, PetscCount index)
73d71ae5a4SJacob Faibussowitsch {
74*73bc78fdSLisandro Dalcin   const PetscByte ret = PetscBTLookup(array, index);
759566063dSJacob Faibussowitsch   PetscCallContinue(PetscBTSet(array, index));
76652f91beSJacob Faibussowitsch   return ret;
77652f91beSJacob Faibussowitsch }
78652f91beSJacob Faibussowitsch 
PetscBTLookupClear(PetscBT array,PetscCount index)79*73bc78fdSLisandro Dalcin static inline PetscByte PetscBTLookupClear(PetscBT array, PetscCount index)
80d71ae5a4SJacob Faibussowitsch {
81*73bc78fdSLisandro Dalcin   const PetscByte ret = PetscBTLookup(array, index);
829566063dSJacob Faibussowitsch   PetscCallContinue(PetscBTClear(array, index));
83652f91beSJacob Faibussowitsch   return ret;
84652f91beSJacob Faibussowitsch }
85652f91beSJacob Faibussowitsch 
PetscBTCountSet(PetscBT array,PetscCount m)869844c891SJames Wright static inline PetscCount PetscBTCountSet(PetscBT array, PetscCount m)
879844c891SJames Wright {
889844c891SJames Wright   PetscCount cnt = 0;
899844c891SJames Wright   for (size_t j = 0; j < PetscBTLength(m); j++) {
90*73bc78fdSLisandro Dalcin     PetscByte       byte = array[j];
91*73bc78fdSLisandro Dalcin     const PetscByte c1   = 0x55;
92*73bc78fdSLisandro Dalcin     const PetscByte c2   = 0x33;
93*73bc78fdSLisandro Dalcin     const PetscByte c4   = 0x0F;
949844c891SJames Wright 
959844c891SJames Wright     byte -= (byte >> 1) & c1;
969844c891SJames Wright     byte = ((byte >> 2) & c2) + (byte & c2);
979844c891SJames Wright     cnt += (byte + (byte >> 4)) & c4;
989844c891SJames Wright   }
999844c891SJames Wright   return cnt;
1009844c891SJames Wright }
1019844c891SJames Wright 
1026497c311SBarry Smith PETSC_EXTERN PetscErrorCode PetscBTView(PetscCount, const PetscBT, PetscViewer);
103