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

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

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

revision 415 by gross, Wed Jan 4 05:37:33 2006 UTC revision 633 by dhawcroft, Thu Mar 23 05:37:00 2006 UTC
# Line 1  Line 1 
1  /* $Id$ */  /* $Id$ */
2    
3    
4    /*
5    ********************************************************************************
6    *               Copyright   2006 by ACcESS MNRF                                *
7    *                                                                              *
8    *                 http://www.access.edu.au                                     *
9    *           Primary Business: Queensland, Australia                            *
10    *     Licensed under the Open Software License version 3.0             *
11    *        http://www.opensource.org/licenses/osl-3.0.php                        *
12    ********************************************************************************
13    */
14    
15  /**************************************************************/  /**************************************************************/
16    
17  /* Paso: matrix vector product with sparse matrix           */  /* Paso: matrix vector product with sparse matrix           */
# Line 189  void  Paso_SystemMatrix_MatrixVector_CSR Line 201  void  Paso_SystemMatrix_MatrixVector_CSR
201      double beta,      double beta,
202      double* out) {      double* out) {
203    
204    register index_t ir,icol,iptr,icb,irb,irow,ic;    register index_t ir,icol,iptr,icb,irb,irow,ic,Aiptr;
205    register double reg,reg1,reg2,reg3;    register double reg,reg1,reg2,reg3,in1,in2,in3,A00,A10,A20,A01,A11,A21,A02,A12,A22;
206    #pragma omp barrier    #pragma omp barrier
207    if (ABS(beta)>0.) {    if (ABS(beta)>0.) {
208      #pragma omp for private(irow) schedule(static)      #pragma omp for private(irow) schedule(static)
# Line 213  void  Paso_SystemMatrix_MatrixVector_CSR Line 225  void  Paso_SystemMatrix_MatrixVector_CSR
225        out[irow] += alpha * reg;        out[irow] += alpha * reg;
226      }      }
227      } else if (A ->col_block_size==2 && A->row_block_size ==2) {      } else if (A ->col_block_size==2 && A->row_block_size ==2) {
228          #pragma omp for private(ir,iptr,irb,icb,irow,icol,reg1,reg2) schedule(static)          #pragma omp for private(ir,reg1,reg2,iptr,ic,Aiptr,in1,in2,A00,A10,A01,A11) schedule(static)
229      for (ir=0;ir< A->pattern->n_ptr;ir++) {      for (ir=0;ir< A->pattern->n_ptr;ir++) {
230            reg1=0.;            reg1=0.;
231            reg2=0.;            reg2=0.;
232        for (iptr=A->pattern->ptr[ir];iptr<A->pattern->ptr[ir+1]; iptr++) {        for (iptr=A->pattern->ptr[ir];iptr<A->pattern->ptr[ir+1]; iptr++) {
233             ic=2*(A->pattern->index[iptr]);             ic=2*(A->pattern->index[iptr]);
234             reg1 += A->val[iptr*4  ]*in[ic] + A->val[iptr*4+2]*in[1+ic];                 Aiptr=iptr*4;
235             reg2 += A->val[iptr*4+1]*in[ic] + A->val[iptr*4+3]*in[1+ic];                 in1=in[ic];
236                   in2=in[1+ic];
237                   A00=A->val[Aiptr  ];
238                   A10=A->val[Aiptr+1];
239                   A01=A->val[Aiptr+2];
240                   A11=A->val[Aiptr+3];
241               reg1 += A00*in1 + A01*in2;
242               reg2 += A10*in1 + A11*in2;
243        }        }
244        out[  2*ir] += alpha * reg1;        out[  2*ir] += alpha * reg1;
245        out[1+2*ir] += alpha * reg2;        out[1+2*ir] += alpha * reg2;
246      }      }
247      } else if (A ->col_block_size==3 && A->row_block_size ==3) {      } else if (A ->col_block_size==3 && A->row_block_size ==3) {
248          #pragma omp for private(ir,iptr,irb,icb,irow,icol,reg1,reg2,reg3) schedule(static)          #pragma omp for private(ir,reg1,reg2,reg3,iptr,ic,Aiptr,in1,in2,in3,A00,A10,A20,A01,A11,A21,A02,A12,A22) schedule(static)
249      for (ir=0;ir< A->pattern->n_ptr;ir++) {      for (ir=0;ir< A->pattern->n_ptr;ir++) {
250            reg1=0.;            reg1=0.;
251            reg2=0.;            reg2=0.;
252            reg3=0.;            reg3=0.;
253        for (iptr=A->pattern->ptr[ir];iptr<A->pattern->ptr[ir+1]; iptr++) {        for (iptr=A->pattern->ptr[ir];iptr<A->pattern->ptr[ir+1]; iptr++) {
254             ic=3*(A->pattern->index[iptr]);             ic=3*(A->pattern->index[iptr]);
255             reg1 += A->val[iptr*9  ]*in[ic] + A->val[iptr*9+3]*in[1+ic] + A->val[iptr*9+6]*in[2+ic];                 Aiptr=iptr*9;
256             reg2 += A->val[iptr*9+1]*in[ic] + A->val[iptr*9+4]*in[1+ic] + A->val[iptr*9+7]*in[2+ic];                 in1=in[ic];
257             reg3 += A->val[iptr*9+2]*in[ic] + A->val[iptr*9+5]*in[1+ic] + A->val[iptr*9+8]*in[2+ic];                 in2=in[1+ic];
258                   in3=in[2+ic];
259                   A00=A->val[Aiptr  ];
260                   A10=A->val[Aiptr+1];
261                   A20=A->val[Aiptr+2];
262                   A01=A->val[Aiptr+3];
263                   A11=A->val[Aiptr+4];
264                   A21=A->val[Aiptr+5];
265                   A02=A->val[Aiptr+6];
266                   A12=A->val[Aiptr+7];
267                   A22=A->val[Aiptr+8];
268               reg1 += A00*in1 + A01*in2 + A02*in3;
269               reg2 += A10*in1 + A11*in2 + A12*in3;
270               reg3 += A20*in1 + A21*in2 + A22*in3;
271        }        }
272        out[  3*ir] += alpha * reg1;        out[  3*ir] += alpha * reg1;
273        out[1+3*ir] += alpha * reg2;        out[1+3*ir] += alpha * reg2;
# Line 292  void  Paso_SystemMatrix_MatrixVector_CSR Line 324  void  Paso_SystemMatrix_MatrixVector_CSR
324        out[irow] += alpha * reg;        out[irow] += alpha * reg;
325      }      }
326      } else if (A ->col_block_size==2 && A->row_block_size ==2) {      } else if (A ->col_block_size==2 && A->row_block_size ==2) {
327          #pragma omp for private(ir,iptr,irb,icb,irow,icol,reg1,reg2) schedule(static)          #pragma omp for private(ir,reg1,reg2,iptr,ic) schedule(static)
328      for (ir=0;ir< A->pattern->n_ptr;ir++) {      for (ir=0;ir< A->pattern->n_ptr;ir++) {
329            reg1=0.;            reg1=0.;
330            reg2=0.;            reg2=0.;
# Line 305  void  Paso_SystemMatrix_MatrixVector_CSR Line 337  void  Paso_SystemMatrix_MatrixVector_CSR
337        out[1+2*ir] += alpha * reg2;        out[1+2*ir] += alpha * reg2;
338      }      }
339      } else if (A ->col_block_size==3 && A->row_block_size ==3) {      } else if (A ->col_block_size==3 && A->row_block_size ==3) {
340          #pragma omp for private(ir,iptr,irb,icb,irow,icol,reg1,reg2,reg3) schedule(static)          #pragma omp for private(ir,reg1,reg2,reg3,iptr,ic) schedule(static)
341      for (ir=0;ir< A->pattern->n_ptr;ir++) {      for (ir=0;ir< A->pattern->n_ptr;ir++) {
342            reg1=0.;            reg1=0.;
343            reg2=0.;            reg2=0.;

Legend:
Removed from v.415  
changed lines
  Added in v.633

  ViewVC Help
Powered by ViewVC 1.1.26