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