#ifdef PETSC_RCS_HEADER static char vcid[] = "$Id: axpy.c,v 1.33 1998/04/24 02:16:14 bsmith Exp bsmith $"; #endif #include "src/mat/matimpl.h" /*I "mat.h" I*/ #undef __FUNC__ #define __FUNC__ "MatAXPY" /*@ MatAXPY - Computes Y = a*X + Y. Collective on Mat Input Parameters: + X,Y - the matrices - a - the scalar multiplier Contributed by: Matthew Knepley .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; PetscFunctionBegin; PetscValidHeaderSpecific(X,MAT_COOKIE); PetscValidHeaderSpecific(Y,MAT_COOKIE); PetscValidScalarPointer(a); MatGetSize(X,&m1,&n1); MatGetSize(Y,&m2,&n2); if (m1 != m2 || n1 != n2) SETERRQ(PETSC_ERR_ARG_SIZ,0,"Non conforming matrix add"); if (X->ops->axpy) { ierr = (*X->ops->axpy)(a,X,Y); CHKERRQ(ierr); } else { ierr = MatGetOwnershipRange(X,&start,&end); CHKERRQ(ierr); if (*a == 1.0) { for (i = start; i < end; i++) { ierr = MatGetRow(X, i, &ncols, &row, &vals); CHKERRQ(ierr); ierr = MatSetValues(Y, 1, &i, ncols, row, vals, ADD_VALUES); CHKERRQ(ierr); ierr = MatRestoreRow(X, i, &ncols, &row, &vals); CHKERRQ(ierr); } } else { vals = (Scalar *) PetscMalloc( (n1+1)*sizeof(Scalar) ); CHKPTRQ(vals); for ( i=start; iops->shift) { ierr = (*Y->ops->shift)(a,Y); CHKERRQ(ierr); } else { ierr = MatGetOwnershipRange(Y,&start,&end); CHKERRQ(ierr); 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(PETSC_ERR_ARG_SIZ,0,"Vector ownership range not compatible with matrix"); } ierr = VecGetArray(D,&v); CHKERRQ(ierr); for ( i=start; i