xref: /petsc/include/petscbt.h (revision 9d633c0cde20a0e03f0abbd74b371d1494a653e1)
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 */
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 
166497c311SBarry Smith static inline char PetscBTMask_Internal(PetscCount index)
17d71ae5a4SJacob Faibussowitsch {
18d00ed860SLisandro Dalcin   return (char)(1 << index % PETSC_BITS_PER_BYTE);
19652f91beSJacob Faibussowitsch }
20652f91beSJacob Faibussowitsch 
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 
266497c311SBarry Smith static inline PetscErrorCode PetscBTMemzero(PetscCount m, PetscBT array)
27d71ae5a4SJacob Faibussowitsch {
28652f91beSJacob Faibussowitsch   return PetscArrayzero(array, PetscBTLength(m));
2953b8de81SBarry Smith }
303b71518fSBarry Smith 
31d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscBTDestroy(PetscBT *array)
32d71ae5a4SJacob Faibussowitsch {
333ba16761SJacob Faibussowitsch   return (*array) ? PetscFree(*array) : PETSC_SUCCESS;
3453b8de81SBarry Smith }
35ca71c51bSBarry Smith 
366497c311SBarry Smith static inline PetscErrorCode PetscBTCreate(PetscCount m, PetscBT *array)
37d71ae5a4SJacob Faibussowitsch {
38652f91beSJacob Faibussowitsch   return PetscCalloc1(PetscBTLength(m), array);
3953b8de81SBarry Smith }
4053b8de81SBarry Smith 
41*9d633c0cSMatthew G. Knepley static inline PetscErrorCode PetscBTCopy(PetscBT dest, PetscCount m, PetscBT source)
42*9d633c0cSMatthew G. Knepley {
43*9d633c0cSMatthew G. Knepley   return PetscArraycpy(dest, source, PetscBTLength(m));
44*9d633c0cSMatthew G. Knepley }
45*9d633c0cSMatthew G. Knepley 
466497c311SBarry Smith static inline char PetscBTLookup(PetscBT array, PetscCount index)
47d71ae5a4SJacob Faibussowitsch {
48652f91beSJacob Faibussowitsch   return array[PetscBTIndex_Internal(index)] & PetscBTMask_Internal(index);
4953b8de81SBarry Smith }
5053b8de81SBarry Smith 
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 
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 
656497c311SBarry Smith static inline PetscErrorCode PetscBTClear(PetscBT array, PetscCount index)
66d71ae5a4SJacob Faibussowitsch {
67652f91beSJacob Faibussowitsch   PetscFunctionBegin;
68090438c4SLisandro Dalcin   array[PetscBTIndex_Internal(index)] &= (char)~PetscBTMask_Internal(index);
693ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7053b8de81SBarry Smith }
7153b8de81SBarry Smith 
726497c311SBarry Smith static inline char PetscBTLookupSet(PetscBT array, PetscCount index)
73d71ae5a4SJacob Faibussowitsch {
74652f91beSJacob Faibussowitsch   const char ret = PetscBTLookup(array, index);
759566063dSJacob Faibussowitsch   PetscCallContinue(PetscBTSet(array, index));
76652f91beSJacob Faibussowitsch   return ret;
77652f91beSJacob Faibussowitsch }
78652f91beSJacob Faibussowitsch 
796497c311SBarry Smith static inline char PetscBTLookupClear(PetscBT array, PetscCount index)
80d71ae5a4SJacob Faibussowitsch {
81652f91beSJacob Faibussowitsch   const char ret = PetscBTLookup(array, index);
829566063dSJacob Faibussowitsch   PetscCallContinue(PetscBTClear(array, index));
83652f91beSJacob Faibussowitsch   return ret;
84652f91beSJacob Faibussowitsch }
85652f91beSJacob Faibussowitsch 
866497c311SBarry Smith PETSC_EXTERN PetscErrorCode PetscBTView(PetscCount, const PetscBT, PetscViewer);
87