xref: /petsc/include/petscbt.h (revision 6497c311e7b976d467be1503c1effce92a60525c)
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 */
11*6497c311SBarry 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 
16*6497c311SBarry Smith static inline char PetscBTMask_Internal(PetscCount index)
17d71ae5a4SJacob Faibussowitsch {
18d00ed860SLisandro Dalcin   return (char)(1 << index % PETSC_BITS_PER_BYTE);
19652f91beSJacob Faibussowitsch }
20652f91beSJacob Faibussowitsch 
21*6497c311SBarry 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 
26*6497c311SBarry 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 
36*6497c311SBarry Smith static inline PetscErrorCode PetscBTCreate(PetscCount m, PetscBT *array)
37d71ae5a4SJacob Faibussowitsch {
38652f91beSJacob Faibussowitsch   return PetscCalloc1(PetscBTLength(m), array);
3953b8de81SBarry Smith }
4053b8de81SBarry Smith 
41*6497c311SBarry Smith static inline char PetscBTLookup(PetscBT array, PetscCount index)
42d71ae5a4SJacob Faibussowitsch {
43652f91beSJacob Faibussowitsch   return array[PetscBTIndex_Internal(index)] & PetscBTMask_Internal(index);
4453b8de81SBarry Smith }
4553b8de81SBarry Smith 
46*6497c311SBarry Smith static inline PetscErrorCode PetscBTSet(PetscBT array, PetscCount index)
47d71ae5a4SJacob Faibussowitsch {
48652f91beSJacob Faibussowitsch   PetscFunctionBegin;
49652f91beSJacob Faibussowitsch   array[PetscBTIndex_Internal(index)] |= PetscBTMask_Internal(index);
503ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5153b8de81SBarry Smith }
5253b8de81SBarry Smith 
53*6497c311SBarry Smith static inline PetscErrorCode PetscBTNegate(PetscBT array, PetscCount index)
54d71ae5a4SJacob Faibussowitsch {
55652f91beSJacob Faibussowitsch   PetscFunctionBegin;
56652f91beSJacob Faibussowitsch   array[PetscBTIndex_Internal(index)] ^= PetscBTMask_Internal(index);
573ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5831b932fcSLisandro Dalcin }
5931b932fcSLisandro Dalcin 
60*6497c311SBarry Smith static inline PetscErrorCode PetscBTClear(PetscBT array, PetscCount index)
61d71ae5a4SJacob Faibussowitsch {
62652f91beSJacob Faibussowitsch   PetscFunctionBegin;
63090438c4SLisandro Dalcin   array[PetscBTIndex_Internal(index)] &= (char)~PetscBTMask_Internal(index);
643ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6553b8de81SBarry Smith }
6653b8de81SBarry Smith 
67*6497c311SBarry Smith static inline char PetscBTLookupSet(PetscBT array, PetscCount index)
68d71ae5a4SJacob Faibussowitsch {
69652f91beSJacob Faibussowitsch   const char ret = PetscBTLookup(array, index);
709566063dSJacob Faibussowitsch   PetscCallContinue(PetscBTSet(array, index));
71652f91beSJacob Faibussowitsch   return ret;
72652f91beSJacob Faibussowitsch }
73652f91beSJacob Faibussowitsch 
74*6497c311SBarry Smith static inline char PetscBTLookupClear(PetscBT array, PetscCount index)
75d71ae5a4SJacob Faibussowitsch {
76652f91beSJacob Faibussowitsch   const char ret = PetscBTLookup(array, index);
779566063dSJacob Faibussowitsch   PetscCallContinue(PetscBTClear(array, index));
78652f91beSJacob Faibussowitsch   return ret;
79652f91beSJacob Faibussowitsch }
80652f91beSJacob Faibussowitsch 
81*6497c311SBarry Smith PETSC_EXTERN PetscErrorCode PetscBTView(PetscCount, const PetscBT, PetscViewer);
82