1#ifndef PROJECTS_DPG_PRODUCT_FE_SPACE_FACTORY
2#define PROJECTS_DPG_PRODUCT_FE_SPACE_FACTORY
12#include <lf/base/base.h>
14#include <lf/mesh/mesh.h>
15#include <lf/uscalfe/uscalfe.h>
17#include "discontinuous_fe_constant.h"
18#include "discontinuous_scalar_reference_finite_element.h"
20#include "product_fe_space.h"
21#include "trace_scalar_reference_finite_element.h"
32template <
typename SCALAR>
50 std::shared_ptr<const
lf::mesh::Mesh> mesh_p)
112 std::shared_ptr<ProductUniformFESpace<SCALAR>>
Build();
131 std::shared_ptr<const lf::fe::ScalarReferenceFiniteElement<SCALAR>>
135 std::shared_ptr<const lf::mesh::Mesh>
mesh_p_;
140 std::shared_ptr<const lf::fe::ScalarReferenceFiniteElement<SCALAR>>>
143 std::shared_ptr<const lf::fe::ScalarReferenceFiniteElement<SCALAR>>>
146 std::shared_ptr<const lf::fe::ScalarReferenceFiniteElement<SCALAR>>>
149 std::shared_ptr<const lf::fe::ScalarReferenceFiniteElement<SCALAR>>>
156template <
typename SCALAR>
157std::shared_ptr<const lf::fe::ScalarReferenceFiniteElement<SCALAR>>
164 return std::make_shared<FeDiscontinuousO0Tria<SCALAR>>();
166 return std::make_shared<lf::uscalfe::FeLagrangeO1Tria<SCALAR>>();
168 return std::make_shared<lf::uscalfe::FeLagrangeO2Tria<SCALAR>>();
170 return std::make_shared<lf::uscalfe::FeLagrangeO3Tria<SCALAR>>();
172 LF_ASSERT_MSG(
false,
"no fe of degree " << degree
173 <<
" available on ref_el "
180 return std::make_shared<FeDiscontinuousO0Quad<SCALAR>>();
182 return std::make_shared<lf::uscalfe::FeLagrangeO1Quad<SCALAR>>();
184 return std::make_shared<lf::uscalfe::FeLagrangeO2Quad<SCALAR>>();
186 return std::make_shared<lf::uscalfe::FeLagrangeO3Quad<SCALAR>>();
188 LF_ASSERT_MSG(
false,
"no fe of degree " << degree
189 <<
"available on ref_el "
196 return std::make_shared<FeDiscontinuousO0Segment<SCALAR>>();
198 return std::make_shared<lf::uscalfe::FeLagrangeO1Segment<SCALAR>>();
200 return std::make_shared<lf::uscalfe::FeLagrangeO2Segment<SCALAR>>();
202 return std::make_shared<lf::uscalfe::FeLagrangeO3Segment<SCALAR>>();
204 LF_ASSERT_MSG(
false,
"no fe of degree " << degree
205 <<
"available on ref_el "
210 return std::make_shared<lf::fe::FePoint<SCALAR>>(degree);
213 LF_ASSERT_MSG(
false,
"unsupported reference element " << ref_el);
219template <
typename SCALAR>
224 "Can only represent H1 conforming finite element with degree > 0");
226 rfs_tria_v_.push_back(
228 rfs_quad_v_.push_back(
230 rfs_segment_v_.push_back(
232 rfs_point_v_.push_back(
nullptr);
233 return num_components_++;
236template <
typename SCALAR>
240 rfs_tria_v_.push_back(
243 rfs_quad_v_.push_back(
246 rfs_segment_v_.push_back(
nullptr);
247 rfs_point_v_.push_back(
nullptr);
248 return num_components_++;
251template <
typename SCALAR>
255 rfs_tria_v_.push_back(
nullptr);
256 rfs_quad_v_.push_back(
nullptr);
257 rfs_segment_v_.push_back(
260 rfs_point_v_.push_back(
nullptr);
261 return num_components_++;
264template <
typename SCALAR>
269 rfs_tria_v_.push_back(
272 rfs_quad_v_.push_back(
275 rfs_segment_v_.push_back(
277 rfs_point_v_.push_back(
nullptr);
278 return num_components_++;
281template <
typename SCALAR>
282std::shared_ptr<ProductUniformFESpace<SCALAR>>
286 auto fe_space = std::make_shared<ProductUniformFESpace<SCALAR>>(
287 mesh_p_, rfs_tria_v_, rfs_quad_v_, rfs_segment_v_, rfs_point_v_);
Represents a reference element with all its properties.
static constexpr RefEl kSegment()
Returns the (1-dimensional) reference segment.
static constexpr RefEl kPoint()
Returns the (0-dimensional) reference point.
static constexpr RefEl kTria()
Returns the reference triangle.
static constexpr RefEl kQuad()
Returns the reference quadrilateral.
Decorator class around a ScalarReferenceFiniteElement to represent discontinuous shape functions.
Decorator class around a ScalarReferenceFiniteElement to represent traces on the cell boundary.
Contains functionality for the implementation of DPG methods.
lf::uscalfe::size_type size_type
Type for vector length/matrix sizes.