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