22#ifndef INCLUDE_EXADG_OPERATORS_FINITE_ELEMENT_H_
23#define INCLUDE_EXADG_OPERATORS_FINITE_ELEMENT_H_
26#include <deal.II/fe/fe_dgq.h>
27#include <deal.II/fe/fe_q.h>
28#include <deal.II/fe/fe_simplex_p.h>
29#include <deal.II/fe/fe_system.h>
32#include <exadg/grid/grid_data.h>
33#include <exadg/utilities/exceptions.h>
44std::shared_ptr<dealii::FiniteElement<dim>>
47 unsigned int const n_components,
48 unsigned int const degree)
50 std::shared_ptr<dealii::FiniteElement<dim>> fe;
58 if(element_type == ElementType::Hypercube)
60 fe = std::make_shared<dealii::FESystem<dim>>(dealii::FE_DGQ<dim>(degree), n_components);
62 else if(element_type == ElementType::Simplex)
65 std::make_shared<dealii::FESystem<dim>>(dealii::FE_SimplexDGP<dim>(degree), n_components);
69 AssertThrow(
false, ExcNotImplemented());
74 if(element_type == ElementType::Hypercube)
76 fe = std::make_shared<dealii::FESystem<dim>>(dealii::FE_Q<dim>(degree), n_components);
78 else if(element_type == ElementType::Simplex)
80 fe = std::make_shared<dealii::FESystem<dim>>(dealii::FE_SimplexP<dim>(degree), n_components);
84 AssertThrow(
false, ExcNotImplemented());
92get_dofs_per_element_simplex_scalar(
unsigned int const n_points_1d,
unsigned int const dim)
96 else if(n_points_1d == 1)
100 unsigned int scalar_inner_dofs = 1;
101 for(
unsigned int d = 0; d < dim; ++d)
102 scalar_inner_dofs = (scalar_inner_dofs * (n_points_1d + d)) / (d + 1);
104 return scalar_inner_dofs;
109get_dofs_per_element(ExaDG::ElementType
const element_type,
111 unsigned int const n_components,
112 unsigned int const degree,
113 unsigned int const dim)
115 double scalar_dofs_per_element = 0.;
117 if(element_type == ElementType::Hypercube)
119 unsigned int n_points_1d = degree;
123 scalar_dofs_per_element = dealii::Utilities::pow(n_points_1d, dim);
125 else if(element_type == ElementType::Simplex)
127 unsigned int n_points_1d = degree + 1;
131 scalar_dofs_per_element = get_dofs_per_element_simplex_scalar(n_points_1d, dim);
142 scalar_dofs_per_element = 1. / 2.;
143 scalar_dofs_per_element += 3. * (n_points_1d - 2) / 2.;
146 scalar_dofs_per_element +=
147 get_dofs_per_element_simplex_scalar(n_points_1d - 3, dim);
158 scalar_dofs_per_element = 1. / 5.;
159 scalar_dofs_per_element += 6. * (n_points_1d - 2) / 5.;
162 scalar_dofs_per_element +=
163 4. * get_dofs_per_element_simplex_scalar(n_points_1d - 3, dim - 1) / 2.;
167 scalar_dofs_per_element +=
168 get_dofs_per_element_simplex_scalar(n_points_1d - 4, dim);
173 AssertThrow(
false, dealii::ExcMessage(
"Not implemented."));
179 AssertThrow(
false, ExcNotImplemented());
182 return scalar_dofs_per_element * n_components;
std::shared_ptr< dealii::FiniteElement< dim > > create_finite_element(ElementType const &element_type, bool const is_dg, unsigned int const n_components, unsigned int const degree)
Definition finite_element.h:45