16f79c3a4SBarry Smith #ifndef lint 2*6d84be18SBarry Smith static char vcid[] = "$Id: axpy.c,v 1.13 1996/01/23 00:19:25 bsmith Exp bsmith $"; 36f79c3a4SBarry Smith #endif 46f79c3a4SBarry Smith 548b35521SBarry Smith #include "matimpl.h" /*I "mat.h" I*/ 66f79c3a4SBarry Smith 706be10caSBarry Smith /*@ 89cf4f1e8SLois Curfman McInnes MatAXPY - Computes Y = a*X + Y 96f79c3a4SBarry Smith 106f79c3a4SBarry Smith Input Parameters: 1106be10caSBarry Smith . X,Y - the matrices 129cf4f1e8SLois Curfman McInnes . a - the scalar multiplier 136f79c3a4SBarry Smith 149cf4f1e8SLois Curfman McInnes .keywords: matrix, add 1506be10caSBarry Smith @*/ 1606be10caSBarry Smith int MatAXPY(Scalar *a,Mat X,Mat Y) 176f79c3a4SBarry Smith { 1806be10caSBarry Smith int m1,m2,n1,n2,i,*row,start,end,j,ncols,ierr; 1906be10caSBarry Smith Scalar *val,*vals; 206f79c3a4SBarry Smith 211a941147SBarry Smith PETSCVALIDHEADERSPECIFIC(X,MAT_COOKIE); PETSCVALIDHEADERSPECIFIC(Y,MAT_COOKIE); 2206be10caSBarry Smith MatGetSize(X,&m1,&n1); MatGetSize(X,&m2,&n2); 23bbb6d6a8SBarry Smith if (m1 != m2 || n1 != n2) SETERRQ(1,"MatAXPY:Non conforming matrix add"); 241987afe7SBarry Smith 251987afe7SBarry Smith if (X->ops.axpy) { 261987afe7SBarry Smith ierr = (*X->ops.axpy)(a,X,Y); CHKERRQ(ierr); 271987afe7SBarry Smith } 281987afe7SBarry Smith else { 290452661fSBarry Smith vals = (Scalar *) PetscMalloc( n1*sizeof(Scalar) ); CHKPTRQ(vals); 3006be10caSBarry Smith MatGetOwnershipRange(X,&start,&end); 3106be10caSBarry Smith for ( i=start; i<end; i++ ) { 3206be10caSBarry Smith MatGetRow(X,i,&ncols,&row,&val); 3306be10caSBarry Smith for ( j=0; j<ncols; j++ ) { 3406be10caSBarry Smith vals[j] = (*a)*val[j]; 356f79c3a4SBarry Smith } 36dbb450caSBarry Smith ierr = MatSetValues(Y,1,&i,ncols,row,vals,ADD_VALUES); CHKERRQ(ierr); 3706be10caSBarry Smith MatRestoreRow(X,i,&ncols,&row,&val); 386f79c3a4SBarry Smith } 390452661fSBarry Smith PetscFree(vals); 4078b31e54SBarry Smith ierr = MatAssemblyBegin(Y,FINAL_ASSEMBLY); CHKERRQ(ierr); 4178b31e54SBarry Smith ierr = MatAssemblyEnd(Y,FINAL_ASSEMBLY); CHKERRQ(ierr); 421987afe7SBarry Smith } 436f79c3a4SBarry Smith return 0; 446f79c3a4SBarry Smith } 45052efed2SBarry Smith 46052efed2SBarry Smith /*@ 47052efed2SBarry Smith MatShift - Computes Y = Y + a I 48052efed2SBarry Smith 49052efed2SBarry Smith Input Parameters: 50052efed2SBarry Smith . Y - the matrices 51052efed2SBarry Smith . a - the scalar 52052efed2SBarry Smith 53*6d84be18SBarry Smith .seealso: MatDiagonalShift() 54*6d84be18SBarry Smith 55052efed2SBarry Smith .keywords: matrix, add, shift 56052efed2SBarry Smith @*/ 57052efed2SBarry Smith int MatShift(Scalar *a,Mat Y) 58052efed2SBarry Smith { 59052efed2SBarry Smith int i,start,end,ierr; 60052efed2SBarry Smith 61052efed2SBarry Smith PETSCVALIDHEADERSPECIFIC(Y,MAT_COOKIE); 62052efed2SBarry Smith if (Y->ops.shift) { 63052efed2SBarry Smith ierr = (*Y->ops.shift)(a,Y); CHKERRQ(ierr); 64052efed2SBarry Smith } 65052efed2SBarry Smith else { 66052efed2SBarry Smith MatGetOwnershipRange(Y,&start,&end); 67052efed2SBarry Smith for ( i=start; i<end; i++ ) { 68052efed2SBarry Smith ierr = MatSetValues(Y,1,&i,1,&i,a,ADD_VALUES); CHKERRQ(ierr); 69052efed2SBarry Smith } 70052efed2SBarry Smith ierr = MatAssemblyBegin(Y,FINAL_ASSEMBLY); CHKERRQ(ierr); 71052efed2SBarry Smith ierr = MatAssemblyEnd(Y,FINAL_ASSEMBLY); CHKERRQ(ierr); 72052efed2SBarry Smith } 73052efed2SBarry Smith return 0; 74052efed2SBarry Smith } 75*6d84be18SBarry Smith 76*6d84be18SBarry Smith /*@ 77*6d84be18SBarry Smith MatDiagonalShift - Computes Y = Y + D. Where D is a diagonal matrix 78*6d84be18SBarry Smith represented as a vector. 79*6d84be18SBarry Smith 80*6d84be18SBarry Smith Input Parameters: 81*6d84be18SBarry Smith . Y - the matrices 82*6d84be18SBarry Smith . D - the diagonal matrix, represented as a vector 83*6d84be18SBarry Smith 84*6d84be18SBarry Smith .seealso: MatDiagonalShift() 85*6d84be18SBarry Smith 86*6d84be18SBarry Smith .keywords: matrix, add, shift 87*6d84be18SBarry Smith @*/ 88*6d84be18SBarry Smith int MatDiagonalShift(Mat Y,Vec D) 89*6d84be18SBarry Smith { 90*6d84be18SBarry Smith int i,start,end,ierr; 91*6d84be18SBarry Smith 92*6d84be18SBarry Smith PETSCVALIDHEADERSPECIFIC(Y,MAT_COOKIE); 93*6d84be18SBarry Smith if (Y->ops.shift) { 94*6d84be18SBarry Smith ierr = (*Y->ops.diagonalshift)(D,Y); CHKERRQ(ierr); 95*6d84be18SBarry Smith } 96*6d84be18SBarry Smith else { 97*6d84be18SBarry Smith int vstart,vend; 98*6d84be18SBarry Smith Scalar *v; 99*6d84be18SBarry Smith ierr = VecGetOwnershipRange(D,&vstart,&vend); CHKERRQ(ierr); 100*6d84be18SBarry Smith ierr = MatGetOwnershipRange(Y,&start,&end); CHKERRQ(ierr); 101*6d84be18SBarry Smith if (vstart != start || vend != end) 102*6d84be18SBarry Smith SETERRQ(1,"MatDiagonalShift:Vector shift not compatible with matrix"); 103*6d84be18SBarry Smith 104*6d84be18SBarry Smith ierr = VecGetArray(D,&v); CHKERRQ(ierr); 105*6d84be18SBarry Smith for ( i=start; i<end; i++ ) { 106*6d84be18SBarry Smith ierr = MatSetValues(Y,1,&i,1,&i,v+i-start,ADD_VALUES); CHKERRQ(ierr); 107*6d84be18SBarry Smith } 108*6d84be18SBarry Smith ierr = MatAssemblyBegin(Y,FINAL_ASSEMBLY); CHKERRQ(ierr); 109*6d84be18SBarry Smith ierr = MatAssemblyEnd(Y,FINAL_ASSEMBLY); CHKERRQ(ierr); 110*6d84be18SBarry Smith } 111*6d84be18SBarry Smith return 0; 112*6d84be18SBarry Smith } 113