[petsc-users] DMPlex filter with Face Sets
Matthew Knepley
knepley at gmail.com
Fri Jan 14 08:12:41 CST 2022
On Fri, Jan 14, 2022 at 9:07 AM Thibault Bridel-Bertomeu <
thibault.bridelbertomeu at gmail.com> wrote:
> Also, if we still consider my example with Solid and Fluid, let's image we
> call DMPlexFilter twice. We then get two new DMs with Solid in one and
> Fluid in the other one.
>
> The labels will be communicated, so fluidDM will still know Wall, Inlet,
> Freestream and Outlet and on the other hand, solidDM will still know Wall
> and Insulation : those two domain share the Wall stratum of the Face Sets.
>
> Can I extract data at the Wall label from the solidDM and transfer it to
> the Wall label of the fluidDM ?
>
Yes, conceptually here is how that would work. You iterate over the label,
extracting the values you want. You map those points
to points in the original mesh using the subpointMap, and then map them
again using the subpointMap from the fluidDM down to it.
Now you can insert the values using the section in the fluidDM. I think the
easiest way to do this is to setup a VecScatter (or PetscSF)
from one boundary to the other. Then you would just stick in the two
vectors and call VecScatterBegin/End()
If this turns out to be useful, this construction is something we could
easily automate in the library.
Thanks,
Matt
> Thanks !
> Thibault
>
>
> Le ven. 14 janv. 2022 à 14:55, Thibault Bridel-Bertomeu <
> thibault.bridelbertomeu at gmail.com> a écrit :
>
>> Hi Matt,
>>
>> Thank you for your help in this matter !
>> Do you mind posting the link to the gitlab issue when you have the
>> occasion to open it ?
>>
>> Thanks !
>> Thibault
>>
>>
>> Le ven. 14 janv. 2022 à 14:37, Matthew Knepley <knepley at gmail.com> a
>> écrit :
>>
>>> On Fri, Jan 14, 2022 at 8:23 AM Thibault Bridel-Bertomeu <
>>> thibault.bridelbertomeu at gmail.com> wrote:
>>>
>>>> Dear all,
>>>>
>>>> I have a new question - in relation with my other ongoing thread
>>>> "Fluid-Structure interaction with multiple DMPlex" actually.
>>>> Is it possible to filter a DMPlex and keep in the new piece of DM the
>>>> strata from the Face Sets label that belong to that piece ?
>>>>
>>>
>>> You are right. We are not doing labels. That is just an oversight. I
>>> will fix it.
>>>
>>> Thanks,
>>>
>>> Matt
>>>
>>>
>>>> Consider for instance the following example :
>>>>
>>>> // Standard includes
>>>> #include <cstdlib>
>>>>
>>>> // PETSc includes
>>>> #include <petscsys.h>
>>>> #include <petscdmplex.h>
>>>> #include <petscds.h>
>>>>
>>>> int main(
>>>> int argc, /**< Number of CLI arguments */
>>>> char* argv[] /**< List of CLI arguments as strings */
>>>> )
>>>> {
>>>> User user;
>>>> DM dm;
>>>> PetscErrorCode ierr = EXIT_SUCCESS;
>>>>
>>>> // Start-up the PETSc interface
>>>> ierr = PetscInitialize(&argc, &argv, (char*)0, NULL);if (ierr) return
>>>> ierr;
>>>>
>>>> // Allocate whatever needs to be
>>>> ierr = PetscNew(&user);CHKERRQ(ierr);
>>>>
>>>> // Parse the mesh given by the user
>>>> //+ Mesh filename
>>>> ierr = PetscOptionsBegin(PETSC_COMM_WORLD, NULL, "PETSc DMPlex Coupled
>>>> Physics Demo Mesh Options", "");CHKERRQ(ierr);
>>>> {
>>>> ierr = PetscStrcpy(user->meshName,
>>>> "data/divided_square/divided_square_gmsh22ascii.msh");CHKERRQ(ierr);
>>>> ierr = PetscOptionsString("-meshname", "Mesh filename", "",
>>>> user->meshName, user->meshName, sizeof(user->meshName), NULL);CHKERRQ
>>>> (ierr);
>>>> }
>>>> ierr = PetscOptionsEnd();CHKERRQ(ierr);
>>>> //+ Read the mesh in
>>>> ierr = DMPlexCreateFromFile(PETSC_COMM_WORLD, user->meshName,
>>>> "CoupledPhysics_Plex", PETSC_TRUE, &dm);CHKERRQ(ierr);
>>>> ierr = DMSetFromOptions(dm);CHKERRQ(ierr);
>>>> ierr = DMViewFromOptions(dm, NULL, "-dm_view");CHKERRQ(ierr);
>>>>
>>>> // Extract both domains separately
>>>> //+ Label of the fluid domain
>>>> DMLabel fluidLabel;
>>>> ierr = DMGetLabel(dm, "Fluid", &fluidLabel);CHKERRQ(ierr);
>>>> //+ Sub-DM for the fluid domain
>>>> DM fluidDM;
>>>> // ierr = DMPlexFilter(dm, domainsLabel, 2, &fluidDM);CHKERRQ(ierr);
>>>> ierr = DMPlexFilter(dm, fluidLabel, 2, &fluidDM);CHKERRQ(ierr);
>>>> ierr = DMViewFromOptions(fluidDM, NULL, "-fluid_dm_view");CHKERRQ
>>>> (ierr);
>>>> //+ Label of the solid domain
>>>> DMLabel solidLabel;
>>>> ierr = DMGetLabel(dm, "Solid", &solidLabel);CHKERRQ(ierr);
>>>> //+ Sub-DM for the solid domain
>>>> DM solidDM;
>>>> ierr = DMPlexFilter(dm, solidLabel, 1, &solidDM);CHKERRQ(ierr);
>>>> ierr = DMViewFromOptions(solidDM, NULL, "-solid_dm_view");CHKERRQ
>>>> (ierr);
>>>>
>>>> // Close the PETSc interface and end the parallel communicator
>>>> ierr = PetscFree(user);CHKERRQ(ierr);
>>>> ierr = PetscFinalize();
>>>> return(ierr);
>>>> }
>>>>
>>>> run with the mesh attached to this email and the command ./program
>>>> -meshname divided_square_gmsh41ascii.msh -dm_plex_gmsh_use_regions -dm_view
>>>> -fluid_dm_view.
>>>> It yields :
>>>>
>>>> DM Object: CoupledPhysics_Plex 1 MPI processes
>>>> type: plex
>>>> CoupledPhysics_Plex in 2 dimensions:
>>>> Number of 0-cells per rank: 1409
>>>> Number of 1-cells per rank: 4084
>>>> Number of 2-cells per rank: 2676
>>>> Labels:
>>>> celltype: 3 strata with value/size (0 (1409), 3 (2676), 1 (4084))
>>>> depth: 3 strata with value/size (0 (1409), 1 (4084), 2 (2676))
>>>> Cell Sets: 2 strata with value/size (1 (924), 2 (1752))
>>>> Solid: 1 strata with value/size (1 (924))
>>>> Fluid: 1 strata with value/size (2 (1752))
>>>> Face Sets: 5 strata with value/size (4 (60), 3 (40), 7 (20), 5 (40),
>>>> 6 (20))
>>>> Insulation: 1 strata with value/size (4 (60))
>>>> Wall: 1 strata with value/size (3 (40))
>>>> Outlet: 1 strata with value/size (7 (20))
>>>> Freestream: 1 strata with value/size (5 (40))
>>>> Inlet: 1 strata with value/size (6 (20))
>>>>
>>>> DM Object: 1 MPI processes
>>>> type: plex
>>>> DM_0x557ff009be70_1 in 2 dimensions:
>>>> Number of 0-cells per rank: 937
>>>> Number of 1-cells per rank: 2688
>>>> Number of 2-cells per rank: 1752
>>>> Labels:
>>>> celltype: 3 strata with value/size (0 (937), 1 (2688), 3 (1752))
>>>> depth: 3 strata with value/size (0 (937), 1 (2688), 2 (1752))
>>>>
>>>> In the attached mesh, Wall, Outlet, Freestream and Inlet "belong" to
>>>> the Fluid domain, therefore I would like to transfer them to the fluidDM
>>>> during or right after the DMPlexFilter action.
>>>> Is that possible ? I was looking at extracting the IS from those labels
>>>> of dm and creating new labels in fluidDM from those IS, but the indices
>>>> won't match, will they ? The filtering operation renumbers everything right
>>>> ?
>>>>
>>>> Thank you very much !!
>>>>
>>>> Thibault Bridel-Bertomeu
>>>> —
>>>> Eng, MSc, PhD
>>>> Research Engineer
>>>> CEA/CESTA
>>>> 33114 LE BARP
>>>> Tel.: (+33)557046924
>>>> Mob.: (+33)611025322
>>>> Mail: thibault.bridelbertomeu at gmail.com
>>>>
>>>
>>>
>>> --
>>> 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/~knepley/>
>>>
>>
--
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/~knepley/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20220114/87935e4f/attachment-0001.html>
More information about the petsc-users
mailing list