34 template <
int dim,
int spacedim>
36 compute_linear_transformation(
40 for (
unsigned int j = 0; j < spacedim; ++j)
41 for (
unsigned int i = 1; i < dim + 1; ++i)
42 result[j][i - 1] = cell->vertex(i)[j] - cell->vertex(0)[j];
49template <
int dim,
int spacedim>
58template <
int dim,
int spacedim>
61 : quadrature(quadrature)
66template <
int dim,
int spacedim>
72 this->quadrature = quadrature;
73 this->update_each = update_flags;
78template <
int dim,
int spacedim>
92template <
int dim,
int spacedim>
101template <
int dim,
int spacedim>
106 return reference_cell.is_simplex();
111template <
int dim,
int spacedim>
126template <
int dim,
int spacedim>
127std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
131 auto data_ptr = std::make_unique<InternalData>(quadrature);
148template <
int dim,
int spacedim>
149std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
154 auto data_ptr = std::make_unique<InternalData>(
165 data_ptr->update_each = update_flags;
172template <
int dim,
int spacedim>
173std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
178 auto data_ptr = std::make_unique<InternalData>(
189 data_ptr->update_each = update_flags;
196template <
int dim,
int spacedim>
202 data.affine_component = cell->vertex(0);
203 data.contravariant = compute_linear_transformation<dim, spacedim>(cell);
204 data.covariant =
data.contravariant.covariant_form();
205 data.volume_element =
data.contravariant.determinant();
210template <
int dim,
int spacedim>
219 for (
unsigned int i = 0; i < quadrature_points.size(); ++i)
220 quadrature_points[i] =
221 data.affine_component +
223 data.quadrature.point(offset + i));
228template <
int dim,
int spacedim>
231 const unsigned int face_no,
236 ReferenceCells::get_simplex<dim>().face_normal_vector(face_no);
239 normal_vector /= normal_vector.
norm();
241 std::fill(normal_vectors.begin(), normal_vectors.end(), normal_vector);
246template <
int dim,
int spacedim>
291template <
int dim,
int spacedim>
310template <
int dim,
int spacedim>
321 const auto inverse =
data.covariant.transpose();
330template <
int dim,
int spacedim>
356 for (
unsigned int i = 0; i < output_data.
JxW_values.size(); ++i)
367 Assert(spacedim == dim + 1,
368 ExcMessage(
"There is no (unique) cell normal for " +
370 "-dimensional cells in " +
372 "-dimensional space. This only works if the "
373 "space dimension is one greater than the "
374 "dimensionality of the mesh cells."));
378 if constexpr (dim == 1 && spacedim == 2)
379 normal = cross_product_2d(-
data.contravariant.transpose()[0]);
380 else if constexpr (dim == 2 && spacedim == 3)
387 normal /= normal.
norm();
389 if (cell->direction_flag() ==
false)
397 return cell_similarity;
402template <
int dim,
int spacedim>
419 output_data.
initialize(unit_points.size(), update_flags);
422 data.update_each = update_flags;
437template <
int dim,
int spacedim>
441 const unsigned int face_no,
455 cell->combined_face_orientation(
457 quadrature_collection);
471 const double J = cell->face(face_no)->measure() /
472 cell->reference_cell().face_measure(face_no);
474 for (
unsigned int i = 0; i < output_data.
JxW_values.size(); ++i)
475 output_data.
JxW_values[i] = J *
data.quadrature.weight(i + offset);
478 for (
unsigned int i = 0; i < output_data.
boundary_forms.size(); ++i)
489template <
int dim,
int spacedim>
493 const unsigned int face_no,
494 const unsigned int subface_no,
509 cell->combined_face_orientation(
512 cell->subface_case(face_no));
525 cell->face(face_no)->measure() /
526 cell->face(face_no)->reference_cell().volume() /
531 for (
unsigned int i = 0; i < output_data.
JxW_values.size(); ++i)
535 for (
unsigned int i = 0; i < output_data.
boundary_forms.size(); ++i)
546template <
int dim,
int spacedim>
559 switch (mapping_kind)
563 for (
unsigned int i = 0; i < output.size(); ++i)
570 for (
unsigned int i = 0; i < output.size(); ++i)
578 for (
unsigned int d = 0; d < spacedim; ++d)
579 transformation[d] *= 1.0 /
data.volume_element;
580 for (
unsigned int i = 0; i < output.size(); ++i)
591template <
int dim,
int spacedim>
604 switch (mapping_kind)
608 for (
unsigned int i = 0; i < output.size(); ++i)
620template <
int dim,
int spacedim>
633 switch (mapping_kind)
639 "update_covariant_transformation"));
641 for (
unsigned int i = 0; i < output.size(); ++i)
650 "update_contravariant_transformation"));
652 for (
unsigned int i = 0; i < output.size(); ++i)
661 "update_covariant_transformation"));
663 for (
unsigned int i = 0; i < output.size(); ++i)
676 "update_covariant_transformation"));
678 for (
unsigned int i = 0; i < output.size(); ++i)
692 "update_contravariant_transformation"));
694 for (
unsigned int i = 0; i < output.size(); ++i)
711template <
int dim,
int spacedim>
724 switch (mapping_kind)
730 "update_covariant_transformation"));
732 for (
unsigned int i = 0; i < output.size(); ++i)
745template <
int dim,
int spacedim>
758 switch (mapping_kind)
764 "update_covariant_transformation"));
767 "update_contravariant_transformation"));
769 for (
unsigned int i = 0; i < output.size(); ++i)
782 "update_covariant_transformation"));
784 for (
unsigned int i = 0; i < output.size(); ++i)
795 "update_covariant_transformation"));
798 "update_contravariant_transformation"));
800 for (
unsigned int i = 0; i < output.size(); ++i)
816template <
int dim,
int spacedim>
823 compute_linear_transformation<dim, spacedim>(cell);
825 return cell->vertex(0) + sheared;
830template <
int dim,
int spacedim>
837 compute_linear_transformation<dim, spacedim>(cell)
846template <
int dim,
int spacedim>
854 compute_linear_transformation<dim, spacedim>(cell)
858 for (
unsigned int i = 0; i < real_points.size(); ++i)
865template <
int dim,
int spacedim>
866std::unique_ptr<Mapping<dim, spacedim>>
869 return std::make_unique<MappingP1<dim, spacedim>>(*this);
875#include "fe/mapping_p1.inst"
virtual void reinit(const UpdateFlags update_flags, const Quadrature< dim > &quadrature) override
DerivativeForm< 1, dim, spacedim > contravariant
Quadrature< dim > quadrature
InternalData(const ArrayView< const Point< dim > > &quadrature_points)
virtual std::size_t memory_consumption() const override
virtual std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > get_data(const UpdateFlags, const Quadrature< dim > &quadrature) const override
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) 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_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< dim > &reference_cell) const override
void transform_quadrature_points(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const InternalData &data, const typename QProjector< dim >::DataSetDescriptor &offset, std::vector< Point< spacedim > > &quadrature_points) const
virtual std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > get_subface_data(const UpdateFlags flags, const Quadrature< dim - 1 > &quadrature) const override
virtual bool preserves_vertex_locations() 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 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 Point< spacedim > transform_unit_to_real_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< dim > &p) const override
void update_transformation(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const InternalData &data) const
virtual std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > get_face_data(const UpdateFlags flags, const hp::QCollection< dim - 1 > &quadrature) const override
virtual std::unique_ptr< Mapping< dim, spacedim > > clone() const override
void maybe_update_inverse_jacobians(const InternalData &data, const CellSimilarity::Similarity cell_similarity, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data) const
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
void maybe_update_jacobian_derivatives(const InternalData &data, const CellSimilarity::Similarity cell_similarity, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data) const
virtual Point< dim > transform_real_to_unit_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< spacedim > &p) const override
void maybe_update_normal_vectors(const unsigned int face_no, const InternalData &data, std::vector< Tensor< 1, spacedim > > &normal_vectors) const
void maybe_update_jacobians(const InternalData &data, const CellSimilarity::Similarity cell_similarity, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data) const
virtual void fill_fe_subface_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const unsigned int subface_no, const Quadrature< dim - 1 > &quadrature, const typename Mapping< dim, spacedim >::InternalDataBase &internal_data, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data) const override
Abstract base class for mapping classes.
Class storing the offset index into a Quadrature rule created by project_to_all_faces() or project_to...
static DataSetDescriptor face(const ReferenceCell< dim > &reference_cell, const unsigned int face_no, const types::geometric_orientation combined_orientation, const unsigned int n_quadrature_points)
static DataSetDescriptor subface(const ReferenceCell< dim > &reference_cell, const unsigned int face_no, const unsigned int subface_no, const types::geometric_orientation combined_orientation, const unsigned int n_quadrature_points, const internal::SubfaceCase< dim > ref_case=internal::SubfaceCase< dim >::case_isotropic)
Class which transforms dim - 1-dimensional quadrature rules to dim-dimensional face quadratures.
double weight(const unsigned int i) const
unsigned int size() const
numbers::NumberTraits< Number >::real_type norm() const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_ASSERT_UNREACHABLE()
#define DEAL_II_NOT_IMPLEMENTED()
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcDivideByZero()
static ::ExceptionBase & ExcMessage(std::string arg1)
@ update_jacobian_pushed_forward_2nd_derivatives
@ update_contravariant_transformation
Contravariant transformation.
@ update_jacobian_pushed_forward_grads
@ update_jacobian_3rd_derivatives
@ 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.
@ update_jacobian_2nd_derivatives
@ 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)
std::string int_to_string(const unsigned int value, const unsigned int digits=numbers::invalid_unsigned_int)
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)