/[escript]/trunk/paso/src/Pattern.c
ViewVC logotype

Diff of /trunk/paso/src/Pattern.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3283 by gross, Mon Oct 18 22:39:28 2010 UTC revision 3303 by gross, Mon Oct 25 04:33:31 2010 UTC
# Line 153  bool_t Paso_Pattern_isEmpty(Paso_Pattern Line 153  bool_t Paso_Pattern_isEmpty(Paso_Pattern
153  }  }
154    
155    
 /* computes the pattern coming from matrix-matrix multiplication  
 *  
 **/  
   
 Paso_Pattern* Paso_Pattern_multiply(int type, Paso_Pattern* A, Paso_Pattern* B) {  
   Paso_Pattern*out=NULL;  
   index_t iptrA,iptrB;  
   dim_t i,j,k;  
   Paso_IndexListArray* index_list = Paso_IndexListArray_alloc(A->numOutput);  
     
   #pragma omp parallel for private(i,iptrA,j,iptrB,k) schedule(static)  
   for(i = 0; i < A->numOutput; i++) {  
      for(iptrA = A->ptr[i]; iptrA < A->ptr[i+1]; ++iptrA) {  
       j = A->index[iptrA];  
       for(iptrB = B->ptr[j]; iptrB < B->ptr[j+1]; ++iptrB) {  
         k = B->index[iptrB];  
     Paso_IndexListArray_insertIndex(index_list,i,k);  
      }  
     }  
   }  
       
   out=Paso_Pattern_fromIndexListArray(0, index_list,0,B->numInput,0);  
   
  /* clean up */  
  Paso_IndexListArray_free(index_list);  
     
 return out;  
 }  
   
   
   
 /*  
  * Computes the pattern  of C = A binary operation B for CSR matrices A,B  
  *  
  * Note: we do not check whether A_ij(op)B_ij=0  
  *  
  */  
 Paso_Pattern* Paso_Pattern_binop(int type, Paso_Pattern* A, Paso_Pattern* B) {  
   Paso_Pattern *out=NULL;  
   index_t iptrA,iptrB;  
   dim_t i,j,k;  
   
   Paso_IndexListArray* index_list = Paso_IndexListArray_alloc(A->numOutput);  
     
   #pragma omp parallel for private(i,iptrA,j,iptrB,k) schedule(static)  
   for(i = 0; i < B->numOutput; i++){  
     iptrA = A->ptr[i],  
     iptrB = B->ptr[i];  
       
     while (iptrA < A->ptr[i+1] && iptrB < B->ptr[i+1]) {  
         j = A->index[iptrA];  
         k = B->index[iptrB];  
         if (j<k) {  
        Paso_IndexListArray_insertIndex(index_list,i,j);  
            iptrA++;  
         } else if (j>k) {  
        Paso_IndexListArray_insertIndex(index_list,i,k);  
             iptrB++;  
         } else if (j==k) {  
        Paso_IndexListArray_insertIndex(index_list,i,j);  
             iptrB++;  
             iptrA++;  
         }  
     }  
     while(iptrA < A->ptr[i+1]) {  
         j = A->index[iptrA];  
     Paso_IndexListArray_insertIndex(index_list,i,j);  
         iptrA++;  
     }  
     while(iptrB < B->ptr[i+1]) {  
         k = B->index[iptrB];  
     Paso_IndexListArray_insertIndex(index_list,i,k);  
         iptrB++;  
     }  
   }  
   
   out=Paso_Pattern_fromIndexListArray(0, index_list,0,A->numInput,0);  
   
   
  /* clean up */  
  Paso_IndexListArray_free(index_list);  
   
   return out;  
 }  
   
156  /* creates a Paso_pattern from a range of indices */  /* creates a Paso_pattern from a range of indices */
157  Paso_Pattern* Paso_Pattern_fromIndexListArray(dim_t n0, Paso_IndexListArray* index_list_array,index_t range_min,index_t range_max,index_t index_offset)  Paso_Pattern* Paso_Pattern_fromIndexListArray(dim_t n0, Paso_IndexListArray* index_list_array,index_t range_min,index_t range_max,index_t index_offset)
158  {  {

Legend:
Removed from v.3283  
changed lines
  Added in v.3303

  ViewVC Help
Powered by ViewVC 1.1.26