MatGetSubMatrix() and MatGetSubMatrices()

Barry Smith bsmith at
Tue Mar 4 06:53:05 CST 2008

On Mar 4, 2008, at 1:47 AM, Yujie wrote:

> Hi, everyone
> #include "petscmat.h"
> PetscErrorCode PETSCMAT_DLLEXPORT MatGetSubMatrix(Mat mat,IS  
> isrow,IS iscol,PetscInt csize,MatReuse cll,Mat *newmat)
> #include "petscmat.h"
> PetscErrorCode PETSCMAT_DLLEXPORT MatGetSubMatrices(Mat mat,PetscInt  
> n,const IS irow[],const IS icol[],MatReuse scall,Mat *submat[])
> To my knowledge, I can't get different matrices at different nodes  
> by setting different isrows and iscol with MatGetSubMatrix().
> Because isrow  is rows current processor should obtain and the iscol  
> argument must be the same on each processor.
> Furthermore, I can't get different parallel matrices at different  
> nodes by setting different irow[] and icolp[] with  
> MatGetSubMatrices() assuming I only want to get a matrix at each node.
> Because this function only gets different sequential matrices at  
> different nodes. Is it right?
    MatGetSubMatrices() gets one or more sequential matrix on each  
    MatGetSubMatrix() gets ONE parallel matrix that lives on the same  
communicator has the original matrix

> Another equestion is how to partition the matrix when calling  
> MatConvert() to convert a sequential matrix to a parallel one?

    MatConvert() is not for converting sequential matrix to parallel;  
the communicator of a the new matrix from MatConvert()
is always the same as the old one.

    In petsc-dev there is a utility for AIJ matrices that takes a  
given sequential AIJ matrix and makes it parallel, called

     Distributes a SeqAIJ matrix across a set of processes. Code  
stolen from
     MatLoad_MPIAIJ(). Horrible lack of reuse. Should be a routine for  
each matrix type.

     Only for square matrices
PetscErrorCode MatDistribute_MPIAIJ(MPI_Comm comm,Mat gmat,PetscInt  
m,MatReuse reuse,Mat *inmat)


> Thanks a lot.
> Regards,
> Yujie

More information about the petsc-users mailing list