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