xref: /petsc/src/mat/utils/axpy.c (revision 83f0b094dc636e37da8195bbeaa240568e9f5ab6)
1 #ifndef lint
2 static char vcid[] = "$Id: axpy.c,v 1.7 1995/08/07 18:53:19 bsmith Exp bsmith $";
3 #endif
4 
5 #include "matimpl.h"  /*I   "mat.h"  I*/
6 
7 /*@
8    MatAXPY - Y = a*X + Y
9 
10    Input Parameters:
11 .  X,Y - the matrices
12 .  a - the scalar multiple
13 
14 .keywods: Mat, 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   vals = (Scalar *) PETSCMALLOC( n1*sizeof(Scalar) ); CHKPTRQ(vals);
25   MatGetOwnershipRange(X,&start,&end);
26   for ( i=start; i<end; i++ ) {
27     MatGetRow(X,i,&ncols,&row,&val);
28     for ( j=0; j<ncols; j++ ) {
29       vals[j] = (*a)*val[j];
30     }
31     ierr = MatSetValues(Y,1,&i,ncols,row,vals,ADDVALUES); CHKERRQ(ierr);
32     MatRestoreRow(X,i,&ncols,&row,&val);
33   }
34   PETSCFREE(vals);
35   ierr = MatAssemblyBegin(Y,FINAL_ASSEMBLY); CHKERRQ(ierr);
36   ierr = MatAssemblyEnd(Y,FINAL_ASSEMBLY); CHKERRQ(ierr);
37   return 0;
38 }
39