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***********************************/ 19*9371c9d4SSatish Balay PetscErrorCode PCTFS_bm_to_proc(char *ptr, PetscInt p_mask, PetscInt *msg_list) { 20a1db5e05SBarry Smith PetscInt i, tmp; 21a1db5e05SBarry Smith 22a1db5e05SBarry Smith PetscFunctionBegin; 232fa5cd67SKarl Rupp if (msg_list) { 24a1db5e05SBarry Smith /* low to high */ 25a1db5e05SBarry Smith ptr += (p_mask - 1); 262fa5cd67SKarl Rupp for (i = p_mask - 1; i >= 0; i--) { 27a1db5e05SBarry Smith tmp = BYTE * (p_mask - i - 1); 282fa5cd67SKarl Rupp if (*ptr & BIT_0) { 29*9371c9d4SSatish Balay *msg_list = tmp; 30*9371c9d4SSatish Balay msg_list++; 312fa5cd67SKarl Rupp } 322fa5cd67SKarl Rupp if (*ptr & BIT_1) { 33*9371c9d4SSatish Balay *msg_list = tmp + 1; 34*9371c9d4SSatish Balay msg_list++; 352fa5cd67SKarl Rupp } 362fa5cd67SKarl Rupp if (*ptr & BIT_2) { 37*9371c9d4SSatish Balay *msg_list = tmp + 2; 38*9371c9d4SSatish Balay msg_list++; 392fa5cd67SKarl Rupp } 402fa5cd67SKarl Rupp if (*ptr & BIT_3) { 41*9371c9d4SSatish Balay *msg_list = tmp + 3; 42*9371c9d4SSatish Balay msg_list++; 432fa5cd67SKarl Rupp } 442fa5cd67SKarl Rupp if (*ptr & BIT_4) { 45*9371c9d4SSatish Balay *msg_list = tmp + 4; 46*9371c9d4SSatish Balay msg_list++; 472fa5cd67SKarl Rupp } 482fa5cd67SKarl Rupp if (*ptr & BIT_5) { 49*9371c9d4SSatish Balay *msg_list = tmp + 5; 50*9371c9d4SSatish Balay msg_list++; 512fa5cd67SKarl Rupp } 522fa5cd67SKarl Rupp if (*ptr & BIT_6) { 53*9371c9d4SSatish Balay *msg_list = tmp + 6; 54*9371c9d4SSatish Balay msg_list++; 552fa5cd67SKarl Rupp } 562fa5cd67SKarl Rupp if (*ptr & BIT_7) { 57*9371c9d4SSatish Balay *msg_list = tmp + 7; 58*9371c9d4SSatish Balay msg_list++; 592fa5cd67SKarl Rupp } 60a1db5e05SBarry Smith ptr--; 61a1db5e05SBarry Smith } 62a1db5e05SBarry Smith } 63a1db5e05SBarry Smith PetscFunctionReturn(0); 64a1db5e05SBarry Smith } 65a1db5e05SBarry Smith 66a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 67*9371c9d4SSatish Balay PetscInt PCTFS_ct_bits(char *ptr, PetscInt n) { 68a1db5e05SBarry Smith PetscInt i, tmp = 0; 69a1db5e05SBarry Smith 702fa5cd67SKarl Rupp for (i = 0; i < n; i++) { 712fa5cd67SKarl Rupp if (*ptr & 128) tmp++; 722fa5cd67SKarl Rupp if (*ptr & 64) tmp++; 732fa5cd67SKarl Rupp if (*ptr & 32) tmp++; 742fa5cd67SKarl Rupp if (*ptr & 16) tmp++; 752fa5cd67SKarl Rupp if (*ptr & 8) tmp++; 762fa5cd67SKarl Rupp if (*ptr & 4) tmp++; 772fa5cd67SKarl Rupp if (*ptr & 2) tmp++; 782fa5cd67SKarl Rupp if (*ptr & 1) tmp++; 79a1db5e05SBarry Smith ptr++; 80a1db5e05SBarry Smith } 81a1db5e05SBarry Smith return (tmp); 82a1db5e05SBarry Smith } 83a1db5e05SBarry Smith 84a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 85*9371c9d4SSatish Balay PetscInt PCTFS_div_ceil(PetscInt numer, PetscInt denom) { 8698921bdaSJacob Faibussowitsch if ((numer < 0) || (denom <= 0)) SETERRABORT(PETSC_COMM_SELF, PETSC_ERR_PLIB, "PCTFS_div_ceil() :: numer=%" PetscInt_FMT " ! >=0, denom=%" PetscInt_FMT " ! >0", numer, denom); 87faa75363SBarry Smith return (PetscCeilInt(numer, denom)); 88a1db5e05SBarry Smith } 89a1db5e05SBarry Smith 90a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 91*9371c9d4SSatish Balay PetscInt PCTFS_len_bit_mask(PetscInt num_items) { 92a1db5e05SBarry Smith PetscInt rt_val, tmp; 93a1db5e05SBarry Smith 9408401ef6SPierre Jolivet PetscCheck(num_items >= 0, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Value Sent To PCTFS_len_bit_mask() Must be >= 0!"); 95a1db5e05SBarry Smith 96faa75363SBarry Smith rt_val = PetscCeilInt(num_items, BYTE); 97faa75363SBarry Smith /* make multiple of sizeof PetscInt */ 982fa5cd67SKarl Rupp if ((tmp = rt_val % sizeof(PetscInt))) rt_val += (sizeof(PetscInt) - tmp); 99a1db5e05SBarry Smith return (rt_val); 100a1db5e05SBarry Smith } 101a1db5e05SBarry Smith 102a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 103*9371c9d4SSatish Balay PetscErrorCode PCTFS_set_bit_mask(PetscInt *bm, PetscInt len, PetscInt val) { 104a1db5e05SBarry Smith PetscInt i, offset; 105a1db5e05SBarry Smith char mask = 1; 106a1db5e05SBarry Smith char *cptr; 107a1db5e05SBarry Smith 1084a2f8832SBarry Smith PetscFunctionBegin; 10908401ef6SPierre Jolivet PetscCheck(PCTFS_len_bit_mask(val) <= len, PETSC_COMM_SELF, PETSC_ERR_PLIB, "The Bit Mask Isn't That Large!"); 110a1db5e05SBarry Smith 111a1db5e05SBarry Smith cptr = (char *)bm; 112a1db5e05SBarry Smith 113a1db5e05SBarry Smith offset = len / sizeof(PetscInt); 1142fa5cd67SKarl Rupp for (i = 0; i < offset; i++) { 1152fa5cd67SKarl Rupp *bm = 0; 1162fa5cd67SKarl Rupp bm++; 1172fa5cd67SKarl Rupp } 118a1db5e05SBarry Smith 119a1db5e05SBarry Smith offset = val % BYTE; 120*9371c9d4SSatish Balay for (i = 0; i < offset; i++) { mask <<= 1; } 121a1db5e05SBarry Smith 122a1db5e05SBarry Smith offset = len - val / BYTE - 1; 123a1db5e05SBarry Smith cptr[offset] = mask; 124a1db5e05SBarry Smith PetscFunctionReturn(0); 125a1db5e05SBarry Smith } 126a1db5e05SBarry Smith 127a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 128*9371c9d4SSatish Balay PetscInt PCTFS_len_buf(PetscInt item_size, PetscInt num_items) { 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 } 137