1 #ifdef PETSC_RCS_HEADER 2 static char vcid[] = "$Id: getcolv.c,v 1.1 1998/01/28 21:03:00 bsmith Exp bsmith $"; 3 #endif 4 5 #include "src/mat/matimpl.h" /*I "mat.h" I*/ 6 7 #undef __FUNC__ 8 #define __FUNC__ "MatGetColumnVector" 9 /*@ 10 MatGetColumnVector - Gets the values from a given column of a matrix. 11 12 Input Parameters: 13 . X - the matrix 14 . v - the vector 15 . c - the column requested 16 17 Contributed by: Denis Vanderstraeten 18 19 .keywords: matrix, column, get 20 21 @*/ 22 int MatGetColumnVector(Mat A, Vec yy, int col) 23 { 24 Scalar *y,*v,zero = 0.0; 25 int ierr,i,j,nz,*idx,M,N,Mv,Rs,Re,rs,re; 26 27 PetscFunctionBegin; 28 PetscValidHeaderSpecific(A,MAT_COOKIE); 29 PetscValidHeaderSpecific(yy,VEC_COOKIE); 30 31 if (col < 0) SETERRQ(1,1,"Requested negative column"); 32 ierr = MatGetSize(A,&M,&N); CHKERRQ(ierr); 33 if (col >= N) SETERRQ(1,1,"Requested column larger than number columns in matrix"); 34 35 ierr = VecGetSize(yy,&Mv); CHKERRQ(ierr); 36 if (M != Mv) SETERRQ(1,1,"Matrix does not have same number of columns as vector"); 37 38 ierr = MatGetOwnershipRange(A,&Rs,&Re);CHKERRQ(ierr); 39 ierr = VecGetOwnershipRange(yy,&rs,&re);CHKERRQ(ierr); 40 if (Rs != rs || Re != re) SETERRQ(1,1,"Matrix does not have same ownership range as vector"); 41 42 ierr = VecSet(&zero,yy);CHKERRQ(ierr); 43 ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 44 45 for ( i=Rs; i<Re; i++ ) { 46 ierr = MatGetRow(A,i,&nz,&idx,&v);CHKERRQ(ierr); 47 if (nz && idx[0] <= col) { 48 /* 49 Should use faster search here 50 */ 51 for ( j=0; j<nz; j++ ) { 52 if (idx[j] >= col) { 53 if (idx[j] == col) y[i-rs] = v[j]; 54 break; 55 } 56 } 57 } 58 ierr = MatRestoreRow(A,i,&nz,&idx,&v);CHKERRQ(ierr); 59 } 60 61 ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 62 PetscFunctionReturn(0); 63 } 64