Matthew Knepley <[email protected]> writes:
> On Fri, May 5, 2023 at 10:55 AM Vilmer Dahlberg via petsc-users <
> [email protected]> wrote:
>
>> Hi.
>>
>>
>> I'm trying to read a mesh of higher element order, in this example a mesh
>> consisting of 10-node tetrahedral elements, from gmsh, into PETSC. But It
>> looks like the mesh is not properly being loaded and converted into a
>> DMPlex. gmsh tells me it has generated a mesh with 7087 nodes, but when I
>> view my dm object it tells me it has 1081 0-cells. This is the printout I
>> get
>>
>
> Hi Vilmer,
>
> Plex makes a distinction between topological entities, like vertices, edges
> and cells, and the function spaces used to represent fields, like velocity
> or coordinates. When formats use "nodes", they mix the two concepts
> together.
>
> You see that if you add the number of vertices and edges, you get 7087,
> since for P2 there is a "node" on every edge. Is anything else wrong?
Note that quadratic (and higher order) tets are broken with the Gmsh reader.
It's been on my todo list for a while.
As an example, this works when using linear elements (the projection makes them
quadratic and visualization is correct), but is tangled when holes.msh is
quadratic.
$ $PETSC_ARCH/tests/dm/impls/plex/tutorials/ex1 -dm_plex_filename
~/meshes/holes.msh -dm_view cgns:s.cgns -dm_coord_petscspace_degree 2
SetFactory("OpenCASCADE");
radius = 0.3;
DefineConstant[
nx = {1, Min 1, Max 30, Step 1, Name "Parameters/nx"}
ny = {1, Min 1, Max 30, Step 1, Name "Parameters/ny"}
extrude_length = {1, Min .1, Max 10, Step .1, Name "Parameters/extrusion
length"}
extrude_layers = {10, Min 1, Max 100, Step 1, Name "Parameters/extrusion
layers"}
];
N = nx * ny;
Rectangle(1) = {0, 0, 0, 1, 1, 0};
Disk(10) = {0.5, 0.5, 0, radius};
BooleanDifference(100) = {Surface{1}; Delete;}{Surface{10}; Delete;};
For i In {0:nx-1}
For j In {0:ny-1}
If (i + j > 0)
Translate {i, j, 0} { Duplicata { Surface{100}; } }
EndIf
EndFor
EndFor
Coherence;
// All the straight edges should have 8 elements
Transfinite Curve {:} = 8+1;
// Select the circles
circles = {};
For i In {0:nx-1}
For j In {0:ny-1}
lo = .5 - radius - 1e-4;
hi = .5 + radius + 1e-4;
circles() += Curve In BoundingBox {
i + lo, j + lo, -1e-4,
i + hi, j + hi, +1e-4
};
EndFor
EndFor
// Circles need 16 elements
Transfinite Curve {circles()} = 16+1;
Mesh.Algorithm = 8;
Extrude {0, 0, extrude_length} { Surface{100:100+N-1}; Layers{extrude_layers}; }
e = 1e-4;
extrude_start() = Surface In BoundingBox {-e, -e, -e, nx+e, ny+e, e};
extrude_end() = Surface In BoundingBox {
-e, -e, extrude_length-e,
nx+e, ny+e, extrude_length+e};
Physical Surface("start") = {extrude_start()};
Physical Surface("end") = {extrude_end()};
Physical Volume("solid") = {1:N};