xref: /petsc/src/ksp/pc/impls/tfs/bitmask.c (revision ca8e9878d215fbd0d6b1ef802734bc6b1f5fa99c)
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***********************************/
20*ca8e9878SJed 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;
25a1db5e05SBarry Smith    if (msg_list)
26a1db5e05SBarry Smith     {
27a1db5e05SBarry Smith       /* low to high */
28a1db5e05SBarry Smith       ptr+=(p_mask-1);
29a1db5e05SBarry Smith       for (i=p_mask-1;i>=0;i--)
30a1db5e05SBarry Smith 	{
31a1db5e05SBarry Smith 	  tmp = BYTE*(p_mask-i-1);
32a1db5e05SBarry Smith 	  if (*ptr&BIT_0)
33a1db5e05SBarry Smith 	    {*msg_list = tmp; msg_list++;}
34a1db5e05SBarry Smith 	  if (*ptr&BIT_1)
35a1db5e05SBarry Smith 	    {*msg_list = tmp+1; msg_list++;}
36a1db5e05SBarry Smith 	  if (*ptr&BIT_2)
37a1db5e05SBarry Smith 	    {*msg_list = tmp+2; msg_list++;}
38a1db5e05SBarry Smith 	  if (*ptr&BIT_3)
39a1db5e05SBarry Smith 	    {*msg_list = tmp+3; msg_list++;}
40a1db5e05SBarry Smith 	  if (*ptr&BIT_4)
41a1db5e05SBarry Smith 	    {*msg_list = tmp+4; msg_list++;}
42a1db5e05SBarry Smith 	  if (*ptr&BIT_5)
43a1db5e05SBarry Smith 	    {*msg_list = tmp+5; msg_list++;}
44a1db5e05SBarry Smith 	  if (*ptr&BIT_6)
45a1db5e05SBarry Smith 	    {*msg_list = tmp+6; msg_list++;}
46a1db5e05SBarry Smith 	  if (*ptr&BIT_7)
47a1db5e05SBarry Smith 	    {*msg_list = tmp+7; msg_list++;}
48a1db5e05SBarry Smith 	  ptr --;
49a1db5e05SBarry Smith 	}
50a1db5e05SBarry Smith   }
51a1db5e05SBarry Smith   PetscFunctionReturn(0);
52a1db5e05SBarry Smith }
53a1db5e05SBarry Smith 
54a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/
55*ca8e9878SJed Brown PetscInt PCTFS_ct_bits( char *ptr, PetscInt n)
56a1db5e05SBarry Smith {
57a1db5e05SBarry Smith    PetscInt i, tmp=0;
58a1db5e05SBarry Smith 
59a1db5e05SBarry Smith    PetscFunctionBegin;
60a1db5e05SBarry Smith   for(i=0;i<n;i++)
61a1db5e05SBarry Smith     {
62a1db5e05SBarry Smith       if (*ptr&128) {tmp++;}
63a1db5e05SBarry Smith       if (*ptr&64)  {tmp++;}
64a1db5e05SBarry Smith       if (*ptr&32)  {tmp++;}
65a1db5e05SBarry Smith       if (*ptr&16)  {tmp++;}
66a1db5e05SBarry Smith       if (*ptr&8)   {tmp++;}
67a1db5e05SBarry Smith       if (*ptr&4)   {tmp++;}
68a1db5e05SBarry Smith       if (*ptr&2)   {tmp++;}
69a1db5e05SBarry Smith       if (*ptr&1)   {tmp++;}
70a1db5e05SBarry Smith       ptr++;
71a1db5e05SBarry Smith     }
72a1db5e05SBarry Smith 
73a1db5e05SBarry Smith   return(tmp);
74a1db5e05SBarry Smith }
75a1db5e05SBarry Smith 
76a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/
77a1db5e05SBarry Smith PetscInt
78*ca8e9878SJed Brown PCTFS_div_ceil( PetscInt numer,  PetscInt denom)
79a1db5e05SBarry Smith {
80a1db5e05SBarry Smith    PetscInt rt_val;
81a1db5e05SBarry Smith 
82*ca8e9878SJed Brown   if ((numer<0)||(denom<=0)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_div_ceil() :: numer=%D ! >=0, denom=%D ! >0",numer,denom);
83a1db5e05SBarry Smith 
84a1db5e05SBarry Smith   /* if integer division remainder then increment */
85a1db5e05SBarry Smith   rt_val = numer/denom;
86a1db5e05SBarry Smith   if (numer%denom)
87a1db5e05SBarry Smith     {rt_val++;}
88a1db5e05SBarry Smith 
89a1db5e05SBarry Smith   return(rt_val);
90a1db5e05SBarry Smith }
91a1db5e05SBarry Smith 
92a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/
93a1db5e05SBarry Smith PetscInt
94*ca8e9878SJed Brown PCTFS_len_bit_mask( PetscInt num_items)
95a1db5e05SBarry Smith {
96a1db5e05SBarry Smith    PetscInt rt_val, tmp;
97a1db5e05SBarry Smith 
98*ca8e9878SJed Brown   if (num_items<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Value Sent To PCTFS_len_bit_mask() Must be >= 0!");
99a1db5e05SBarry Smith 
100a1db5e05SBarry Smith   /* mod BYTE ceiling function */
101a1db5e05SBarry Smith   rt_val = num_items/BYTE;
102a1db5e05SBarry Smith   if (num_items%BYTE)
103a1db5e05SBarry Smith     {rt_val++;}
104a1db5e05SBarry Smith 
105a1db5e05SBarry Smith   /* make mults of sizeof int */
106a1db5e05SBarry Smith   if ((tmp=rt_val%sizeof(PetscInt)))
107a1db5e05SBarry Smith     {rt_val+=(sizeof(PetscInt)-tmp);}
108a1db5e05SBarry Smith 
109a1db5e05SBarry Smith   return(rt_val);
110a1db5e05SBarry Smith }
111a1db5e05SBarry Smith 
112a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/
113*ca8e9878SJed Brown PetscErrorCode PCTFS_set_bit_mask( PetscInt *bm, PetscInt len, PetscInt val)
114a1db5e05SBarry Smith {
115a1db5e05SBarry Smith    PetscInt i, offset;
116a1db5e05SBarry Smith    char mask = 1;
117a1db5e05SBarry Smith    char *cptr;
118a1db5e05SBarry Smith 
119*ca8e9878SJed Brown   if (PCTFS_len_bit_mask(val)>len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"The Bit Mask Isn't That Large!");
120a1db5e05SBarry Smith 
121a1db5e05SBarry Smith   cptr = (char *) bm;
122a1db5e05SBarry Smith 
123a1db5e05SBarry Smith   offset = len/sizeof(PetscInt);
124a1db5e05SBarry Smith   for (i=0;i<offset;i++)
125a1db5e05SBarry Smith     {*bm=0; bm++;}
126a1db5e05SBarry Smith 
127a1db5e05SBarry Smith   offset = val%BYTE;
128a1db5e05SBarry Smith   for (i=0;i<offset;i++)
129a1db5e05SBarry Smith     {mask <<= 1;}
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***********************************/
137*ca8e9878SJed 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 */
145a1db5e05SBarry Smith   if ((tmp = (rt_val%(PetscInt)sizeof(double))))
146a1db5e05SBarry Smith     {rt_val += (sizeof(double) - tmp);}
147a1db5e05SBarry Smith 
148a1db5e05SBarry Smith   return(rt_val);
149a1db5e05SBarry Smith }
150a1db5e05SBarry Smith 
151a1db5e05SBarry Smith 
152a1db5e05SBarry Smith 
153