#ifndef lint static char vcid[] = "$Id: axpy.c,v 1.19 1996/08/08 14:44:19 bsmith Exp bsmith $"; #endif #include "src/mat/matimpl.h" /*I "mat.h" I*/ /*@ MatAXPY - Computes Y = a*X + Y. Input Parameters: . X,Y - the matrices . a - the scalar multiplier .keywords: matrix, add @*/ int MatAXPY(Scalar *a,Mat X,Mat Y) { int m1,m2,n1,n2,i,*row,start,end,j,ncols,ierr; Scalar *val,*vals; PetscValidHeaderSpecific(X,MAT_COOKIE); PetscValidHeaderSpecific(Y,MAT_COOKIE); PetscValidScalarPointer(a); MatGetSize(X,&m1,&n1); MatGetSize(X,&m2,&n2); if (m1 != m2 || n1 != n2) SETERRQ(1,"MatAXPY:Non conforming matrix add"); if (X->ops.axpy) { ierr = (*X->ops.axpy)(a,X,Y); CHKERRQ(ierr); } else { vals = (Scalar *) PetscMalloc( n1*sizeof(Scalar) ); CHKPTRQ(vals); ierr = MatGetOwnershipRange(X,&start,&end); CHKERRQ(ierr); for ( i=start; iops.shift) { ierr = (*Y->ops.shift)(a,Y); CHKERRQ(ierr); } else { MatGetOwnershipRange(Y,&start,&end); for ( i=start; iops.shift) { ierr = (*Y->ops.diagonalshift)(D,Y); CHKERRQ(ierr); } else { int vstart,vend; Scalar *v; ierr = VecGetOwnershipRange(D,&vstart,&vend); CHKERRQ(ierr); ierr = MatGetOwnershipRange(Y,&start,&end); CHKERRQ(ierr); if (vstart != start || vend != end) SETERRQ(1,"MatDiagonalShift:Vector shift not compatible with matrix"); ierr = VecGetArray(D,&v); CHKERRQ(ierr); for ( i=start; i