[petsc-users] MatGetRow for global rows of a parallel matrix

Matthew Knepley knepley at gmail.com
Wed Jul 1 05:43:37 CDT 2020


On Wed, Jul 1, 2020 at 6:34 AM Eda Oktay <eda.oktay at metu.edu.tr> wrote:

> Der Barry,
>
> ı am trying to use your way but I couldn't understand how I create sub
> matrices by using MatCreateSubMatrices() since as input, the function
> needs const IS instead of IS and I couldn't understand how to get a
> const IS. I tried to use ISCreateStride since this IS should be 0:71
> because as you mentioned, the sub matrix should consist of the entire
> matrix. However, since ISCreateStride produces IS, not const IS, I
> couldn't use it in MatCreateSubMatrices().
>

The 'const' refers to the array, not the IS:


https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/MatCreateSubMatrices.html

  Thanks,

    Matt


> Thanks
>
> Eda
>
> Barry Smith <bsmith at petsc.dev>, 10 Haz 2020 Çar, 19:59 tarihinde şunu
> yazdı:
> >
> >
> >   You can use MatCreateSubMatrices() with each process getting a single
> sequential dense sub matrix that consists of the entire matrix.
> >
> >   Use VecDuplicateVecs() to create an array of 72 vectors (create a
> single seq vector of size 4 as the input to this routine)
> >
> >   Then use MatDenseGetArrayRead() to access the upper left corner of the
> new sequential dense matrix
> >
> >   Loop over the vectors calling VecGetArray()
> >      Then loop over the row of the dense array filling up the vector
> >
> >   Because dense matrices are stored by column, you have to do this
> looping to fill up the vectors, they can't share the space with the matrix.
> >
> >   Barry
> >
> >
> >
> > On Jun 10, 2020, at 11:36 AM, Matthew Knepley <knepley at gmail.com> wrote:
> >
> > On Wed, Jun 10, 2020 at 12:26 PM Eda Oktay <eda.oktay at metu.edu.tr>
> wrote:
> >>
> >> Matthew Knepley <knepley at gmail.com>, 10 Haz 2020 Çar, 19:13 tarihinde
> >> şunu yazdı:
> >> >
> >> > On Wed, Jun 10, 2020 at 12:07 PM Eda Oktay <eda.oktay at metu.edu.tr>
> wrote:
> >> >>
> >> >> Der Matt,
> >> >>
> >> >> When I looked at the results, I found that there are some problems I
> >> >> couldn't understand.
> >> >>
> >> >> First of all, I am working on a 72*4 matrix and as I said before, I
> >> >> want to have 72 different vectors having size 4 each, whose elements
> >> >> consist of the elements in the same row. And of course, all vectors
> >> >> should be in all processors (currently I am using 4 processors).
> >> >>
> >> >> When I use your scatter code, the output vector is divided into 4
> >> >> parts for 4 processors and each vector consists of 18 row vectors
> >> >> whose elements are arranged in a way that if I want to find zeroth
> row
> >> >> vector, its elements are located in 0th,18th,36th,54th elements.
> >> >
> >> >
> >> > Was the global size of the vector you wrapped around the dense matrix
> 72*4?
> >>
> >> Yes it is. I set up its global size  to 72*4.
> >>
> >> >
> >> > If you use CreateToAll(), it will make a vector on each process which
> has the global size of the original vector.
> >>
> >> Although I set 72*4, the size of the vectors in each process is 72.
> >
> >
> > You can understand how it is hard to accept, as this code is tested
> every night. Can you VecView() the input vector
> > to CreateToAll and the output vector,  and send that output?
> >
> >   Thanks,
> >
> >      Matt
> >
> >>
> >> Thanks,
> >>
> >> Eda
> >>
> >> >
> >> >   Thanks,
> >> >
> >> >     Matt
> >> >
> >> >>
> >> >> So, isn't scatter's goal is to scatter all values to all processors?
> >> >>
> >> >> Furthermore, I am trying to use my vectors in that way but isn't
> there
> >> >> any possible way that I can reach my goal entirely?
> >> >>
> >> >> Thanks so much for your help,
> >> >>
> >> >> Eda
> >> >>
> >> >> Matthew Knepley <knepley at gmail.com>, 10 Haz 2020 Çar, 18:11
> tarihinde
> >> >> şunu yazdı:
> >> >> >
> >> >> > On Wed, Jun 10, 2020 at 10:09 AM Eda Oktay <eda.oktay at metu.edu.tr>
> wrote:
> >> >> >>
> >> >> >> Dear Matt,
> >> >> >>
> >> >> >> I have one last question I believe. Up to creating a dense matrix
> I
> >> >> >> did what you've suggested. Thank you so much for that.
> >> >> >>
> >> >> >> I created a new dense matrix. Now, how should I wrap each vector
> in a
> >> >> >> MatDense again? I mean, what is wrapping vectors in a matrix? To
> put
> >> >> >> each of them again as rows?
> >> >> >
> >> >> >
> >> >> > I thought you need a dense matrix for something, since you started
> with one. If you
> >> >> > do not, just do VecGetArray() on the vector from CreateToAll and
> use the values.
> >> >> >
> >> >> >   Thanks,
> >> >> >
> >> >> >      Matt
> >> >> >
> >> >> >>
> >> >> >> Thanks!
> >> >> >>
> >> >> >> Eda
> >> >> >>
> >> >> >> Matthew Knepley <knepley at gmail.com>, 10 Haz 2020 Çar, 16:16
> tarihinde
> >> >> >> şunu yazdı:
> >> >> >> >
> >> >> >> > On Wed, Jun 10, 2020 at 9:08 AM Eda Oktay <
> eda.oktay at metu.edu.tr> wrote:
> >> >> >> >>
> >> >> >> >> Dear Matt,
> >> >> >> >>
> >> >> >> >> Matthew Knepley <knepley at gmail.com>, 10 Haz 2020 Çar, 16:03
> tarihinde
> >> >> >> >> şunu yazdı:
> >> >> >> >> >
> >> >> >> >> > On Wed, Jun 10, 2020 at 8:56 AM Eda Oktay <
> eda.oktay at metu.edu.tr> wrote:
> >> >> >> >> >>
> >> >> >> >> >> Hi all,
> >> >> >> >> >>
> >> >> >> >> >> I am trying to get all the rows of a parallel matrix as
> individual
> >> >> >> >> >> vectors. For instance, if I have 72*4 matrix, I want to get
> 72
> >> >> >> >> >> different vectors having size 4.
> >> >> >> >> >>
> >> >> >> >> >> As far as I understood, MatGetRow is only for local rows, so
> >> >> >> >> >> MatGetOwnershipRange is used, however, when I tried this
> one, I
> >> >> >> >> >> couldn't get the whole and desired row vectors.
> >> >> >> >> >>
> >> >> >> >> >> In MatGetRow explanation, it is written that I should use
> >> >> >> >> >> MatCreateSubMatrices first, then use MatGetRow. But I
> couldn't
> >> >> >> >> >> understand to which extent I should create submatrices. I
> just need to
> >> >> >> >> >> have all 72 rows as 72 different vectors each having 4
> elements.
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> > 1) For sparse matrices, the storage is always divided by
> row, so that values can only be retrieved for local rows with MatGetRow()
> >> >> >> >> >
> >> >> >> >> > 2) Is this matrix sparse? It sounds like it is dense.
> >> >> >> >>
> >> >> >> >> Matrix is dense.
> >> >> >> >>
> >> >> >> >> >
> >> >> >> >> > 3) Are you asking to get all matrix values on all processes?
> If so, I think the easiest thing to do is first wrap a Vec around the
> >> >> >> >> >     values, then use VecScatterToAll(), then wrap each one
> in a MatDense again.
> >> >> >> >>
> >> >> >> >> Yes, I want all row vectors on all processes. In a dense
> matrix,
> >> >> >> >> should I still wrap a Vec around the values? I know I should
> use
> >> >> >> >> scatter but I couldn't even wrap a Vec around them.
> >> >> >> >
> >> >> >> >
> >> >> >> > I would do
> >> >> >> >
> >> >> >> >   MatGetSize(&N);
> >> >> >> >   MatGetLocalSize(&m);
> >> >> >> >
> https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/MatDenseGetArray.html
> >> >> >> >   <create vector of local size m*N>
> >> >> >> >
> https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Vec/VecPlaceArray.html
> >> >> >> >
> https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Vec/VecScatterCreateToAll.html
> >> >> >> >   <do scatter>
> >> >> >> >
> https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Vec/VecResetArray.html#VecResetArray
> >> >> >> >
> https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/MatCreateDense.html
> >> >> >> >   <use it>
> >> >> >> >   <destroy matrix>
> >> >> >> >   <destroy vector from CreateToAll>
> >> >> >> >
> >> >> >> >   Thanks,
> >> >> >> >
> >> >> >> >      Matt
> >> >> >> >
> >> >> >> >>
> >> >> >> >> Thanks so much!
> >> >> >> >>
> >> >> >> >> Eda
> >> >> >> >>
> >> >> >> >> >
> >> >> >> >> >   Thanks,
> >> >> >> >> >
> >> >> >> >> >      Matt
> >> >> >> >> >
> >> >> >> >> >>
> >> >> >> >> >> Thanks!
> >> >> >> >> >>
> >> >> >> >> >> Eda
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> > --
> >> >> >> >> > What most experimenters take for granted before they begin
> their experiments is infinitely more interesting than any results to which
> their experiments lead.
> >> >> >> >> > -- Norbert Wiener
> >> >> >> >> >
> >> >> >> >> > https://www.cse.buffalo.edu/~knepley/
> >> >> >> >
> >> >> >> >
> >> >> >> >
> >> >> >> > --
> >> >> >> > What most experimenters take for granted before they begin
> their experiments is infinitely more interesting than any results to which
> their experiments lead.
> >> >> >> > -- Norbert Wiener
> >> >> >> >
> >> >> >> > https://www.cse.buffalo.edu/~knepley/
> >> >> >
> >> >> >
> >> >> >
> >> >> > --
> >> >> > What most experimenters take for granted before they begin their
> experiments is infinitely more interesting than any results to which their
> experiments lead.
> >> >> > -- Norbert Wiener
> >> >> >
> >> >> > https://www.cse.buffalo.edu/~knepley/
> >> >
> >> >
> >> >
> >> > --
> >> > What most experimenters take for granted before they begin their
> experiments is infinitely more interesting than any results to which their
> experiments lead.
> >> > -- Norbert Wiener
> >> >
> >> > https://www.cse.buffalo.edu/~knepley/
> >
> >
> >
> > --
> > What most experimenters take for granted before they begin their
> experiments is infinitely more interesting than any results to which their
> experiments lead.
> > -- Norbert Wiener
> >
> > https://www.cse.buffalo.edu/~knepley/
> >
> >
>


-- 
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which their
experiments lead.
-- Norbert Wiener

https://www.cse.buffalo.edu/~knepley/ <http://www.cse.buffalo.edu/~knepley/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20200701/e7c60f7c/attachment-0001.html>


More information about the petsc-users mailing list