LehrFEM++ 1.0.0
A simple Finite Element Library for teaching
Loading...
Searching...
No Matches
segment.h
1
9#ifndef INCGfeff908010fa4d75a9c006c02b4fafe7
10#define INCGfeff908010fa4d75a9c006c02b4fafe7
11
12#include <lf/mesh/mesh.h>
13
14namespace lf::mesh::hybrid2d {
15
16// Forward declaration:
17class Point;
18
29class Segment : public mesh::Entity {
31
32 public:
34 Segment() = default;
35
38 Segment(const Segment&) = delete;
39 Segment(Segment&&) noexcept = default;
40 Segment& operator=(const Segment&) = delete;
41 Segment& operator=(Segment&&) noexcept = default;
57 std::unique_ptr<geometry::Geometry>&& geometry,
58 const Point* endpoint0, const Point* endpoint1)
59 : index_(index),
60 geometry_(std::move(geometry)),
61 nodes_({endpoint0, endpoint1}),
62 this_(this) {
63 LF_VERIFY_MSG((endpoint0 != nullptr) && (endpoint1 != nullptr),
64 "Invalid pointer to endnode of edge");
65 if (geometry_) {
66 LF_VERIFY_MSG(geometry_->DimLocal() == 1,
67 "Geometry must describe a curve");
68 LF_VERIFY_MSG(geometry_->RefEl() == base::RefEl::kSegment(),
69 "Segment geometry must fit a segment");
70 }
71 }
72
74 [[nodiscard]] unsigned Codim() const override { return 1; }
75
82 [[nodiscard]] std::span<const Entity* const> SubEntities(
83 unsigned rel_codim) const override;
84
90 [[nodiscard]] std::span<const lf::mesh::Orientation> RelativeOrientations()
91 const override {
92 return endpoint_ori_;
93 }
94
96 [[nodiscard]] size_type index() const { return index_; }
97
102 [[nodiscard]] const geometry::Geometry* Geometry() const override {
103 return geometry_.get();
104 }
105 [[nodiscard]] base::RefEl RefEl() const override {
106 return base::RefEl::kSegment();
107 }
108 [[nodiscard]] bool operator==(const mesh::Entity& rhs) const override {
109 return this == &rhs;
110 }
113 ~Segment() override = default;
114
115 private:
116 size_type index_ = -1; // zero-based index of this entity.
117 std::unique_ptr<geometry::Geometry> geometry_; // shape information
118 std::array<const Point*, 2> nodes_{}; // nodes connected by edge
119 Entity* this_ = nullptr; // needed for SubEntity()
120 static constexpr std::array<lf::mesh::Orientation, 2> endpoint_ori_{
122 lf::mesh::Orientation::positive}; // orientation of endpoints
123};
124
125} // namespace lf::mesh::hybrid2d
126
127#endif // INCGfeff908010fa4d75a9c006c02b4fafe7
Represents a reference element with all its properties.
Definition ref_el.h:109
static constexpr RefEl kSegment()
Returns the (1-dimensional) reference segment.
Definition ref_el.h:153
Interface class for shape information on a mesh cell in the spirit of parametric finite element metho...
Interface class representing a topological entity in a cellular complex
Definition entity.h:42
lf::base::size_type size_type
A node object for a 2D hybrid mesh.
Definition point.h:28
An edge object for a 2D hybrid mesh.
Definition segment.h:29
unsigned Codim() const override
an edge is an entity of co-dimension 1
Definition segment.h:74
std::span< const Entity *const > SubEntities(unsigned rel_codim) const override
Access to all subentities selected by relative co-dimension.
Definition segment.cc:14
Segment(Segment &&) noexcept=default
base::RefEl RefEl() const override
Describes the reference element type of this entity.
Definition segment.h:105
bool operator==(const mesh::Entity &rhs) const override
Check if two entities are the same.
Definition segment.h:108
std::array< const Point *, 2 > nodes_
Definition segment.h:118
Segment(const Segment &)=delete
mesh::Mesh::size_type size_type
Definition segment.h:30
static constexpr std::array< lf::mesh::Orientation, 2 > endpoint_ori_
Definition segment.h:120
size_type index() const
access to index of an entity
Definition segment.h:96
std::unique_ptr< geometry::Geometry > geometry_
Definition segment.h:117
const geometry::Geometry * Geometry() const override
Describes the geometry of this entity.
Definition segment.h:102
std::span< const lf::mesh::Orientation > RelativeOrientations() const override
Access to relative orientations of endpoints.
Definition segment.h:90
~Segment() override=default
Segment()=default
default constructors, needed by std::vector
An alternative implementation of a hybrid2d mesh manager that uses Pointers to store sub-entity relat...
Definition hybrid2d.h:11