xref: /petsc/src/mat/utils/getcolv.c (revision 82bf6240e2c962f3f106f2e53a46e3db58a7d347)
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