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***********************************/ 19d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_bm_to_proc(char *ptr, PetscInt p_mask, PetscInt *msg_list) 20d71ae5a4SJacob Faibussowitsch { 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) { 309371c9d4SSatish Balay *msg_list = tmp; 319371c9d4SSatish Balay msg_list++; 322fa5cd67SKarl Rupp } 332fa5cd67SKarl Rupp if (*ptr & BIT_1) { 349371c9d4SSatish Balay *msg_list = tmp + 1; 359371c9d4SSatish Balay msg_list++; 362fa5cd67SKarl Rupp } 372fa5cd67SKarl Rupp if (*ptr & BIT_2) { 389371c9d4SSatish Balay *msg_list = tmp + 2; 399371c9d4SSatish Balay msg_list++; 402fa5cd67SKarl Rupp } 412fa5cd67SKarl Rupp if (*ptr & BIT_3) { 429371c9d4SSatish Balay *msg_list = tmp + 3; 439371c9d4SSatish Balay msg_list++; 442fa5cd67SKarl Rupp } 452fa5cd67SKarl Rupp if (*ptr & BIT_4) { 469371c9d4SSatish Balay *msg_list = tmp + 4; 479371c9d4SSatish Balay msg_list++; 482fa5cd67SKarl Rupp } 492fa5cd67SKarl Rupp if (*ptr & BIT_5) { 509371c9d4SSatish Balay *msg_list = tmp + 5; 519371c9d4SSatish Balay msg_list++; 522fa5cd67SKarl Rupp } 532fa5cd67SKarl Rupp if (*ptr & BIT_6) { 549371c9d4SSatish Balay *msg_list = tmp + 6; 559371c9d4SSatish Balay msg_list++; 562fa5cd67SKarl Rupp } 572fa5cd67SKarl Rupp if (*ptr & BIT_7) { 589371c9d4SSatish Balay *msg_list = tmp + 7; 599371c9d4SSatish Balay msg_list++; 602fa5cd67SKarl Rupp } 61a1db5e05SBarry Smith ptr--; 62a1db5e05SBarry Smith } 63a1db5e05SBarry Smith } 64*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 65a1db5e05SBarry Smith } 66a1db5e05SBarry Smith 67a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 68d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_ct_bits(char *ptr, PetscInt n) 69d71ae5a4SJacob Faibussowitsch { 70a1db5e05SBarry Smith PetscInt i, tmp = 0; 71a1db5e05SBarry Smith 722fa5cd67SKarl Rupp for (i = 0; i < n; i++) { 732fa5cd67SKarl Rupp if (*ptr & 128) tmp++; 742fa5cd67SKarl Rupp if (*ptr & 64) tmp++; 752fa5cd67SKarl Rupp if (*ptr & 32) tmp++; 762fa5cd67SKarl Rupp if (*ptr & 16) tmp++; 772fa5cd67SKarl Rupp if (*ptr & 8) tmp++; 782fa5cd67SKarl Rupp if (*ptr & 4) tmp++; 792fa5cd67SKarl Rupp if (*ptr & 2) tmp++; 802fa5cd67SKarl Rupp if (*ptr & 1) tmp++; 81a1db5e05SBarry Smith ptr++; 82a1db5e05SBarry Smith } 83a1db5e05SBarry Smith return (tmp); 84a1db5e05SBarry Smith } 85a1db5e05SBarry Smith 86a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 87d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_div_ceil(PetscInt numer, PetscInt denom) 88d71ae5a4SJacob Faibussowitsch { 8998921bdaSJacob 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); 90faa75363SBarry Smith return (PetscCeilInt(numer, denom)); 91a1db5e05SBarry Smith } 92a1db5e05SBarry Smith 93a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 94d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_len_bit_mask(PetscInt num_items) 95d71ae5a4SJacob Faibussowitsch { 96a1db5e05SBarry Smith PetscInt rt_val, tmp; 97a1db5e05SBarry Smith 9808401ef6SPierre Jolivet PetscCheck(num_items >= 0, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Value Sent To PCTFS_len_bit_mask() Must be >= 0!"); 99a1db5e05SBarry Smith 100faa75363SBarry Smith rt_val = PetscCeilInt(num_items, BYTE); 101faa75363SBarry Smith /* make multiple of sizeof PetscInt */ 1022fa5cd67SKarl Rupp if ((tmp = rt_val % sizeof(PetscInt))) rt_val += (sizeof(PetscInt) - tmp); 103a1db5e05SBarry Smith return (rt_val); 104a1db5e05SBarry Smith } 105a1db5e05SBarry Smith 106a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 107d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_set_bit_mask(PetscInt *bm, PetscInt len, PetscInt val) 108d71ae5a4SJacob Faibussowitsch { 109a1db5e05SBarry Smith PetscInt i, offset; 110a1db5e05SBarry Smith char mask = 1; 111a1db5e05SBarry Smith char *cptr; 112a1db5e05SBarry Smith 1134a2f8832SBarry Smith PetscFunctionBegin; 11408401ef6SPierre Jolivet PetscCheck(PCTFS_len_bit_mask(val) <= len, PETSC_COMM_SELF, PETSC_ERR_PLIB, "The Bit Mask Isn't That Large!"); 115a1db5e05SBarry Smith 116a1db5e05SBarry Smith cptr = (char *)bm; 117a1db5e05SBarry Smith 118a1db5e05SBarry Smith offset = len / sizeof(PetscInt); 1192fa5cd67SKarl Rupp for (i = 0; i < offset; i++) { 1202fa5cd67SKarl Rupp *bm = 0; 1212fa5cd67SKarl Rupp bm++; 1222fa5cd67SKarl Rupp } 123a1db5e05SBarry Smith 124a1db5e05SBarry Smith offset = val % BYTE; 125ad540459SPierre Jolivet for (i = 0; i < offset; i++) mask <<= 1; 126a1db5e05SBarry Smith 127a1db5e05SBarry Smith offset = len - val / BYTE - 1; 128a1db5e05SBarry Smith cptr[offset] = mask; 129*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 130a1db5e05SBarry Smith } 131a1db5e05SBarry Smith 132a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 133d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_len_buf(PetscInt item_size, PetscInt num_items) 134d71ae5a4SJacob Faibussowitsch { 135a1db5e05SBarry Smith PetscInt rt_val, tmp; 136a1db5e05SBarry Smith 137a1db5e05SBarry Smith rt_val = item_size * num_items; 138a1db5e05SBarry Smith 139a1db5e05SBarry Smith /* double precision align for now ... consider page later */ 1402fa5cd67SKarl Rupp if ((tmp = (rt_val % (PetscInt)sizeof(double)))) rt_val += (sizeof(double) - tmp); 141a1db5e05SBarry Smith return (rt_val); 142a1db5e05SBarry Smith } 143