xref: /petsc/include/petscbt.h (revision 778ae69a1fc7b9ce4f97d59a15da539c98b45420)
1652f91beSJacob Faibussowitsch #ifndef PETSCBT_H
226bd1501SBarry Smith #define PETSCBT_H
319fee000SSatish Balay 
4*778ae69aSToby Isaac #include <petscsystypes.h>
5*778ae69aSToby Isaac #include <petscviewertypes.h>
6*778ae69aSToby Isaac #include <petscstring.h>
76420c192SJed Brown 
8ac09b921SBarry Smith /* SUBMANSEC = Sys */
9ac09b921SBarry Smith 
10652f91beSJacob Faibussowitsch /* convert an index i to an index suitable for indexing a PetscBT, such that
11652f91beSJacob Faibussowitsch  * bt[PetscBTIndex(i)] returns the i'th value of the bt */
12d71ae5a4SJacob Faibussowitsch static inline size_t PetscBTIndex_Internal(PetscInt index)
13d71ae5a4SJacob Faibussowitsch {
14c133393eSBarry Smith   return (size_t)index / PETSC_BITS_PER_BYTE;
15652f91beSJacob Faibussowitsch }
16652f91beSJacob Faibussowitsch 
17d71ae5a4SJacob Faibussowitsch static inline char PetscBTMask_Internal(PetscInt index)
18d71ae5a4SJacob Faibussowitsch {
19d00ed860SLisandro Dalcin   return (char)(1 << index % PETSC_BITS_PER_BYTE);
20652f91beSJacob Faibussowitsch }
21652f91beSJacob Faibussowitsch 
22d71ae5a4SJacob Faibussowitsch static inline size_t PetscBTLength(PetscInt m)
23d71ae5a4SJacob Faibussowitsch {
24c133393eSBarry Smith   return (size_t)m / PETSC_BITS_PER_BYTE + 1;
2553b8de81SBarry Smith }
2682502324SSatish Balay 
27d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscBTMemzero(PetscInt m, PetscBT array)
28d71ae5a4SJacob Faibussowitsch {
29652f91beSJacob Faibussowitsch   return PetscArrayzero(array, PetscBTLength(m));
3053b8de81SBarry Smith }
313b71518fSBarry Smith 
32d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscBTDestroy(PetscBT *array)
33d71ae5a4SJacob Faibussowitsch {
343ba16761SJacob Faibussowitsch   return (*array) ? PetscFree(*array) : PETSC_SUCCESS;
3553b8de81SBarry Smith }
36ca71c51bSBarry Smith 
37d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscBTCreate(PetscInt m, PetscBT *array)
38d71ae5a4SJacob Faibussowitsch {
39652f91beSJacob Faibussowitsch   return PetscCalloc1(PetscBTLength(m), array);
4053b8de81SBarry Smith }
4153b8de81SBarry Smith 
42d71ae5a4SJacob Faibussowitsch static inline char PetscBTLookup(PetscBT array, PetscInt index)
43d71ae5a4SJacob Faibussowitsch {
44652f91beSJacob Faibussowitsch   return array[PetscBTIndex_Internal(index)] & PetscBTMask_Internal(index);
4553b8de81SBarry Smith }
4653b8de81SBarry Smith 
47d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscBTSet(PetscBT array, PetscInt index)
48d71ae5a4SJacob Faibussowitsch {
49652f91beSJacob Faibussowitsch   PetscFunctionBegin;
50652f91beSJacob Faibussowitsch   array[PetscBTIndex_Internal(index)] |= PetscBTMask_Internal(index);
513ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5253b8de81SBarry Smith }
5353b8de81SBarry Smith 
54d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscBTNegate(PetscBT array, PetscInt index)
55d71ae5a4SJacob Faibussowitsch {
56652f91beSJacob Faibussowitsch   PetscFunctionBegin;
57652f91beSJacob Faibussowitsch   array[PetscBTIndex_Internal(index)] ^= PetscBTMask_Internal(index);
583ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5931b932fcSLisandro Dalcin }
6031b932fcSLisandro Dalcin 
61d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscBTClear(PetscBT array, PetscInt index)
62d71ae5a4SJacob Faibussowitsch {
63652f91beSJacob Faibussowitsch   PetscFunctionBegin;
64090438c4SLisandro Dalcin   array[PetscBTIndex_Internal(index)] &= (char)~PetscBTMask_Internal(index);
653ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6653b8de81SBarry Smith }
6753b8de81SBarry Smith 
68d71ae5a4SJacob Faibussowitsch static inline char PetscBTLookupSet(PetscBT array, PetscInt index)
69d71ae5a4SJacob Faibussowitsch {
70652f91beSJacob Faibussowitsch   const char ret = PetscBTLookup(array, index);
719566063dSJacob Faibussowitsch   PetscCallContinue(PetscBTSet(array, index));
72652f91beSJacob Faibussowitsch   return ret;
73652f91beSJacob Faibussowitsch }
74652f91beSJacob Faibussowitsch 
75d71ae5a4SJacob Faibussowitsch static inline char PetscBTLookupClear(PetscBT array, PetscInt index)
76d71ae5a4SJacob Faibussowitsch {
77652f91beSJacob Faibussowitsch   const char ret = PetscBTLookup(array, index);
789566063dSJacob Faibussowitsch   PetscCallContinue(PetscBTClear(array, index));
79652f91beSJacob Faibussowitsch   return ret;
80652f91beSJacob Faibussowitsch }
81652f91beSJacob Faibussowitsch 
82*778ae69aSToby Isaac PETSC_EXTERN PetscErrorCode PetscBTView(PetscInt, const PetscBT, PetscViewer);
83*778ae69aSToby Isaac 
84652f91beSJacob Faibussowitsch #endif /* PETSCBT_H */
85