Actual source code: bitmask.c

petsc-3.3-p7 2013-05-11
  2: /********************************bit_mask.c************************************

  4: Author: Henry M. Tufo III

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

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

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


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

 25:    if (msg_list)
 26:     {
 27:       /* low to high */
 28:       ptr+=(p_mask-1);
 29:       for (i=p_mask-1;i>=0;i--)
 30:         {
 31:           tmp = BYTE*(p_mask-i-1);
 32:           if (*ptr&BIT_0)
 33:             {*msg_list = tmp; msg_list++;}
 34:           if (*ptr&BIT_1)
 35:             {*msg_list = tmp+1; msg_list++;}
 36:           if (*ptr&BIT_2)
 37:             {*msg_list = tmp+2; msg_list++;}
 38:           if (*ptr&BIT_3)
 39:             {*msg_list = tmp+3; msg_list++;}
 40:           if (*ptr&BIT_4)
 41:             {*msg_list = tmp+4; msg_list++;}
 42:           if (*ptr&BIT_5)
 43:             {*msg_list = tmp+5; msg_list++;}
 44:           if (*ptr&BIT_6)
 45:             {*msg_list = tmp+6; msg_list++;}
 46:           if (*ptr&BIT_7)
 47:             {*msg_list = tmp+7; msg_list++;}
 48:           ptr --;
 49:         }
 50:   }
 51:   return(0);
 52: }

 54: /*********************************bit_mask.c***********************************/
 55: PetscInt PCTFS_ct_bits( char *ptr, PetscInt n)
 56: {
 57:    PetscInt i, tmp=0;

 60:   for(i=0;i<n;i++)
 61:     {
 62:       if (*ptr&128) {tmp++;}
 63:       if (*ptr&64)  {tmp++;}
 64:       if (*ptr&32)  {tmp++;}
 65:       if (*ptr&16)  {tmp++;}
 66:       if (*ptr&8)   {tmp++;}
 67:       if (*ptr&4)   {tmp++;}
 68:       if (*ptr&2)   {tmp++;}
 69:       if (*ptr&1)   {tmp++;}
 70:       ptr++;
 71:     }

 73:   return(tmp);
 74: }

 76: /*********************************bit_mask.c***********************************/
 77: PetscInt
 78: PCTFS_div_ceil( PetscInt numer,  PetscInt denom)
 79: {
 80:    PetscInt rt_val;

 82:   if ((numer<0)||(denom<=0)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_div_ceil() :: numer=%D ! >=0, denom=%D ! >0",numer,denom);

 84:   /* if integer division remainder then increment */
 85:   rt_val = numer/denom;
 86:   if (numer%denom)
 87:     {rt_val++;}
 88: 
 89:   return(rt_val);
 90: }

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

 98:   if (num_items<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Value Sent To PCTFS_len_bit_mask() Must be >= 0!");

100:   /* mod BYTE ceiling function */
101:   rt_val = num_items/BYTE;
102:   if (num_items%BYTE)
103:     {rt_val++;}
104: 
105:   /* make mults of sizeof int */
106:   if ((tmp=rt_val%sizeof(PetscInt)))
107:     {rt_val+=(sizeof(PetscInt)-tmp);}

109:   return(rt_val);
110: }

112: /*********************************bit_mask.c***********************************/
113: PetscErrorCode PCTFS_set_bit_mask( PetscInt *bm, PetscInt len, PetscInt val)
114: {
115:    PetscInt i, offset;
116:    char mask = 1;
117:    char *cptr;

119:   if (PCTFS_len_bit_mask(val)>len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"The Bit Mask Isn't That Large!");

121:   cptr = (char *) bm;

123:   offset = len/sizeof(PetscInt);
124:   for (i=0;i<offset;i++)
125:     {*bm=0; bm++;}

127:   offset = val%BYTE;
128:   for (i=0;i<offset;i++)
129:     {mask <<= 1;}

131:   offset = len - val/BYTE - 1;
132:   cptr[offset] = mask;
133:   return(0);
134: }

136: /*********************************bit_mask.c***********************************/
137: PetscInt PCTFS_len_buf(PetscInt item_size, PetscInt num_items)
138: {
139:    PetscInt rt_val, tmp;

142:   rt_val = item_size * num_items;

144:   /*  double precision align for now ... consider page later */
145:   if ((tmp = (rt_val%(PetscInt)sizeof(double))))
146:     {rt_val += (sizeof(double) - tmp);}

148:   return(rt_val);
149: }