16f79c3a4SBarry Smith #ifndef lint 2*1a941147SBarry Smith static char vcid[] = "$Id: axpy.c,v 1.6 1995/07/17 20:41:50 bsmith Exp bsmith $"; 36f79c3a4SBarry Smith #endif 46f79c3a4SBarry Smith 548b35521SBarry Smith #include "matimpl.h" /*I "mat.h" I*/ 66f79c3a4SBarry Smith 706be10caSBarry Smith /*@ 806be10caSBarry Smith MatAXPY - Y = a*X + Y 96f79c3a4SBarry Smith 106f79c3a4SBarry Smith Input Parameters: 1106be10caSBarry Smith . X,Y - the matrices 1206be10caSBarry Smith . a - the scalar multiple 136f79c3a4SBarry Smith 1406be10caSBarry Smith .keywods: Mat, add 1506be10caSBarry Smith @*/ 166f79c3a4SBarry Smith 1706be10caSBarry Smith int MatAXPY(Scalar *a,Mat X,Mat Y) 186f79c3a4SBarry Smith { 1906be10caSBarry Smith int m1,m2,n1,n2,i,*row,start,end,j,ncols,ierr; 2006be10caSBarry Smith Scalar *val,*vals; 216f79c3a4SBarry Smith 22*1a941147SBarry Smith PETSCVALIDHEADERSPECIFIC(X,MAT_COOKIE); PETSCVALIDHEADERSPECIFIC(Y,MAT_COOKIE); 2306be10caSBarry Smith MatGetSize(X,&m1,&n1); MatGetSize(X,&m2,&n2); 24bbb6d6a8SBarry Smith if (m1 != m2 || n1 != n2) SETERRQ(1,"MatAXPY:Non conforming matrix add"); 2578b31e54SBarry Smith vals = (Scalar *) PETSCMALLOC( n1*sizeof(Scalar) ); CHKPTRQ(vals); 2606be10caSBarry Smith MatGetOwnershipRange(X,&start,&end); 2706be10caSBarry Smith for ( i=start; i<end; i++ ) { 2806be10caSBarry Smith MatGetRow(X,i,&ncols,&row,&val); 2906be10caSBarry Smith for ( j=0; j<ncols; j++ ) { 3006be10caSBarry Smith vals[j] = (*a)*val[j]; 316f79c3a4SBarry Smith } 3278b31e54SBarry Smith ierr = MatSetValues(Y,1,&i,ncols,row,vals,ADDVALUES); CHKERRQ(ierr); 3306be10caSBarry Smith MatRestoreRow(X,i,&ncols,&row,&val); 346f79c3a4SBarry Smith } 3578b31e54SBarry Smith PETSCFREE(vals); 3678b31e54SBarry Smith ierr = MatAssemblyBegin(Y,FINAL_ASSEMBLY); CHKERRQ(ierr); 3778b31e54SBarry Smith ierr = MatAssemblyEnd(Y,FINAL_ASSEMBLY); CHKERRQ(ierr); 386f79c3a4SBarry Smith return 0; 396f79c3a4SBarry Smith } 40