xref: /petsc/src/ksp/pc/impls/tfs/bitmask.c (revision 7d5fd1e4d9337468ad3f05b65b7facdcd2dfd2a4)
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; msg_list++;
31       }
32       if (*ptr&BIT_1) {
33         *msg_list = tmp+1; msg_list++;
34       }
35       if (*ptr&BIT_2) {
36         *msg_list = tmp+2; msg_list++;
37       }
38       if (*ptr&BIT_3) {
39         *msg_list = tmp+3; msg_list++;
40       }
41       if (*ptr&BIT_4) {
42         *msg_list = tmp+4; msg_list++;
43       }
44       if (*ptr&BIT_5) {
45         *msg_list = tmp+5; msg_list++;
46       }
47       if (*ptr&BIT_6) {
48         *msg_list = tmp+6; msg_list++;
49       }
50       if (*ptr&BIT_7) {
51         *msg_list = tmp+7; msg_list++;
52       }
53       ptr--;
54     }
55   }
56   PetscFunctionReturn(0);
57 }
58 
59 /*********************************bit_mask.c***********************************/
60 PetscInt PCTFS_ct_bits(char *ptr, PetscInt n)
61 {
62   PetscInt i, tmp=0;
63 
64   for (i=0;i<n;i++) {
65     if (*ptr&128) tmp++;
66     if (*ptr&64)  tmp++;
67     if (*ptr&32)  tmp++;
68     if (*ptr&16)  tmp++;
69     if (*ptr&8)   tmp++;
70     if (*ptr&4)   tmp++;
71     if (*ptr&2)   tmp++;
72     if (*ptr&1)   tmp++;
73     ptr++;
74   }
75   return(tmp);
76 }
77 
78 /*********************************bit_mask.c***********************************/
79 PetscInt PCTFS_div_ceil(PetscInt numer,  PetscInt denom)
80 {
81   PetscInt rt_val;
82 
83   if ((numer<0)||(denom<=0)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_div_ceil() :: numer=%D ! >=0, denom=%D ! >0",numer,denom);
84 
85   /* if integer division remainder then increment */
86   rt_val = numer/denom;
87   if (numer%denom) rt_val++;
88   return(rt_val);
89 }
90 
91 /*********************************bit_mask.c***********************************/
92 PetscInt PCTFS_len_bit_mask(PetscInt num_items)
93 {
94   PetscInt rt_val, tmp;
95 
96   if (num_items<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Value Sent To PCTFS_len_bit_mask() Must be >= 0!");
97 
98   /* mod BYTE ceiling function */
99   rt_val = num_items/BYTE;
100   if (num_items%BYTE) rt_val++;
101   /* make mults of sizeof int */
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   if (PCTFS_len_bit_mask(val)>len) SETERRQ(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++) {
126     mask <<= 1;
127   }
128 
129   offset       = len - val/BYTE - 1;
130   cptr[offset] = mask;
131   PetscFunctionReturn(0);
132 }
133 
134 /*********************************bit_mask.c***********************************/
135 PetscInt PCTFS_len_buf(PetscInt item_size, PetscInt num_items)
136 {
137   PetscInt rt_val, tmp;
138 
139   rt_val = item_size * num_items;
140 
141   /*  double precision align for now ... consider page later */
142   if ((tmp = (rt_val%(PetscInt)sizeof(double)))) rt_val += (sizeof(double) - tmp);
143   return(rt_val);
144 }
145 
146