LehrFEM++ 1.0.0
A simple Finite Element Library for teaching
product_fe_space_factory.h
1#ifndef PROJECTS_DPG_PRODUCT_FE_SPACE_FACTORY
2#define PROJECTS_DPG_PRODUCT_FE_SPACE_FACTORY
3
12#include <lf/base/base.h>
13#include <lf/fe/fe.h>
14#include <lf/mesh/mesh.h>
15#include <lf/uscalfe/uscalfe.h>
16
17#include "discontinuous_fe_constant.h"
18#include "discontinuous_scalar_reference_finite_element.h"
19#include "dpg.h"
20#include "product_fe_space.h"
21#include "trace_scalar_reference_finite_element.h"
22
23namespace projects::dpg {
24
32template <typename SCALAR>
34 public:
38 delete;
40 delete;
42 delete;
43
50 std::shared_ptr<const lf::mesh::Mesh> mesh_p)
51 : mesh_p_(std::move(mesh_p)) {}
52
64
79
93
107
112 std::shared_ptr<ProductUniformFESpace<SCALAR>> Build();
113
118
119 virtual ~ProductUniformFESpaceFactory() = default;
120
121 private:
131 std::shared_ptr<const lf::fe::ScalarReferenceFiniteElement<SCALAR>>
133
135 std::shared_ptr<const lf::mesh::Mesh> mesh_p_;
136
139 std::vector<
140 std::shared_ptr<const lf::fe::ScalarReferenceFiniteElement<SCALAR>>>
142 std::vector<
143 std::shared_ptr<const lf::fe::ScalarReferenceFiniteElement<SCALAR>>>
145 std::vector<
146 std::shared_ptr<const lf::fe::ScalarReferenceFiniteElement<SCALAR>>>
148 std::vector<
149 std::shared_ptr<const lf::fe::ScalarReferenceFiniteElement<SCALAR>>>
151
154};
155
156template <typename SCALAR>
157std::shared_ptr<const lf::fe::ScalarReferenceFiniteElement<SCALAR>>
159 lf::base::RefEl ref_el, size_type degree) {
160 switch (ref_el) {
161 case (lf::base::RefEl::kTria()): {
162 switch (degree) {
163 case (0):
164 return std::make_shared<FeDiscontinuousO0Tria<SCALAR>>();
165 case (1):
166 return std::make_shared<lf::uscalfe::FeLagrangeO1Tria<SCALAR>>();
167 case (2):
168 return std::make_shared<lf::uscalfe::FeLagrangeO2Tria<SCALAR>>();
169 case (3):
170 return std::make_shared<lf::uscalfe::FeLagrangeO3Tria<SCALAR>>();
171 default:
172 LF_ASSERT_MSG(false, "no fe of degree " << degree
173 << " available on ref_el "
174 << ref_el);
175 }
176 }
177 case (lf::base::RefEl::kQuad()): {
178 switch (degree) {
179 case (0):
180 return std::make_shared<FeDiscontinuousO0Quad<SCALAR>>();
181 case (1):
182 return std::make_shared<lf::uscalfe::FeLagrangeO1Quad<SCALAR>>();
183 case (2):
184 return std::make_shared<lf::uscalfe::FeLagrangeO2Quad<SCALAR>>();
185 case (3):
186 return std::make_shared<lf::uscalfe::FeLagrangeO3Quad<SCALAR>>();
187 default:
188 LF_ASSERT_MSG(false, "no fe of degree " << degree
189 << "available on ref_el "
190 << ref_el);
191 }
192 }
193 case (lf::base::RefEl::kSegment()): {
194 switch (degree) {
195 case (0):
196 return std::make_shared<FeDiscontinuousO0Segment<SCALAR>>();
197 case (1):
198 return std::make_shared<lf::uscalfe::FeLagrangeO1Segment<SCALAR>>();
199 case (2):
200 return std::make_shared<lf::uscalfe::FeLagrangeO2Segment<SCALAR>>();
201 case (3):
202 return std::make_shared<lf::uscalfe::FeLagrangeO3Segment<SCALAR>>();
203 default:
204 LF_ASSERT_MSG(false, "no fe of degree " << degree
205 << "available on ref_el "
206 << ref_el);
207 }
208 }
209 case (lf::base::RefEl::kPoint()): {
210 return std::make_shared<lf::fe::FePoint<SCALAR>>(degree);
211 }
212 default: {
213 LF_ASSERT_MSG(false, "unsupported reference element " << ref_el);
214 return nullptr;
215 }
216 }
217}
218
219template <typename SCALAR>
221 size_type degree) {
222 LF_ASSERT_MSG(
223 degree > 0,
224 "Can only represent H1 conforming finite element with degree > 0");
225 // add continuous reference shape functions on triangles, quads and segments.
226 rfs_tria_v_.push_back(
227 ReferenceFiniteElement(lf::base::RefEl::kTria(), degree));
228 rfs_quad_v_.push_back(
229 ReferenceFiniteElement(lf::base::RefEl::kQuad(), degree));
230 rfs_segment_v_.push_back(
231 ReferenceFiniteElement(lf::base::RefEl::kSegment(), degree));
232 rfs_point_v_.push_back(nullptr);
233 return num_components_++;
234}
235
236template <typename SCALAR>
238 size_type degree) {
239 // add discontinuous shape functions to triangles and quads.
240 rfs_tria_v_.push_back(
242 ReferenceFiniteElement(lf::base::RefEl::kTria(), degree)));
243 rfs_quad_v_.push_back(
245 ReferenceFiniteElement(lf::base::RefEl::kQuad(), degree)));
246 rfs_segment_v_.push_back(nullptr);
247 rfs_point_v_.push_back(nullptr);
248 return num_components_++;
249}
250
251template <typename SCALAR>
253 size_type degree) {
254 // add discontinuous shape functions to segments
255 rfs_tria_v_.push_back(nullptr);
256 rfs_quad_v_.push_back(nullptr);
257 rfs_segment_v_.push_back(
259 ReferenceFiniteElement(lf::base::RefEl::kSegment(), degree)));
260 rfs_point_v_.push_back(nullptr);
261 return num_components_++;
262}
263
264template <typename SCALAR>
266 size_type degree) {
267 // add trace representing shape functions to triangles and quadrilaterals.
268 // add full shape function spec. to segments.
269 rfs_tria_v_.push_back(
271 ReferenceFiniteElement(lf::base::RefEl::kTria(), degree)));
272 rfs_quad_v_.push_back(
274 ReferenceFiniteElement(lf::base::RefEl::kQuad(), degree)));
275 rfs_segment_v_.push_back(
276 ReferenceFiniteElement(lf::base::RefEl::kSegment(), degree));
277 rfs_point_v_.push_back(nullptr);
278 return num_components_++;
279}
280
281template <typename SCALAR>
282std::shared_ptr<ProductUniformFESpace<SCALAR>>
284 // construct the fe space based on the provided local reference shape function
285 // layouts.
286 auto fe_space = std::make_shared<ProductUniformFESpace<SCALAR>>(
287 mesh_p_, rfs_tria_v_, rfs_quad_v_, rfs_segment_v_, rfs_point_v_);
288
289 // clear supplied information:
290 rfs_tria_v_ = {};
291 rfs_quad_v_ = {};
292 rfs_segment_v_ = {};
293 rfs_point_v_ = {};
294 return fe_space;
295}
296
297} // namespace projects::dpg
298#endif // PROJECTS_DPG_PRODUCT_FE_SPACE_FACTORY
Represents a reference element with all its properties.
Definition: ref_el.h:106
static constexpr RefEl kSegment()
Returns the (1-dimensional) reference segment.
Definition: ref_el.h:150
static constexpr RefEl kPoint()
Returns the (0-dimensional) reference point.
Definition: ref_el.h:141
static constexpr RefEl kTria()
Returns the reference triangle.
Definition: ref_el.h:158
static constexpr RefEl kQuad()
Returns the reference quadrilateral.
Definition: ref_el.h:166
Decorator class around a ScalarReferenceFiniteElement to represent discontinuous shape functions.
Factory class to build a ProductUniformFESpace.
std::shared_ptr< const lf::mesh::Mesh > mesh_p_
size_type AddFluxComponent(size_type degree)
Adds a -conforming finite element to the space, that represents a flux on the mesh skeleton.
size_type AddH1Component(size_type degree)
Adds a -conforming finite element to the space.
size_type AddL2Component(size_type degree)
Adds a -conforming finite element to the space.
ProductUniformFESpaceFactory(ProductUniformFESpaceFactory &&) noexcept=delete
size_type AddTraceComponent(size_type degree)
Adds a -conforming finite element to the space, that represents a trace on the mesh skeleton.
std::vector< std::shared_ptr< const lf::fe::ScalarReferenceFiniteElement< SCALAR > > > rfs_point_v_
std::vector< std::shared_ptr< const lf::fe::ScalarReferenceFiniteElement< SCALAR > > > rfs_tria_v_
std::vector< std::shared_ptr< const lf::fe::ScalarReferenceFiniteElement< SCALAR > > > rfs_quad_v_
std::vector< std::shared_ptr< const lf::fe::ScalarReferenceFiniteElement< SCALAR > > > rfs_segment_v_
size_type NumComponents()
return the number of components that have already been added.
ProductUniformFESpaceFactory(const ProductUniformFESpaceFactory &)=delete
standard constructors
std::shared_ptr< const lf::fe::ScalarReferenceFiniteElement< SCALAR > > ReferenceFiniteElement(lf::base::RefEl ref_el, size_type degree)
returns Lagrangian shape functions of a specified degree on a specific reference element.
std::shared_ptr< ProductUniformFESpace< SCALAR > > Build()
Build the ProductUniformFespace based on the provided specifications.
Decorator class around a ScalarReferenceFiniteElement to represent traces on the cell boundary.
Definition: assemble.h:30
Contains functionality for the implementation of DPG methods.
Definition: primal_dpg.h:33
lf::uscalfe::size_type size_type
Type for vector length/matrix sizes.
Definition: dpg.h:17