xref: /petsc/src/ksp/pc/impls/tfs/bitmask.c (revision 2205254efee3a00a594e5e2a3a70f74dcb40bc03)
1 
2 /********************************bit_mask.c************************************
3 
4 Author: Henry M. Tufo III
5 
6 e-mail: hmt@cs.brown.edu
7 
8 snail-mail:
9 Division of Applied Mathematics
10 Brown University
11 Providence, RI 02912
12 
13 Last Modification:
14 11.21.97
15 *********************************bit_mask.c***********************************/
16 #include <../src/ksp/pc/impls/tfs/tfs.h>
17 
18 
19 /*********************************bit_mask.c***********************************/
20 PetscErrorCode PCTFS_bm_to_proc(char *ptr, PetscInt p_mask,  PetscInt *msg_list)
21 {
22   PetscInt i, tmp;
23 
24   PetscFunctionBegin;
25   if (msg_list) {
26     /* low to high */
27     ptr+=(p_mask-1);
28     for (i=p_mask-1;i>=0;i--) {
29       tmp = BYTE*(p_mask-i-1);
30       if (*ptr&BIT_0) {
31         *msg_list = tmp; msg_list++;
32       }
33       if (*ptr&BIT_1) {
34         *msg_list = tmp+1; msg_list++;
35       }
36       if (*ptr&BIT_2) {
37         *msg_list = tmp+2; msg_list++;
38       }
39       if (*ptr&BIT_3) {
40         *msg_list = tmp+3; msg_list++;
41       }
42       if (*ptr&BIT_4) {
43         *msg_list = tmp+4; msg_list++;
44       }
45       if (*ptr&BIT_5) {
46         *msg_list = tmp+5; msg_list++;
47       }
48       if (*ptr&BIT_6) {
49         *msg_list = tmp+6; msg_list++;
50       }
51       if (*ptr&BIT_7) {
52         *msg_list = tmp+7; msg_list++;
53       }
54       ptr--;
55     }
56   }
57   PetscFunctionReturn(0);
58 }
59 
60 /*********************************bit_mask.c***********************************/
61 PetscInt PCTFS_ct_bits(char *ptr, PetscInt n)
62 {
63   PetscInt i, tmp=0;
64 
65   PetscFunctionBegin;
66   for (i=0;i<n;i++) {
67     if (*ptr&128) tmp++;
68     if (*ptr&64)  tmp++;
69     if (*ptr&32)  tmp++;
70     if (*ptr&16)  tmp++;
71     if (*ptr&8)   tmp++;
72     if (*ptr&4)   tmp++;
73     if (*ptr&2)   tmp++;
74     if (*ptr&1)   tmp++;
75     ptr++;
76   }
77 
78   return(tmp);
79 }
80 
81 /*********************************bit_mask.c***********************************/
82 PetscInt PCTFS_div_ceil(PetscInt numer,  PetscInt denom)
83 {
84   PetscInt rt_val;
85 
86   if ((numer<0)||(denom<=0)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_div_ceil() :: numer=%D ! >=0, denom=%D ! >0",numer,denom);
87 
88   /* if integer division remainder then increment */
89   rt_val = numer/denom;
90   if (numer%denom) rt_val++;
91   return(rt_val);
92 }
93 
94 /*********************************bit_mask.c***********************************/
95 PetscInt PCTFS_len_bit_mask(PetscInt num_items)
96 {
97   PetscInt rt_val, tmp;
98 
99   if (num_items<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Value Sent To PCTFS_len_bit_mask() Must be >= 0!");
100 
101   /* mod BYTE ceiling function */
102   rt_val = num_items/BYTE;
103   if (num_items%BYTE) rt_val++;
104   /* make mults of sizeof int */
105   if ((tmp=rt_val%sizeof(PetscInt))) rt_val+=(sizeof(PetscInt)-tmp);
106   return(rt_val);
107 }
108 
109 /*********************************bit_mask.c***********************************/
110 PetscErrorCode PCTFS_set_bit_mask(PetscInt *bm, PetscInt len, PetscInt val)
111 {
112   PetscInt i, offset;
113   char     mask = 1;
114   char     *cptr;
115 
116   if (PCTFS_len_bit_mask(val)>len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"The Bit Mask Isn't That Large!");
117 
118   cptr = (char*) bm;
119 
120   offset = len/sizeof(PetscInt);
121   for (i=0; i<offset; i++) {
122     *bm=0;
123     bm++;
124   }
125 
126   offset = val%BYTE;
127   for (i=0;i<offset;i++) {
128     mask <<= 1;
129   }
130 
131   offset       = len - val/BYTE - 1;
132   cptr[offset] = mask;
133   PetscFunctionReturn(0);
134 }
135 
136 /*********************************bit_mask.c***********************************/
137 PetscInt PCTFS_len_buf(PetscInt item_size, PetscInt num_items)
138 {
139   PetscInt rt_val, tmp;
140 
141   PetscFunctionBegin;
142   rt_val = item_size * num_items;
143 
144   /*  double precision align for now ... consider page later */
145   if ((tmp = (rt_val%(PetscInt)sizeof(double)))) rt_val += (sizeof(double) - tmp);
146   return(rt_val);
147 }
148 
149 
150 
151