在 2022年6月16日,23:22,Matthew Knepley <[email protected]> 写道:
On Thu, Jun 16, 2022 at 11:11 AM Zongze Yang <[email protected]> wrote:
Hi, if I load a `gmsh` file with second-order elements, the coordinates will be stored in a DG-P2 space. After obtaining the coordinates of a cell, how can I map the coordinates to vertex and edge?
By default, they are stored as P2, not DG.
I checked the coordinates vector, and found the dogs only defined on cell other than vertex and edge, so I said they are stored as DG. Then the function DMPlexVecGetClosure seems return the coordinates in lex order. Some code in reading gmsh file reads that 1756: if (isSimplex) continuity = PETSC_FALSE; /* XXX FIXME Requires DMPlexSetClosurePermutationLexicographic() */ 1758: GmshCreateFE(comm, NULL, isSimplex, continuity, nodeType, dim, coordDim, order, &fe) The continuity is set to false for simplex. Thanks, Zongze
You can ask for the coordinates of a vertex or an edge directly using
https://petsc.org/main/docs/manualpages/DMPLEX/DMPlexPointLocalRead/
by giving the vertex or edge point. You can get all the coordinates on a cell, in the closure order, using
https://petsc.org/main/docs/manualpages/DMPLEX/DMPlexVecGetClosure/ Thanks,
Matt
Below is some code load the gmsh file, I want to know the relation between `cl` and `cell_coords`.
``` import firedrake as fd import numpy as np
# Load gmsh file (2rd) plex = fd.mesh._from_gmsh('test-fd-load-p2-rect.msh')
cs, ce = plex.getHeightStratum(0)
cdm = plex.getCoordinateDM() csec = dm.getCoordinateSection() coords_gvec = dm.getCoordinates()
for i in range(cs, ce): cell_coords = cdm.getVecClosure(csec, coords_gvec, i) print(f'coordinates for cell {i} :\n{cell_coords.reshape([-1, 3])}') cl = dm.getTransitiveClosure(i) print('closure:', cl) break ```
Best wishes, Zongze
-- 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