/[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 494 by gross, Wed Jan 4 05:37:33 2006 UTC revision 495 by gross, Mon Feb 6 06:32:06 2006 UTC
# Line 189  void  Paso_SystemMatrix_MatrixVector_CSR Line 189  void  Paso_SystemMatrix_MatrixVector_CSR
189      double beta,      double beta,
190      double* out) {      double* out) {
191    
192    register index_t ir,icol,iptr,icb,irb,irow,ic;    register index_t ir,icol,iptr,icb,irb,irow,ic,Aiptr;
193    register double reg,reg1,reg2,reg3;    register double reg,reg1,reg2,reg3,in1,in2,in3,A00,A10,A20,A01,A11,A21,A02,A12,A22;
194    #pragma omp barrier    #pragma omp barrier
195    if (ABS(beta)>0.) {    if (ABS(beta)>0.) {
196      #pragma omp for private(irow) schedule(static)      #pragma omp for private(irow) schedule(static)
# Line 207  void  Paso_SystemMatrix_MatrixVector_CSR Line 207  void  Paso_SystemMatrix_MatrixVector_CSR
207          #pragma omp for private(irow,iptr,reg) schedule(static)          #pragma omp for private(irow,iptr,reg) schedule(static)
208      for (irow=0;irow< A->pattern->n_ptr;++irow) {      for (irow=0;irow< A->pattern->n_ptr;++irow) {
209            reg=0.;            reg=0.;
210              #pragma swp
211        for (iptr=(A->pattern->ptr[irow]);iptr<(A->pattern->ptr[irow+1]); ++iptr) {        for (iptr=(A->pattern->ptr[irow]);iptr<(A->pattern->ptr[irow+1]); ++iptr) {
212            reg += A->val[iptr] * in[A->pattern->index[iptr]];            reg += A->val[iptr] * in[A->pattern->index[iptr]];
213        }        }
214        out[irow] += alpha * reg;        out[irow] += alpha * reg;
215      }      }
216      } else if (A ->col_block_size==2 && A->row_block_size ==2) {      } else if (A ->col_block_size==2 && A->row_block_size ==2) {
217          #pragma omp for private(ir,iptr,irb,icb,irow,icol,reg1,reg2) schedule(static)          #pragma omp for private(ir,iptr,irb,icb,irow,icol,reg1,reg2,in1,in2,Aiptr,A00,A10,A01,A11) schedule(static)
218      for (ir=0;ir< A->pattern->n_ptr;ir++) {      for (ir=0;ir< A->pattern->n_ptr;ir++) {
219            reg1=0.;            reg1=0.;
220            reg2=0.;            reg2=0.;
221              #pragma swp
222        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++) {
223             ic=2*(A->pattern->index[iptr]);             ic=2*(A->pattern->index[iptr]);
224             reg1 += A->val[iptr*4  ]*in[ic] + A->val[iptr*4+2]*in[1+ic];                 Aiptr=iptr*4;
225             reg2 += A->val[iptr*4+1]*in[ic] + A->val[iptr*4+3]*in[1+ic];                 in1=in[ic];
226                   in2=in[1+ic];
227                   A00=A->val[Aiptr  ];
228                   A10=A->val[Aiptr+1];
229                   A01=A->val[Aiptr+2];
230                   A11=A->val[Aiptr+3];
231               reg1 += A00*in1 + A01*in2;
232               reg2 += A10*in1 + A11*in2;
233        }        }
234        out[  2*ir] += alpha * reg1;        out[  2*ir] += alpha * reg1;
235        out[1+2*ir] += alpha * reg2;        out[1+2*ir] += alpha * reg2;
236      }      }
237      } else if (A ->col_block_size==3 && A->row_block_size ==3) {      } else if (A ->col_block_size==3 && A->row_block_size ==3) {
238          #pragma omp for private(ir,iptr,irb,icb,irow,icol,reg1,reg2,reg3) schedule(static)          #pragma omp for private(ir,iptr,irb,icb,irow,icol,reg1,reg2,reg3,in1,in2,in3,Aiptr,A00,A10,A20,A01,A11,A21,A02,A12,A22) schedule(static)
239      for (ir=0;ir< A->pattern->n_ptr;ir++) {      for (ir=0;ir< A->pattern->n_ptr;ir++) {
240            reg1=0.;            reg1=0.;
241            reg2=0.;            reg2=0.;
242            reg3=0.;            reg3=0.;
243              #pragma swp
244        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++) {
245             ic=3*(A->pattern->index[iptr]);             ic=3*(A->pattern->index[iptr]);
246             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;
247             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];
248             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];
249                   in3=in[2+ic];
250                   A00=A->val[Aiptr  ];
251                   A10=A->val[Aiptr+1];
252                   A20=A->val[Aiptr+2];
253                   A01=A->val[Aiptr+3];
254                   A11=A->val[Aiptr+4];
255                   A21=A->val[Aiptr+5];
256                   A02=A->val[Aiptr+6];
257                   A12=A->val[Aiptr+7];
258                   A22=A->val[Aiptr+8];
259               reg1 += A00*in1 + A01*in2 + A02*in3;
260               reg2 += A10*in1 + A11*in2 + A12*in3;
261               reg3 += A20*in1 + A21*in2 + A22*in3;
262        }        }
263        out[  3*ir] += alpha * reg1;        out[  3*ir] += alpha * reg1;
264        out[1+3*ir] += alpha * reg2;        out[1+3*ir] += alpha * reg2;

Legend:
Removed from v.494  
changed lines
  Added in v.495

  ViewVC Help
Powered by ViewVC 1.1.26