#include "private/matimpl.h" /*I "petscmat.h" I*/ #undef __FUNCT__ #define __FUNCT__ "MatGetColumnVector" /*@ MatGetColumnVector - Gets the values from a given column of a matrix. Not Collective Input Parameters: + A - the matrix . yy - the vector - c - the column requested (in global numbering) Level: advanced Notes: Each processor for which this is called gets the values for its rows. Since PETSc matrices are usually stored in compressed row format, this routine will generally be slow. The vector must have the same parallel row layout as the matrix. Contributed by: Denis Vanderstraeten .keywords: matrix, column, get .seealso: MatGetRow(), MatGetDiagonal() @*/ PetscErrorCode MatGetColumnVector(Mat A,Vec yy,PetscInt col) { PetscScalar *y; const PetscScalar *v; PetscErrorCode ierr; PetscInt i,j,nz,N,Rs,Re,rs,re; const PetscInt *idx; PetscFunctionBegin; PetscValidHeaderSpecific(A,MAT_CLASSID,1); PetscValidHeaderSpecific(yy,VEC_CLASSID,2); if (col < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Requested negative column: %D",col); ierr = MatGetSize(A,PETSC_NULL,&N);CHKERRQ(ierr); if (col >= N) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Requested column %D larger than number columns in matrix %D",col,N); ierr = MatGetOwnershipRange(A,&Rs,&Re);CHKERRQ(ierr); ierr = VecGetOwnershipRange(yy,&rs,&re);CHKERRQ(ierr); if (Rs != rs || Re != re) SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Matrix %D %D does not have same ownership range (size) as vector %D %D",Rs,Re,rs,re); if (A->ops->getcolumnvector) { ierr = (*A->ops->getcolumnvector)(A,yy,col);CHKERRQ(ierr); } else { ierr = VecSet(yy,0.0);CHKERRQ(ierr); ierr = VecGetArray(yy,&y);CHKERRQ(ierr); for (i=Rs; i= col) { if (idx[j] == col) y[i-rs] = v[j]; break; } } } ierr = MatRestoreRow(A,i,&nz,&idx,&v);CHKERRQ(ierr); } ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); } PetscFunctionReturn(0); } #include "../src/mat/impls/aij/seq/aij.h" #undef __FUNCT__ #define __FUNCT__ "MatGetColumnNorms_SeqAIJ" PetscErrorCode MatGetColumnNorms_SeqAIJ(Mat A,NormType type,PetscReal *norms) { PetscErrorCode ierr; PetscInt i,m,n; Mat_SeqAIJ *aij = (Mat_SeqAIJ*)A->data; PetscFunctionBegin; ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr); ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr); if (type == NORM_2) { for (i=0; ii[m]; i++) { norms[aij->j[i]] += PetscAbsScalar(aij->a[i]*aij->a[i]); } } else if (type == NORM_1) { for (i=0; ii[m]; i++) { norms[aij->j[i]] += PetscAbsScalar(aij->a[i]); } } else if (type == NORM_INFINITY) { for (i=0; ii[m]; i++) { norms[aij->j[i]] = PetscMax(PetscAbsScalar(aij->a[i]),norms[aij->j[i]]); } } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Unknown NormType"); if (type == NORM_2) { for (i=0; idata; PetscInt i,n,*garray = aij->garray; Mat_SeqAIJ *a_aij = (Mat_SeqAIJ*) aij->A->data; Mat_SeqAIJ *b_aij = (Mat_SeqAIJ*) aij->B->data; PetscReal *work; PetscFunctionBegin; ierr = MatGetSize(A,PETSC_NULL,&n);CHKERRQ(ierr); ierr = PetscMalloc(n*sizeof(PetscReal),&work);CHKERRQ(ierr); ierr = PetscMemzero(work,n*sizeof(PetscReal));CHKERRQ(ierr); if (type == NORM_2) { for (i=0; ii[aij->A->rmap->n]; i++) { work[A->cmap->rstart + a_aij->j[i]] += PetscAbsScalar(a_aij->a[i]*a_aij->a[i]); } for (i=0; ii[aij->B->rmap->n]; i++) { work[garray[b_aij->j[i]]] += PetscAbsScalar(b_aij->a[i]*b_aij->a[i]); } } else if (type == NORM_1) { for (i=0; ii[aij->A->rmap->n]; i++) { work[A->cmap->rstart + a_aij->j[i]] += PetscAbsScalar(a_aij->a[i]); } for (i=0; ii[aij->B->rmap->n]; i++) { work[garray[b_aij->j[i]]] += PetscAbsScalar(b_aij->a[i]); } } else if (type == NORM_INFINITY) { for (i=0; ii[aij->A->rmap->n]; i++) { work[A->cmap->rstart + a_aij->j[i]] = PetscMax(PetscAbsScalar(a_aij->a[i]), work[A->cmap->rstart + a_aij->j[i]]); } for (i=0; ii[aij->B->rmap->n]; i++) { work[garray[b_aij->j[i]]] = PetscMax(PetscAbsScalar(b_aij->a[i]),work[garray[b_aij->j[i]]]); } } else SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Unknown NormType"); if (type == NORM_INFINITY) { ierr = MPI_Allreduce(work,norms,n,MPIU_REAL,MPI_MAX,A->hdr.comm);CHKERRQ(ierr); } else { ierr = MPI_Allreduce(work,norms,n,MPIU_REAL,MPI_SUM,A->hdr.comm);CHKERRQ(ierr); } ierr = PetscFree(work);CHKERRQ(ierr); if (type == NORM_2) { for (i=0; icomm,PETSC_ERR_ARG_WRONG,"Unknown NormType"); if (type == NORM_2) { for (i=0; idata; PetscReal *work; PetscFunctionBegin; ierr = MatGetSize(A,PETSC_NULL,&n);CHKERRQ(ierr); ierr = PetscMalloc(n*sizeof(PetscReal),&work);CHKERRQ(ierr); ierr = MatGetColumnNorms_SeqDense(a->A,type,work);CHKERRQ(ierr); if (type == NORM_2) { for (i=0; ihdr.comm);CHKERRQ(ierr); } else { ierr = MPI_Allreduce(work,norms,n,MPIU_REAL,MPI_SUM,A->hdr.comm);CHKERRQ(ierr); } ierr = PetscFree(work);CHKERRQ(ierr); if (type == NORM_2) { for (i=0; icomm,PETSC_ERR_SUP,"Not coded for this matrix type"); } } } PetscFunctionReturn(0); }