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