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 /*********************************bit_mask.c***********************************/ 19ca8e9878SJed Brown PetscErrorCode PCTFS_bm_to_proc(char *ptr, PetscInt p_mask, PetscInt *msg_list) 20a1db5e05SBarry Smith { 21a1db5e05SBarry Smith PetscInt i, tmp; 22a1db5e05SBarry Smith 23a1db5e05SBarry Smith PetscFunctionBegin; 242fa5cd67SKarl Rupp if (msg_list) { 25a1db5e05SBarry Smith /* low to high */ 26a1db5e05SBarry Smith ptr+=(p_mask-1); 272fa5cd67SKarl Rupp for (i=p_mask-1;i>=0;i--) { 28a1db5e05SBarry Smith tmp = BYTE*(p_mask-i-1); 292fa5cd67SKarl Rupp if (*ptr&BIT_0) { 302fa5cd67SKarl Rupp *msg_list = tmp; msg_list++; 312fa5cd67SKarl Rupp } 322fa5cd67SKarl Rupp if (*ptr&BIT_1) { 332fa5cd67SKarl Rupp *msg_list = tmp+1; msg_list++; 342fa5cd67SKarl Rupp } 352fa5cd67SKarl Rupp if (*ptr&BIT_2) { 362fa5cd67SKarl Rupp *msg_list = tmp+2; msg_list++; 372fa5cd67SKarl Rupp } 382fa5cd67SKarl Rupp if (*ptr&BIT_3) { 392fa5cd67SKarl Rupp *msg_list = tmp+3; msg_list++; 402fa5cd67SKarl Rupp } 412fa5cd67SKarl Rupp if (*ptr&BIT_4) { 422fa5cd67SKarl Rupp *msg_list = tmp+4; msg_list++; 432fa5cd67SKarl Rupp } 442fa5cd67SKarl Rupp if (*ptr&BIT_5) { 452fa5cd67SKarl Rupp *msg_list = tmp+5; msg_list++; 462fa5cd67SKarl Rupp } 472fa5cd67SKarl Rupp if (*ptr&BIT_6) { 482fa5cd67SKarl Rupp *msg_list = tmp+6; msg_list++; 492fa5cd67SKarl Rupp } 502fa5cd67SKarl Rupp if (*ptr&BIT_7) { 512fa5cd67SKarl Rupp *msg_list = tmp+7; msg_list++; 522fa5cd67SKarl Rupp } 53a1db5e05SBarry Smith ptr--; 54a1db5e05SBarry Smith } 55a1db5e05SBarry Smith } 56a1db5e05SBarry Smith PetscFunctionReturn(0); 57a1db5e05SBarry Smith } 58a1db5e05SBarry Smith 59a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 60ca8e9878SJed Brown PetscInt PCTFS_ct_bits(char *ptr, PetscInt n) 61a1db5e05SBarry Smith { 62a1db5e05SBarry Smith PetscInt i, tmp=0; 63a1db5e05SBarry Smith 642fa5cd67SKarl Rupp for (i=0;i<n;i++) { 652fa5cd67SKarl Rupp if (*ptr&128) tmp++; 662fa5cd67SKarl Rupp if (*ptr&64) tmp++; 672fa5cd67SKarl Rupp if (*ptr&32) tmp++; 682fa5cd67SKarl Rupp if (*ptr&16) tmp++; 692fa5cd67SKarl Rupp if (*ptr&8) tmp++; 702fa5cd67SKarl Rupp if (*ptr&4) tmp++; 712fa5cd67SKarl Rupp if (*ptr&2) tmp++; 722fa5cd67SKarl Rupp if (*ptr&1) tmp++; 73a1db5e05SBarry Smith ptr++; 74a1db5e05SBarry Smith } 75a1db5e05SBarry Smith return(tmp); 76a1db5e05SBarry Smith } 77a1db5e05SBarry Smith 78a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 792fa5cd67SKarl Rupp PetscInt PCTFS_div_ceil(PetscInt numer, PetscInt denom) 80a1db5e05SBarry Smith { 81*faa75363SBarry Smith if ((numer<0)||(denom<=0)) SETERRABORT(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_div_ceil() :: numer=%D ! >=0, denom=%D ! >0"); 82*faa75363SBarry Smith return(PetscCeilInt(numer,denom)); 83a1db5e05SBarry Smith } 84a1db5e05SBarry Smith 85a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 862fa5cd67SKarl Rupp PetscInt PCTFS_len_bit_mask(PetscInt num_items) 87a1db5e05SBarry Smith { 88a1db5e05SBarry Smith PetscInt rt_val, tmp; 89a1db5e05SBarry Smith 90ca8e9878SJed Brown if (num_items<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Value Sent To PCTFS_len_bit_mask() Must be >= 0!"); 91a1db5e05SBarry Smith 92*faa75363SBarry Smith rt_val = PetscCeilInt(num_items,BYTE); 93*faa75363SBarry Smith /* make multiple of sizeof PetscInt */ 942fa5cd67SKarl Rupp if ((tmp=rt_val%sizeof(PetscInt))) rt_val+=(sizeof(PetscInt)-tmp); 95a1db5e05SBarry Smith return(rt_val); 96a1db5e05SBarry Smith } 97a1db5e05SBarry Smith 98a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 99ca8e9878SJed Brown PetscErrorCode PCTFS_set_bit_mask(PetscInt *bm, PetscInt len, PetscInt val) 100a1db5e05SBarry Smith { 101a1db5e05SBarry Smith PetscInt i, offset; 102a1db5e05SBarry Smith char mask = 1; 103a1db5e05SBarry Smith char *cptr; 104a1db5e05SBarry Smith 1054a2f8832SBarry Smith PetscFunctionBegin; 106ca8e9878SJed Brown if (PCTFS_len_bit_mask(val)>len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"The Bit Mask Isn't That Large!"); 107a1db5e05SBarry Smith 108a1db5e05SBarry Smith cptr = (char*) bm; 109a1db5e05SBarry Smith 110a1db5e05SBarry Smith offset = len/sizeof(PetscInt); 1112fa5cd67SKarl Rupp for (i=0; i<offset; i++) { 1122fa5cd67SKarl Rupp *bm=0; 1132fa5cd67SKarl Rupp bm++; 1142fa5cd67SKarl Rupp } 115a1db5e05SBarry Smith 116a1db5e05SBarry Smith offset = val%BYTE; 1172fa5cd67SKarl Rupp for (i=0;i<offset;i++) { 1182fa5cd67SKarl Rupp mask <<= 1; 1192fa5cd67SKarl Rupp } 120a1db5e05SBarry Smith 121a1db5e05SBarry Smith offset = len - val/BYTE - 1; 122a1db5e05SBarry Smith cptr[offset] = mask; 123a1db5e05SBarry Smith PetscFunctionReturn(0); 124a1db5e05SBarry Smith } 125a1db5e05SBarry Smith 126a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 127ca8e9878SJed Brown PetscInt PCTFS_len_buf(PetscInt item_size, PetscInt num_items) 128a1db5e05SBarry Smith { 129a1db5e05SBarry Smith PetscInt rt_val, tmp; 130a1db5e05SBarry Smith 131a1db5e05SBarry Smith rt_val = item_size * num_items; 132a1db5e05SBarry Smith 133a1db5e05SBarry Smith /* double precision align for now ... consider page later */ 1342fa5cd67SKarl Rupp if ((tmp = (rt_val%(PetscInt)sizeof(double)))) rt_val += (sizeof(double) - tmp); 135a1db5e05SBarry Smith return(rt_val); 136a1db5e05SBarry Smith } 137a1db5e05SBarry Smith 138