[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: MatGetSubMatrix() and MatGetSubMatrices()



Dear Barry:

That is, if one wants to generate different sub-matrices at different nodes of the cluster from the same matrix, only MatGetSubMatrices() is available?

If I use MatDistribute_MPIAIJ to convert a sequential matrix to parallel one, how to control which nodes of the cluster the submatrix of the parallel matrix is distributed into? For example, in a cluster, there are 10 nodes, I only want to use the specified 5 nodes for 
distributing the matrix. thanks a lot.

Regards,
Yujie


On 3/4/08, Barry Smith <bsmith@xxxxxxxxxxx> wrote:

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
process.
    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)



    Barry



>
>
> Thanks a lot.
>
> Regards,
> Yujie