[petsc-users] interpolate HDF5 mesh

Yann Jobic yann.jobic at univ-amu.fr
Thu Dec 20 15:55:54 CST 2018


On 20/12/2018 21:33, Matthew Knepley wrote:
> On Thu, Dec 20, 2018 at 2:35 PM Yann JOBIC <yann.jobic at univ-amu.fr 
> <mailto:yann.jobic at univ-amu.fr>> wrote:
>
>     Le 20/12/2018 à 19:05, Matthew Knepley a écrit :
>>     On Thu, Dec 20, 2018 at 12:56 PM Yann JOBIC
>>     <yann.jobic at univ-amu.fr <mailto:yann.jobic at univ-amu.fr>> wrote:
>>
>>         Le 20/12/2018 à 16:40, Matthew Knepley a écrit :
>>>         On Thu, Dec 20, 2018 at 9:33 AM Yann JOBIC via petsc-users
>>>         <petsc-users at mcs.anl.gov <mailto:petsc-users at mcs.anl.gov>>
>>>         wrote:
>>>
>>>             Dear Petsc Users,
>>>
>>>             When i'm using DMPlexCreateBoxMesh, my code works fine.
>>>             However, when i
>>>             load the "exact" same mesh from an HDF5 file, it's not
>>>             working anymore
>>>             (Nonlinear solve did not converge due to
>>>             DIVERGED_FNORM_NAN iterations 0).
>>>
>>>             The mesh view when i use DMPlexCreateBoxMesh looks like
>>>             (i labeled my
>>>             boudary nodes):
>>>
>>>             /* generated with DMPlexCreateBoxMesh */
>>>             DM Object: Mesh 1 MPI processes
>>>                type: plex
>>>             Mesh in 3 dimensions:
>>>                0-cells: 216
>>>                1-cells: 540
>>>                2-cells: 450
>>>                3-cells: 125
>>>             Labels:
>>>                Faces: 6 strata with value/size (2 (121), 4 (121), 3
>>>             (121), 6 (121),
>>>             5 (121), 7 (121))
>>>                boundary: 1 strata with value/size (1 (602))
>>>                depth: 4 strata with value/size (0 (216), 1 (540), 2
>>>             (450), 3 (125))
>>>                Face Sets: 6 strata with value/size (6 (25), 5 (25),
>>>             3 (25), 4 (25),
>>>             1 (25), 2 (25))
>>>                marker: 1 strata with value/size (1 (450))
>>>
>>>             And when i use DMPlexCreateFromFile, or DMLoad, i have :
>>>
>>>             /* generated with H5 file */
>>>             fin label DM
>>>             DM Object: Mesh 1 MPI processes
>>>                type: plex
>>>             Mesh in 3 dimensions:
>>>                0-cells: 216
>>>                1-cells: 540
>>>                2-cells: 450
>>>                3-cells: 125
>>>             Labels:
>>>                Faces: 6 strata with value/size (2 (121), 4 (121), 6
>>>             (121), 7 (121),
>>>             5 (121), 3 (121))
>>>                boundary: 1 strata with value/size (1 (602))
>>>                depth: 4 strata with value/size (0 (216), 1 (540), 2
>>>             (450), 3 (125))
>>>
>>>             It looks like my DM is not interpolated. Am i wrong ?
>>>
>>>
>>>         Its interpolated (you have 4 kinds of k-cells, instead of
>>>         2). However, you are missing your
>>>         Face Sets marker, which probably means boundary conditions
>>>         are not getting applied.
>>         My Face marker is label to 1, with the label "boundary" (i
>>         used DMPlexMarkBoundaryFaces)
>>         After that, i create a new label, "Faces", with the number
>>         associated to the boundary condition.
>>         Faces = 0 -> ouest
>>         Faces = 1 -> est
>>         ...
>>
>>         But you're right, I'm missing "Face Sets".
>>
>>
>>     You are also missing "marker". Both of these are added by the
>>     mesh creation function. Do you know
>>     which one you are using (setting in a boundary condition)?
>     I'm using DMPlexLoad_HDF5_Internal, which doesn't add those markers.
>     I'm using the label "Faces", that i create, with has a different
>     value defining the physical location of the boundary.
>     Next, my using this label in order to define my boundary
>     condition, as :
>       ierr = PetscDSAddBoundary(prob, DM_BC_ESSENTIAL, "wall",
>     "Faces", 0, Ncomp, components, (void (*)(void)) zero, NInd, nord,
>     NULL);CHKERRQ(ierr);
>       ierr = PetscDSAddBoundary(prob, DM_BC_ESSENTIAL, "wall",
>     "Faces", 0, Ncomp, components, (void (*)(void)) zero, NInd, sud,
>     NULL);CHKERRQ(ierr);
>       ierr = PetscDSAddBoundary(prob, DM_BC_ESSENTIAL, "wall",
>     "Faces", 0, Ncomp, components, (void (*)(void)) zero, NInd, Back,
>     NULL);CHKERRQ(ierr);
>       ierr = PetscDSAddBoundary(prob, DM_BC_ESSENTIAL, "wall",
>     "Faces", 0, Ncomp, components, (void (*)(void)) zero, NInd, Top,
>     NULL);CHKERRQ(ierr);
>       ierr = PetscDSAddBoundary(prob, DM_BC_ESSENTIAL, "in", "Faces",
>     0, Ncomp, components, (void (*)(void)) uIn, NInd, west,
>     NULL);CHKERRQ(ierr);
>     With:
>       const PetscInt Ncomp = 3; /*  dim = 3 */
>       const PetscInt components[] = {0,1,2};
>       const PetscInt NInd = 1;
>       const PetscInt west[] = {2}; /* (x=0) */
>       const PetscInt est[] = {3}; /* (x=L_x) */
>       const PetscInt sud[] = {4}; /* (y=0) */
>       const PetscInt nord[] = {5}; /* (y=L_y) */
>       const PetscInt Back[] = {6}; /* (z=0) */
>       const PetscInt Top[] = {7}; /* (z=L_z) */
>
>     Is it the right way to do it ?
>
>
> It looks right.
>
>     Should i have a different label for each boundary condition ? I
>     thought that the value was enough.
>
>
> The next thing to do is compare residuals.

I found the bugs. I had one code which has a hard coded domain 
length.... (which was incorrect for the hdf5 file)

The other one was more tricky. In the function where i put boundary 
values, i had to specify the exact same value at the corners (imposed 
more than once).

I first thought that the last one to change it will be imposed, but no, 
otherwise it crashed.

Everything is working now.

Thanks a lot !!

Yann

>
>    Matt
>
>     Thanks,
>
>     Yann
>>
>>       Thanks,
>>
>>         Matt
>>
>>         I couldn't find the function which adds this label.
>>         Is there one ? or do i have to do as in
>>         DMPlexCreateCubeMesh_Internal?
>>
>>         Thanks,
>>
>>         Yann
>>>           Thanks,
>>>
>>>             Matt
>>>
>>>             It's strange, because when i use DMPlexCreateFromFile, i
>>>             put PETSC_TRUE
>>>             for interpolation.
>>>
>>>             Even after loading the mesh, i used DMPlexInterpolate,
>>>             which return a
>>>             new DM (not null).
>>>
>>>             Do you know what's happening here ?
>>>             Maybe my DIVERGED_FNORM_NAN comes from another part of
>>>             the code ?
>>>             (however only the mesh is changing)
>>>
>>>             Thanks,
>>>
>>>             Yann
>>>
>
>
>
> -- 
> 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/20181220/a6faafe7/attachment-0001.html>


More information about the petsc-users mailing list