1 #pragma once 2 3 #include <petscsystypes.h> 4 #include <petscviewertypes.h> 5 #include <petscstring.h> 6 7 /* SUBMANSEC = Sys */ 8 9 /* convert an index i to an index suitable for indexing a PetscBT, such that 10 * bt[PetscBTIndex(i)] returns the i'th value of the bt */ 11 static inline size_t PetscBTIndex_Internal(PetscCount index) 12 { 13 return (size_t)index / PETSC_BITS_PER_BYTE; 14 } 15 16 static inline char PetscBTMask_Internal(PetscCount index) 17 { 18 return (char)(1 << index % PETSC_BITS_PER_BYTE); 19 } 20 21 static inline size_t PetscBTLength(PetscCount m) 22 { 23 return (size_t)m / PETSC_BITS_PER_BYTE + 1; 24 } 25 26 static inline PetscErrorCode PetscBTMemzero(PetscCount m, PetscBT array) 27 { 28 return PetscArrayzero(array, PetscBTLength(m)); 29 } 30 31 static inline PetscErrorCode PetscBTDestroy(PetscBT *array) 32 { 33 return (*array) ? PetscFree(*array) : PETSC_SUCCESS; 34 } 35 36 static inline PetscErrorCode PetscBTCreate(PetscCount m, PetscBT *array) 37 { 38 return PetscCalloc1(PetscBTLength(m), array); 39 } 40 41 static inline PetscErrorCode PetscBTCopy(PetscBT dest, PetscCount m, PetscBT source) 42 { 43 return PetscArraycpy(dest, source, PetscBTLength(m)); 44 } 45 46 static inline char PetscBTLookup(PetscBT array, PetscCount index) 47 { 48 return array[PetscBTIndex_Internal(index)] & PetscBTMask_Internal(index); 49 } 50 51 static inline PetscErrorCode PetscBTSet(PetscBT array, PetscCount index) 52 { 53 PetscFunctionBegin; 54 array[PetscBTIndex_Internal(index)] |= PetscBTMask_Internal(index); 55 PetscFunctionReturn(PETSC_SUCCESS); 56 } 57 58 static inline PetscErrorCode PetscBTNegate(PetscBT array, PetscCount index) 59 { 60 PetscFunctionBegin; 61 array[PetscBTIndex_Internal(index)] ^= PetscBTMask_Internal(index); 62 PetscFunctionReturn(PETSC_SUCCESS); 63 } 64 65 static inline PetscErrorCode PetscBTClear(PetscBT array, PetscCount index) 66 { 67 PetscFunctionBegin; 68 array[PetscBTIndex_Internal(index)] &= (char)~PetscBTMask_Internal(index); 69 PetscFunctionReturn(PETSC_SUCCESS); 70 } 71 72 static inline char PetscBTLookupSet(PetscBT array, PetscCount index) 73 { 74 const char ret = PetscBTLookup(array, index); 75 PetscCallContinue(PetscBTSet(array, index)); 76 return ret; 77 } 78 79 static inline char PetscBTLookupClear(PetscBT array, PetscCount index) 80 { 81 const char ret = PetscBTLookup(array, index); 82 PetscCallContinue(PetscBTClear(array, index)); 83 return ret; 84 } 85 86 PETSC_EXTERN PetscErrorCode PetscBTView(PetscCount, const PetscBT, PetscViewer); 87