xref: /petsc/src/ksp/pc/impls/tfs/bitmask.c (revision 3ba1676111f5c958fe6c2729b46ca4d523958bb3)
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 /*********************************bit_mask.c***********************************/
19d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_bm_to_proc(char *ptr, PetscInt p_mask, PetscInt *msg_list)
20d71ae5a4SJacob Faibussowitsch {
21a1db5e05SBarry Smith   PetscInt i, tmp;
22a1db5e05SBarry Smith 
23a1db5e05SBarry Smith   PetscFunctionBegin;
242fa5cd67SKarl Rupp   if (msg_list) {
25a1db5e05SBarry Smith     /* low to high */
26a1db5e05SBarry Smith     ptr += (p_mask - 1);
272fa5cd67SKarl Rupp     for (i = p_mask - 1; i >= 0; i--) {
28a1db5e05SBarry Smith       tmp = BYTE * (p_mask - i - 1);
292fa5cd67SKarl Rupp       if (*ptr & BIT_0) {
309371c9d4SSatish Balay         *msg_list = tmp;
319371c9d4SSatish Balay         msg_list++;
322fa5cd67SKarl Rupp       }
332fa5cd67SKarl Rupp       if (*ptr & BIT_1) {
349371c9d4SSatish Balay         *msg_list = tmp + 1;
359371c9d4SSatish Balay         msg_list++;
362fa5cd67SKarl Rupp       }
372fa5cd67SKarl Rupp       if (*ptr & BIT_2) {
389371c9d4SSatish Balay         *msg_list = tmp + 2;
399371c9d4SSatish Balay         msg_list++;
402fa5cd67SKarl Rupp       }
412fa5cd67SKarl Rupp       if (*ptr & BIT_3) {
429371c9d4SSatish Balay         *msg_list = tmp + 3;
439371c9d4SSatish Balay         msg_list++;
442fa5cd67SKarl Rupp       }
452fa5cd67SKarl Rupp       if (*ptr & BIT_4) {
469371c9d4SSatish Balay         *msg_list = tmp + 4;
479371c9d4SSatish Balay         msg_list++;
482fa5cd67SKarl Rupp       }
492fa5cd67SKarl Rupp       if (*ptr & BIT_5) {
509371c9d4SSatish Balay         *msg_list = tmp + 5;
519371c9d4SSatish Balay         msg_list++;
522fa5cd67SKarl Rupp       }
532fa5cd67SKarl Rupp       if (*ptr & BIT_6) {
549371c9d4SSatish Balay         *msg_list = tmp + 6;
559371c9d4SSatish Balay         msg_list++;
562fa5cd67SKarl Rupp       }
572fa5cd67SKarl Rupp       if (*ptr & BIT_7) {
589371c9d4SSatish Balay         *msg_list = tmp + 7;
599371c9d4SSatish Balay         msg_list++;
602fa5cd67SKarl Rupp       }
61a1db5e05SBarry Smith       ptr--;
62a1db5e05SBarry Smith     }
63a1db5e05SBarry Smith   }
64*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
65a1db5e05SBarry Smith }
66a1db5e05SBarry Smith 
67a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/
68d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_ct_bits(char *ptr, PetscInt n)
69d71ae5a4SJacob Faibussowitsch {
70a1db5e05SBarry Smith   PetscInt i, tmp = 0;
71a1db5e05SBarry Smith 
722fa5cd67SKarl Rupp   for (i = 0; i < n; i++) {
732fa5cd67SKarl Rupp     if (*ptr & 128) tmp++;
742fa5cd67SKarl Rupp     if (*ptr & 64) tmp++;
752fa5cd67SKarl Rupp     if (*ptr & 32) tmp++;
762fa5cd67SKarl Rupp     if (*ptr & 16) tmp++;
772fa5cd67SKarl Rupp     if (*ptr & 8) tmp++;
782fa5cd67SKarl Rupp     if (*ptr & 4) tmp++;
792fa5cd67SKarl Rupp     if (*ptr & 2) tmp++;
802fa5cd67SKarl Rupp     if (*ptr & 1) tmp++;
81a1db5e05SBarry Smith     ptr++;
82a1db5e05SBarry Smith   }
83a1db5e05SBarry Smith   return (tmp);
84a1db5e05SBarry Smith }
85a1db5e05SBarry Smith 
86a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/
87d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_div_ceil(PetscInt numer, PetscInt denom)
88d71ae5a4SJacob Faibussowitsch {
8998921bdaSJacob Faibussowitsch   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);
90faa75363SBarry Smith   return (PetscCeilInt(numer, denom));
91a1db5e05SBarry Smith }
92a1db5e05SBarry Smith 
93a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/
94d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_len_bit_mask(PetscInt num_items)
95d71ae5a4SJacob Faibussowitsch {
96a1db5e05SBarry Smith   PetscInt rt_val, tmp;
97a1db5e05SBarry Smith 
9808401ef6SPierre Jolivet   PetscCheck(num_items >= 0, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Value Sent To PCTFS_len_bit_mask() Must be >= 0!");
99a1db5e05SBarry Smith 
100faa75363SBarry Smith   rt_val = PetscCeilInt(num_items, BYTE);
101faa75363SBarry Smith   /* make multiple of sizeof PetscInt */
1022fa5cd67SKarl Rupp   if ((tmp = rt_val % sizeof(PetscInt))) rt_val += (sizeof(PetscInt) - tmp);
103a1db5e05SBarry Smith   return (rt_val);
104a1db5e05SBarry Smith }
105a1db5e05SBarry Smith 
106a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/
107d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_set_bit_mask(PetscInt *bm, PetscInt len, PetscInt val)
108d71ae5a4SJacob Faibussowitsch {
109a1db5e05SBarry Smith   PetscInt i, offset;
110a1db5e05SBarry Smith   char     mask = 1;
111a1db5e05SBarry Smith   char    *cptr;
112a1db5e05SBarry Smith 
1134a2f8832SBarry Smith   PetscFunctionBegin;
11408401ef6SPierre Jolivet   PetscCheck(PCTFS_len_bit_mask(val) <= len, PETSC_COMM_SELF, PETSC_ERR_PLIB, "The Bit Mask Isn't That Large!");
115a1db5e05SBarry Smith 
116a1db5e05SBarry Smith   cptr = (char *)bm;
117a1db5e05SBarry Smith 
118a1db5e05SBarry Smith   offset = len / sizeof(PetscInt);
1192fa5cd67SKarl Rupp   for (i = 0; i < offset; i++) {
1202fa5cd67SKarl Rupp     *bm = 0;
1212fa5cd67SKarl Rupp     bm++;
1222fa5cd67SKarl Rupp   }
123a1db5e05SBarry Smith 
124a1db5e05SBarry Smith   offset = val % BYTE;
125ad540459SPierre Jolivet   for (i = 0; i < offset; i++) mask <<= 1;
126a1db5e05SBarry Smith 
127a1db5e05SBarry Smith   offset       = len - val / BYTE - 1;
128a1db5e05SBarry Smith   cptr[offset] = mask;
129*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
130a1db5e05SBarry Smith }
131a1db5e05SBarry Smith 
132a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/
133d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_len_buf(PetscInt item_size, PetscInt num_items)
134d71ae5a4SJacob Faibussowitsch {
135a1db5e05SBarry Smith   PetscInt rt_val, tmp;
136a1db5e05SBarry Smith 
137a1db5e05SBarry Smith   rt_val = item_size * num_items;
138a1db5e05SBarry Smith 
139a1db5e05SBarry Smith   /*  double precision align for now ... consider page later */
1402fa5cd67SKarl Rupp   if ((tmp = (rt_val % (PetscInt)sizeof(double)))) rt_val += (sizeof(double) - tmp);
141a1db5e05SBarry Smith   return (rt_val);
142a1db5e05SBarry Smith }
143