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) ? If so, the mesh connectivity is like the one of a torus, then how does it work with the cells/faces coordinates ?

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.


Pierre


On 15/10/21 15:33, Pierre Seize wrote:

When I first tried to handle the periodicity, I found the DMPlexCreateBoxMesh function (I cannot find the cylinder one).

From reading the sources, I understand that we do some work either in DMPlexCreateCubeMesh_Internal or with DMSetPeriodicity.

I tried to use DMSetPeriodicity before, for example with a 2x2 box on length 10. I did something like:

const PetscReal maxCell[] = {2, 2};
const PetscReal L[] = {10, 10};
const DMBoundaryType bd[] = {DM_BOUNDARY_PERIODIC, DM_BOUNDARY_PERIODIC};
DMSetPeriodicity(dm, PETSC_TRUE, maxCell, L, bd);
// or:
DMSetPeriodicity(dm, PETSC_TRUE, NULL, L, bd);

but it did not work:

VecSet(X, 1);
DMGetLocalVector(dm, &locX);
VecZeroEntries(locX);
DMGlobalToLocalBegin(dm, X, INSERT_VALUES, locX);
DMGlobalToLocalEnd(dm, X, INSERT_VALUES, locX);
VecView(locX, PETSC_VIEWER_STDOUT_WORLD);

but the ghost cells values are all 0, only the real cells are 1. So I guess DMSetPeriodicity 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 DMGlobalToLocalBegin/DMGlobalToLocalEnd do exchange values between procs AND exchange the periodic values?


Thanks for the help


Pierre


On 15/10/21 14:03, Matthew Knepley wrote:
On Fri, Oct 15, 2021 at 7:31 AM Pierre Seize <[email protected] <mailto:[email protected]>> wrote:

    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 ?

The first way is implemented for example in DMPlexCreateBoxMesh() and DMPlexCreateCylinderMesh(). The second is not implemented since there did not seem to be a general way to do it. I would help if you wanted to try coding it up.

  Thanks,

    Matt

    Pierre


    On 15/10/21 13:25, Matthew Knepley wrote:
    On Fri, Oct 15, 2021 at 7:08 AM Pierre Seize
    <[email protected] <mailto:[email protected]>> wrote:

        Hi,

        I'm writing a code using PETSc to solve NS equations with FV
        on an
        unstructured mesh. Therefore I use DMPlex.

        Regarding periodicity, I manage to implement it this way:

           - for each couple of boundaries that is linked with
        periodicity, I
        create a buffer vector with an ISLocalToGlobalMapping

           - then, when I need to fill the ghost cells corresponding
        to the
        periodicity, the i "true" cell of the local vector fills the
        buffer
        vector on location i with VecSetValuesBlockedLocal, then
        VecAssemblyBegin/VecAssemblyEnd ensure each value is send to
        the correct
        location thanks to the mapping, then the i "ghost" cell of
        the local
        vector reads the vector on location i to get it's value.


        It works, but it seems to me there is a better way, with
        maybe PetscSF,
        VecScatter, or something I don't know yet. Does anyone have
        any advice ?


    There are at least two other ways to handle this. First, the
    method that is advocated in
    Plex is to actually make a periodic geometry, meaning connect
    the cells that are meant
    to be connected. Then, if you partition with overlap = 1,
    PetscGlobalToLocal() will fill in
    these cell values automatically.

    Second, you could use a non-periodic geometry, but alter the
    LocalToGlobal map such
    that the cells gets filled in anyway. Many codes use this scheme
    and it is straightforward
    with Plex just by augmenting the map it makes automatically.

    Does this make sense?

      Thanks,

         Matt

        Pierre Seize

-- What most experimenters take for granted before they begin their
    experiments is infinitely more interesting than any results to
    which their experiments lead.
    -- Norbert Wiener

    https://www.cse.buffalo.edu/~knepley/
    <http://www.cse.buffalo.edu/%7Eknepley/>



--
What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.
-- Norbert Wiener

https://www.cse.buffalo.edu/~knepley/ <http://www.cse.buffalo.edu/%7Eknepley/>


Reply via email to