21#include <deal.II/fe/fe_poly_face.templates.h>
34 namespace FE_FaceQImplementation
44 return std::vector<Point<1>>(1,
Point<1>(0.5));
50template <
int dim,
int spacedim>
63 const unsigned int codim = dim - 1;
65 Utilities::fixed_power<codim>(this->degree + 1));
67 if (this->degree == 0)
68 for (
unsigned int d = 0; d <
codim; ++d)
72 std::vector<Point<1>> points =
73 internal::FE_FaceQImplementation::get_QGaussLobatto_points(
degree);
76 for (
unsigned int iz = 0;
iz <= ((
codim > 2) ? this->degree : 0); ++
iz)
77 for (
unsigned int iy = 0;
iy <= ((
codim > 1) ? this->degree : 0); ++
iy)
99 for (
unsigned int d = 0; d < dim; ++d)
101 for (
unsigned int e = 0, c = 0; e < dim; ++e)
105 unsigned int renumber = i;
106 if (dim == 3 && d == 1)
120template <
int dim,
int spacedim>
121std::unique_ptr<FiniteElement<dim, spacedim>>
124 return std::make_unique<FE_FaceQ<dim, spacedim>>(this->degree);
129template <
int dim,
int spacedim>
138 << this->degree <<
")";
145template <
int dim,
int spacedim>
150 const unsigned int face_no)
const
152 get_subface_interpolation_matrix(
source_fe,
160template <
int dim,
int spacedim>
164 const unsigned int subface,
166 const unsigned int face_no)
const
189 spacedim>::ExcInterpolationNotImplemented()));
198 const double eps = 2e-13 * (this->degree + 1) * (dim - 1);
204 const Point<dim - 1> p =
206 face_quadrature.point(i) :
208 face_quadrature.point(i), subface);
210 for (
unsigned int j = 0;
j < this->n_dofs_per_face(
face_no); ++
j)
233 for (
unsigned int i = 0; i < this->n_dofs_per_face(
face_no); ++i)
248 spacedim>::ExcInterpolationNotImplemented()));
253template <
int dim,
int spacedim>
257 const unsigned int face_index)
const
259 return (face_index == (
shape_index / this->n_dofs_per_face(face_index)));
264template <
int dim,
int spacedim>
265std::vector<unsigned int>
268 std::vector<unsigned int>
dpo(dim + 1, 0U);
270 for (
unsigned int i = 1; i < dim - 1; ++i)
277template <
int dim,
int spacedim>
286template <
int dim,
int spacedim>
287std::vector<std::pair<unsigned int, unsigned int>>
292 return std::vector<std::pair<unsigned int, unsigned int>>();
297template <
int dim,
int spacedim>
298std::vector<std::pair<unsigned int, unsigned int>>
306 return std::vector<std::pair<unsigned int, unsigned int>>();
319 const unsigned int p = this->degree;
322 std::vector<std::pair<unsigned int, unsigned int>>
identities;
324 const std::vector<unsigned int> &index_map_inverse =
325 this->poly_space.get_numbering_inverse();
327 fe_q_other->poly_space.get_numbering_inverse();
329 for (
unsigned int i = 0; i < p + 1; ++i)
330 for (
unsigned int j = 0;
j <
q + 1; ++
j)
332 this->unit_support_points[index_map_inverse[i]][dim - 1] -
343 return std::vector<std::pair<unsigned int, unsigned int>>();
345 else if (
fe_other.n_unique_faces() == 1 &&
355 return std::vector<std::pair<unsigned int, unsigned int>>();
360 return std::vector<std::pair<unsigned int, unsigned int>>();
367template <
int dim,
int spacedim>
368std::vector<std::pair<unsigned int, unsigned int>>
371 const unsigned int)
const
377 return std::vector<std::pair<unsigned int, unsigned int>>();
389 const unsigned int p = this->degree;
392 std::vector<std::pair<unsigned int, unsigned int>>
identities;
394 const std::vector<unsigned int> &index_map_inverse =
395 this->poly_space.get_numbering_inverse();
397 fe_q_other->poly_space.get_numbering_inverse();
399 std::vector<std::pair<unsigned int, unsigned int>>
identities_1d;
401 for (
unsigned int i = 0; i < p + 1; ++i)
402 for (
unsigned int j = 0;
j <
q + 1; ++
j)
404 this->unit_support_points[index_map_inverse[i]][dim - 2] -
422 return std::vector<std::pair<unsigned int, unsigned int>>();
424 else if (
fe_other.n_unique_faces() == 1 &&
434 return std::vector<std::pair<unsigned int, unsigned int>>();
439 return std::vector<std::pair<unsigned int, unsigned int>>();
446template <
int dim,
int spacedim>
450 const unsigned int codim)
const
470 if (fe_nothing->is_dominating())
483template <
int dim,
int spacedim>
484std::pair<Table<2, bool>, std::vector<unsigned int>>
488 for (
unsigned int i = 0; i < this->n_dofs_per_cell(); ++i)
489 constant_modes(0, i) =
true;
490 return std::pair<Table<2, bool>, std::vector<unsigned int>>(
491 constant_modes, std::vector<unsigned int>(1, 0));
494template <
int dim,
int spacedim>
501 this->get_unit_support_points().
size());
505 for (
unsigned int i = 0; i < this->n_dofs_per_cell(); ++i)
515template <
int spacedim>
535template <
int spacedim>
536std::unique_ptr<FiniteElement<1, spacedim>>
539 return std::make_unique<FE_FaceQ<1, spacedim>>(this->degree);
544template <
int spacedim>
553 << this->degree <<
")";
560template <
int spacedim>
565 const unsigned int face_no)
const
567 get_subface_interpolation_matrix(
source_fe,
575template <
int spacedim>
581 const unsigned int face_no)
const
597template <
int spacedim>
600 const unsigned int face_index)
const
608template <
int spacedim>
609std::vector<unsigned int>
612 std::vector<unsigned int>
dpo(2, 0U);
619template <
int spacedim>
626template <
int spacedim>
627std::vector<std::pair<unsigned int, unsigned int>>
632 return std::vector<std::pair<unsigned int, unsigned int>>(1,
639template <
int spacedim>
640std::vector<std::pair<unsigned int, unsigned int>>
645 return std::vector<std::pair<unsigned int, unsigned int>>();
650template <
int spacedim>
651std::vector<std::pair<unsigned int, unsigned int>>
654 const unsigned int)
const
657 return std::vector<std::pair<unsigned int, unsigned int>>();
662template <
int spacedim>
663std::pair<Table<2, bool>, std::vector<unsigned int>>
667 for (
unsigned int i = 0; i < this->n_dofs_per_cell(); ++i)
668 constant_modes(0, i) =
true;
669 return std::pair<Table<2, bool>, std::vector<unsigned int>>(
670 constant_modes, std::vector<unsigned int>(1, 0));
675template <
int spacedim>
691template <
int spacedim>
710template <
int spacedim>
714 const unsigned int face,
724 const unsigned int foffset = face;
727 for (
unsigned int k = 0;
k < this->n_dofs_per_cell(); ++
k)
728 output_data.shape_values(
k, 0) = 0.;
729 output_data.shape_values(
foffset, 0) = 1;
734template <
int spacedim>
756template <
int dim,
int spacedim>
760 Polynomials::Legendre::generate_complete_basis(degree)),
770template <
int dim,
int spacedim>
771std::unique_ptr<FiniteElement<dim, spacedim>>
774 return std::make_unique<FE_FaceP<dim, spacedim>>(this->degree);
779template <
int dim,
int spacedim>
788 << this->degree <<
")";
795template <
int dim,
int spacedim>
799 const unsigned int face_index)
const
801 return (face_index == (
shape_index / this->n_dofs_per_face(face_index)));
806template <
int dim,
int spacedim>
807std::vector<unsigned int>
810 std::vector<unsigned int>
dpo(dim + 1, 0U);
812 for (
unsigned int i = 1; i < dim - 1; ++i)
814 dpo[dim - 1] *=
deg + 1 + i;
815 dpo[dim - 1] /= i + 1;
822template <
int dim,
int spacedim>
831template <
int dim,
int spacedim>
835 const unsigned int codim)
const
855 if (fe_nothing->is_dominating())
870template <
int dim,
int spacedim>
875 const unsigned int face_no)
const
877 get_subface_interpolation_matrix(
source_fe,
885template <
int dim,
int spacedim>
889 const unsigned int subface,
891 const unsigned int face_no)
const
914 spacedim>::ExcInterpolationNotImplemented()));
924 const double eps = 2e-13 * (this->degree + 1) * (dim - 1);
929 for (
unsigned int k = 0;
k < face_quadrature.
size(); ++
k)
931 const Point<dim - 1> p =
933 face_quadrature.point(
k) :
935 face_quadrature.point(
k), subface);
948 for (
unsigned int i = 0; i < this->n_dofs_per_face(
face_no); ++i)
950 for (
unsigned int k = 0;
k < face_quadrature.
size(); ++
k)
952 const Point<dim - 1> p =
954 face_quadrature.point(
k) :
956 face_quadrature.point(
k), subface);
957 v_in(
k) = this->poly_space.compute_value(i, p);
987 spacedim>::ExcInterpolationNotImplemented()));
992template <
int dim,
int spacedim>
993std::pair<Table<2, bool>, std::vector<unsigned int>>
998 constant_modes(0, face * this->n_dofs_per_face(face)) =
true;
999 return std::pair<Table<2, bool>, std::vector<unsigned int>>(
1000 constant_modes, std::vector<unsigned int>(1, 0));
1005template <
int spacedim>
1012template <
int spacedim>
1021 << this->degree <<
")";
1029#include "fe_face.inst"
virtual std::pair< Table< 2, bool >, std::vector< unsigned int > > get_constant_modes() const override
virtual bool hp_constraints_are_implemented() const override
virtual bool has_support_on_face(const unsigned int shape_index, const unsigned int face_index) const override
virtual FiniteElementDomination::Domination compare_for_domination(const FiniteElement< dim, spacedim > &fe_other, const unsigned int codim=0) const override final
virtual std::string get_name() const override
static std::vector< unsigned int > get_dpo_vector(const unsigned int deg)
virtual void get_subface_interpolation_matrix(const FiniteElement< dim, spacedim > &source, const unsigned int subface, FullMatrix< double > &matrix, const unsigned int face_no=0) const override
virtual std::unique_ptr< FiniteElement< dim, spacedim > > clone() const override
virtual void get_face_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix, const unsigned int face_no=0) const override
virtual FiniteElementDomination::Domination compare_for_domination(const FiniteElement< dim, spacedim > &fe_other, const unsigned int codim=0) const override final
virtual std::string get_name() const override
static std::vector< unsigned int > get_dpo_vector(const unsigned int deg)
virtual void convert_generalized_support_point_values_to_dof_values(const std::vector< Vector< double > > &support_point_values, std::vector< double > &nodal_values) const override
virtual std::pair< Table< 2, bool >, std::vector< unsigned int > > get_constant_modes() const override
virtual void get_face_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix, const unsigned int face_no=0) const override
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
FE_FaceQ(const unsigned int p)
virtual std::unique_ptr< FiniteElement< dim, spacedim > > clone() const override
virtual void get_subface_interpolation_matrix(const FiniteElement< dim, spacedim > &source, const unsigned int subface, FullMatrix< double > &matrix, const unsigned int face_no=0) const override
virtual bool has_support_on_face(const unsigned int shape_index, const unsigned int face_index) const override
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_quad_dof_identities(const FiniteElement< dim, spacedim > &fe_other, const unsigned int face_no=0) const override
virtual bool hp_constraints_are_implemented() const override
const unsigned int degree
virtual void fill_fe_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const CellSimilarity::Similarity cell_similarity, const Quadrature< dim > &quadrature, const Mapping< dim, spacedim > &mapping, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_internal, const internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &mapping_data, const InternalDataBase &fe_internal, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const =0
std::vector< std::vector< Point< dim - 1 > > > unit_face_support_points
virtual void fill_fe_face_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const hp::QCollection< dim - 1 > &quadrature, const Mapping< dim, spacedim > &mapping, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_internal, const internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &mapping_data, const InternalDataBase &fe_internal, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const
virtual void fill_fe_subface_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const unsigned int sub_no, const Quadrature< dim - 1 > &quadrature, const Mapping< dim, spacedim > &mapping, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_internal, const internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &mapping_data, const InternalDataBase &fe_internal, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const =0
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const =0
std::vector< Point< dim > > unit_support_points
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
static ::ExceptionBase & ExcLeastSquaresError(double arg1)
static ::ExceptionBase & ExcImpossibleInDim(int arg1)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
@ update_hessians
Second derivatives of shape functions.
@ update_values
Shape function values.
@ update_normal_vectors
Normal vectors.
@ update_JxW_values
Transformed quadrature weights.
@ update_covariant_transformation
Covariant transformation.
@ update_gradients
Shape function gradients.
@ either_element_can_dominate
@ other_element_dominates
@ neither_element_dominates
std::string dim_string(const int dim, const int spacedim)
static const unsigned int invalid_unsigned_int
static std_cxx20::ranges::iota_view< unsigned int, unsigned int > face_indices()
static Point< dim > child_to_cell_coordinates(const Point< dim > &p, const unsigned int child_index, const RefinementCase< dim > refine_case=RefinementCase< dim >::isotropic_refinement)