Le 20/12/2018 à 19:05, Matthew Knepley a écrit :
On Thu, Dec 20, 2018 at 12:56 PM Yann JOBIC <yann.jo...@univ-amu.fr
<mailto:yann.jo...@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@mcs.anl.gov <mailto:petsc-users@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 ?
Should i have a different label for each boundary condition ? I thought
that the value was enough.
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