1 #ifndef lint 2 static char vcid[] = "$Id: axpy.c,v 1.10 1995/10/10 16:22:15 curfman Exp bsmith $"; 3 #endif 4 5 #include "matimpl.h" /*I "mat.h" I*/ 6 7 /*@ 8 MatAXPY - Computes Y = a*X + Y 9 10 Input Parameters: 11 . X,Y - the matrices 12 . a - the scalar multiplier 13 14 .keywords: matrix, add 15 @*/ 16 int MatAXPY(Scalar *a,Mat X,Mat Y) 17 { 18 int m1,m2,n1,n2,i,*row,start,end,j,ncols,ierr; 19 Scalar *val,*vals; 20 21 PETSCVALIDHEADERSPECIFIC(X,MAT_COOKIE); PETSCVALIDHEADERSPECIFIC(Y,MAT_COOKIE); 22 MatGetSize(X,&m1,&n1); MatGetSize(X,&m2,&n2); 23 if (m1 != m2 || n1 != n2) SETERRQ(1,"MatAXPY:Non conforming matrix add"); 24 25 if (X->ops.axpy) { 26 ierr = (*X->ops.axpy)(a,X,Y); CHKERRQ(ierr); 27 } 28 else { 29 vals = (Scalar *) PETSCMALLOC( n1*sizeof(Scalar) ); CHKPTRQ(vals); 30 MatGetOwnershipRange(X,&start,&end); 31 for ( i=start; i<end; i++ ) { 32 MatGetRow(X,i,&ncols,&row,&val); 33 for ( j=0; j<ncols; j++ ) { 34 vals[j] = (*a)*val[j]; 35 } 36 ierr = MatSetValues(Y,1,&i,ncols,row,vals,ADD_VALUES); CHKERRQ(ierr); 37 MatRestoreRow(X,i,&ncols,&row,&val); 38 } 39 PETSCFREE(vals); 40 ierr = MatAssemblyBegin(Y,FINAL_ASSEMBLY); CHKERRQ(ierr); 41 ierr = MatAssemblyEnd(Y,FINAL_ASSEMBLY); CHKERRQ(ierr); 42 } 43 return 0; 44 } 45