xref: /petsc/include/petscbt.h (revision d20b5d95fb5ed4c01fb0da19d63ae2a035fb24e8)
1 
2 #if !defined(__PETSCBT_H)
3 #define __PETSCBT_H
4 PETSC_EXTERN_CXX_BEGIN
5 
6 /*S
7      PetscBT - PETSc bitarrays
8 
9      Level: advanced
10 
11      PetscBTCreate(m,&bt)       - creates a bit array with enough room to hold m values
12      PetscBTDestroy(&bt)        - destroys the bit array
13      PetscBTMemzero(m,bt)       - zeros the entire bit array (sets all values to false)
14      PetscBTSet(bt,index)       - sets a particular entry as true
15      PetscBTClear(bt,index)     - sets a particular entry as false
16      PetscBTLookup(bt,index)    - returns the value
17      PetscBTLookupSet(bt,index) - returns the value and then sets it true
18      PetscBTLength(m)           - returns number of bytes in array with m bits
19      PetscBTView(m,bt,viewer)   - prints all the entries in a bit array
20 
21     We do not currently check error flags on PetscBTSet(), PetscBTClear(), PetscBTLookup(),
22     PetcBTLookupSet(), PetscBTLength() cause error checking would cost hundreds more cycles then
23     the operation.
24 
25 S*/
26 typedef char* PetscBT;
27 
28 
29 PETSC_STATIC_INLINE PetscInt  PetscBTLength(PetscInt m)
30 {
31   return  ((m)/PETSC_BITS_PER_BYTE+1);
32 }
33 
34 PETSC_STATIC_INLINE PetscErrorCode PetscBTMemzero(PetscInt m,PetscBT array)
35 {
36   return PetscMemzero(array,sizeof(char)*((m)/PETSC_BITS_PER_BYTE+1));
37 }
38 
39 PETSC_STATIC_INLINE PetscErrorCode PetscBTDestroy(PetscBT *array)
40 {
41   return PetscFree(*array);
42 }
43 
44 PETSC_STATIC_INLINE char PetscBTLookup(PetscBT array,PetscInt index)
45 {
46   char      BT_mask,BT_c;
47   PetscInt  BT_idx;
48 
49  return  (BT_idx        = (index)/PETSC_BITS_PER_BYTE,
50           BT_c          = array[BT_idx],
51           BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE),
52           BT_c & BT_mask);
53 }
54 
55 PETSC_STATIC_INLINE PetscErrorCode PetscBTView(PetscInt m,const PetscBT bt,PetscViewer viewer)
56 {
57   PetscInt       i;
58   PetscErrorCode ierr;
59 
60   if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF;
61   ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_TRUE);CHKERRQ(ierr);
62   for (i=0; i<m; i++) {
63     ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%D %d\n",i,PetscBTLookup(bt,i));CHKERRQ(ierr);
64   }
65   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
66   ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_FALSE);CHKERRQ(ierr);
67   return 0;
68 }
69 
70 PETSC_STATIC_INLINE PetscErrorCode PetscBTCreate(PetscInt m,PetscBT *array)
71 {
72   return (PetscMalloc(((m)/PETSC_BITS_PER_BYTE+1)*sizeof(char),array) || PetscBTMemzero(m,*array));
73 }
74 
75 PETSC_STATIC_INLINE char PetscBTLookupSet(PetscBT array,PetscInt index)
76 {
77   char      BT_mask,BT_c;
78   PetscInt  BT_idx;
79 
80   return (BT_idx        = (index)/PETSC_BITS_PER_BYTE,
81           BT_c          = array[BT_idx],
82           BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE),
83           array[BT_idx] = BT_c | BT_mask,
84           BT_c & BT_mask);
85 }
86 
87 PETSC_STATIC_INLINE PetscErrorCode PetscBTSet(PetscBT array,PetscInt index)
88 {
89   char      BT_mask,BT_c;
90   PetscInt  BT_idx;
91 
92   BT_idx        = (index)/PETSC_BITS_PER_BYTE;
93   BT_c          = array[BT_idx];
94   BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE);
95   array[BT_idx] = BT_c | BT_mask;
96   return 0;
97 }
98 
99 PETSC_STATIC_INLINE PetscErrorCode PetscBTClear(PetscBT array,PetscInt index)
100 {
101   char      BT_mask,BT_c;
102   PetscInt  BT_idx;
103 
104   BT_idx        = (index)/PETSC_BITS_PER_BYTE;
105   BT_c          = array[BT_idx];
106   BT_mask       = (char)1 << ((index)%PETSC_BITS_PER_BYTE);
107   array[BT_idx] = BT_c & (~BT_mask);
108  return 0;
109 }
110 
111 
112 PETSC_EXTERN_CXX_END
113 #endif
114