<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Nov 9, 2017 at 3:08 AM, Matteo Semplice <span dir="ltr"><<a href="mailto:matteo.semplice@unito.it" target="_blank">matteo.semplice@unito.it</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi.<br>
I am using a DMPLex to store a grid (at present 2d symplicial but will need to work more in general), but after distributing it, I am finding it hard to organize my loops over the cells/faces.<br>
<br>
First things first: the mesh distribution. I do<br>
<br>
  DMPlexSetAdjacencyUseCone(dm, PETSC_TRUE);<br>
  DMPlexSetAdjacencyUseClosure(d<wbr>m, PETSC_FALSE);<br></blockquote><div><br></div><div>This gives you adjacent cells, but not their boundary. Usually what you want for FV.</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">
  DMPlexDistribute(dm, 1, NULL, &dmDist);<br>
<br>
The 1 in DMPlexDistribute is correct to give me 1 layer of ghost cells, right?<br></blockquote><div><br></div><div>Yes.</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">
Using 2 instead of 1 should add more internal ghosts, right? Actually, this errors out with petsc3.7.7 from debian/stable... If you deem it worth, I will test again with petsc3.8.<br></blockquote><div><br></div><div>It should not error. If possible, send me the mesh please. I have some tests where 2 is successful.</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">
Secondly, looping over cells. I do<br>
<br>
  DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);<br>
  DMPlexGetHybridBounds(dm, &cPhysical, NULL, NULL, NULL);<br>
  for (int c = cStart; c < cEnd; ++c) {<br>
      if ((cPhysical>=0)&&(c>=cPhysical<wbr>))<br>
        {code for ghost cells outside physical domain boundary}<br>
      else if ( ??? )<br>
        {code for ghost cells}<br></blockquote><div><br></div><div>I am not sure why you want to draw this distinction, but you can check to see if the cell is present in the pointSF. If it is, then its not owned by the process.</div><div>Here is the kind of FV loop I do (for example in TS ex11):</div><div><br></div><div>  <a href="https://bitbucket.org/petsc/petsc/src/f9fed41fd6c28d171f9c644f97b15591be9df7d6/src/snes/utils/dmplexsnes.c?at=master&fileviewer=file-view-default#dmplexsnes.c-1634">https://bitbucket.org/petsc/petsc/src/f9fed41fd6c28d171f9c644f97b15591be9df7d6/src/snes/utils/dmplexsnes.c?at=master&fileviewer=file-view-default#dmplexsnes.c-1634</a></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">
      else<br>
        {code for cells owned by this process}<br>
  }<br>
<br>
  What should I use as a test for ghost cells outside processor boundary? I have seen that (on a 2d symplicial mesh) reading the ghost label with DMGetLabelValue(dm, "ghost", c, &ghost) gives the value -1 for inner cells and domain boundary ghosts but 2 for processor boundary ghosts. Is this the correct test? What is the meaning of ghost=2? In general, should I test for any value >=0?<br></blockquote><div><br></div><div>Yes, see the link I gave.</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">
Lastly, since I will do finite volumes, I'd like to loop over the faces to compute fluxes.<br>
DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd)<br>
gives me the start/endpoints for faces, but they include also faces between ghost cells that are therefore external to the cells owned by the processor. I see that for faces on processor boundary, ghost=-1 on one process and ghost=2 on the other process, which I like. However ghost=-1 also on faces between ghosts cells and therefore to compute fluxes I should test for the ghost value of the face and for the ghost value of the cells on both sides... Is there a better way to loop over faces?<br></blockquote><div><br></div><div>See the link.</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 in advance for any suggestion.<span class="gmail-m_1659222374501753253HOEnZb"><font color="#888888"><br>
<br>
    Matteo<br>
<br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail-m_1659222374501753253gmail_signature"><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.caam.rice.edu/~mk51/" target="_blank">https://www.cse.buffalo.edu/~<wbr>knepley/</a><br></div></div></div></div></div>
</div></div>