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***********************************/ 20ca8e9878SJed 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; 252fa5cd67SKarl Rupp if (msg_list) { 26a1db5e05SBarry Smith /* low to high */ 27a1db5e05SBarry Smith ptr+=(p_mask-1); 282fa5cd67SKarl Rupp for (i=p_mask-1;i>=0;i--) { 29a1db5e05SBarry Smith tmp = BYTE*(p_mask-i-1); 302fa5cd67SKarl Rupp if (*ptr&BIT_0) { 312fa5cd67SKarl Rupp *msg_list = tmp; msg_list++; 322fa5cd67SKarl Rupp } 332fa5cd67SKarl Rupp if (*ptr&BIT_1) { 342fa5cd67SKarl Rupp *msg_list = tmp+1; msg_list++; 352fa5cd67SKarl Rupp } 362fa5cd67SKarl Rupp if (*ptr&BIT_2) { 372fa5cd67SKarl Rupp *msg_list = tmp+2; msg_list++; 382fa5cd67SKarl Rupp } 392fa5cd67SKarl Rupp if (*ptr&BIT_3) { 402fa5cd67SKarl Rupp *msg_list = tmp+3; msg_list++; 412fa5cd67SKarl Rupp } 422fa5cd67SKarl Rupp if (*ptr&BIT_4) { 432fa5cd67SKarl Rupp *msg_list = tmp+4; msg_list++; 442fa5cd67SKarl Rupp } 452fa5cd67SKarl Rupp if (*ptr&BIT_5) { 462fa5cd67SKarl Rupp *msg_list = tmp+5; msg_list++; 472fa5cd67SKarl Rupp } 482fa5cd67SKarl Rupp if (*ptr&BIT_6) { 492fa5cd67SKarl Rupp *msg_list = tmp+6; msg_list++; 502fa5cd67SKarl Rupp } 512fa5cd67SKarl Rupp if (*ptr&BIT_7) { 522fa5cd67SKarl Rupp *msg_list = tmp+7; msg_list++; 532fa5cd67SKarl Rupp } 54a1db5e05SBarry Smith ptr--; 55a1db5e05SBarry Smith } 56a1db5e05SBarry Smith } 57a1db5e05SBarry Smith PetscFunctionReturn(0); 58a1db5e05SBarry Smith } 59a1db5e05SBarry Smith 60a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 61ca8e9878SJed Brown PetscInt PCTFS_ct_bits(char *ptr, PetscInt n) 62a1db5e05SBarry Smith { 63a1db5e05SBarry Smith PetscInt i, tmp=0; 64a1db5e05SBarry Smith 652fa5cd67SKarl Rupp for (i=0;i<n;i++) { 662fa5cd67SKarl Rupp if (*ptr&128) tmp++; 672fa5cd67SKarl Rupp if (*ptr&64) tmp++; 682fa5cd67SKarl Rupp if (*ptr&32) tmp++; 692fa5cd67SKarl Rupp if (*ptr&16) tmp++; 702fa5cd67SKarl Rupp if (*ptr&8) tmp++; 712fa5cd67SKarl Rupp if (*ptr&4) tmp++; 722fa5cd67SKarl Rupp if (*ptr&2) tmp++; 732fa5cd67SKarl Rupp if (*ptr&1) tmp++; 74a1db5e05SBarry Smith ptr++; 75a1db5e05SBarry Smith } 76a1db5e05SBarry Smith return(tmp); 77a1db5e05SBarry Smith } 78a1db5e05SBarry Smith 79a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 802fa5cd67SKarl Rupp PetscInt PCTFS_div_ceil(PetscInt numer, PetscInt denom) 81a1db5e05SBarry Smith { 82a1db5e05SBarry Smith PetscInt rt_val; 83a1db5e05SBarry Smith 84ca8e9878SJed Brown if ((numer<0)||(denom<=0)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_div_ceil() :: numer=%D ! >=0, denom=%D ! >0",numer,denom); 85a1db5e05SBarry Smith 86a1db5e05SBarry Smith /* if integer division remainder then increment */ 87a1db5e05SBarry Smith rt_val = numer/denom; 882fa5cd67SKarl Rupp if (numer%denom) rt_val++; 89a1db5e05SBarry Smith return(rt_val); 90a1db5e05SBarry Smith } 91a1db5e05SBarry Smith 92a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 932fa5cd67SKarl Rupp PetscInt PCTFS_len_bit_mask(PetscInt num_items) 94a1db5e05SBarry Smith { 95a1db5e05SBarry Smith PetscInt rt_val, tmp; 96a1db5e05SBarry Smith 97ca8e9878SJed Brown if (num_items<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Value Sent To PCTFS_len_bit_mask() Must be >= 0!"); 98a1db5e05SBarry Smith 99a1db5e05SBarry Smith /* mod BYTE ceiling function */ 100a1db5e05SBarry Smith rt_val = num_items/BYTE; 1012fa5cd67SKarl Rupp if (num_items%BYTE) rt_val++; 102a1db5e05SBarry Smith /* make mults of sizeof int */ 1032fa5cd67SKarl Rupp if ((tmp=rt_val%sizeof(PetscInt))) rt_val+=(sizeof(PetscInt)-tmp); 104a1db5e05SBarry Smith return(rt_val); 105a1db5e05SBarry Smith } 106a1db5e05SBarry Smith 107a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 108ca8e9878SJed Brown PetscErrorCode PCTFS_set_bit_mask(PetscInt *bm, PetscInt len, PetscInt val) 109a1db5e05SBarry Smith { 110a1db5e05SBarry Smith PetscInt i, offset; 111a1db5e05SBarry Smith char mask = 1; 112a1db5e05SBarry Smith char *cptr; 113a1db5e05SBarry Smith 114*4a2f8832SBarry Smith PetscFunctionBegin; 115ca8e9878SJed Brown if (PCTFS_len_bit_mask(val)>len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"The Bit Mask Isn't That Large!"); 116a1db5e05SBarry Smith 117a1db5e05SBarry Smith cptr = (char*) bm; 118a1db5e05SBarry Smith 119a1db5e05SBarry Smith offset = len/sizeof(PetscInt); 1202fa5cd67SKarl Rupp for (i=0; i<offset; i++) { 1212fa5cd67SKarl Rupp *bm=0; 1222fa5cd67SKarl Rupp bm++; 1232fa5cd67SKarl Rupp } 124a1db5e05SBarry Smith 125a1db5e05SBarry Smith offset = val%BYTE; 1262fa5cd67SKarl Rupp for (i=0;i<offset;i++) { 1272fa5cd67SKarl Rupp mask <<= 1; 1282fa5cd67SKarl Rupp } 129a1db5e05SBarry Smith 130a1db5e05SBarry Smith offset = len - val/BYTE - 1; 131a1db5e05SBarry Smith cptr[offset] = mask; 132a1db5e05SBarry Smith PetscFunctionReturn(0); 133a1db5e05SBarry Smith } 134a1db5e05SBarry Smith 135a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 136ca8e9878SJed Brown PetscInt PCTFS_len_buf(PetscInt item_size, PetscInt num_items) 137a1db5e05SBarry Smith { 138a1db5e05SBarry Smith PetscInt rt_val, tmp; 139a1db5e05SBarry Smith 140a1db5e05SBarry Smith rt_val = item_size * num_items; 141a1db5e05SBarry Smith 142a1db5e05SBarry Smith /* double precision align for now ... consider page later */ 1432fa5cd67SKarl Rupp if ((tmp = (rt_val%(PetscInt)sizeof(double)))) rt_val += (sizeof(double) - tmp); 144a1db5e05SBarry Smith return(rt_val); 145a1db5e05SBarry Smith } 146a1db5e05SBarry Smith 147a1db5e05SBarry Smith 148a1db5e05SBarry Smith 149