45template <
int dim,
int spacedim>
66template <
int dim,
int spacedim>
74 this->update_each = update_flags;
76 const unsigned int n_q_points = q.
size();
83 if (this->update_each &
85 compute_manifold_quadrature_weights(q);
88 covariant.resize(n_q_points);
91 contravariant.resize(n_q_points);
94 volume_elements.resize(n_q_points);
99template <
int dim,
int spacedim>
104 const unsigned int n_original_q_points)
106 reinit(update_flags, q);
111 covariant.resize(n_original_q_points);
114 contravariant.resize(n_original_q_points);
117 volume_elements.resize(n_original_q_points);
129 unit_tangentials[i].resize(n_original_q_points);
130 std::fill(unit_tangentials[i].
begin(),
131 unit_tangentials[i].
end(),
136 .resize(n_original_q_points);
151template <
int dim,
int spacedim>
157 vertices[i] = cell->vertex(i);
163template <
int dim,
int spacedim>
168 cell_manifold_quadrature_weights.resize(quad.
size());
169 for (
unsigned int q = 0; q < quad.
size(); ++q)
173 cell_manifold_quadrature_weights[q][i] =
181template <
int dim,
int spacedim>
188template <
int dim,
int spacedim>
189std::unique_ptr<Mapping<dim, spacedim>>
192 return std::make_unique<MappingManifold<dim, spacedim>>(*this);
197template <
int dim,
int spacedim>
209template <
int dim,
int spacedim>
216 std::array<double, GeometryInfo<dim>::vertices_per_cell> weights;
220 vertices[v] = cell->vertex(v);
223 return cell->get_manifold().get_new_point(
243template <
int dim,
int spacedim>
255 for (
unsigned int i = 0; i < 5; ++i)
305template <
int dim,
int spacedim>
306std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
310 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase> data_ptr =
311 std::make_unique<InternalData>();
319template <
int dim,
int spacedim>
320std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
327 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase> data_ptr =
328 std::make_unique<InternalData>();
332 ReferenceCells::get_hypercube<dim>(), quadrature[0]),
333 quadrature[0].
size());
340template <
int dim,
int spacedim>
341std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
346 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase> data_ptr =
347 std::make_unique<InternalData>();
351 ReferenceCells::get_hypercube<dim>(), quadrature),
361 namespace MappingManifoldImplementation
371 template <
int dim,
int spacedim>
373 maybe_compute_q_points(
375 const typename ::MappingManifold<dim, spacedim>::InternalData
383 for (
unsigned int point = 0; point < quadrature_points.size();
386 quadrature_points[point] =
data.manifold->get_new_point(
389 data.cell_manifold_quadrature_weights[point + data_set]));
402 template <
int dim,
int spacedim>
404 maybe_update_Jacobians(
405 const typename ::QProjector<dim>::DataSetDescriptor data_set,
406 const typename ::MappingManifold<dim, spacedim>::InternalData
413 const unsigned int n_q_points =
data.contravariant.size();
415 std::fill(
data.contravariant.begin(),
416 data.contravariant.end(),
419 for (
unsigned int point = 0; point < n_q_points; ++point)
429 data.cell_manifold_quadrature_weights[point + data_set]));
438 for (
unsigned int i = 0; i < dim; ++i)
441 const double pi = p[i];
442 Assert(pi >= 0 && pi <= 1.0,
444 "Was expecting a quadrature point "
445 "inside the unit reference element."));
449 const double L = pi > .5 ? -pi : 1 - pi;
454 for (
const unsigned int j :
456 data.vertex_weights[j] =
464 data.manifold->get_tangent_vector(P, NP);
466 for (
unsigned int d = 0; d < spacedim; ++d)
467 data.contravariant[point][d][i] = T[d] / L;
473 const unsigned int n_q_points =
data.contravariant.size();
474 for (
unsigned int point = 0; point < n_q_points; ++point)
476 data.covariant[point] =
477 (
data.contravariant[point]).covariant_form();
483 const unsigned int n_q_points =
data.contravariant.size();
484 for (
unsigned int point = 0; point < n_q_points; ++point)
485 data.volume_elements[point] =
486 data.contravariant[point].determinant();
496template <
int dim,
int spacedim>
511 const unsigned int n_q_points = quadrature.
size();
513 data.store_vertices(cell);
514 data.manifold = &(cell->get_manifold());
516 internal::MappingManifoldImplementation::maybe_compute_q_points<dim,
522 internal::MappingManifoldImplementation::maybe_update_Jacobians<dim,
527 const std::vector<double> &weights = quadrature.
get_weights();
542 for (
unsigned int point = 0; point < n_q_points; ++point)
546 const double det =
data.contravariant[point].determinant();
553 Assert(det > 1e-12 * Utilities::fixed_power<dim>(
554 cell->diameter() /
std::sqrt(
double(dim))),
556 cell->center(), det, point)));
558 output_data.
JxW_values[point] = weights[point] * det;
566 for (
unsigned int i = 0; i < spacedim; ++i)
567 for (
unsigned int j = 0; j < dim; ++j)
568 DX_t[j][i] =
data.contravariant[point][i][j];
571 for (
unsigned int i = 0; i < dim; ++i)
572 for (
unsigned int j = 0; j < dim; ++j)
573 G[i][j] = DX_t[i] * DX_t[j];
580 Assert(spacedim == dim + 1,
582 "There is no (unique) cell normal for " +
584 "-dimensional cells in " +
586 "-dimensional space. This only works if the "
587 "space dimension is one greater than the "
588 "dimensionality of the mesh cells."));
592 cross_product_2d(-DX_t[0]);
595 cross_product_3d(DX_t[0], DX_t[1]);
600 if (cell->direction_flag() ==
false)
613 for (
unsigned int point = 0; point < n_q_points; ++point)
621 for (
unsigned int point = 0; point < n_q_points; ++point)
623 data.covariant[point].transpose();
633 namespace MappingManifoldImplementation
646 template <
int dim,
int spacedim>
648 maybe_compute_face_data(
649 const ::MappingManifold<dim, spacedim> &mapping,
650 const typename ::Triangulation<dim, spacedim>::cell_iterator
652 const unsigned int face_no,
653 const unsigned int subface_no,
654 const unsigned int n_q_points,
655 const std::vector<double> &weights,
656 const typename ::MappingManifold<dim, spacedim>::InternalData
674 for (
unsigned int d = 0; d != dim - 1; ++d)
677 data.unit_tangentials.size(),
680 data.aux[d].size() <=
682 .unit_tangentials[face_no +
690 .unit_tangentials[face_no +
701 for (
unsigned int i = 0; i < n_q_points; ++i)
710 (face_no == 0 ? -1 : +1);
714 cross_product_2d(
data.aux[0][i]);
718 cross_product_3d(
data.aux[0][i],
data.aux[1][i]);
734 for (
unsigned int point = 0;
point < n_q_points; ++
point)
742 data.contravariant[
point].transpose()[0];
744 (face_no == 0 ? -1. : +1.) *
756 cross_product_3d(DX_t[0], DX_t[1]);
757 cell_normal /= cell_normal.
norm();
762 cross_product_3d(
data.aux[0][point], cell_normal);
784 const double area_ratio =
786 cell->subface_case(face_no), subface_no);
798 for (
unsigned int point = 0;
point < n_q_points; ++
point)
802 for (
unsigned int point = 0;
point < n_q_points; ++
point)
804 data.covariant[point].transpose();
815 template <
int dim,
int spacedim>
818 const ::MappingManifold<dim, spacedim> &mapping,
819 const typename ::Triangulation<dim, spacedim>::cell_iterator
821 const unsigned int face_no,
822 const unsigned int subface_no,
825 const typename ::MappingManifold<dim, spacedim>::InternalData
830 data.store_vertices(cell);
832 data.manifold = &cell->face(face_no)->get_manifold();
834 maybe_compute_q_points<dim, spacedim>(data_set,
837 maybe_update_Jacobians<dim, spacedim>(data_set,
data);
849 template <
int dim,
int spacedim,
int rank>
858 Assert((
dynamic_cast<const typename ::
859 MappingManifold<dim, spacedim>::InternalData *
>(
860 &mapping_data) !=
nullptr),
862 const typename ::MappingManifold<dim, spacedim>::InternalData
864 static_cast<const typename ::MappingManifold<dim, spacedim>::
865 InternalData &
>(mapping_data);
867 switch (mapping_kind)
874 "update_contravariant_transformation"));
876 for (
unsigned int i = 0; i < output.size(); ++i)
888 "update_contravariant_transformation"));
892 "update_volume_elements"));
897 for (
unsigned int i = 0; i < output.size(); ++i)
901 output[i] /=
data.volume_elements[i];
913 "update_covariant_transformation"));
915 for (
unsigned int i = 0; i < output.size(); ++i)
927 template <
int dim,
int spacedim,
int rank>
936 Assert((
dynamic_cast<const typename ::
937 MappingManifold<dim, spacedim>::InternalData *
>(
938 &mapping_data) !=
nullptr),
940 const typename ::MappingManifold<dim, spacedim>::InternalData
942 static_cast<const typename ::MappingManifold<dim, spacedim>::
943 InternalData &
>(mapping_data);
945 switch (mapping_kind)
952 "update_covariant_transformation"));
956 "update_contravariant_transformation"));
959 for (
unsigned int i = 0; i < output.size(); ++i)
976 "update_covariant_transformation"));
979 for (
unsigned int i = 0; i < output.size(); ++i)
996 "update_covariant_transformation"));
1000 "update_contravariant_transformation"));
1004 "update_volume_elements"));
1007 for (
unsigned int i = 0; i < output.size(); ++i)
1010 data.contravariant[i],
1011 data.volume_elements[i],
1024 template <
int dim,
int spacedim>
1033 Assert((
dynamic_cast<const typename ::
1034 MappingManifold<dim, spacedim>::InternalData *
>(
1035 &mapping_data) !=
nullptr),
1037 const typename ::MappingManifold<dim, spacedim>::InternalData
1039 static_cast<const typename ::MappingManifold<dim, spacedim>::
1040 InternalData &
>(mapping_data);
1042 switch (mapping_kind)
1049 "update_covariant_transformation"));
1053 "update_contravariant_transformation"));
1055 for (
unsigned int q = 0; q < output.size(); ++q)
1058 data.contravariant[q],
1069 "update_covariant_transformation"));
1071 for (
unsigned int q = 0; q < output.size(); ++q)
1084 "update_covariant_transformation"));
1088 "update_contravariant_transformation"));
1092 "update_volume_elements"));
1094 for (
unsigned int q = 0; q < output.size(); ++q)
1097 data.contravariant[q],
1098 data.volume_elements[q],
1111 template <
int dim,
int spacedim,
int rank>
1120 Assert((
dynamic_cast<const typename ::
1121 MappingManifold<dim, spacedim>::InternalData *
>(
1122 &mapping_data) !=
nullptr),
1124 const typename ::MappingManifold<dim, spacedim>::InternalData
1126 static_cast<const typename ::MappingManifold<dim, spacedim>::
1127 InternalData &
>(mapping_data);
1129 switch (mapping_kind)
1136 "update_covariant_transformation"));
1138 for (
unsigned int i = 0; i < output.size(); ++i)
1153template <
int dim,
int spacedim>
1157 const unsigned int face_no,
1170 internal::MappingManifoldImplementation::do_fill_fe_face_values(
1176 ReferenceCells::get_hypercube<dim>(),
1178 cell->combined_face_orientation(face_no),
1179 quadrature[0].
size()),
1187template <
int dim,
int spacedim>
1191 const unsigned int face_no,
1192 const unsigned int subface_no,
1203 internal::MappingManifoldImplementation::do_fill_fe_face_values(
1209 ReferenceCells::get_hypercube<dim>(),
1212 cell->combined_face_orientation(face_no),
1214 cell->subface_case(face_no)),
1222template <
int dim,
int spacedim>
1230 internal::MappingManifoldImplementation::transform_fields(input,
1238template <
int dim,
int spacedim>
1246 internal::MappingManifoldImplementation::transform_differential_forms(
1247 input, mapping_kind, mapping_data, output);
1252template <
int dim,
int spacedim>
1260 switch (mapping_kind)
1263 internal::MappingManifoldImplementation::transform_fields(input,
1272 internal::MappingManifoldImplementation::transform_gradients(
1273 input, mapping_kind, mapping_data, output);
1282template <
int dim,
int spacedim>
1295 switch (mapping_kind)
1301 "update_covariant_transformation"));
1303 for (
unsigned int q = 0; q < output.size(); ++q)
1317template <
int dim,
int spacedim>
1325 switch (mapping_kind)
1330 internal::MappingManifoldImplementation::transform_hessians(
1331 input, mapping_kind, mapping_data, output);
1339#include "fe/mapping_manifold.inst"
ArrayView< std::remove_reference_t< typename std::iterator_traits< Iterator >::reference >, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
void store_vertices(const typename Triangulation< dim, spacedim >::cell_iterator &cell) const
std::vector< double > volume_elements
std::array< std::vector< Tensor< 1, dim > >, GeometryInfo< dim >::faces_per_cell *(dim - 1)> unit_tangentials
std::vector< DerivativeForm< 1, dim, spacedim > > contravariant
std::array< Point< spacedim >, GeometryInfo< dim >::vertices_per_cell > vertices
std::vector< std::array< double, GeometryInfo< dim >::vertices_per_cell > > cell_manifold_quadrature_weights
std::vector< std::vector< Tensor< 1, spacedim > > > aux
virtual std::size_t memory_consumption() const override
void initialize_face(const UpdateFlags update_flags, const Quadrature< dim > &quadrature, const unsigned int n_original_q_points)
virtual void reinit(const UpdateFlags update_flags, const Quadrature< dim > &quadrature) override
ObserverPointer< const Manifold< dim, spacedim > > manifold
std::array< double, GeometryInfo< dim >::vertices_per_cell > vertex_weights
void compute_manifold_quadrature_weights(const Quadrature< dim > &quadrature)
std::vector< DerivativeForm< 1, dim, spacedim > > covariant
Triangulation< dim, spacedim >::cell_iterator cell
virtual Point< spacedim > transform_unit_to_real_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< dim > &p) const override
MappingManifold()=default
virtual std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > get_face_data(const UpdateFlags, const hp::QCollection< dim - 1 > &quadrature) const override
virtual Point< dim > transform_real_to_unit_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< spacedim > &p) 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 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 std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > get_subface_data(const UpdateFlags, const Quadrature< dim - 1 > &quadrature) 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 UpdateFlags requires_update_flags(const UpdateFlags update_flags) const override
virtual std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > get_data(const UpdateFlags, const Quadrature< dim > &quadrature) const override
virtual std::unique_ptr< Mapping< dim, spacedim > > clone() 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
Abstract base class for mapping classes.
static constexpr Point< dim, Number > unit_vector(const unsigned int i)
Class storing the offset index into a Quadrature rule created by project_to_all_faces() or project_to...
static DataSetDescriptor cell()
Class which transforms dim - 1-dimensional quadrature rules to dim-dimensional face quadratures.
const Point< dim > & point(const unsigned int i) const
const std::vector< double > & get_weights() const
const std::vector< Point< dim > > & get_points() const
unsigned int size() const
numbers::NumberTraits< Number >::real_type norm() const
unsigned int size() const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_NOT_IMPLEMENTED()
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
static ::ExceptionBase & ExcMessage(std::string arg1)
@ 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_jacobian_pushed_forward_3rd_derivatives
@ update_boundary_forms
Outer normal vector, not normalized.
@ mapping_covariant_gradient
@ mapping_contravariant_hessian
@ mapping_covariant_hessian
@ mapping_contravariant_gradient
std::vector< index_type > data
std::enable_if_t< std::is_fundamental_v< T >, std::size_t > memory_consumption(const T &t)
Point< spacedim > point(const gp_Pnt &p, const double tolerance=1e-10)
std::string int_to_string(const unsigned int value, const unsigned int digits=numbers::invalid_unsigned_int)
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 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 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_compute_face_data(const ::MappingQ< dim, spacedim > &mapping, const typename ::Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const unsigned int subface_no, const unsigned int n_q_points, const std::vector< double > &weights, const typename ::MappingQ< dim, spacedim >::InternalData &data, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data)
Tensor< 3, spacedim, Number > apply_contravariant_hessian(const DerivativeForm< 1, dim, spacedim, Number > &covariant, const DerivativeForm< 1, dim, spacedim, Number > &contravariant, const Tensor< 3, dim, Number > &input)
Tensor< 3, spacedim, Number > apply_piola_hessian(const DerivativeForm< 1, dim, spacedim, Number > &covariant, const DerivativeForm< 1, dim, spacedim, Number > &contravariant, const Number &volume_element, const Tensor< 3, dim, Number > &input)
Tensor< 2, spacedim, Number > apply_piola_gradient(const DerivativeForm< 1, dim, spacedim, Number > &covariant, const DerivativeForm< 1, dim, spacedim, Number > &contravariant, const Number &volume_element, const Tensor< 2, dim, Number > &input)
Tensor< 3, spacedim, Number > apply_covariant_gradient(const DerivativeForm< 1, dim, spacedim, Number > &covariant, const DerivativeForm< 2, dim, spacedim, Number > &input)
Tensor< 3, spacedim, Number > apply_covariant_hessian(const DerivativeForm< 1, dim, spacedim, Number > &covariant, const Tensor< 3, dim, Number > &input)
constexpr unsigned int invalid_unsigned_int
::VectorizedArray< Number, width > sqrt(const ::VectorizedArray< Number, width > &)
static std_cxx20::ranges::iota_view< unsigned int, unsigned int > face_indices()
static double subface_ratio(const internal::SubfaceCase< dim > &subface_case, const unsigned int subface_no)
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()
constexpr Number determinant(const SymmetricTensor< 2, dim, Number > &)