Il 14/05/24 15:02, Matthew Knepley ha scritto:
On Tue, May 14, 2024 at 12:14 AM Matteo Semplice
<[email protected]> wrote:
Dear petsc-users, I am playing with DMPlexGetCellCoordinates and
observing that it returns correct periodic coordinates for cells,
but not for faces. More precisely, adding
PetscCall(DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd)); for
ZjQcmQRYFpfptBannerStart
This Message Is From an External Sender
This message came from outside your organization.
ZjQcmQRYFpfptBannerEnd
Dear petsc-users,
I am playing with DMPlexGetCellCoordinates and observing that
it returns correct periodic coordinates for cells, but not for faces.
More precisely, adding
PetscCall(DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd));
for (f = fStart; f < fEnd; ++f) {
const PetscScalar *array;
PetscScalar *x = NULL;
PetscInt ndof;
PetscBool isDG;
PetscCall(DMPlexGetCellCoordinates(dm, f, &isDG, &ndof,
&array, &x));
PetscCheck(ndof % cdim == 0, PETSC_COMM_SELF,
PETSC_ERR_ARG_INCOMP, "ndof not divisible by cdim");
PetscCall(PetscPrintf(PETSC_COMM_SELF, "Face #%"
PetscInt_FMT " coordinates\n", f - fStart));
for (PetscInt i = 0; i < ndof; i += cdim)
PetscCall(PetscScalarView(cdim, &x[i], PETSC_VIEWER_STDOUT_SELF));
PetscCall(DMPlexRestoreCellCoordinates(dm, f, &isDG, &ndof,
&array, &x));
}
to src/dm/impls/plex/tutorials/ex8.c, I get
$ ./ex8 -dm_plex_dim 2 -petscspace_degree 1 -dm_plex_simplex 0
-dm_plex_box_faces 3,2 -dm_plex_box_bd periodic,none -dm_view
-view_coord
DM Object: box 1 MPI process
type: plex
box in 2 dimensions:
Number of 0-cells per rank: 9
Number of 1-cells per rank: 15
Number of 2-cells per rank: 6
Periodic mesh (PERIODIC, NONE) coordinates localized
[...]
Element #2 coordinates
0: 6.6667e-01 0.0000e+00
0: 1.0000e+00 0.0000e+00 <<<----- correct
0: 1.0000e+00 5.0000e-01
0: 6.6667e-01 5.0000e-01
[...]
Face #0 coordinates
0: 0.0000e+00 0.0000e+00
0: 3.3333e-01 0.0000e+00
Face #1 coordinates
0: 3.3333e-01 0.0000e+00
0: 6.6667e-01 0.0000e+00
Face #2 coordinates
0: 6.6667e-01 0.0000e+00
0: 0.0000e+00 0.0000e+00 <<<---- should be (0.66,0.00) and
(1.00,0.00)
Is there a way to recover correct periodic coordinates in the case
of periodic DMPLex?
The way that periodic coordinates work is that it stores a DG
coordinate field by cell. Faces default back to the vertices. You
could think about also putting DG coordinates on faces, but no one
had asked, and it is potentially expensive.
If you really need them to keep going, face coordinates can be
extracted from cell coordinates. Otherwise, I can do it after the
PETSc Meeting. Or, we are happy to take contributions adding this.
Hi.
I mainly wanted to check that this was expected and not a result of a
setup of my DM. No need to change Petsc now except maybe issuing a
warning if the fallback to continuous coordinates will give wrong
results. As for my code, I think I can extract the info from the cell
coordinates in a pre-processing phase and if this crazy FV methods I am
implementing will survive for long enough, I'll think about contributing.
Just to double-check, can I assume that the order in which
DMPlexGetCellCoordinates returns the coordinates matches the ordering of
vertices in DMPlexGetCone for the uninterpolated DM, right?
Best
Matteo