xref: /petsc/src/ksp/pc/impls/tfs/bitmask.c (revision df4cd43f92eaa320656440c40edb1046daee8f75)
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 /*********************************bit_mask.c***********************************/
19 PetscErrorCode PCTFS_bm_to_proc(char *ptr, PetscInt p_mask, PetscInt *msg_list)
20 {
21   PetscInt i, tmp;
22 
23   PetscFunctionBegin;
24   if (msg_list) {
25     /* low to high */
26     ptr += (p_mask - 1);
27     for (i = p_mask - 1; i >= 0; i--) {
28       tmp = BYTE * (p_mask - i - 1);
29       if (*ptr & BIT_0) {
30         *msg_list = tmp;
31         msg_list++;
32       }
33       if (*ptr & BIT_1) {
34         *msg_list = tmp + 1;
35         msg_list++;
36       }
37       if (*ptr & BIT_2) {
38         *msg_list = tmp + 2;
39         msg_list++;
40       }
41       if (*ptr & BIT_3) {
42         *msg_list = tmp + 3;
43         msg_list++;
44       }
45       if (*ptr & BIT_4) {
46         *msg_list = tmp + 4;
47         msg_list++;
48       }
49       if (*ptr & BIT_5) {
50         *msg_list = tmp + 5;
51         msg_list++;
52       }
53       if (*ptr & BIT_6) {
54         *msg_list = tmp + 6;
55         msg_list++;
56       }
57       if (*ptr & BIT_7) {
58         *msg_list = tmp + 7;
59         msg_list++;
60       }
61       ptr--;
62     }
63   }
64   PetscFunctionReturn(PETSC_SUCCESS);
65 }
66 
67 /*********************************bit_mask.c***********************************/
68 PetscInt PCTFS_ct_bits(char *ptr, PetscInt n)
69 {
70   PetscInt i, tmp = 0;
71 
72   for (i = 0; i < n; i++) {
73     if (*ptr & 128) tmp++;
74     if (*ptr & 64) tmp++;
75     if (*ptr & 32) tmp++;
76     if (*ptr & 16) tmp++;
77     if (*ptr & 8) tmp++;
78     if (*ptr & 4) tmp++;
79     if (*ptr & 2) tmp++;
80     if (*ptr & 1) tmp++;
81     ptr++;
82   }
83   return (tmp);
84 }
85 
86 /*********************************bit_mask.c***********************************/
87 PetscInt PCTFS_div_ceil(PetscInt numer, PetscInt denom)
88 {
89   if ((numer < 0) || (denom <= 0)) SETERRABORT(PETSC_COMM_SELF, PETSC_ERR_PLIB, "PCTFS_div_ceil() :: numer=%" PetscInt_FMT " ! >=0, denom=%" PetscInt_FMT " ! >0", numer, denom);
90   return (PetscCeilInt(numer, denom));
91 }
92 
93 /*********************************bit_mask.c***********************************/
94 PetscInt PCTFS_len_bit_mask(PetscInt num_items)
95 {
96   PetscInt rt_val, tmp;
97 
98   PetscCheck(num_items >= 0, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Value Sent To PCTFS_len_bit_mask() Must be >= 0!");
99 
100   rt_val = PetscCeilInt(num_items, BYTE);
101   /* make multiple of sizeof PetscInt */
102   if ((tmp = rt_val % sizeof(PetscInt))) rt_val += (sizeof(PetscInt) - tmp);
103   return (rt_val);
104 }
105 
106 /*********************************bit_mask.c***********************************/
107 PetscErrorCode PCTFS_set_bit_mask(PetscInt *bm, PetscInt len, PetscInt val)
108 {
109   PetscInt i, offset;
110   char     mask = 1;
111   char    *cptr;
112 
113   PetscFunctionBegin;
114   PetscCheck(PCTFS_len_bit_mask(val) <= len, PETSC_COMM_SELF, PETSC_ERR_PLIB, "The Bit Mask Isn't That Large!");
115 
116   cptr = (char *)bm;
117 
118   offset = len / sizeof(PetscInt);
119   for (i = 0; i < offset; i++) {
120     *bm = 0;
121     bm++;
122   }
123 
124   offset = val % BYTE;
125   for (i = 0; i < offset; i++) mask <<= 1;
126 
127   offset       = len - val / BYTE - 1;
128   cptr[offset] = mask;
129   PetscFunctionReturn(PETSC_SUCCESS);
130 }
131 
132 /*********************************bit_mask.c***********************************/
133 PetscInt PCTFS_len_buf(PetscInt item_size, PetscInt num_items)
134 {
135   PetscInt rt_val, tmp;
136 
137   rt_val = item_size * num_items;
138 
139   /*  double precision align for now ... consider page later */
140   if ((tmp = (rt_val % (PetscInt)sizeof(double)))) rt_val += (sizeof(double) - tmp);
141   return (rt_val);
142 }
143