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)
56 , output_data(nullptr)
61template <
int dim,
int spacedim>
79template <
int dim,
int spacedim>
84 const unsigned int n_original_q_points)
88 this->update_each = update_flags;
90 const unsigned int n_q_points = quadrature.
size();
93 volume_elements.resize(n_original_q_points);
100 tensor_product_quadrature =
false;
106 if (tensor_product_quadrature)
108 const std::array<Quadrature<1>, dim> &quad_array =
110 for (
unsigned int i = 1; i < dim && tensor_product_quadrature; ++i)
112 if (quad_array[i - 1].size() != quad_array[i].size())
114 tensor_product_quadrature =
false;
119 const std::vector<Point<1>> &points_1 =
120 quad_array[i - 1].get_points();
121 const std::vector<Point<1>> &points_2 =
122 quad_array[i].get_points();
123 const std::vector<double> &weights_1 =
124 quad_array[i - 1].get_weights();
125 const std::vector<double> &weights_2 =
126 quad_array[i].get_weights();
127 for (
unsigned int j = 0; j < quad_array[i].size(); ++j)
129 if (
std::abs(points_1[j][0] - points_2[j][0]) > 1.e-10 ||
130 std::abs(weights_1[j] - weights_2[j]) > 1.e-10)
132 tensor_product_quadrature =
false;
139 if (tensor_product_quadrature)
146 shape_info.lexicographic_numbering =
147 FETools::lexicographic_to_hierarchic_numbering<dim>(
149 shape_info.n_q_points = n_q_points;
150 shape_info.dofs_per_component_on_cell =
159template <
int dim,
int spacedim>
164 const unsigned int n_original_q_points)
166 initialize(update_flags, quadrature, n_original_q_points);
170 if (dim > 1 && tensor_product_quadrature)
172 constexpr unsigned int facedim = dim - 1;
175 shape_info.lexicographic_numbering =
176 FETools::lexicographic_to_hierarchic_numbering<facedim>(
178 shape_info.n_q_points = n_original_q_points;
179 shape_info.dofs_per_component_on_cell =
185 if (this->update_each &
189 aux[0].resize(n_original_q_points);
191 aux[1].resize(n_original_q_points);
196 unit_tangentials[i].resize(n_original_q_points);
197 std::fill(unit_tangentials[i].begin(),
198 unit_tangentials[i].end(),
203 .resize(n_original_q_points);
218template <
int dim,
int spacedim>
226 FETools::lexicographic_to_hierarchic_numbering<dim>(p))
228 internal::MappingQImplementation::unit_support_points<dim>(
233 compute_support_point_weights_perimeter_to_interior(
237 internal::MappingQImplementation::compute_support_point_weights_cell<dim>(
241 ExcMessage(
"It only makes sense to create polynomial mappings "
242 "with a polynomial degree greater or equal to one."));
247template <
int dim,
int spacedim>
254template <
int dim,
int spacedim>
256 : polynomial_degree(mapping.polynomial_degree)
257 , line_support_points(mapping.line_support_points)
258 , polynomials_1d(mapping.polynomials_1d)
259 , renumber_lexicographic_to_hierarchic(
260 mapping.renumber_lexicographic_to_hierarchic)
261 , unit_cell_support_points(mapping.unit_cell_support_points)
262 , support_point_weights_perimeter_to_interior(
263 mapping.support_point_weights_perimeter_to_interior)
264 , support_point_weights_cell(mapping.support_point_weights_cell)
269template <
int dim,
int spacedim>
270std::unique_ptr<Mapping<dim, spacedim>>
273 return std::make_unique<MappingQ<dim, spacedim>>(*this);
278template <
int dim,
int spacedim>
282 return polynomial_degree;
287template <
int dim,
int spacedim>
295 this->compute_mapping_support_points(cell),
297 polynomials_1d.size() == 2,
298 renumber_lexicographic_to_hierarchic));
321template <
int dim,
int spacedim>
340 const Point<1> &initial_p_unit)
const
344 return internal::MappingQImplementation::
345 do_transform_real_to_unit_cell_internal<1>(
348 this->compute_mapping_support_points(cell),
350 renumber_lexicographic_to_hierarchic);
360 const Point<2> &initial_p_unit)
const
362 return internal::MappingQImplementation::
363 do_transform_real_to_unit_cell_internal<2>(
366 this->compute_mapping_support_points(cell),
368 renumber_lexicographic_to_hierarchic);
378 const Point<3> &initial_p_unit)
const
380 return internal::MappingQImplementation::
381 do_transform_real_to_unit_cell_internal<3>(
384 this->compute_mapping_support_points(cell),
386 renumber_lexicographic_to_hierarchic);
396 const Point<1> &initial_p_unit)
const
399 const int spacedim = 2;
406 auto mdata = Utilities::dynamic_unique_cast<InternalData>(
407 get_data(update_flags, point_quadrature));
409 mdata->mapping_support_points = this->compute_mapping_support_points(cell);
413 return internal::MappingQImplementation::
414 do_transform_real_to_unit_cell_internal_codim1<1>(
417 mdata->mapping_support_points,
419 renumber_lexicographic_to_hierarchic);
429 const Point<2> &initial_p_unit)
const
432 const int spacedim = 3;
439 auto mdata = Utilities::dynamic_unique_cast<InternalData>(
440 get_data(update_flags, point_quadrature));
442 mdata->mapping_support_points = this->compute_mapping_support_points(cell);
446 return internal::MappingQImplementation::
447 do_transform_real_to_unit_cell_internal_codim1<2>(
450 mdata->mapping_support_points,
452 renumber_lexicographic_to_hierarchic);
470template <
int dim,
int spacedim>
478 if (this->preserves_vertex_locations() && (polynomial_degree == 1) &&
479 ((dim == 1) || ((dim == 2) && (dim == spacedim))))
502 const auto vertices_ = this->get_vertices(cell);
532 const double eps = 1e-15;
533 if (-eps <= point[1] && point[1] <= 1 + eps &&
534 -eps <= point[0] && point[0] <= 1 + eps)
565 if (this->preserves_vertex_locations())
567 initial_p_unit = cell->real_to_unit_cell_affine_approximation(p);
569 if (dim == 1 && polynomial_degree == 1)
570 return initial_p_unit;
575 for (
unsigned int d = 0;
d < dim; ++
d)
576 initial_p_unit[d] = 0.5;
582 this->transform_real_to_unit_cell_internal(cell, p, initial_p_unit);
590template <
int dim,
int spacedim>
608 const std::vector<Point<spacedim>> support_points =
609 this->compute_mapping_support_points(cell);
614 inverse_approximation(support_points, unit_cell_support_points);
616 const unsigned int n_points = real_points.size();
621 for (
unsigned int i = 0; i < n_points; i += n_lanes)
622 if (n_points - i > 1)
625 for (
unsigned int j = 0; j < n_lanes; ++j)
626 if (i + j < n_points)
627 for (
unsigned int d = 0; d < spacedim; ++d)
628 p_vec[d][j] = real_points[i + j][d];
630 for (
unsigned int d = 0; d < spacedim; ++d)
631 p_vec[d][j] = real_points[i][d];
634 internal::MappingQImplementation::
635 do_transform_real_to_unit_cell_internal<dim, spacedim>(
637 inverse_approximation.
compute(p_vec),
640 renumber_lexicographic_to_hierarchic);
647 for (
unsigned int j = 0; j < n_lanes && i + j < n_points; ++j)
649 for (
unsigned int d = 0; d < dim; ++d)
650 unit_points[i + j][d] = unit_point[d][j];
652 unit_points[i + j] = internal::MappingQImplementation::
653 do_transform_real_to_unit_cell_internal<dim, spacedim>(
655 inverse_approximation.
compute(real_points[i + j]),
658 renumber_lexicographic_to_hierarchic);
661 unit_points[i] = internal::MappingQImplementation::
662 do_transform_real_to_unit_cell_internal<dim, spacedim>(
664 inverse_approximation.
compute(real_points[i]),
667 renumber_lexicographic_to_hierarchic);
672template <
int dim,
int spacedim>
683 for (
unsigned int i = 0; i < 5; ++i)
728template <
int dim,
int spacedim>
729std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
733 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase> data_ptr =
734 std::make_unique<InternalData>(polynomial_degree);
736 data.
initialize(this->requires_update_flags(update_flags), q, q.
size());
743template <
int dim,
int spacedim>
744std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
751 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase> data_ptr =
752 std::make_unique<InternalData>(polynomial_degree);
756 ReferenceCells::get_hypercube<dim>(), quadrature[0]),
757 quadrature[0].size());
764template <
int dim,
int spacedim>
765std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
770 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase> data_ptr =
771 std::make_unique<InternalData>(polynomial_degree);
775 ReferenceCells::get_hypercube<dim>(), quadrature),
783template <
int dim,
int spacedim>
799 const unsigned int n_q_points = quadrature.
size();
819 (polynomial_degree == 1 && this->preserves_vertex_locations() ?
825 internal::MappingQImplementation::
826 maybe_update_q_points_Jacobians_and_grads_tensor<dim, spacedim>(
827 computed_cell_similarity,
837 computed_cell_similarity,
841 renumber_lexicographic_to_hierarchic,
848 computed_cell_similarity,
852 renumber_lexicographic_to_hierarchic,
858 spacedim>(computed_cell_similarity,
862 renumber_lexicographic_to_hierarchic,
867 spacedim>(computed_cell_similarity,
871 renumber_lexicographic_to_hierarchic,
874 internal::MappingQImplementation::
875 maybe_update_jacobian_pushed_forward_2nd_derivatives<dim, spacedim>(
876 computed_cell_similarity,
880 renumber_lexicographic_to_hierarchic,
885 spacedim>(computed_cell_similarity,
889 renumber_lexicographic_to_hierarchic,
892 internal::MappingQImplementation::
893 maybe_update_jacobian_pushed_forward_3rd_derivatives<dim, spacedim>(
894 computed_cell_similarity,
898 renumber_lexicographic_to_hierarchic,
902 const std::vector<double> &weights = quadrature.
get_weights();
910 (output_data.
JxW_values.size() == n_q_points),
920 for (
unsigned int point = 0; point < n_q_points; ++point)
932 1e-12 * Utilities::fixed_power<dim>(
933 cell->diameter() /
std::sqrt(
double(dim))),
935 cell->center(), det, point)));
937 output_data.
JxW_values[point] = weights[point] * det;
945 for (
unsigned int i = 0; i < spacedim; ++i)
946 for (
unsigned int j = 0; j < dim; ++j)
947 DX_t[j][i] = output_data.
jacobians[point][i][j];
950 for (
unsigned int i = 0; i < dim; ++i)
951 for (
unsigned int j = 0; j < dim; ++j)
952 G[i][j] = DX_t[i] * DX_t[j];
958 if (computed_cell_similarity ==
969 Assert(spacedim == dim + 1,
971 "There is no (unique) cell normal for " +
973 "-dimensional cells in " +
975 "-dimensional space. This only works if the "
976 "space dimension is one greater than the "
977 "dimensionality of the mesh cells."));
981 cross_product_2d(-DX_t[0]);
984 cross_product_3d(DX_t[0], DX_t[1]);
989 if (cell->direction_flag() ==
false)
997 return computed_cell_similarity;
1002template <
int dim,
int spacedim>
1006 const unsigned int face_no,
1025 (&cell->get_triangulation() !=
1039 ReferenceCells::get_hypercube<dim>(),
1041 cell->face_orientation(face_no),
1042 cell->face_flip(face_no),
1043 cell->face_rotation(face_no),
1044 quadrature[0].
size()),
1048 renumber_lexicographic_to_hierarchic,
1054template <
int dim,
int spacedim>
1058 const unsigned int face_no,
1059 const unsigned int subface_no,
1076 (&cell->get_triangulation() !=
1090 ReferenceCells::get_hypercube<dim>(),
1093 cell->face_orientation(face_no),
1094 cell->face_flip(face_no),
1095 cell->face_rotation(face_no),
1097 cell->subface_case(face_no)),
1101 renumber_lexicographic_to_hierarchic,
1107template <
int dim,
int spacedim>
1124 const unsigned int n_q_points = quadrature.
size();
1134 renumber_lexicographic_to_hierarchic,
1139 internal::MappingQImplementation::maybe_update_jacobian_grads<dim, spacedim>(
1144 renumber_lexicographic_to_hierarchic,
1153 renumber_lexicographic_to_hierarchic,
1162 renumber_lexicographic_to_hierarchic,
1165 internal::MappingQImplementation::
1166 maybe_update_jacobian_pushed_forward_2nd_derivatives<dim, spacedim>(
1171 renumber_lexicographic_to_hierarchic,
1180 renumber_lexicographic_to_hierarchic,
1183 internal::MappingQImplementation::
1184 maybe_update_jacobian_pushed_forward_3rd_derivatives<dim, spacedim>(
1189 renumber_lexicographic_to_hierarchic,
1192 const UpdateFlags update_flags = data.update_each;
1193 const std::vector<double> &weights = quadrature.
get_weights();
1205 for (
unsigned int point = 0; point < n_q_points; ++point)
1214 Assert(det > 1e-12 * Utilities::fixed_power<dim>(
1215 cell->diameter() /
std::sqrt(
double(dim))),
1217 cell->center(), det, point)));
1221 for (
unsigned int d = 0; d < spacedim; d++)
1225 output_data.
JxW_values[point] = weights[point] * det * normal.
norm();
1229 normal /= normal.
norm();
1238template <
int dim,
int spacedim>
1255 output_data.
initialize(unit_points.size(), update_flags);
1257 auto internal_data =
1258 this->get_data(update_flags,
1260 unit_points.end())));
1270 renumber_lexicographic_to_hierarchic,
1278template <
int dim,
int spacedim>
1282 const unsigned int face_no,
1308 renumber_lexicographic_to_hierarchic,
1314template <
int dim,
int spacedim>
1330template <
int dim,
int spacedim>
1346template <
int dim,
int spacedim>
1354 switch (mapping_kind)
1378template <
int dim,
int spacedim>
1390 &data = *
static_cast<const InternalData &
>(mapping_data).output_data;
1392 switch (mapping_kind)
1398 "update_covariant_transformation"));
1400 for (
unsigned int q = 0; q < output.size(); ++q)
1401 for (
unsigned int i = 0; i < spacedim; ++i)
1402 for (
unsigned int j = 0; j < spacedim; ++j)
1407 for (
unsigned int K = 0; K < dim; ++K)
1409 tmp[K] = covariant[j][0] * input[q][i][0][K];
1410 for (
unsigned int J = 1; J < dim; ++J)
1411 tmp[K] += covariant[j][J] * input[q][i][J][K];
1413 for (
unsigned int k = 0; k < spacedim; ++k)
1415 output[q][i][j][k] = covariant[k][0] * tmp[0];
1416 for (
unsigned int K = 1; K < dim; ++K)
1417 output[q][i][j][k] += covariant[k][K] * tmp[K];
1430template <
int dim,
int spacedim>
1438 switch (mapping_kind)
1455template <
int dim,
int spacedim>
1462 if (this->polynomial_degree == 2)
1464 for (
unsigned int line_no = 0;
1465 line_no < GeometryInfo<dim>::lines_per_cell;
1472 cell->line(line_no));
1477 cell->get_manifold() :
1486 std::vector<Point<spacedim>> tmp_points;
1487 for (
unsigned int line_no = 0;
1488 line_no < GeometryInfo<dim>::lines_per_cell;
1495 cell->line(line_no));
1500 cell->get_manifold() :
1503 const auto reference_cell = ReferenceCells::get_hypercube<dim>();
1504 const std::array<Point<spacedim>, 2>
vertices{
1505 {cell->vertex(reference_cell.line_to_cell_vertices(line_no, 0)),
1506 cell->vertex(reference_cell.line_to_cell_vertices(line_no, 1))}};
1508 const std::size_t n_rows =
1509 support_point_weights_perimeter_to_interior[0].size(0);
1510 a.resize(a.size() + n_rows);
1514 support_point_weights_perimeter_to_interior[0],
1531 std::vector<Point<3>> tmp_points;
1534 for (
unsigned int face_no = 0; face_no < faces_per_cell; ++face_no)
1539 const bool face_orientation = cell->face_orientation(face_no),
1540 face_flip = cell->face_flip(face_no),
1541 face_rotation = cell->face_rotation(face_no);
1546 for (
unsigned int i = 0; i < vertices_per_face; ++i)
1547 Assert(face->vertex_index(i) ==
1549 face_no, i, face_orientation, face_flip, face_rotation)),
1554 for (
unsigned int i = 0; i < lines_per_face; ++i)
1557 face_no, i, face_orientation, face_flip, face_rotation)),
1563 boost::container::small_vector<Point<3>, 200> tmp_points(
1568 if (polynomial_degree > 1)
1569 for (
unsigned int line = 0; line < GeometryInfo<2>::lines_per_cell;
1571 for (
unsigned int i = 0; i < polynomial_degree - 1; ++i)
1572 tmp_points[4 + line * (polynomial_degree - 1) + i] =
1574 (polynomial_degree - 1) *
1578 const std::size_t n_rows =
1579 support_point_weights_perimeter_to_interior[1].size(0);
1580 a.resize(a.size() + n_rows);
1582 face->get_manifold().get_new_points(
1584 support_point_weights_perimeter_to_interior[1],
1603 for (
unsigned int q = 0, q2 = 0; q2 < polynomial_degree - 1; ++q2)
1604 for (
unsigned int q1 = 0; q1 < polynomial_degree - 1; ++q1, ++q)
1606 Point<2> point(line_support_points[q1 + 1][0],
1607 line_support_points[q2 + 1][0]);
1612 const std::size_t n_rows = weights.size(0);
1613 a.resize(a.size() + n_rows);
1615 cell->get_manifold().get_new_points(
1621template <
int dim,
int spacedim>
1632template <
int dim,
int spacedim>
1633std::vector<Point<spacedim>>
1638 std::vector<Point<spacedim>> a;
1639 a.reserve(Utilities::fixed_power<dim>(polynomial_degree + 1));
1641 a.push_back(cell->vertex(i));
1643 if (this->polynomial_degree > 1)
1650 bool all_manifold_ids_are_equal = (dim == spacedim);
1651 if (all_manifold_ids_are_equal &&
1653 &cell->get_manifold()) ==
nullptr)
1656 if (&cell->face(f)->get_manifold() != &cell->get_manifold())
1657 all_manifold_ids_are_equal =
false;
1660 for (
unsigned int l = 0; l < GeometryInfo<dim>::lines_per_cell; ++l)
1661 if (&cell->line(l)->get_manifold() != &cell->get_manifold())
1662 all_manifold_ids_are_equal =
false;
1665 if (all_manifold_ids_are_equal)
1667 const std::size_t n_rows = support_point_weights_cell.size(0);
1668 a.resize(a.size() + n_rows);
1672 support_point_weights_cell,
1679 add_line_support_points(cell, a);
1684 add_line_support_points(cell, a);
1687 if (dim != spacedim)
1688 add_quad_support_points(cell, a);
1691 const std::size_t n_rows =
1692 support_point_weights_perimeter_to_interior[1].size(0);
1693 a.resize(a.size() + n_rows);
1695 cell->get_manifold().get_new_points(
1697 support_point_weights_perimeter_to_interior[1],
1704 add_line_support_points(cell, a);
1705 add_quad_support_points(cell, a);
1709 const std::size_t n_rows =
1710 support_point_weights_perimeter_to_interior[2].size(0);
1711 a.resize(a.size() + n_rows);
1713 cell->get_manifold().get_new_points(
1715 support_point_weights_perimeter_to_interior[2],
1731template <
int dim,
int spacedim>
1741template <
int dim,
int spacedim>
1746 Assert(dim == reference_cell.get_dimension(),
1747 ExcMessage(
"The dimension of your mapping (" +
1749 ") and the reference cell cell_type (" +
1751 " ) do not agree."));
1753 return reference_cell.is_hyper_cube();
1759#include "mapping_q.inst"
ArrayView< typename std::remove_reference< typename std::iterator_traits< Iterator >::reference >::type, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
virtual Point< spacedim > get_new_point_on_line(const typename Triangulation< dim, spacedim >::line_iterator &line) const
virtual void get_new_points(const ArrayView< const Point< spacedim > > &surrounding_points, const Table< 2, double > &weights, ArrayView< Point< spacedim > > new_points) const
Triangulation< dim, spacedim >::cell_iterator cell_of_current_support_points
virtual std::size_t memory_consumption() const override
std::vector< Point< spacedim > > mapping_support_points
bool tensor_product_quadrature
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)
AlignedVector< double > volume_elements
void initialize(const UpdateFlags update_flags, const Quadrature< dim > &quadrature, const unsigned int n_original_q_points)
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
bool is_tensor_product() const
const std::vector< double > & get_weights() const
const std::array< Quadrature< 1 >, dim > & get_tensor_basis() const
const std::vector< Point< dim > > & get_points() const
unsigned int size() const
numbers::NumberTraits< Number >::real_type norm() const
Triangulation< dim, spacedim > & get_triangulation()
static constexpr std::size_t size()
unsigned int size() const
Point< dim, Number > compute(const Point< spacedim, Number > &p) 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::enable_if_t< std::is_fundamental_v< T >, std::size_t > memory_consumption(const T &t)
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
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(const std::vector< Polynomials::Polynomial< double > > &poly, const std::vector< Number > &values, const Point< dim, Number2 > &p, const bool d_linear=false, const std::vector< unsigned int > &renumber={})
static const unsigned int invalid_unsigned_int
const types::manifold_id flat_manifold_id
bool is_finite(const double x)
::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 > &)