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