xref: /petsc/src/mat/utils/getcolv.c (revision 0713fee8a27481b0deeccc792613f84c28abcf5e)
1 #ifdef PETSC_RCS_HEADER
2 static char vcid[] = "$Id: getcolv.c,v 1.3 1998/04/13 17:43:46 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    Collective on Mat and Vec
13 
14    Input Parameters:
15 +  X - the matrix
16 .  v - the vector
17 -  c - the column requested
18 
19    Contributed by: Denis Vanderstraeten
20 
21 .keywords: matrix, column, get
22 
23 @*/
24 int MatGetColumnVector(Mat A, Vec yy, int col)
25 {
26   Scalar *y,*v,zero = 0.0;
27   int    ierr,i,j,nz,*idx,M,N,Mv,Rs,Re,rs,re;
28 
29   PetscFunctionBegin;
30   PetscValidHeaderSpecific(A,MAT_COOKIE);
31   PetscValidHeaderSpecific(yy,VEC_COOKIE);
32 
33   if (col < 0)  SETERRQ(1,1,"Requested negative column");
34   ierr = MatGetSize(A,&M,&N); CHKERRQ(ierr);
35   if (col >= N)  SETERRQ(1,1,"Requested column larger than number columns in matrix");
36 
37   ierr = VecGetSize(yy,&Mv); CHKERRQ(ierr);
38   if (M != Mv) SETERRQ(1,1,"Matrix does not have same number of columns as vector");
39 
40   ierr = MatGetOwnershipRange(A,&Rs,&Re);CHKERRQ(ierr);
41   ierr = VecGetOwnershipRange(yy,&rs,&re);CHKERRQ(ierr);
42   if (Rs != rs || Re != re) SETERRQ(1,1,"Matrix does not have same ownership range as vector");
43 
44   ierr = VecSet(&zero,yy);CHKERRQ(ierr);
45   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
46 
47   for ( i=Rs; i<Re; i++ ) {
48     ierr = MatGetRow(A,i,&nz,&idx,&v);CHKERRQ(ierr);
49     if (nz && idx[0] <= col) {
50       /*
51           Should use faster search here
52       */
53       for ( j=0; j<nz; j++ ) {
54         if (idx[j] >= col) {
55           if (idx[j] == col) y[i-rs] = v[j];
56           break;
57         }
58       }
59     }
60     ierr = MatRestoreRow(A,i,&nz,&idx,&v);CHKERRQ(ierr);
61   }
62 
63   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
64   PetscFunctionReturn(0);
65 }
66