1a1db5e05SBarry Smith /********************************bit_mask.c************************************
2a1db5e05SBarry Smith
3a1db5e05SBarry Smith Author: Henry M. Tufo III
4a1db5e05SBarry Smith
5a1db5e05SBarry Smith e-mail: hmt@cs.brown.edu
6a1db5e05SBarry Smith
7a1db5e05SBarry Smith snail-mail:
8a1db5e05SBarry Smith Division of Applied Mathematics
9a1db5e05SBarry Smith Brown University
10a1db5e05SBarry Smith Providence, RI 02912
11a1db5e05SBarry Smith
12a1db5e05SBarry Smith Last Modification:
13a1db5e05SBarry Smith 11.21.97
14a1db5e05SBarry Smith *********************************bit_mask.c***********************************/
15c6db04a5SJed Brown #include <../src/ksp/pc/impls/tfs/tfs.h>
16a1db5e05SBarry Smith
17a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/
PCTFS_bm_to_proc(char * ptr,PetscInt p_mask,PetscInt * msg_list)18d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_bm_to_proc(char *ptr, PetscInt p_mask, PetscInt *msg_list)
19d71ae5a4SJacob Faibussowitsch {
20a1db5e05SBarry Smith PetscInt i, tmp;
21a1db5e05SBarry Smith
22a1db5e05SBarry Smith PetscFunctionBegin;
232fa5cd67SKarl Rupp if (msg_list) {
24a1db5e05SBarry Smith /* low to high */
25a1db5e05SBarry Smith ptr += (p_mask - 1);
262fa5cd67SKarl Rupp for (i = p_mask - 1; i >= 0; i--) {
27a1db5e05SBarry Smith tmp = BYTE * (p_mask - i - 1);
282fa5cd67SKarl Rupp if (*ptr & BIT_0) {
299371c9d4SSatish Balay *msg_list = tmp;
309371c9d4SSatish Balay msg_list++;
312fa5cd67SKarl Rupp }
322fa5cd67SKarl Rupp if (*ptr & BIT_1) {
339371c9d4SSatish Balay *msg_list = tmp + 1;
349371c9d4SSatish Balay msg_list++;
352fa5cd67SKarl Rupp }
362fa5cd67SKarl Rupp if (*ptr & BIT_2) {
379371c9d4SSatish Balay *msg_list = tmp + 2;
389371c9d4SSatish Balay msg_list++;
392fa5cd67SKarl Rupp }
402fa5cd67SKarl Rupp if (*ptr & BIT_3) {
419371c9d4SSatish Balay *msg_list = tmp + 3;
429371c9d4SSatish Balay msg_list++;
432fa5cd67SKarl Rupp }
442fa5cd67SKarl Rupp if (*ptr & BIT_4) {
459371c9d4SSatish Balay *msg_list = tmp + 4;
469371c9d4SSatish Balay msg_list++;
472fa5cd67SKarl Rupp }
482fa5cd67SKarl Rupp if (*ptr & BIT_5) {
499371c9d4SSatish Balay *msg_list = tmp + 5;
509371c9d4SSatish Balay msg_list++;
512fa5cd67SKarl Rupp }
522fa5cd67SKarl Rupp if (*ptr & BIT_6) {
539371c9d4SSatish Balay *msg_list = tmp + 6;
549371c9d4SSatish Balay msg_list++;
552fa5cd67SKarl Rupp }
562fa5cd67SKarl Rupp if (*ptr & BIT_7) {
579371c9d4SSatish Balay *msg_list = tmp + 7;
589371c9d4SSatish Balay msg_list++;
592fa5cd67SKarl Rupp }
60a1db5e05SBarry Smith ptr--;
61a1db5e05SBarry Smith }
62a1db5e05SBarry Smith }
633ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
64a1db5e05SBarry Smith }
65a1db5e05SBarry Smith
66a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/
PCTFS_ct_bits(char * ptr,PetscInt n)67d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_ct_bits(char *ptr, PetscInt n)
68d71ae5a4SJacob Faibussowitsch {
69a1db5e05SBarry Smith PetscInt i, tmp = 0;
70a1db5e05SBarry Smith
712fa5cd67SKarl Rupp for (i = 0; i < n; i++) {
722fa5cd67SKarl Rupp if (*ptr & 128) tmp++;
732fa5cd67SKarl Rupp if (*ptr & 64) tmp++;
742fa5cd67SKarl Rupp if (*ptr & 32) tmp++;
752fa5cd67SKarl Rupp if (*ptr & 16) tmp++;
762fa5cd67SKarl Rupp if (*ptr & 8) tmp++;
772fa5cd67SKarl Rupp if (*ptr & 4) tmp++;
782fa5cd67SKarl Rupp if (*ptr & 2) tmp++;
792fa5cd67SKarl Rupp if (*ptr & 1) tmp++;
80a1db5e05SBarry Smith ptr++;
81a1db5e05SBarry Smith }
82*4ad8454bSPierre Jolivet return tmp;
83a1db5e05SBarry Smith }
84a1db5e05SBarry Smith
85a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/
PCTFS_div_ceil(PetscInt numer,PetscInt denom)86d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_div_ceil(PetscInt numer, PetscInt denom)
87d71ae5a4SJacob Faibussowitsch {
8898921bdaSJacob 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);
89*4ad8454bSPierre Jolivet return PetscCeilInt(numer, denom);
90a1db5e05SBarry Smith }
91a1db5e05SBarry Smith
92a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/
PCTFS_len_bit_mask(PetscInt num_items)93d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_len_bit_mask(PetscInt num_items)
94d71ae5a4SJacob Faibussowitsch {
95a1db5e05SBarry Smith PetscInt rt_val, tmp;
96a1db5e05SBarry Smith
9708401ef6SPierre Jolivet PetscCheck(num_items >= 0, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Value Sent To PCTFS_len_bit_mask() Must be >= 0!");
98a1db5e05SBarry Smith
99faa75363SBarry Smith rt_val = PetscCeilInt(num_items, BYTE);
100faa75363SBarry Smith /* make multiple of sizeof PetscInt */
1012fa5cd67SKarl Rupp if ((tmp = rt_val % sizeof(PetscInt))) rt_val += (sizeof(PetscInt) - tmp);
102*4ad8454bSPierre Jolivet return rt_val;
103a1db5e05SBarry Smith }
104a1db5e05SBarry Smith
105a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/
PCTFS_set_bit_mask(PetscInt * bm,PetscInt len,PetscInt val)106d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_set_bit_mask(PetscInt *bm, PetscInt len, PetscInt val)
107d71ae5a4SJacob Faibussowitsch {
108a1db5e05SBarry Smith PetscInt i, offset;
109a1db5e05SBarry Smith char mask = 1;
110a1db5e05SBarry Smith char *cptr;
111a1db5e05SBarry Smith
1124a2f8832SBarry Smith PetscFunctionBegin;
11308401ef6SPierre Jolivet PetscCheck(PCTFS_len_bit_mask(val) <= len, PETSC_COMM_SELF, PETSC_ERR_PLIB, "The Bit Mask Isn't That Large!");
114a1db5e05SBarry Smith
115a1db5e05SBarry Smith cptr = (char *)bm;
116a1db5e05SBarry Smith
117a1db5e05SBarry Smith offset = len / sizeof(PetscInt);
1182fa5cd67SKarl Rupp for (i = 0; i < offset; i++) {
1192fa5cd67SKarl Rupp *bm = 0;
1202fa5cd67SKarl Rupp bm++;
1212fa5cd67SKarl Rupp }
122a1db5e05SBarry Smith
123a1db5e05SBarry Smith offset = val % BYTE;
124ad540459SPierre Jolivet for (i = 0; i < offset; i++) mask <<= 1;
125a1db5e05SBarry Smith
126a1db5e05SBarry Smith offset = len - val / BYTE - 1;
127a1db5e05SBarry Smith cptr[offset] = mask;
1283ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
129a1db5e05SBarry Smith }
130a1db5e05SBarry Smith
131a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/
PCTFS_len_buf(PetscInt item_size,PetscInt num_items)132d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_len_buf(PetscInt item_size, PetscInt num_items)
133d71ae5a4SJacob Faibussowitsch {
134a1db5e05SBarry Smith PetscInt rt_val, tmp;
135a1db5e05SBarry Smith
136a1db5e05SBarry Smith rt_val = item_size * num_items;
137a1db5e05SBarry Smith
138a1db5e05SBarry Smith /* double precision align for now ... consider page later */
1392fa5cd67SKarl Rupp if ((tmp = (rt_val % (PetscInt)sizeof(double)))) rt_val += (sizeof(double) - tmp);
140*4ad8454bSPierre Jolivet return rt_val;
141a1db5e05SBarry Smith }
142