deal.II version GIT relicensing-6834-g5b78e6bcdf 2026-10-01 11:20:01+00:00
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
Loading...
Searching...
No Matches
fe_poly_face.h
Go to the documentation of this file.
1// -----------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception OR LGPL-2.1-or-later
4// Copyright (C) 2009 - 2024 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Detailed license information governing the source code and contributions
9// can be found in LICENSE.md and CONTRIBUTING.md at the top level directory.
10//
11// -----------------------------------------------------------------------------
12
13#ifndef dealii_fe_poly_face_h
14#define dealii_fe_poly_face_h
15
16
17#include <deal.II/base/config.h>
18
20
21#include <deal.II/fe/fe.h>
22
23#include <memory>
24
26
55template <typename PolynomialType,
56 int dim = PolynomialType::dimension + 1,
57 int spacedim = dim>
58class FE_PolyFace : public FiniteElement<dim, spacedim>
59{
60public:
64 FE_PolyFace(const PolynomialType &poly_space,
65 const FiniteElementData<dim> &fe_data,
66 const std::vector<bool> &restriction_is_additive_flags);
67
72 unsigned int
73 get_degree() const;
74
75 // for documentation, see the FiniteElement base class
76 virtual UpdateFlags
77 requires_update_flags(const UpdateFlags update_flags) const override;
78
79protected:
80 /*
81 * NOTE: The following functions have their definitions inlined into the class
82 * declaration because we otherwise run into a compiler error with MS Visual
83 * Studio.
84 */
85
86
87 virtual std::unique_ptr<
90 const UpdateFlags update_flags,
91 const Mapping<dim, spacedim> &mapping,
92 const Quadrature<dim> &quadrature,
94 spacedim>
95 &output_data) const override
96 {
97 (void)update_flags;
98 (void)mapping;
99 (void)quadrature;
100 (void)output_data;
101 return std::make_unique<InternalData>();
102 }
103
104 using FiniteElement<dim, spacedim>::get_face_data;
105
106 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
108 const UpdateFlags update_flags,
109 const Mapping<dim, spacedim> &mapping,
110 const hp::QCollection<dim - 1> &quadrature,
112 spacedim>
113 &output_data) const override
114 {
115 (void)mapping;
116 (void)output_data;
117 AssertDimension(quadrature.size(), 1);
118
119 // generate a new data object and
120 // initialize some fields
121 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
122 data_ptr = std::make_unique<InternalData>();
123 auto &data = dynamic_cast<InternalData &>(*data_ptr);
124 data.update_each = requires_update_flags(update_flags);
125
126 const unsigned int n_q_points = quadrature[0].size();
127
128 // some scratch arrays
129 std::vector<double> values(0);
130 std::vector<Tensor<1, dim - 1>> grads(0);
131 std::vector<Tensor<2, dim - 1>> grad_grads(0);
132 std::vector<Tensor<3, dim - 1>> empty_vector_of_3rd_order_tensors;
133 std::vector<Tensor<4, dim - 1>> empty_vector_of_4th_order_tensors;
134
135 // initialize fields only if really
136 // necessary. otherwise, don't
137 // allocate memory
138 if (data.update_each & update_values)
139 {
140 values.resize(poly_space.n());
141 data.shape_values.resize(poly_space.n(),
142 std::vector<double>(n_q_points));
143 for (unsigned int i = 0; i < n_q_points; ++i)
144 {
145 poly_space.evaluate(quadrature[0].point(i),
146 values,
147 grads,
148 grad_grads,
149 empty_vector_of_3rd_order_tensors,
150 empty_vector_of_4th_order_tensors);
151
152 for (unsigned int k = 0; k < poly_space.n(); ++k)
153 data.shape_values[k][i] = values[k];
154 }
155 }
156 // No derivatives of this element
157 // are implemented.
158 if (data.update_each & update_gradients ||
159 data.update_each & update_hessians)
160 {
162 }
163
164 return data_ptr;
165 }
166
167 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
169 const UpdateFlags update_flags,
170 const Mapping<dim, spacedim> &mapping,
171 const Quadrature<dim - 1> &quadrature,
173 spacedim>
174 &output_data) const override
175 {
176 return get_face_data(
177 update_flags,
178 mapping,
180 ReferenceCells::get_hypercube<dim - 1>(), quadrature)),
181 output_data);
182 }
183
184 virtual void
187 const CellSimilarity::Similarity cell_similarity,
188 const Quadrature<dim> &quadrature,
189 const Mapping<dim, spacedim> &mapping,
190 const typename Mapping<dim, spacedim>::InternalDataBase &mapping_internal,
192 &mapping_data,
193 const typename FiniteElement<dim, spacedim>::InternalDataBase &fe_internal,
195 spacedim>
196 &output_data) const override;
197
198 using FiniteElement<dim, spacedim>::fill_fe_face_values;
199
200 virtual void
203 const unsigned int face_no,
204 const hp::QCollection<dim - 1> &quadrature,
205 const Mapping<dim, spacedim> &mapping,
206 const typename Mapping<dim, spacedim>::InternalDataBase &mapping_internal,
208 &mapping_data,
209 const typename FiniteElement<dim, spacedim>::InternalDataBase &fe_internal,
211 spacedim>
212 &output_data) const override;
213
214 virtual void
217 const unsigned int face_no,
218 const unsigned int sub_no,
219 const Quadrature<dim - 1> &quadrature,
220 const Mapping<dim, spacedim> &mapping,
221 const typename Mapping<dim, spacedim>::InternalDataBase &mapping_internal,
223 &mapping_data,
224 const typename FiniteElement<dim, spacedim>::InternalDataBase &fe_internal,
226 spacedim>
227 &output_data) const override;
228
235 class InternalData : public FiniteElement<dim, spacedim>::InternalDataBase
236 {
237 public:
251 std::vector<std::vector<double>> shape_values;
252 };
253
258 PolynomialType poly_space;
259};
260
264
265#endif
std::vector< std::vector< double > > shape_values
PolynomialType poly_space
std::unique_ptr< typename FiniteElement< dim, spacedim >::InternalDataBase > get_subface_data(const UpdateFlags update_flags, const Mapping< dim, spacedim > &mapping, const Quadrature< dim - 1 > &quadrature, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const override
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 typename FiniteElement< dim, spacedim >::InternalDataBase &fe_internal, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const override
std::unique_ptr< typename FiniteElement< dim, spacedim >::InternalDataBase > get_face_data(const UpdateFlags update_flags, const Mapping< dim, spacedim > &mapping, const hp::QCollection< dim - 1 > &quadrature, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const override
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 typename FiniteElement< dim, spacedim >::InternalDataBase &fe_internal, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const override
FE_PolyFace(const PolynomialType &poly_space, const FiniteElementData< dim > &fe_data, const std::vector< bool > &restriction_is_additive_flags)
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const override
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 typename FiniteElement< dim, spacedim >::InternalDataBase &fe_internal, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const override
virtual std::unique_ptr< typename FiniteElement< dim, spacedim >::InternalDataBase > get_data(const UpdateFlags update_flags, const Mapping< dim, spacedim > &mapping, const Quadrature< dim > &quadrature, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const override
unsigned int get_degree() const
const std::vector< bool > restriction_is_additive_flags
Definition fe.h:2713
Abstract base class for mapping classes.
Definition mapping.h:318
Class which transforms dim - 1-dimensional quadrature rules to dim-dimensional face quadratures.
Definition qprojector.h:68
unsigned int size() const
Definition collection.h:314
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
#define DEAL_II_NOT_IMPLEMENTED()
#define AssertDimension(dim1, dim2)
UpdateFlags
@ update_hessians
Second derivatives of shape functions.
@ update_values
Shape function values.
@ update_gradients
Shape function gradients.
std::vector< index_type > data
Definition mpi.cc:734