[petsc-users] Periodic boundary conditions in DMPlex
Pierre Seize
pierre.seize at onera.fr
Fri Oct 15 09:16:23 CDT 2021
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 <pierre.seize at onera.fr
>> <mailto:pierre.seize at onera.fr>> 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
>>> <pierre.seize at onera.fr <mailto:pierre.seize at onera.fr>> 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/>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20211015/0997ef6a/attachment-0001.html>
More information about the petsc-users
mailing list