<div dir="ltr"><div dir="ltr">On Mon, Mar 22, 2021 at 6:22 AM Nicolas Barral <<a href="mailto:nicolas.barral@math.u-bordeaux.fr">nicolas.barral@math.u-bordeaux.fr</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 21/03/2021 21:29, Matthew Knepley wrote:<br>
> On Sat, Mar 20, 2021 at 10:07 AM Nicolas Barral <br>
> <<a href="mailto:nicolas.barral@math.u-bordeaux.fr" target="_blank">nicolas.barral@math.u-bordeaux.fr</a> <br>
> <mailto:<a href="mailto:nicolas.barral@math.u-bordeaux.fr" target="_blank">nicolas.barral@math.u-bordeaux.fr</a>>> wrote:<br>
> <br>
>     Hi all,<br>
> <br>
>     I'm building a plex from elements arrays using<br>
>     DMPlexCreateFromCellListParallelPetsc. Once the plex is built, I<br>
>     need to<br>
>     set up boundary labels. I have an array of faces containing a series of<br>
>     3 vertex local indices. To rebuild boundary labels, I need to loop over<br>
>     the array and get the join of 3 consecutive points to find the<br>
>     corresponding face point in the DAG.<br>
> <br>
> <br>
> This is very common. We should have a built-in thing that does this.<br>
> <br>
Ordering apart, it's not very complicated once you figure out "join" is <br>
the right operation to use. We need more doc on graph layout and <br>
operations in DMPlex, I think I'm going to make pictures when I'm done <br>
with that code because I waste too much time every time. Is there a <br>
starting point you like ?<br></blockquote><div><br></div><div>I think the discussion in</div><div><br></div><div>@article{LangeMitchellKnepleyGorman2015,<br>  title     = {Efficient mesh management in {Firedrake} using {PETSc-DMPlex}},<br>  author    = {Michael Lange and Lawrence Mitchell and Matthew G. Knepley and Gerard J. Gorman},<br>  journal   = {SIAM Journal on Scientific Computing},<br>  volume    = {38},<br>  number    = {5},<br>  pages     = {S143--S155},<br>  eprint    = {<a href="http://arxiv.org/abs/1506.07749">http://arxiv.org/abs/1506.07749</a>},<br>  doi       = {10.1137/15M1026092},<br>  year      = {2016}<br>}<br></div><div><br></div><div>is pretty good.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
>     Problem, vertices get reordered by<br>
>     DMPlexCreateFromCellListParallelPetsc<br>
>     so that locally owned vertices are before remote ones, so local indices<br>
>     are changed and the indices in the face array are not good anymore.<br>
> <br>
> <br>
> This is not exactly what happens. I will talk through the algorithm so <br>
> that maybe we can find a good<br>
> interface. I can probably write the code quickly:<br>
> <br>
> 1) We take in cells[numCells, numCorners], which is a list of all the <br>
> vertices in each cell<br>
> <br>
>       The vertex numbers do not have to be a contiguous set. You can <br>
> have any integers you want.<br>
> <br>
> 2) We create a sorted list of the unique vertex numbers on each process. <br>
> The new local vertex numbers<br>
>       are the locations in this list.<br>
> <br>
<br>
Ok It took me re-writing this email a couple times but I think I <br>
understand. I was too focused on local/global indices. But if I get this <br>
right, you still make an assumption: that the numVertices*dim <br>
coordinates passed in vertexCoords are the coordinates of the <br>
numvertices first vertices in the sorted list. Is that true ?<br></blockquote><div><br></div><div>No. It can be arbitrary. That is why we make the vertexSF, so we can map those coordinates back to the right processes.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
> Here is my proposed interface. We preserve this list of unique vertices, <br>
> just as we preserve the vertexSF.<br>
> Then after DMPlexCreateFromCellListParallelPetsc(), can <br>
> DMPlexInterpolate(), you could call<br>
> <br>
>    DMPlexBuildFaceLabelsFromCellList(dm, numFaces, faces, labelName, <br>
> labelValues)<br>
> <br>
> Would that work for you? I think I could do that in a couple of hours.<br>
> <br>
<br>
So that function would be very helpful. But is it as simple as you're <br>
thinking ? The sorted list gives local index -> unique identifier, but</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
what we need is the other way round, isn't it ?<br></blockquote><div><br></div><div>You get the other way using search.</div><div><br></div><div>  Thanks,</div><div><br></div><div>     Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Once I understand better, I can have a first draft in my plexadapt code <br>
and we pull it out later.<br>
<br>
Thanks<br>
<br>
-- <br>
Nicolas<br>
<br>
<br>
>    Thanks,<br>
> <br>
>       Matt<br>
> <br>
>     Is there a way to track this renumbering ? For owned vertices, I can<br>
>     find the local index from the global one (so do old local index -><br>
>     global index -> new local index). For the remote ones, I'm not sure. I<br>
>     can hash global indices, but is there a more idiomatic way ?<br>
> <br>
>     Thanks,<br>
> <br>
>     -- <br>
>     Nicolas<br>
> <br>
> <br>
> <br>
> -- <br>
> What most experimenters take for granted before they begin their <br>
> experiments is infinitely more interesting than any results to which <br>
> their experiments lead.<br>
> -- Norbert Wiener<br>
> <br>
> <a href="https://www.cse.buffalo.edu/~knepley/" rel="noreferrer" target="_blank">https://www.cse.buffalo.edu/~knepley/</a> <<a href="http://www.cse.buffalo.edu/~knepley/" rel="noreferrer" target="_blank">http://www.cse.buffalo.edu/~knepley/</a>><br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div>What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>-- Norbert Wiener</div><div><br></div><div><a href="http://www.cse.buffalo.edu/~knepley/" target="_blank">https://www.cse.buffalo.edu/~knepley/</a><br></div></div></div></div></div></div></div></div>