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

  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: }