<div dir="ltr"><div dir="ltr">On Sat, Jun 12, 2021 at 5:25 AM Lawrence Mitchell <<a href="mailto:wence@gmx.li">wence@gmx.li</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"><br>
> On 11 Jun 2021, at 13:19, Matthew Knepley <<a href="mailto:knepley@gmail.com" target="_blank">knepley@gmail.com</a>> wrote:<br>
> <br>
> Before doing what Lawrence suggests, I would like to talk this through. I don't think we should need communication. So,<br>
> <br>
>   Goal: Section with dofs on each face that has support 2 (separates 2 cells)<br>
> <br>
> Okay, suppose we loop over our local faces and get the support size of each. Boundary faces are disqualified, which is good,<br>
> but if a face is on the boundary with another process, it will also have support size 1. Thus, let us distribute with overlap = 1.<br>
> Now if we loop over that same face set, we will get the "right answer" for the support size.<br>
> <br>
> However, using overlap = 1 put in a bunch of new faces. We do not care about the ones on the process boundary. They will be<br>
> handled by the other process. We do care about faces between two ghost cells, since they will be a false positive. Luckily, these<br>
> are labeled by the "ghost" label. So I think this is our algorithm:<br>
<br>
Ah, I missed that the mesh is already overlapped.<br>
<br>
> 1) DMClone(dm, &fdm);<br>
> <br>
> 2) DMGetLocalSection(fdm, &ls);<br>
> <br>
> 3) Mark each face with 2 neighbors that is not a ghost<br>
> <br>
>   DMGetLabel(dm, "ghost", &ghostLabel);<br>
<br>
This label is only created if one calls DMPlexConstructGhostCells,</blockquote><div><br></div><div>Shoot, that is the wrong workflow.</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"> I don't understand this code really, but it seems like if I call DMPlexDistribute(dm, overlap=1, &newdm) and then DMPlexConstructGhostCells, the "depth 2" faces/etc... will be marked with the ghost label, but the "depth 1" faces will not be.<br></blockquote><div><br></div><div>Yes, I only marked those because those are the only ones you might calculate fluxes on.</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">
That said, I agree with Matt's algorithm, and if the ghost label isn't available or set up right you can replace<br>
<br>
DMLabelGetValue(ghostLabel, f, &ghost)<br>
<br>
by checking if the point f is in the ilocal array of the DM's pointSF, I think.<br></blockquote><div><br></div><div>It is a little more complicated. The check for "ghost" is that you have 2 cells in the support, but they are both not owned, meaning both are in the SF.</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">
>   DMGetHeightStratum(fdm, 1, &fStart, &fEnd);<br>
>   for (f = fStartl f < fEnd; ++f) {<br>
>     PetscInt  supportSize, ghost;<br>
> <br>
>     DMGetSupportSize(fdm, f, &supportSize);<br>
>     DMLabelGetValue(ghostLabel, f, &ghost);<br>
>     if (ghost < 0 && supportSize == 2) PetscSectionSetDof(ls, f, 1);<br>
>   }<br>
> <br>
> 4) The global section will be created automatically when we ask for it<br>
> <br>
>   DMGetGlobalSection(fdm, &s);<br>
> <br>
> Let me know if this does not work.<br>
<br>
<br>
Lawrence</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>