[petsc-users] IS Invert Not Permutation

Matthew Knepley knepley at gmail.com
Wed Nov 28 11:12:14 CST 2018


On Wed, Nov 28, 2018 at 12:06 PM Florian Lindner <mailinglists at xgm.de>
wrote:

> Hey,
>
> thanks for your quick reply!
>
> As far as I understand how MatSetLocalToGlobalMapping works, there is no
> way to create such a mapping that can be used for MatSetValuesLocal?
>
> What I need is basically
>
> MatSetValuesLocal row/col argument = 3 / 4 / 6 maps to local row/col 0 / 1
> / 2
>

You are inverting the meaning of MatSetValuesLocal(). It takes in local
indices (0, 1, 2) and sets the
values into a global matrix using global indices (3, 4, 6) which it gets
from a compact table.

It you have global indices (3, 4, 6) use MatSetValues() directly.

Why are you trying to convert global indices to local indices, which
requires a search.

  Thanks,

    Matt


> I seems to me, that if I set an index set with MatSetLocalToGlobalMapping
> like {3, 4, 6} it does the opposite. i.e. maps local {0, 1, 2] to global
> {3, 4, 6}
>
> Therefore I probably need to create my own translation of {3, 4, 6} to {0,
> 1, 2}
>
> A first sketch looks like that
>
> mapping[rank] = {3, 4, 6}
>
> for (auto i : mapping[rank]) {
>     for (auto j : mapping[rank]) {
>       cout << "Setting " << i << ", " << j << endl;
>       PetscScalar v[] = {i*10.0 + j};
>       PetscInt rows[] = {i};
>       PetscInt cols[] = {j};
>       AOApplicationToPetsc(ao, 1, rows);
>       AOApplicationToPetsc(ao, 1, cols);
>       cout << "Really setting " << rows[0] << ", " << cols[0] << endl <<
> endl;
>       ierr = MatSetValues(matrix, 1, rows, 1, cols, v, INSERT_VALUES);
> CHKERRQ(ierr);
>     }
>   }
>
> which seems to work so far.
>
> Any comments from your side are appreciated!
>
> Of course, I should set as much values as possible using MatSetValues...
>
> Best,
> Florian
>
>
> Am 27.11.18 um 16:33 schrieb Matthew Knepley:
> > On Tue, Nov 27, 2018 at 10:17 AM Florian Lindner via petsc-users <
> petsc-users at mcs.anl.gov <mailto:petsc-users at mcs.anl.gov>> wrote:
> >
> >     Hello,
> >
> >     I have a range of local input data indices that I want to use for
> row indexing, say { 3, 4, 6}.
> >
> >     For that, I create a matrix with a local number of rows of 3 and map
> the indices {3, 4, 5} to these rows.
> >
> >
> > It seems like you are trying to create a mapping and its inverse. We do
> that in
> >
> >
> https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/AO/AOCreateMapping.html
> >
> > Note that this is not really scalable. Usually there is a way to
> restructure the code to avoid this.
> >
> >   Thanks,
> >
> >     Matt
> >
> >
> >     I create an index set:
> >
> >     ISCreateGeneral(comm, myIndizes.size(), myIndizes.data(),
> PETSC_COPY_VALUES, &ISlocal);
> >     ISSetPermutation(ISlocal);
> >     ISInvertPermutation(ISlocal, myIndizes.size(), &ISlocalInv);
> >     ISAllGather(ISlocalInv, &ISglobal); // Gather the IS from all
> processors
> >     ISLocalToGlobalMappingCreateIS(ISglobal, &ISmapping); // Make it a
> mapping
> >
> >     MatSetLocalToGlobalMapping(matrix, ISmapping, ISmapping); // Set
> mapping for rows and cols
> >
> >     The InvertPermutation is required because, well, it seems that the
> direction the mapping stuff works in PETSc.
> >
> >     Now I can use MatSetValues local to set rows {3, 4, 5} and actually
> set the local rows {1, 2, 3}.
> >
> >     The problem is that the range of data vertices is not always
> contiguous, i.e. could be {3, 4, 6}. This seems to be not a permutation of
> PETSc, therefore ISSetPermutation fails and subsequently
> ISInvertPermutation.
> >
> >     How can I still create such a mapping, so that:
> >
> >     3 -> 1
> >     4 -> 2
> >     6 -> 6
> >
> >     row 5 is unassigned and will never be addressed.
> >
> >     Thanks!
> >     Florian
> >
> >
> >
> >
> > --
> > 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/>
>


-- 
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/20181128/d2e82b4a/attachment-0001.html>


More information about the petsc-users mailing list