[petsc-users] Re-ordering in DMPlexCreateFromCellListParallelPetsc

Nicolas Barral nicolas.barral at math.u-bordeaux.fr
Mon Mar 22 11:20:35 CDT 2021


Thanks for your answers Matt.

On 22/03/2021 13:45, Matthew Knepley wrote:
> On Mon, Mar 22, 2021 at 6:22 AM Nicolas Barral 
> <nicolas.barral at math.u-bordeaux.fr 
> <mailto:nicolas.barral at math.u-bordeaux.fr>> wrote:
> 
>     On 21/03/2021 21:29, Matthew Knepley wrote:
>      > On Sat, Mar 20, 2021 at 10:07 AM Nicolas Barral
>      > <nicolas.barral at math.u-bordeaux.fr
>     <mailto:nicolas.barral at math.u-bordeaux.fr>
>      > <mailto:nicolas.barral at math.u-bordeaux.fr
>     <mailto:nicolas.barral at math.u-bordeaux.fr>>> wrote:
>      >
>      >     Hi all,
>      >
>      >     I'm building a plex from elements arrays using
>      >     DMPlexCreateFromCellListParallelPetsc. Once the plex is built, I
>      >     need to
>      >     set up boundary labels. I have an array of faces containing a
>     series of
>      >     3 vertex local indices. To rebuild boundary labels, I need to
>     loop over
>      >     the array and get the join of 3 consecutive points to find the
>      >     corresponding face point in the DAG.
>      >
>      >
>      > This is very common. We should have a built-in thing that does this.
>      >
>     Ordering apart, it's not very complicated once you figure out "join" is
>     the right operation to use. We need more doc on graph layout and
>     operations in DMPlex, I think I'm going to make pictures when I'm done
>     with that code because I waste too much time every time. Is there a
>     starting point you like ?
> 
> 
> I think the discussion in
> 
> @article{LangeMitchellKnepleyGorman2015,
>    title     = {Efficient mesh management in {Firedrake} using 
> {PETSc-DMPlex}},
>    author    = {Michael Lange and Lawrence Mitchell and Matthew G. 
> Knepley and Gerard J. Gorman},
>    journal   = {SIAM Journal on Scientific Computing},
>    volume    = {38},
>    number    = {5},
>    pages     = {S143--S155},
>    eprint    = {http://arxiv.org/abs/1506.07749},
>    doi       = {10.1137/15M1026092},
>    year      = {2016}
> }
> 
> is pretty good.
> 
It is, I'd just like to have something more complete (meet, join, 
height, depth...) and with more 2D & 3D pictures. It's all information 
available somewhere, but I would find it convenient to be all at the 
same place. Are sources of the paper available somewhere ?


>      >     Problem, vertices get reordered by
>      >     DMPlexCreateFromCellListParallelPetsc
>      >     so that locally owned vertices are before remote ones, so
>     local indices
>      >     are changed and the indices in the face array are not good
>     anymore.
>      >
>      >
>      > This is not exactly what happens. I will talk through the
>     algorithm so
>      > that maybe we can find a good
>      > interface. I can probably write the code quickly:
>      >
>      > 1) We take in cells[numCells, numCorners], which is a list of all
>     the
>      > vertices in each cell
>      >
>      >       The vertex numbers do not have to be a contiguous set. You can
>      > have any integers you want.
>      >
>      > 2) We create a sorted list of the unique vertex numbers on each
>     process.
>      > The new local vertex numbers
>      >       are the locations in this list.
>      >
> 
>     Ok It took me re-writing this email a couple times but I think I
>     understand. I was too focused on local/global indices. But if I get
>     this
>     right, you still make an assumption: that the numVertices*dim
>     coordinates passed in vertexCoords are the coordinates of the
>     numvertices first vertices in the sorted list. Is that true ?
> 
> 
> No. It can be arbitrary. That is why we make the vertexSF, so we can map 
> those coordinates back to the right processes.
> 
So how do you know which coordinates correspond to which vertex since no 
map is explicitly provided ?



>      > Here is my proposed interface. We preserve this list of unique
>     vertices,
>      > just as we preserve the vertexSF.
>      > Then after DMPlexCreateFromCellListParallelPetsc(), can
>      > DMPlexInterpolate(), you could call
>      >
>      >    DMPlexBuildFaceLabelsFromCellList(dm, numFaces, faces, labelName,
>      > labelValues)
>      >
>      > Would that work for you? I think I could do that in a couple of
>     hours.
>      >
> 
>     So that function would be very helpful. But is it as simple as you're
>     thinking ? The sorted list gives local index -> unique identifier, but
> 
>     what we need is the other way round, isn't it ?
> 
> 
> You get the other way using search.
> 
Do you mean a linear search for each vertex ?

Thanks,

-- 
Nicolas

>    Thanks,
> 
>       Matt
> 
>     Once I understand better, I can have a first draft in my plexadapt code
>     and we pull it out later.
> 
>     Thanks
> 
>     -- 
>     Nicolas
> 
> 
>      >    Thanks,
>      >
>      >       Matt
>      >
>      >     Is there a way to track this renumbering ? For owned
>     vertices, I can
>      >     find the local index from the global one (so do old local
>     index ->
>      >     global index -> new local index). For the remote ones, I'm
>     not sure. I
>      >     can hash global indices, but is there a more idiomatic way ?
>      >
>      >     Thanks,
>      >
>      >     --
>      >     Nicolas
>      >
>      >
>      >
>      > --
>      > 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/>


More information about the petsc-users mailing list