16 std::unique_ptr<geometry::Geometry>&& geometry,
22 geometry_(std::move(geometry)),
23 nodes_({corner0, corner1, corner2, corner3}),
24 edges_({edge0, edge1, edge2, edge3}),
27 LF_VERIFY_MSG(corner0 !=
nullptr,
"Invalid pointer to corner 0");
28 LF_VERIFY_MSG(corner1 !=
nullptr,
"Invalid pointer to corner 1");
29 LF_VERIFY_MSG(corner2 !=
nullptr,
"Invalid pointer to corner 2");
30 LF_VERIFY_MSG(corner3 !=
nullptr,
"Invalid pointer to corner 3");
31 LF_VERIFY_MSG(edge0 !=
nullptr,
"Invalid pointer to edge 0");
32 LF_VERIFY_MSG(edge1 !=
nullptr,
"Invalid pointer to edge 1");
33 LF_VERIFY_MSG(edge2 !=
nullptr,
"Invalid pointer to edge 2");
34 LF_VERIFY_MSG(edge3 !=
nullptr,
"Invalid pointer to edge 3");
36 LF_VERIFY_MSG(geometry_->DimLocal() == 2,
37 "Geometry must describe a 2D cell");
39 "Cell geometry must fit a quad");
47 for (
int ed_loc_idx = 0; ed_loc_idx < 4; ed_loc_idx++) {
49 const Segment* ed_ptr = edges_.at(ed_loc_idx);
52 "Wrong type for edge " << ed_loc_idx);
54 auto ed_nodes = ed_ptr->SubEntities(1);
57 const size_type loc_idx_p0 =
58 ref_el_quad.SubSubEntity2SubEntity(1, ed_loc_idx, 1, 0);
59 const size_type loc_idx_p1 =
60 ref_el_quad.SubSubEntity2SubEntity(1, ed_loc_idx, 1, 1);
61 const Point* p0_ptr = nodes_.at(loc_idx_p0);
62 const Point* p1_ptr = nodes_.at(loc_idx_p1);
65 LF_VERIFY_MSG((ed_nodes[0] == p0_ptr) || (ed_nodes[0] == p1_ptr),
66 "Node 0 of edge " << ed_loc_idx <<
" not a quad node");
67 LF_VERIFY_MSG((ed_nodes[1] == p0_ptr) || (ed_nodes[1] == p1_ptr),
68 "Node 1 of edge " << ed_loc_idx <<
" not a quad node");
73 for (
int ed_loc_idx = 0; ed_loc_idx < 4; ed_loc_idx++) {
75 auto ed_nodes = edges_[ed_loc_idx]->SubEntities(1);
76 edge_ori_[ed_loc_idx] = (ed_nodes[0] == nodes_[ed_loc_idx])
85 unsigned rel_codim)
const {
86 auto l = [&](
auto i) ->
const mesh::Entity& {
return **i; };
89 return {
reinterpret_cast<const Entity* const*
>(&
nodes_[0]), 4};
91 return {
reinterpret_cast<const Entity* const*
>(&
edges_[0]), 4};
96 false,
"Quadrilateral: rel_codim " << rel_codim <<
" out of range");
Represents a reference element with all its properties.
static constexpr RefEl kSegment()
Returns the (1-dimensional) reference segment.
static constexpr RefEl kQuad()
Returns the reference quadrilateral.
Interface class representing a topological entity in a cellular complex
A node object for a 2D hybrid mesh.
nonstd::span< const Entity *const > SubEntities(unsigned rel_codim) const override
Access to all subentities selected by relative co-dimension.
mesh::Mesh::size_type size_type
std::array< const Point *, 4 > nodes_
std::array< const Segment *, 4 > edges_
Quadrilateral()=default
default constructors, needed by std::vector
An edge object for a 2D hybrid mesh.
@ kQuad
Returns the reference quadrilateral.
An alternative implementation of a hybrid2d mesh manager that uses Pointers to store sub-entity relat...