1a1db5e05SBarry Smith /********************************bit_mask.c************************************ 2a1db5e05SBarry Smith 3a1db5e05SBarry Smith Author: Henry M. Tufo III 4a1db5e05SBarry Smith 5a1db5e05SBarry Smith e-mail: hmt@cs.brown.edu 6a1db5e05SBarry Smith 7a1db5e05SBarry Smith snail-mail: 8a1db5e05SBarry Smith Division of Applied Mathematics 9a1db5e05SBarry Smith Brown University 10a1db5e05SBarry Smith Providence, RI 02912 11a1db5e05SBarry Smith 12a1db5e05SBarry Smith Last Modification: 13a1db5e05SBarry Smith 11.21.97 14a1db5e05SBarry Smith *********************************bit_mask.c***********************************/ 15c6db04a5SJed Brown #include <../src/ksp/pc/impls/tfs/tfs.h> 16a1db5e05SBarry Smith 17a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 18d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_bm_to_proc(char *ptr, PetscInt p_mask, PetscInt *msg_list) 19d71ae5a4SJacob Faibussowitsch { 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) { 299371c9d4SSatish Balay *msg_list = tmp; 309371c9d4SSatish Balay msg_list++; 312fa5cd67SKarl Rupp } 322fa5cd67SKarl Rupp if (*ptr & BIT_1) { 339371c9d4SSatish Balay *msg_list = tmp + 1; 349371c9d4SSatish Balay msg_list++; 352fa5cd67SKarl Rupp } 362fa5cd67SKarl Rupp if (*ptr & BIT_2) { 379371c9d4SSatish Balay *msg_list = tmp + 2; 389371c9d4SSatish Balay msg_list++; 392fa5cd67SKarl Rupp } 402fa5cd67SKarl Rupp if (*ptr & BIT_3) { 419371c9d4SSatish Balay *msg_list = tmp + 3; 429371c9d4SSatish Balay msg_list++; 432fa5cd67SKarl Rupp } 442fa5cd67SKarl Rupp if (*ptr & BIT_4) { 459371c9d4SSatish Balay *msg_list = tmp + 4; 469371c9d4SSatish Balay msg_list++; 472fa5cd67SKarl Rupp } 482fa5cd67SKarl Rupp if (*ptr & BIT_5) { 499371c9d4SSatish Balay *msg_list = tmp + 5; 509371c9d4SSatish Balay msg_list++; 512fa5cd67SKarl Rupp } 522fa5cd67SKarl Rupp if (*ptr & BIT_6) { 539371c9d4SSatish Balay *msg_list = tmp + 6; 549371c9d4SSatish Balay msg_list++; 552fa5cd67SKarl Rupp } 562fa5cd67SKarl Rupp if (*ptr & BIT_7) { 579371c9d4SSatish Balay *msg_list = tmp + 7; 589371c9d4SSatish Balay msg_list++; 592fa5cd67SKarl Rupp } 60a1db5e05SBarry Smith ptr--; 61a1db5e05SBarry Smith } 62a1db5e05SBarry Smith } 633ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 64a1db5e05SBarry Smith } 65a1db5e05SBarry Smith 66a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 67d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_ct_bits(char *ptr, PetscInt n) 68d71ae5a4SJacob Faibussowitsch { 69a1db5e05SBarry Smith PetscInt i, tmp = 0; 70a1db5e05SBarry Smith 712fa5cd67SKarl Rupp for (i = 0; i < n; i++) { 722fa5cd67SKarl Rupp if (*ptr & 128) tmp++; 732fa5cd67SKarl Rupp if (*ptr & 64) tmp++; 742fa5cd67SKarl Rupp if (*ptr & 32) tmp++; 752fa5cd67SKarl Rupp if (*ptr & 16) tmp++; 762fa5cd67SKarl Rupp if (*ptr & 8) tmp++; 772fa5cd67SKarl Rupp if (*ptr & 4) tmp++; 782fa5cd67SKarl Rupp if (*ptr & 2) tmp++; 792fa5cd67SKarl Rupp if (*ptr & 1) tmp++; 80a1db5e05SBarry Smith ptr++; 81a1db5e05SBarry Smith } 82*4ad8454bSPierre Jolivet return tmp; 83a1db5e05SBarry Smith } 84a1db5e05SBarry Smith 85a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 86d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_div_ceil(PetscInt numer, PetscInt denom) 87d71ae5a4SJacob Faibussowitsch { 8898921bdaSJacob 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); 89*4ad8454bSPierre Jolivet return PetscCeilInt(numer, denom); 90a1db5e05SBarry Smith } 91a1db5e05SBarry Smith 92a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 93d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_len_bit_mask(PetscInt num_items) 94d71ae5a4SJacob Faibussowitsch { 95a1db5e05SBarry Smith PetscInt rt_val, tmp; 96a1db5e05SBarry Smith 9708401ef6SPierre Jolivet PetscCheck(num_items >= 0, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Value Sent To PCTFS_len_bit_mask() Must be >= 0!"); 98a1db5e05SBarry Smith 99faa75363SBarry Smith rt_val = PetscCeilInt(num_items, BYTE); 100faa75363SBarry Smith /* make multiple of sizeof PetscInt */ 1012fa5cd67SKarl Rupp if ((tmp = rt_val % sizeof(PetscInt))) rt_val += (sizeof(PetscInt) - tmp); 102*4ad8454bSPierre Jolivet return rt_val; 103a1db5e05SBarry Smith } 104a1db5e05SBarry Smith 105a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 106d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_set_bit_mask(PetscInt *bm, PetscInt len, PetscInt val) 107d71ae5a4SJacob Faibussowitsch { 108a1db5e05SBarry Smith PetscInt i, offset; 109a1db5e05SBarry Smith char mask = 1; 110a1db5e05SBarry Smith char *cptr; 111a1db5e05SBarry Smith 1124a2f8832SBarry Smith PetscFunctionBegin; 11308401ef6SPierre Jolivet PetscCheck(PCTFS_len_bit_mask(val) <= len, PETSC_COMM_SELF, PETSC_ERR_PLIB, "The Bit Mask Isn't That Large!"); 114a1db5e05SBarry Smith 115a1db5e05SBarry Smith cptr = (char *)bm; 116a1db5e05SBarry Smith 117a1db5e05SBarry Smith offset = len / sizeof(PetscInt); 1182fa5cd67SKarl Rupp for (i = 0; i < offset; i++) { 1192fa5cd67SKarl Rupp *bm = 0; 1202fa5cd67SKarl Rupp bm++; 1212fa5cd67SKarl Rupp } 122a1db5e05SBarry Smith 123a1db5e05SBarry Smith offset = val % BYTE; 124ad540459SPierre Jolivet for (i = 0; i < offset; i++) mask <<= 1; 125a1db5e05SBarry Smith 126a1db5e05SBarry Smith offset = len - val / BYTE - 1; 127a1db5e05SBarry Smith cptr[offset] = mask; 1283ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 129a1db5e05SBarry Smith } 130a1db5e05SBarry Smith 131a1db5e05SBarry Smith /*********************************bit_mask.c***********************************/ 132d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_len_buf(PetscInt item_size, PetscInt num_items) 133d71ae5a4SJacob Faibussowitsch { 134a1db5e05SBarry Smith PetscInt rt_val, tmp; 135a1db5e05SBarry Smith 136a1db5e05SBarry Smith rt_val = item_size * num_items; 137a1db5e05SBarry Smith 138a1db5e05SBarry Smith /* double precision align for now ... consider page later */ 1392fa5cd67SKarl Rupp if ((tmp = (rt_val % (PetscInt)sizeof(double)))) rt_val += (sizeof(double) - tmp); 140*4ad8454bSPierre Jolivet return rt_val; 141a1db5e05SBarry Smith } 142