36#include <boost/container/small_vector.hpp>
49template <
int dim,
int spacedim>
51 const unsigned int polynomial_degree)
52 : polynomial_degree(polynomial_degree)
53 , n_shape_functions(
Utilities::fixed_power<dim>(polynomial_degree + 1))
54 , line_support_points(
QGaussLobatto<1>(polynomial_degree + 1))
55 , tensor_product_quadrature(
false)
61template <
int dim,
int spacedim>
79template <
int dim,
int spacedim>
86 this->update_each = update_flags;
88 const unsigned int n_q_points = quadrature.size();
91 volume_elements.resize(n_q_points);
93 tensor_product_quadrature = quadrature.is_tensor_product();
98 tensor_product_quadrature =
false;
104 if (tensor_product_quadrature)
106 const std::array<Quadrature<1>, dim> &
quad_array =
107 quadrature.get_tensor_basis();
108 for (
unsigned int i = 1; i < dim && tensor_product_quadrature; ++i)
112 tensor_product_quadrature =
false;
119 const std::vector<Point<1>> &
points_2 =
130 tensor_product_quadrature =
false;
137 if (tensor_product_quadrature)
143 shape_info.reinit(quadrature.get_tensor_basis()[0], fe);
144 shape_info.lexicographic_numbering =
145 FETools::lexicographic_to_hierarchic_numbering<dim>(
147 shape_info.n_q_points = n_q_points;
148 shape_info.dofs_per_component_on_cell =
157template <
int dim,
int spacedim>
164 reinit(update_flags, quadrature);
166 quadrature_points = quadrature.get_points();
168 if (dim > 1 && tensor_product_quadrature)
170 constexpr unsigned int facedim = dim - 1;
172 shape_info.reinit(quadrature.get_tensor_basis()[0], fe);
173 shape_info.lexicographic_numbering =
174 FETools::lexicographic_to_hierarchic_numbering<facedim>(
177 shape_info.dofs_per_component_on_cell =
183 if (this->update_each &
195 std::fill(unit_tangentials[i].begin(),
196 unit_tangentials[i].end(),
216template <
int dim,
int spacedim>
224 FETools::lexicographic_to_hierarchic_numbering<dim>(p))
226 internal::MappingQImplementation::unit_support_points<dim>(
231 compute_support_point_weights_perimeter_to_interior(
235 internal::MappingQImplementation::compute_support_point_weights_cell<dim>(
239 ExcMessage(
"It only makes sense to create polynomial mappings "
240 "with a polynomial degree greater or equal to one."));
245template <
int dim,
int spacedim>
247 : polynomial_degree(mapping.polynomial_degree)
248 , line_support_points(mapping.line_support_points)
249 , polynomials_1d(mapping.polynomials_1d)
250 , renumber_lexicographic_to_hierarchic(
251 mapping.renumber_lexicographic_to_hierarchic)
252 , unit_cell_support_points(mapping.unit_cell_support_points)
253 , support_point_weights_perimeter_to_interior(
254 mapping.support_point_weights_perimeter_to_interior)
255 , support_point_weights_cell(mapping.support_point_weights_cell)
260template <
int dim,
int spacedim>
261std::unique_ptr<Mapping<dim, spacedim>>
264 return std::make_unique<MappingQ<dim, spacedim>>(*this);
269template <
int dim,
int spacedim>
273 return polynomial_degree;
278template <
int dim,
int spacedim>
284 if (polynomial_degree == 1)
286 const auto vertices = this->get_vertices(cell);
295 polynomials_1d.size() == 2,
296 renumber_lexicographic_to_hierarchic));
319template <
int dim,
int spacedim>
342 if (polynomial_degree == 1)
344 const auto vertices = this->get_vertices(cell);
345 return internal::MappingQImplementation::
346 do_transform_real_to_unit_cell_internal<1>(
351 renumber_lexicographic_to_hierarchic);
354 return internal::MappingQImplementation::
355 do_transform_real_to_unit_cell_internal<1>(
360 renumber_lexicographic_to_hierarchic);
372 if (polynomial_degree == 1)
374 const auto vertices = this->get_vertices(cell);
375 return internal::MappingQImplementation::
376 do_transform_real_to_unit_cell_internal<2>(
381 renumber_lexicographic_to_hierarchic);
384 return internal::MappingQImplementation::
385 do_transform_real_to_unit_cell_internal<2>(
390 renumber_lexicographic_to_hierarchic);
402 if (polynomial_degree == 1)
404 const auto vertices = this->get_vertices(cell);
405 return internal::MappingQImplementation::
406 do_transform_real_to_unit_cell_internal<3>(
411 renumber_lexicographic_to_hierarchic);
414 return internal::MappingQImplementation::
415 do_transform_real_to_unit_cell_internal<3>(
420 renumber_lexicographic_to_hierarchic);
433 const int spacedim = 2;
440 auto mdata = Utilities::dynamic_unique_cast<InternalData>(
443 mdata->mapping_support_points = this->compute_mapping_support_points(cell);
447 return internal::MappingQImplementation::
448 do_transform_real_to_unit_cell_internal_codim1<1>(
453 renumber_lexicographic_to_hierarchic);
466 const int spacedim = 3;
473 auto mdata = Utilities::dynamic_unique_cast<InternalData>(
476 mdata->mapping_support_points = this->compute_mapping_support_points(cell);
480 return internal::MappingQImplementation::
481 do_transform_real_to_unit_cell_internal_codim1<2>(
486 renumber_lexicographic_to_hierarchic);
504template <
int dim,
int spacedim>
512 if ((polynomial_degree == 1) &&
513 ((dim == 1) || ((dim == 2) && (dim == spacedim))))
536 const auto vertices_ = this->get_vertices(cell);
540 for (
unsigned int i = 0; i < vertices.size(); ++i)
566 const double eps = 1e-15;
567 if (-eps <= point[1] && point[1] <= 1 + eps &&
568 -eps <= point[0] && point[0] <= 1 + eps)
600 if (this->preserves_vertex_locations())
604 if (dim == 1 && polynomial_degree == 1)
610 for (
unsigned int d = 0; d < dim; ++d)
617 this->transform_real_to_unit_cell_internal(cell, p,
initial_p_unit);
625template <
int dim,
int spacedim>
644 boost::container::small_vector<Point<spacedim>,
646 ReferenceCells::max_n_vertices<dim>()
652 if (polynomial_degree == 1)
653 vertices = this->get_vertices(cell);
657 polynomial_degree == 1 ? vertices.data() :
659 Utilities::pow(polynomial_degree + 1, dim));
666 const unsigned int n_points = real_points.size();
671 for (
unsigned int i = 0; i < n_points; i += n_lanes)
672 if (n_points - i > 1)
675 for (
unsigned int j = 0;
j < n_lanes; ++
j)
676 if (i +
j < n_points)
677 for (
unsigned int d = 0; d < spacedim; ++d)
678 p_vec[d][
j] = real_points[i +
j][d];
680 for (
unsigned int d = 0; d < spacedim; ++d)
681 p_vec[d][
j] = real_points[i][d];
684 internal::MappingQImplementation::
685 do_transform_real_to_unit_cell_internal<dim, spacedim>(
690 renumber_lexicographic_to_hierarchic);
697 for (
unsigned int j = 0;
j < n_lanes && i +
j < n_points; ++
j)
698 if (unit_point[0][
j] != std::numeric_limits<double>::lowest())
699 for (
unsigned int d = 0; d < dim; ++d)
700 unit_points[i +
j][d] = unit_point[d][
j];
702 unit_points[i +
j] = internal::MappingQImplementation::
703 do_transform_real_to_unit_cell_internal<dim, spacedim>(
708 renumber_lexicographic_to_hierarchic);
711 unit_points[i] = internal::MappingQImplementation::
712 do_transform_real_to_unit_cell_internal<dim, spacedim>(
717 renumber_lexicographic_to_hierarchic);
722template <
int dim,
int spacedim>
733 for (
unsigned int i = 0; i < 5; ++i)
778template <
int dim,
int spacedim>
779std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
783 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
data_ptr =
784 std::make_unique<InternalData>(polynomial_degree);
791template <
int dim,
int spacedim>
792std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
799 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
data_ptr =
800 std::make_unique<InternalData>(polynomial_degree);
804 ReferenceCells::get_hypercube<dim>(), quadrature[0]),
805 quadrature[0].
size());
812template <
int dim,
int spacedim>
813std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
818 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
data_ptr =
819 std::make_unique<InternalData>(polynomial_degree);
823 ReferenceCells::get_hypercube<dim>(), quadrature),
831template <
int dim,
int spacedim>
847 const unsigned int n_q_points = quadrature.size();
859 if (polynomial_degree == 1)
862 const auto vertices = this->get_vertices(cell);
864 data.mapping_support_points[i] = vertices[i];
867 data.mapping_support_points = this->compute_mapping_support_points(cell);
869 data.cell_of_current_support_points = cell;
876 (polynomial_degree == 1 && this->preserves_vertex_locations() ?
880 if (dim > 1 &&
data.tensor_product_quadrature)
882 internal::MappingQImplementation::
883 maybe_update_q_points_Jacobians_and_grads_tensor<dim, spacedim>(
898 renumber_lexicographic_to_hierarchic,
909 renumber_lexicographic_to_hierarchic,
919 renumber_lexicographic_to_hierarchic,
928 renumber_lexicographic_to_hierarchic,
931 internal::MappingQImplementation::
932 maybe_update_jacobian_pushed_forward_2nd_derivatives<dim, spacedim>(
937 renumber_lexicographic_to_hierarchic,
946 renumber_lexicographic_to_hierarchic,
949 internal::MappingQImplementation::
950 maybe_update_jacobian_pushed_forward_3rd_derivatives<dim, spacedim>(
955 renumber_lexicographic_to_hierarchic,
959 const std::vector<double> &weights = quadrature.get_weights();
967 (output_data.
JxW_values.size() == n_q_points),
977 for (
unsigned int point = 0; point < n_q_points; ++point)
981 const double det =
data.volume_elements[point];
989 1e-12 * Utilities::fixed_power<dim>(
990 cell->diameter() /
std::sqrt(
double(dim))),
992 cell->center(),
det, point)));
1002 for (
unsigned int i = 0; i < spacedim; ++i)
1003 for (
unsigned int j = 0;
j < dim; ++
j)
1007 for (
unsigned int i = 0; i < dim; ++i)
1008 for (
unsigned int j = 0;
j < dim; ++
j)
1026 Assert(spacedim == dim + 1,
1028 "There is no (unique) cell normal for " +
1030 "-dimensional cells in " +
1032 "-dimensional space. This only works if the "
1033 "space dimension is one greater than the "
1034 "dimensionality of the mesh cells."));
1046 if (cell->direction_flag() ==
false)
1059template <
int dim,
int spacedim>
1081 if ((
data.mapping_support_points.empty()) ||
1082 (&cell->get_triangulation() !=
1083 &
data.cell_of_current_support_points->get_triangulation()) ||
1084 (cell !=
data.cell_of_current_support_points))
1086 if (polynomial_degree == 1)
1088 data.mapping_support_points.resize(
1090 const auto vertices = this->get_vertices(cell);
1093 data.mapping_support_points[i] = vertices[i];
1096 data.mapping_support_points =
1097 this->compute_mapping_support_points(cell);
1098 data.cell_of_current_support_points = cell;
1107 ReferenceCells::get_hypercube<dim>(),
1109 cell->combined_face_orientation(
face_no),
1110 quadrature[0].
size()),
1114 renumber_lexicographic_to_hierarchic,
1120template <
int dim,
int spacedim>
1141 if ((
data.mapping_support_points.empty()) ||
1142 (&cell->get_triangulation() !=
1143 &
data.cell_of_current_support_points->get_triangulation()) ||
1144 (cell !=
data.cell_of_current_support_points))
1146 if (polynomial_degree == 1)
1148 data.mapping_support_points.resize(
1150 const auto vertices = this->get_vertices(cell);
1153 data.mapping_support_points[i] = vertices[i];
1156 data.mapping_support_points =
1157 this->compute_mapping_support_points(cell);
1158 data.cell_of_current_support_points = cell;
1167 ReferenceCells::get_hypercube<dim>(),
1170 cell->combined_face_orientation(
face_no),
1176 renumber_lexicographic_to_hierarchic,
1182template <
int dim,
int spacedim>
1199 const unsigned int n_q_points = quadrature.size();
1201 if (polynomial_degree == 1)
1204 const auto vertices = this->get_vertices(cell);
1206 data.mapping_support_points[i] = vertices[i];
1209 data.mapping_support_points = this->compute_mapping_support_points(cell);
1210 data.cell_of_current_support_points = cell;
1217 renumber_lexicographic_to_hierarchic,
1222 internal::MappingQImplementation::maybe_update_jacobian_grads<dim, spacedim>(
1227 renumber_lexicographic_to_hierarchic,
1236 renumber_lexicographic_to_hierarchic,
1245 renumber_lexicographic_to_hierarchic,
1248 internal::MappingQImplementation::
1249 maybe_update_jacobian_pushed_forward_2nd_derivatives<dim, spacedim>(
1254 renumber_lexicographic_to_hierarchic,
1263 renumber_lexicographic_to_hierarchic,
1266 internal::MappingQImplementation::
1267 maybe_update_jacobian_pushed_forward_3rd_derivatives<dim, spacedim>(
1272 renumber_lexicographic_to_hierarchic,
1276 const std::vector<double> &weights = quadrature.get_weights();
1288 for (
unsigned int point = 0; point < n_q_points; ++point)
1290 const double det =
data.volume_elements[point];
1297 Assert(
det > 1e-12 * Utilities::fixed_power<dim>(
1298 cell->diameter() /
std::sqrt(
double(dim))),
1300 cell->center(),
det, point)));
1304 for (
unsigned int d = 0; d < spacedim; d++)
1312 normal /= normal.
norm();
1321template <
int dim,
int spacedim>
1338 output_data.
initialize(unit_points.size(), update_flags);
1341 this->get_data(update_flags,
1343 unit_points.end())));
1346 if (polynomial_degree == 1)
1349 const auto vertices = this->get_vertices(cell);
1351 data.mapping_support_points[i] = vertices[i];
1354 data.mapping_support_points = this->compute_mapping_support_points(cell);
1361 renumber_lexicographic_to_hierarchic,
1369template <
int dim,
int spacedim>
1379 if (face_quadrature.get_points().empty())
1387 if (polynomial_degree == 1)
1390 const auto vertices = this->get_vertices(cell);
1392 data.mapping_support_points[i] = vertices[i];
1395 data.mapping_support_points = this->compute_mapping_support_points(cell);
1396 data.output_data = &output_data;
1407 renumber_lexicographic_to_hierarchic,
1413template <
int dim,
int spacedim>
1429template <
int dim,
int spacedim>
1445template <
int dim,
int spacedim>
1453 switch (mapping_kind)
1477template <
int dim,
int spacedim>
1491 switch (mapping_kind)
1497 "update_covariant_transformation"));
1499 for (
unsigned int q = 0;
q < output.size(); ++
q)
1500 for (
unsigned int i = 0; i < spacedim; ++i)
1501 for (
unsigned int j = 0;
j < spacedim; ++
j)
1505 data.inverse_jacobians[
q].transpose();
1506 for (
unsigned int K = 0; K < dim; ++K)
1508 tmp[K] = covariant[
j][0] * input[
q][i][0][K];
1509 for (
unsigned int J = 1; J < dim; ++J)
1510 tmp[K] += covariant[
j][J] * input[
q][i][J][K];
1512 for (
unsigned int k = 0;
k < spacedim; ++
k)
1514 output[
q][i][
j][
k] = covariant[
k][0] * tmp[0];
1515 for (
unsigned int K = 1; K < dim; ++K)
1516 output[
q][i][
j][
k] += covariant[
k][K] * tmp[K];
1529template <
int dim,
int spacedim>
1537 switch (mapping_kind)
1554template <
int dim,
int spacedim>
1561 if (this->polynomial_degree == 2)
1563 for (
unsigned int line_no = 0;
1576 cell->get_manifold() :
1578 a.push_back(manifold.get_new_point_on_line(line));
1586 for (
unsigned int line_no = 0;
1599 cell->get_manifold() :
1602 const auto reference_cell = ReferenceCells::get_hypercube<dim>();
1603 const std::array<Point<spacedim>, 2> vertices{
1604 {cell->vertex(reference_cell.line_to_cell_vertices(
line_no, 0)),
1605 cell->vertex(reference_cell.line_to_cell_vertices(
line_no, 1))}};
1607 const std::size_t n_rows =
1608 support_point_weights_perimeter_to_interior[0].size(0);
1609 a.resize(a.size() + n_rows);
1611 manifold.get_new_points(
1613 support_point_weights_perimeter_to_interior[0],
1638 const bool face_orientation = cell->face_orientation(
face_no),
1639 face_flip = cell->face_flip(
face_no),
1640 face_rotation = cell->face_rotation(
face_no);
1645 for (
unsigned int i = 0; i < vertices_per_face; ++i)
1646 Assert(face->vertex_index(i) ==
1648 face_no, i, face_orientation, face_flip, face_rotation)),
1653 for (
unsigned int i = 0; i < lines_per_face; ++i)
1656 face_no, i, face_orientation, face_flip, face_rotation)),
1662 boost::container::small_vector<Point<3>, 200>
tmp_points(
1667 if (polynomial_degree > 1)
1670 for (
unsigned int i = 0; i < polynomial_degree - 1; ++i)
1671 tmp_points[4 + line * (polynomial_degree - 1) + i] =
1673 (polynomial_degree - 1) *
1677 const std::size_t n_rows =
1678 support_point_weights_perimeter_to_interior[1].size(0);
1679 a.resize(a.size() + n_rows);
1681 face->get_manifold().get_new_points(
1683 support_point_weights_perimeter_to_interior[1],
1698 vertices[i] = cell->vertex(i);
1702 for (
unsigned int q = 0,
q2 = 0;
q2 < polynomial_degree - 1; ++
q2)
1703 for (
unsigned int q1 = 0;
q1 < polynomial_degree - 1; ++
q1, ++
q)
1705 Point<2> point(line_support_points[
q1 + 1][0],
1706 line_support_points[
q2 + 1][0]);
1711 const std::size_t n_rows = weights.size(0);
1712 a.resize(a.size() + n_rows);
1714 cell->get_manifold().get_new_points(
1720template <
int dim,
int spacedim>
1731template <
int dim,
int spacedim>
1732std::vector<Point<spacedim>>
1737 std::vector<Point<spacedim>> a;
1738 a.reserve(Utilities::fixed_power<dim>(polynomial_degree + 1));
1740 a.push_back(cell->vertex(i));
1742 if (this->polynomial_degree > 1)
1752 &cell->get_manifold()) ==
nullptr)
1755 if (&cell->face(f)->get_manifold() != &cell->get_manifold())
1760 if (&cell->line(l)->get_manifold() != &cell->get_manifold())
1766 const std::size_t n_rows = support_point_weights_cell.size(0);
1767 a.resize(a.size() + n_rows);
1771 support_point_weights_cell,
1778 add_line_support_points(cell, a);
1783 add_line_support_points(cell, a);
1786 if (dim != spacedim)
1787 add_quad_support_points(cell, a);
1790 const std::size_t n_rows =
1791 support_point_weights_perimeter_to_interior[1].size(0);
1792 a.resize(a.size() + n_rows);
1794 cell->get_manifold().get_new_points(
1796 support_point_weights_perimeter_to_interior[1],
1803 add_line_support_points(cell, a);
1804 add_quad_support_points(cell, a);
1808 const std::size_t n_rows =
1809 support_point_weights_perimeter_to_interior[2].size(0);
1810 a.resize(a.size() + n_rows);
1812 cell->get_manifold().get_new_points(
1814 support_point_weights_perimeter_to_interior[2],
1830template <
int dim,
int spacedim>
1840template <
int dim,
int spacedim>
1845 Assert(dim == reference_cell.get_dimension(),
1846 ExcMessage(
"The dimension of your mapping (" +
1848 ") and the reference cell cell_type (" +
1850 " ) do not agree."));
1852 return reference_cell.is_hyper_cube();
1858#include "fe/mapping_q.inst"
auto make_const_array_view(const Container &container) -> decltype(make_array_view(container))
ArrayView< std::remove_reference_t< typename std::iterator_traits< Iterator >::reference >, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
virtual std::size_t memory_consumption() const override
std::vector< Point< spacedim > > mapping_support_points
virtual void reinit(const UpdateFlags update_flags, const Quadrature< dim > &quadrature) override
internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > * output_data
void initialize_face(const UpdateFlags update_flags, const Quadrature< dim > &quadrature, const unsigned int n_original_q_points)
InternalData(const unsigned int polynomial_degree)
const std::vector< unsigned int > renumber_lexicographic_to_hierarchic
const Table< 2, double > support_point_weights_cell
virtual std::vector< Point< spacedim > > compute_mapping_support_points(const typename Triangulation< dim, spacedim >::cell_iterator &cell) const
virtual std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > get_data(const UpdateFlags, const Quadrature< dim > &quadrature) const override
void fill_mapping_data_for_face_quadrature(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_number, const Quadrature< dim - 1 > &face_quadrature, const typename Mapping< dim, spacedim >::InternalDataBase &internal_data, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data) const
virtual BoundingBox< spacedim > get_bounding_box(const typename Triangulation< dim, spacedim >::cell_iterator &cell) const override
virtual std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > get_subface_data(const UpdateFlags flags, const Quadrature< dim - 1 > &quadrature) const override
virtual void fill_fe_subface_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const unsigned int subface_no, const Quadrature< dim - 1 > &quadrature, const typename Mapping< dim, spacedim >::InternalDataBase &internal_data, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data) const override
virtual void transform(const ArrayView< const Tensor< 1, dim > > &input, const MappingKind kind, const typename Mapping< dim, spacedim >::InternalDataBase &internal, const ArrayView< Tensor< 1, spacedim > > &output) const override
virtual CellSimilarity::Similarity fill_fe_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const CellSimilarity::Similarity cell_similarity, const Quadrature< dim > &quadrature, const typename Mapping< dim, spacedim >::InternalDataBase &internal_data, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data) const override
virtual void fill_fe_immersed_surface_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const NonMatching::ImmersedSurfaceQuadrature< dim > &quadrature, const typename Mapping< dim, spacedim >::InternalDataBase &internal_data, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data) const override
const unsigned int polynomial_degree
virtual void transform_points_real_to_unit_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const ArrayView< const Point< spacedim > > &real_points, const ArrayView< Point< dim > > &unit_points) const override
virtual std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > get_face_data(const UpdateFlags flags, const hp::QCollection< dim - 1 > &quadrature) const override
Point< dim > transform_real_to_unit_cell_internal(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< spacedim > &p, const Point< dim > &initial_p_unit) const
const std::vector< Table< 2, double > > support_point_weights_perimeter_to_interior
void fill_mapping_data_for_generic_points(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const ArrayView< const Point< dim > > &unit_points, const UpdateFlags update_flags, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data) const
const std::vector< Point< 1 > > line_support_points
virtual Point< spacedim > transform_unit_to_real_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< dim > &p) const override
const std::vector< Polynomials::Polynomial< double > > polynomials_1d
virtual std::unique_ptr< Mapping< dim, spacedim > > clone() const override
const std::vector< Point< dim > > unit_cell_support_points
virtual Point< dim > transform_real_to_unit_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< spacedim > &p) const override
MappingQ(const unsigned int polynomial_degree)
virtual void add_line_support_points(const typename Triangulation< dim, spacedim >::cell_iterator &cell, std::vector< Point< spacedim > > &a) const
virtual void add_quad_support_points(const typename Triangulation< dim, spacedim >::cell_iterator &cell, std::vector< Point< spacedim > > &a) const
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) 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 typename Mapping< dim, spacedim >::InternalDataBase &internal_data, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data) const override
virtual bool is_compatible_with(const ReferenceCell &reference_cell) const override
unsigned int get_degree() const
Abstract base class for mapping classes.
virtual void transform_points_real_to_unit_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const ArrayView< const Point< spacedim > > &real_points, const ArrayView< Point< dim > > &unit_points) const
const Tensor< 1, spacedim > & normal_vector(const unsigned int i) const
numbers::NumberTraits< Number >::real_type norm() const
static constexpr std::size_t size()
unsigned int size() const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
static ::ExceptionBase & ExcImpossibleInDim(int arg1)
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
typename IteratorSelector::line_iterator line_iterator
@ update_jacobian_pushed_forward_2nd_derivatives
@ update_volume_elements
Determinant of the Jacobian.
@ update_contravariant_transformation
Contravariant transformation.
@ update_jacobian_pushed_forward_grads
@ update_jacobian_grads
Gradient of volume element.
@ update_normal_vectors
Normal vectors.
@ update_JxW_values
Transformed quadrature weights.
@ update_covariant_transformation
Covariant transformation.
@ update_jacobians
Volume element.
@ update_inverse_jacobians
Volume element.
@ update_quadrature_points
Transformed quadrature points.
@ update_default
No update.
@ update_jacobian_pushed_forward_3rd_derivatives
@ update_boundary_forms
Outer normal vector, not normalized.
const Manifold< dim, spacedim > & get_manifold(const types::manifold_id number) const
@ mapping_covariant_gradient
@ mapping_contravariant_hessian
@ mapping_covariant_hessian
@ mapping_contravariant_gradient
#define DEAL_II_ASSERT_UNREACHABLE()
#define DEAL_II_NOT_IMPLEMENTED()
std::vector< index_type > data
std::enable_if_t< std::is_fundamental_v< T >, std::size_t > memory_consumption(const T &t)
std::string to_string(const number value, const unsigned int digits=numbers::invalid_unsigned_int)
std::string int_to_string(const unsigned int value, const unsigned int digits=numbers::invalid_unsigned_int)
constexpr T pow(const T base, const int iexp)
Point< 1 > transform_real_to_unit_cell(const std::array< Point< spacedim >, GeometryInfo< 1 >::vertices_per_cell > &vertices, const Point< spacedim > &p)
void transform_differential_forms(const ArrayView< const DerivativeForm< rank, dim, spacedim > > &input, const MappingKind mapping_kind, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_data, const ArrayView< Tensor< rank+1, spacedim > > &output)
void maybe_update_jacobian_grads(const CellSimilarity::Similarity cell_similarity, const typename ::MappingQ< dim, spacedim >::InternalData &data, const ArrayView< const Point< dim > > &unit_points, const std::vector< Polynomials::Polynomial< double > > &polynomials_1d, const std::vector< unsigned int > &renumber_lexicographic_to_hierarchic, std::vector< DerivativeForm< 2, dim, spacedim > > &jacobian_grads)
void do_fill_fe_face_values(const ::MappingQ< dim, spacedim > &mapping, const typename ::Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const unsigned int subface_no, const typename QProjector< dim >::DataSetDescriptor data_set, const Quadrature< dim - 1 > &quadrature, const typename ::MappingQ< dim, spacedim >::InternalData &data, const std::vector< Polynomials::Polynomial< double > > &polynomials_1d, const std::vector< unsigned int > &renumber_lexicographic_to_hierarchic, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data)
void transform_fields(const ArrayView< const Tensor< rank, dim > > &input, const MappingKind mapping_kind, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_data, const ArrayView< Tensor< rank, spacedim > > &output)
void maybe_update_jacobian_3rd_derivatives(const CellSimilarity::Similarity cell_similarity, const typename ::MappingQ< dim, spacedim >::InternalData &data, const ArrayView< const Point< dim > > &unit_points, const std::vector< Polynomials::Polynomial< double > > &polynomials_1d, const std::vector< unsigned int > &renumber_lexicographic_to_hierarchic, std::vector< DerivativeForm< 4, dim, spacedim > > &jacobian_3rd_derivatives)
void maybe_update_jacobian_pushed_forward_grads(const CellSimilarity::Similarity cell_similarity, const typename ::MappingQ< dim, spacedim >::InternalData &data, const ArrayView< const Point< dim > > &unit_points, const std::vector< Polynomials::Polynomial< double > > &polynomials_1d, const std::vector< unsigned int > &renumber_lexicographic_to_hierarchic, std::vector< Tensor< 3, spacedim > > &jacobian_pushed_forward_grads)
void maybe_update_q_points_Jacobians_generic(const CellSimilarity::Similarity cell_similarity, const typename ::MappingQ< dim, spacedim >::InternalData &data, const ArrayView< const Point< dim > > &unit_points, const std::vector< Polynomials::Polynomial< double > > &polynomials_1d, const std::vector< unsigned int > &renumber_lexicographic_to_hierarchic, std::vector< Point< spacedim > > &quadrature_points, std::vector< DerivativeForm< 1, dim, spacedim > > &jacobians, std::vector< DerivativeForm< 1, spacedim, dim > > &inverse_jacobians)
void transform_gradients(const ArrayView< const Tensor< rank, dim > > &input, const MappingKind mapping_kind, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_data, const ArrayView< Tensor< rank, spacedim > > &output)
void transform_hessians(const ArrayView< const Tensor< 3, dim > > &input, const MappingKind mapping_kind, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_data, const ArrayView< Tensor< 3, spacedim > > &output)
void maybe_update_jacobian_2nd_derivatives(const CellSimilarity::Similarity cell_similarity, const typename ::MappingQ< dim, spacedim >::InternalData &data, const ArrayView< const Point< dim > > &unit_points, const std::vector< Polynomials::Polynomial< double > > &polynomials_1d, const std::vector< unsigned int > &renumber_lexicographic_to_hierarchic, std::vector< DerivativeForm< 3, dim, spacedim > > &jacobian_2nd_derivatives)
ProductTypeNoPoint< Number, Number2 >::type evaluate_tensor_product_value_linear(const Number *values, const Point< dim, Number2 > &p)
ProductTypeNoPoint< Number, Number2 >::type evaluate_tensor_product_value(const std::vector< Polynomials::Polynomial< double > > &poly, const ArrayView< const Number > &values, const Point< dim, Number2 > &p, const bool d_linear=false, const std::vector< unsigned int > &renumber={})
constexpr unsigned int invalid_unsigned_int
constexpr types::manifold_id flat_manifold_id
::VectorizedArray< Number, width > sqrt(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > abs(const ::VectorizedArray< Number, width > &)
static std_cxx20::ranges::iota_view< unsigned int, unsigned int > face_indices()
static double d_linear_shape_function(const Point< dim > &xi, const unsigned int i)
static std_cxx20::ranges::iota_view< unsigned int, unsigned int > vertex_indices()
DEAL_II_HOST constexpr Number determinant(const SymmetricTensor< 2, dim, Number > &)