Actual source code: bitmask.c

  1: /********************************bit_mask.c************************************

  3: Author: Henry M. Tufo III

  5: e-mail: hmt@cs.brown.edu

  7: snail-mail:
  8: Division of Applied Mathematics
  9: Brown University
 10: Providence, RI 02912

 12: Last Modification:
 13: 11.21.97
 14: *********************************bit_mask.c***********************************/
 15: #include <../src/ksp/pc/impls/tfs/tfs.h>

 17: /*********************************bit_mask.c***********************************/
 18: PetscErrorCode PCTFS_bm_to_proc(char *ptr, PetscInt p_mask, PetscInt *msg_list)
 19: {
 20:   PetscInt i, tmp;

 22:   PetscFunctionBegin;
 23:   if (msg_list) {
 24:     /* low to high */
 25:     ptr += (p_mask - 1);
 26:     for (i = p_mask - 1; i >= 0; i--) {
 27:       tmp = BYTE * (p_mask - i - 1);
 28:       if (*ptr & BIT_0) {
 29:         *msg_list = tmp;
 30:         msg_list++;
 31:       }
 32:       if (*ptr & BIT_1) {
 33:         *msg_list = tmp + 1;
 34:         msg_list++;
 35:       }
 36:       if (*ptr & BIT_2) {
 37:         *msg_list = tmp + 2;
 38:         msg_list++;
 39:       }
 40:       if (*ptr & BIT_3) {
 41:         *msg_list = tmp + 3;
 42:         msg_list++;
 43:       }
 44:       if (*ptr & BIT_4) {
 45:         *msg_list = tmp + 4;
 46:         msg_list++;
 47:       }
 48:       if (*ptr & BIT_5) {
 49:         *msg_list = tmp + 5;
 50:         msg_list++;
 51:       }
 52:       if (*ptr & BIT_6) {
 53:         *msg_list = tmp + 6;
 54:         msg_list++;
 55:       }
 56:       if (*ptr & BIT_7) {
 57:         *msg_list = tmp + 7;
 58:         msg_list++;
 59:       }
 60:       ptr--;
 61:     }
 62:   }
 63:   PetscFunctionReturn(PETSC_SUCCESS);
 64: }

 66: /*********************************bit_mask.c***********************************/
 67: PetscInt PCTFS_ct_bits(char *ptr, PetscInt n)
 68: {
 69:   PetscInt i, tmp = 0;

 71:   for (i = 0; i < n; i++) {
 72:     if (*ptr & 128) tmp++;
 73:     if (*ptr & 64) tmp++;
 74:     if (*ptr & 32) tmp++;
 75:     if (*ptr & 16) tmp++;
 76:     if (*ptr & 8) tmp++;
 77:     if (*ptr & 4) tmp++;
 78:     if (*ptr & 2) tmp++;
 79:     if (*ptr & 1) tmp++;
 80:     ptr++;
 81:   }
 82:   return tmp;
 83: }

 85: /*********************************bit_mask.c***********************************/
 86: PetscInt PCTFS_div_ceil(PetscInt numer, PetscInt denom)
 87: {
 88:   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:   return PetscCeilInt(numer, denom);
 90: }

 92: /*********************************bit_mask.c***********************************/
 93: PetscInt PCTFS_len_bit_mask(PetscInt num_items)
 94: {
 95:   PetscInt rt_val, tmp;

 97:   PetscCheck(num_items >= 0, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Value Sent To PCTFS_len_bit_mask() Must be >= 0!");

 99:   rt_val = PetscCeilInt(num_items, BYTE);
100:   /* make multiple of sizeof PetscInt */
101:   if ((tmp = rt_val % sizeof(PetscInt))) rt_val += (sizeof(PetscInt) - tmp);
102:   return rt_val;
103: }

105: /*********************************bit_mask.c***********************************/
106: PetscErrorCode PCTFS_set_bit_mask(PetscInt *bm, PetscInt len, PetscInt val)
107: {
108:   PetscInt i, offset;
109:   char     mask = 1;
110:   char    *cptr;

112:   PetscFunctionBegin;
113:   PetscCheck(PCTFS_len_bit_mask(val) <= len, PETSC_COMM_SELF, PETSC_ERR_PLIB, "The Bit Mask Isn't That Large!");

115:   cptr = (char *)bm;

117:   offset = len / sizeof(PetscInt);
118:   for (i = 0; i < offset; i++) {
119:     *bm = 0;
120:     bm++;
121:   }

123:   offset = val % BYTE;
124:   for (i = 0; i < offset; i++) mask <<= 1;

126:   offset       = len - val / BYTE - 1;
127:   cptr[offset] = mask;
128:   PetscFunctionReturn(PETSC_SUCCESS);
129: }

131: /*********************************bit_mask.c***********************************/
132: PetscInt PCTFS_len_buf(PetscInt item_size, PetscInt num_items)
133: {
134:   PetscInt rt_val, tmp;

136:   rt_val = item_size * num_items;

138:   /*  double precision align for now ... consider page later */
139:   if ((tmp = (rt_val % (PetscInt)sizeof(double)))) rt_val += (sizeof(double) - tmp);
140:   return rt_val;
141: }