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