<div dir="ltr"><div dir="ltr">On Mon, Mar 22, 2021 at 12:20 PM 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">Thanks for your answers Matt.<br>
<br>
On 22/03/2021 13:45, Matthew Knepley wrote:<br>
> On Mon, Mar 22, 2021 at 6:22 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>
>     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>><br>
>      > <mailto:<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<br>
>     series of<br>
>      >     3 vertex local indices. To rebuild boundary labels, I need to<br>
>     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>
> <br>
> <br>
> I think the discussion in<br>
> <br>
> @article{LangeMitchellKnepleyGorman2015,<br>
>    title     = {Efficient mesh management in {Firedrake} using <br>
> {PETSc-DMPlex}},<br>
>    author    = {Michael Lange and Lawrence Mitchell and Matthew G. <br>
> 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" rel="noreferrer" target="_blank">http://arxiv.org/abs/1506.07749</a>},<br>
>    doi       = {10.1137/15M1026092},<br>
>    year      = {2016}<br>
> }<br>
> <br>
> is pretty good.<br>
> <br>
It is, I'd just like to have something more complete (meet, join, <br>
height, depth...) and with more 2D & 3D pictures. It's all information <br>
available somewhere, but I would find it convenient to be all at the <br>
same place. Are sources of the paper available somewhere ?<br></blockquote><div><br></div><div>I think the right answer is no, there is not a complete reference. I have some things in presentations,</div><div>but no complete work has been written. Maybe it is time to do that. At this point, a book is probably</div><div>possible :)</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<br>
>     local indices<br>
>      >     are changed and the indices in the face array are not good<br>
>     anymore.<br>
>      ><br>
>      ><br>
>      > This is not exactly what happens. I will talk through the<br>
>     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<br>
>     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<br>
>     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<br>
>     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>
> <br>
> <br>
> No. It can be arbitrary. That is why we make the vertexSF, so we can map <br>
> those coordinates back to the right processes.<br>
> <br>
So how do you know which coordinates correspond to which vertex since no <br>
map is explicitly provided ?<br></blockquote><div><br></div><div>Ah, it is based on the input assumptions when everything is put together. You could call BuildParallel()</div><div>with any old numbering of vertices. However, if you call CreateParallel(), so that you are also passing</div><div>in an array for vertex coordinates. Now vertices are assumed to be numbered [0, Nv) to correspond to</div><div>the input array. Now, that array of coordinates can be chopped up differently in parallel than the vertices</div><div>for subdomains. The vertexSF can convert between the mappings.</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<br>
>     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<br>
>     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<br>
> <br>
>     what we need is the other way round, isn't it ?<br>
> <br>
> <br>
> You get the other way using search.<br>
> <br>
Do you mean a linear search for each vertex ?<br></blockquote><div><br></div><div>Since it is sorted, it is a log 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">
Thanks,<br>
<br>
-- <br>
Nicolas<br>
<br>
>    Thanks,<br>
> <br>
>       Matt<br>
> <br>
>     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<br>
>     vertices, I can<br>
>      >     find the local index from the global one (so do old local<br>
>     index -><br>
>      >     global index -> new local index). For the remote ones, I'm<br>
>     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><br>
>     <<a href="http://www.cse.buffalo.edu/~knepley/" rel="noreferrer" target="_blank">http://www.cse.buffalo.edu/~knepley/</a>><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>