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