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