<div dir="ltr"><div dir="ltr">On Fri, Oct 15, 2021 at 10:16 AM Pierre Seize <<a href="mailto:pierre.seize@onera.fr">pierre.seize@onera.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">
  
    
  
  <div bgcolor="#FFFFFF">
    <p>I read everything again, I think I did not understand you at
      first. The first solution is to modify the DAG, so that the
      rightmost cell is linked to the leftmost face, right ? To do that,
      do I have to manually edit the DAG (the mesh is read from a file)
      ?</p></div></blockquote><div>Yes, the DAG would be modified if you want it for some particular mesh that we cannot read automatically. For example, we can read periodic GMsh meshes. </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div bgcolor="#FFFFFF"><p> If so, the mesh connectivity is like the one of a torus, then
      how does it work with the cells/faces coordinates ?</p></div></blockquote><div>You let the coordinate field be in a DG space, so that it can have jumps. </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div bgcolor="#FFFFFF">
    <p>Now I think the second method may be more straightforward. What's
      the idea ? Get the mapping with DMGetLocalToGlobalMapping, then
      create the mapping corresponding to the periodicity with
      ISLocalToGlobalMappingCreate, and finally
      ISLocalToGlobalMappingConcatenate ? I'm not sure this is the way,
      and I did not find something like DMSetLocalToGlobalMapping to
      restore the modified mapping.</p></div></blockquote><div>It is more complicated. We make the LocalToGlobalMap by looking at the PetscSection (essentially if gives function space information)  and deciding which unknowns are removed from the global space.</div><div>You would need to decide that unknowns constrained by periodicity are not present in the global space. Actually, this is not hard. You just mark them as constrained in the PetscSection, and all the layout</div><div>functions will function correctly. However, then the LocalToGlobalMap will not be exactly right because the constrained unknowns will not be filled in (just like Dirichlet conditions). You would augment the</div><div>map so that it fills those in by looking up their periodic counterparts. Jed has argued for this type of periodicity.</div><div><br></div><div>To me, the first kind is much more straightforward, but maybe this is because I find the topology code more clear.</div><div><br></div><div>  Thanks,</div><div><br></div><div>      Matt</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div bgcolor="#FFFFFF">
    <p>Pierre<br>
    </p>
    <br>
    <div>On 15/10/21 15:33, Pierre Seize wrote:<br>
    </div>
    <blockquote type="cite">
      
      <p>When I first tried to handle the periodicity, I found the <tt>DMPlexCreateBoxMesh</tt>
        function (I cannot find the cylinder one).</p>
      <p>From reading the sources, I understand that we do some work
        either in <tt>DMPlexCreateCubeMesh_Internal</tt> or with <tt>DMSetPeriodicity</tt>.</p>
      <p>I tried to use <tt>DMSetPeriodicity</tt> before, for example
        with a 2x2 box on length 10. I did something like:<br>
      </p>
      <tt> const PetscReal maxCell[] = {2, 2};</tt><tt><br>
      </tt><tt>const PetscReal L[] = {10, 10};</tt><tt><br>
      </tt><tt>const DMBoundaryType bd[] = {DM_BOUNDARY_PERIODIC,
        DM_BOUNDARY_PERIODIC}</tt><tt>;<br>
      </tt><tt>DMSetPeriodicity(dm, PETSC_TRUE, maxCell, L, bd);<br>
      </tt><tt>// or:<br>
      </tt><tt>DMSetPeriodicity(dm, PETSC_TRUE, NULL, L, bd);</tt><br>
      <p>but it did not work: <br>
      </p>
      <tt>VecSet(X, 1);<br>
        DMGetLocalVector(dm, &locX);</tt><tt><br>
      </tt><tt>VecZeroEntries(locX);</tt><tt><br>
      </tt><tt>DMGlobalToLocalBegin(dm, X, INSERT_VALUES, locX);</tt><tt><br>
      </tt><tt>DMGlobalToLocalEnd(dm, X, INSERT_VALUES, locX);</tt><br>
      <tt>VecView(locX, PETSC_VIEWER_STDOUT_WORLD);</tt>
      <p>but the ghost cells values are all 0, only the real cells are
        1. So I guess <tt>DMSetPeriodicity</tt> alone is not sufficient
        to handle the periodicity. Is there a way to do what I want ?
        That is set up my DMPlex in a way that  <tt>DMGlobalToLocalBegin/</tt><tt>DMGlobalToLocalEnd</tt>
        do exchange values between procs AND exchange the periodic
        values?</p>
      <p><br>
      </p>
      <p>Thanks for the help</p>
      <p><br>
      </p>
      <p>Pierre<br>
      </p>
      <br>
      <div>On 15/10/21 14:03, Matthew Knepley
        wrote:<br>
      </div>
      <blockquote type="cite">
        <div dir="ltr">
          <div dir="ltr">On Fri, Oct 15, 2021 at 7:31 AM Pierre Seize
            <<a href="mailto:pierre.seize@onera.fr" target="_blank">pierre.seize@onera.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">
              <div bgcolor="#FFFFFF">
                <p>It makes sense, thank you. In fact, both ways seems
                  better than my way. The first one looks the most
                  straightforward. Unfortunately I do not know how to
                  implement either of them. Could you please direct me
                  to the corresponding PETSc functions ?<br>
                </p>
              </div>
            </blockquote>
            <div>The first way is implemented for example in
              DMPlexCreateBoxMesh() and DMPlexCreateCylinderMesh(). The
              second is not implemented since</div>
            <div>there did not seem to be a general way to do it. I
              would help if you wanted to try coding it up.</div>
            <div><br>
            </div>
            <div>  Thanks,</div>
            <div><br>
            </div>
            <div>    Matt </div>
            <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
              <div bgcolor="#FFFFFF">
                <p>Pierre<br>
                </p>
                <br>
                <div>On 15/10/21 13:25, Matthew Knepley wrote:<br>
                </div>
                <blockquote type="cite">
                  <div dir="ltr">
                    <div dir="ltr">On Fri, Oct 15, 2021 at 7:08 AM
                      Pierre Seize <<a href="mailto:pierre.seize@onera.fr" target="_blank">pierre.seize@onera.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">Hi,<br>
                        <br>
                        I'm writing a code using PETSc to solve NS
                        equations with FV on an <br>
                        unstructured mesh. Therefore I use DMPlex.<br>
                        <br>
                        Regarding periodicity, I manage to implement it
                        this way:<br>
                        <br>
                           - for each couple of boundaries that is
                        linked with periodicity, I <br>
                        create a buffer vector with an
                        ISLocalToGlobalMapping<br>
                        <br>
                           - then, when I need to fill the ghost cells
                        corresponding to the <br>
                        periodicity, the i "true" cell of the local
                        vector fills the buffer <br>
                        vector on location i with
                        VecSetValuesBlockedLocal, then <br>
                        VecAssemblyBegin/VecAssemblyEnd ensure each
                        value is send to the correct <br>
                        location thanks to the mapping, then the i
                        "ghost" cell of the local <br>
                        vector reads the vector on location i to get
                        it's value.<br>
                        <br>
                        <br>
                        It works, but it seems to me there is a better
                        way, with maybe PetscSF, <br>
                        VecScatter, or something I don't know yet. Does
                        anyone have any advice ?<br>
                      </blockquote>
                      <div><br>
                      </div>
                      <div>There are at least two other ways to handle
                        this. First, the method that is advocated in</div>
                      <div>Plex is to actually make a periodic geometry,
                        meaning connect the cells that are meant</div>
                      <div>to be connected. Then, if you partition with
                        overlap = 1, PetscGlobalToLocal() will fill in</div>
                      <div>these cell values automatically.</div>
                      <div><br>
                      </div>
                      <div>Second, you could use a non-periodic
                        geometry, but alter the LocalToGlobal map such</div>
                      <div>that the cells gets filled in anyway. Many
                        codes use this scheme and it is straightforward</div>
                      <div>with Plex just by augmenting the map it makes
                        automatically.</div>
                      <div><br>
                      </div>
                      <div>Does this make sense?</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"> Pierre Seize<br>
                      </blockquote>
                    </div>
                    -- <br>
                    <div dir="ltr">
                      <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/%7Eknepley/" target="_blank">https://www.cse.buffalo.edu/~knepley/</a><br>
                                </div>
                              </div>
                            </div>
                          </div>
                        </div>
                      </div>
                    </div>
                  </div>
                </blockquote>
                <br>
              </div>
            </blockquote>
          </div>
          <br clear="all">
          <div><br>
          </div>
          -- <br>
          <div dir="ltr">
            <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/%7Eknepley/" target="_blank">https://www.cse.buffalo.edu/~knepley/</a><br>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </blockquote>
      <br>
    </blockquote>
    <br>
  </div>

</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>