Actual source code: getcolv.c
1: /*$Id: getcolv.c,v 1.20 2001/03/23 23:22:45 balay Exp $*/
3: #include "src/mat/matimpl.h" /*I "petscmat.h" I*/
5: /*@
6: MatGetColumnVector - Gets the values from a given column of a matrix.
8: Not Collective
10: Input Parameters:
11: + A - the matrix
12: . yy - the vector
13: - c - the column requested (in global numbering)
15: Level: advanced
17: Contributed by: Denis Vanderstraeten
19: .keywords: matrix, column, get
21: .seealso: MatGetRow(), MatGetDiagonal()
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,N,Rs,Re,rs,re;
28: MPI_Comm comm;
29:
34: if (col < 0) SETERRQ1(1,"Requested negative column: %d",col);
35: MatGetSize(A,PETSC_NULL,&N);
36: if (col >= N) SETERRQ2(1,"Requested column %d larger than number columns in matrix %d",col,N);
38: MatGetOwnershipRange(A,&Rs,&Re);
40: PetscObjectGetComm((PetscObject)yy,&comm);
41: VecGetOwnershipRange(yy,&rs,&re);
42: if (Rs != rs || Re != re) SETERRQ4(1,"Matrix %d %d does not have same ownership range (size) as vector %d %d",Rs,Re,rs,re);
44: VecSet(&zero,yy);
45: VecGetArray(yy,&y);
47: for (i=Rs; i<Re; i++) {
48: MatGetRow(A,i,&nz,&idx,&v);
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: MatRestoreRow(A,i,&nz,&idx,&v);
61: }
63: VecRestoreArray(yy,&y);
64: return(0);
65: }