Reference documentation for deal.II version 9.2.0
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
Classes | Public Member Functions | Protected Attributes | List of all members
MappingQ< dim, spacedim > Class Template Reference

#include <deal.II/fe/mapping_manifold.h>

Inheritance diagram for MappingQ< dim, spacedim >:
[legend]

Classes

class  InternalData
 

Public Member Functions

 MappingQ (const unsigned int polynomial_degree, const bool use_mapping_q_on_all_cells=false)
 
 MappingQ (const MappingQ< dim, spacedim > &mapping)
 
unsigned int get_degree () const
 
virtual bool preserves_vertex_locations () const override
 
virtual Point< spacedim > transform_unit_to_real_cell (const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< dim > &p) 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 transform (const ArrayView< const DerivativeForm< 1, dim, spacedim >> &input, const MappingKind kind, const typename Mapping< dim, spacedim >::InternalDataBase &internal, const ArrayView< Tensor< 2, spacedim >> &output) const override
 
virtual void transform (const ArrayView< const Tensor< 2, dim >> &input, const MappingKind kind, const typename Mapping< dim, spacedim >::InternalDataBase &internal, const ArrayView< Tensor< 2, spacedim >> &output) const override
 
virtual void transform (const ArrayView< const DerivativeForm< 2, dim, spacedim >> &input, const MappingKind kind, const typename Mapping< dim, spacedim >::InternalDataBase &internal, const ArrayView< Tensor< 3, spacedim >> &output) const override
 
virtual void transform (const ArrayView< const Tensor< 3, dim >> &input, const MappingKind kind, const typename Mapping< dim, spacedim >::InternalDataBase &internal, const ArrayView< Tensor< 3, spacedim >> &output) const override
 
virtual std::unique_ptr< Mapping< dim, spacedim > > clone () const override
 

Protected Member Functions

Interface with FEValues
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< typename Mapping< dim, spacedim >::InternalDataBase > get_face_data (const UpdateFlags flags, const Quadrature< dim - 1 > &quadrature) 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 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_face_values (const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_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 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
 

Protected Attributes

const unsigned int polynomial_degree
 
const bool use_mapping_q_on_all_cells
 
std::shared_ptr< const MappingQGeneric< dim, spacedim > > q1_mapping
 
std::shared_ptr< const MappingQGeneric< dim, spacedim > > qp_mapping
 

Detailed Description

template<int dim, int spacedim = dim>
class MappingQ< dim, spacedim >

A class that implements a polynomial mapping \(Q_p\) of degree \(p\) on cells at the boundary of the domain (or, if requested in the constructor, for all cells) and linear mappings for interior cells.

The class is in fact poorly named since (unless explicitly specified during the construction of the object, see below), it does not actually use mappings of degree \(p\) everywhere, but only on cells at the boundary. This is in contrast to the MappingQGeneric class which indeed does use a polynomial mapping \(Q_p\) of degree \(p\) everywhere. The point of the current class is that in many situations, curved domains are only provided with information about how exactly edges at the boundary are shaped, but we do not know anything about internal edges. Thus, in the absence of other information, we can only assume that internal edges are straight lines, and in that case internal cells may as well be treated is bilinear quadrilaterals or trilinear hexahedra. (An example of how such meshes look is shown in step-1 already, but it is also discussed in the "Results" section of step-6.) Because bi-/trilinear mappings are significantly cheaper to compute than higher order mappings, it is advantageous in such situations to use the higher order mapping only on cells at the boundary of the domain. This class implements exactly this behavior.

There are a number of special cases worth considering:

Behavior along curved boundaries and with different manifolds

For the behavior of the mapping and convergence rates in case of mixing different manifolds, please consult the respective section of MappingQGeneric.

Author
Ralf Hartmann, 2000, 2001, 2005; Guido Kanschat 2000, 2001, Wolfgang Bangerth, 2015

Definition at line 33 of file mapping_manifold.h.

Constructor & Destructor Documentation

◆ MappingQ() [1/2]

template<int dim, int spacedim>
MappingQ< dim, spacedim >::MappingQ ( const unsigned int  polynomial_degree,
const bool  use_mapping_q_on_all_cells = false 
)

Constructor. polynomial_degree denotes the polynomial degree of the polynomials that are used to map cells boundary.

The second argument determines whether the higher order mapping should also be used on interior cells. If its value is false (the default), then a lower order mapping is used in the interior. This is sufficient for most cases where higher order mappings are only used to better approximate the boundary. In that case, cells bounded by straight lines are acceptable in the interior. However, there are cases where one would also like to use a higher order mapping in the interior. The MappingQEulerian class is one such case.

The value of use_mapping_q_on_all_cells is ignored if dim is not equal to spacedim, i.e., if we are considering meshes on surfaces embedded into higher dimensional spaces.

Definition at line 62 of file mapping_q.cc.

◆ MappingQ() [2/2]

template<int dim, int spacedim>
MappingQ< dim, spacedim >::MappingQ ( const MappingQ< dim, spacedim > &  mapping)

Copy constructor.

Definition at line 90 of file mapping_q.cc.

Member Function Documentation

◆ get_degree()

template<int dim, int spacedim>
unsigned int MappingQ< dim, spacedim >::get_degree

Return the degree of the mapping, i.e. the value which was passed to the constructor.

Definition at line 123 of file mapping_q.cc.

◆ preserves_vertex_locations()

template<int dim, int spacedim>
bool MappingQ< dim, spacedim >::preserves_vertex_locations
inlineoverridevirtual

Always returns true because the default implementation of functions in this class preserves vertex locations.

Definition at line 132 of file mapping_q.cc.

◆ transform_unit_to_real_cell()

template<int dim, int spacedim>
Point< spacedim > MappingQ< dim, spacedim >::transform_unit_to_real_cell ( const typename Triangulation< dim, spacedim >::cell_iterator &  cell,
const Point< dim > &  p 
) const
overridevirtual

Transform the point p on the unit cell to the point p_real on the real cell cell and returns p_real.

Definition at line 504 of file mapping_q.cc.

◆ transform_real_to_unit_cell()

template<int dim, int spacedim>
Point< dim > MappingQ< dim, spacedim >::transform_real_to_unit_cell ( const typename Triangulation< dim, spacedim >::cell_iterator &  cell,
const Point< spacedim > &  p 
) const
overridevirtual

Transform the point p on the real cell to the point p_unit on the unit cell cell and returns p_unit.

Uses Newton iteration and the transform_unit_to_real_cell function.

In the codimension one case, this function returns the normal projection of the real point p on the curve or surface identified by the cell.

Note
Polynomial mappings from the reference (unit) cell coordinates to the coordinate system of a real cell are not always invertible if the point for which the inverse mapping is to be computed lies outside the cell's boundaries. In such cases, the current function may fail to compute a point on the reference cell whose image under the mapping equals the given point p. If this is the case then this function throws an exception of type Mapping::ExcTransformationFailed . Whether the given point p lies outside the cell can therefore be determined by checking whether the return reference coordinates lie inside of outside the reference cell (e.g., using GeometryInfo::is_inside_unit_cell) or whether the exception mentioned above has been thrown.

Definition at line 521 of file mapping_q.cc.

◆ transform() [1/5]

template<int dim, int spacedim>
void MappingQ< dim, spacedim >::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
overridevirtual

Definition at line 385 of file mapping_q.cc.

◆ transform() [2/5]

template<int dim, int spacedim>
void MappingQ< dim, spacedim >::transform ( const ArrayView< const DerivativeForm< 1, dim, spacedim >> &  input,
const MappingKind  kind,
const typename Mapping< dim, spacedim >::InternalDataBase &  internal,
const ArrayView< Tensor< 2, spacedim >> &  output 
) const
overridevirtual

Definition at line 408 of file mapping_q.cc.

◆ transform() [3/5]

template<int dim, int spacedim>
void MappingQ< dim, spacedim >::transform ( const ArrayView< const Tensor< 2, dim >> &  input,
const MappingKind  kind,
const typename Mapping< dim, spacedim >::InternalDataBase &  internal,
const ArrayView< Tensor< 2, spacedim >> &  output 
) const
overridevirtual

Definition at line 432 of file mapping_q.cc.

◆ transform() [4/5]

template<int dim, int spacedim>
void MappingQ< dim, spacedim >::transform ( const ArrayView< const DerivativeForm< 2, dim, spacedim >> &  input,
const MappingKind  kind,
const typename Mapping< dim, spacedim >::InternalDataBase &  internal,
const ArrayView< Tensor< 3, spacedim >> &  output 
) const
overridevirtual

Definition at line 456 of file mapping_q.cc.

◆ transform() [5/5]

template<int dim, int spacedim>
void MappingQ< dim, spacedim >::transform ( const ArrayView< const Tensor< 3, dim >> &  input,
const MappingKind  kind,
const typename Mapping< dim, spacedim >::InternalDataBase &  internal,
const ArrayView< Tensor< 3, spacedim >> &  output 
) const
overridevirtual

Definition at line 480 of file mapping_q.cc.

◆ clone()

template<int dim, int spacedim>
std::unique_ptr< Mapping< dim, spacedim > > MappingQ< dim, spacedim >::clone
overridevirtual

Return a pointer to a copy of the present object. The caller of this copy then assumes ownership of it.

Definition at line 536 of file mapping_q.cc.

◆ requires_update_flags()

template<int dim, int spacedim>
UpdateFlags MappingQ< dim, spacedim >::requires_update_flags ( const UpdateFlags  update_flags) const
overrideprotectedvirtual

Definition at line 141 of file mapping_q.cc.

◆ get_data()

template<int dim, int spacedim>
std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > MappingQ< dim, spacedim >::get_data ( const UpdateFlags  update_flags,
const Quadrature< dim > &  quadrature 
) const
overrideprotectedvirtual

Definition at line 151 of file mapping_q.cc.

◆ get_face_data()

template<int dim, int spacedim>
std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > MappingQ< dim, spacedim >::get_face_data ( const UpdateFlags  flags,
const Quadrature< dim - 1 > &  quadrature 
) const
overrideprotectedvirtual

Definition at line 182 of file mapping_q.cc.

◆ get_subface_data()

template<int dim, int spacedim>
std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > MappingQ< dim, spacedim >::get_subface_data ( const UpdateFlags  flags,
const Quadrature< dim - 1 > &  quadrature 
) const
overrideprotectedvirtual

Definition at line 215 of file mapping_q.cc.

◆ fill_fe_values()

template<int dim, int spacedim>
CellSimilarity::Similarity MappingQ< dim, spacedim >::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
overrideprotectedvirtual

Reimplemented in MappingQEulerian< dim, VectorType, spacedim >.

Definition at line 249 of file mapping_q.cc.

◆ fill_fe_face_values()

template<int dim, int spacedim>
void MappingQ< dim, spacedim >::fill_fe_face_values ( const typename Triangulation< dim, spacedim >::cell_iterator &  cell,
const unsigned int  face_no,
const Quadrature< dim - 1 > &  quadrature,
const typename Mapping< dim, spacedim >::InternalDataBase &  internal_data,
internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &  output_data 
) const
overrideprotectedvirtual

Definition at line 303 of file mapping_q.cc.

◆ fill_fe_subface_values()

template<int dim, int spacedim>
void MappingQ< dim, spacedim >::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
overrideprotectedvirtual

Definition at line 339 of file mapping_q.cc.

Member Data Documentation

◆ polynomial_degree

template<int dim, int spacedim = dim>
const unsigned int MappingQ< dim, spacedim >::polynomial_degree
protected

The polynomial degree of the cells to be used on all cells at the boundary of the domain, or everywhere if so specified.

Definition at line 327 of file mapping_q.h.

◆ use_mapping_q_on_all_cells

template<int dim, int spacedim = dim>
const bool MappingQ< dim, spacedim >::use_mapping_q_on_all_cells
protected

If this flag is set true then MappingQ is used on all cells, not only on boundary cells.

Definition at line 333 of file mapping_q.h.

◆ q1_mapping

template<int dim, int spacedim = dim>
std::shared_ptr<const MappingQGeneric<dim, spacedim> > MappingQ< dim, spacedim >::q1_mapping
protected

Pointer to a Q1 mapping. This mapping is used on interior cells unless use_mapping_q_on_all_cells was set in the call to the constructor. The mapping is also used on any cell in the transform_real_to_unit_cell() to compute a cheap initial guess for the position of the point before we employ the more expensive Newton iteration using the full mapping.

Note
MappingQEulerian resets this pointer to an object of type MappingQ1Eulerian to ensure that the Q1 mapping also knows about the proper shifts and transformations of the Eulerian displacements. This also means that we really need to store our own Q1 mapping here, rather than simply resorting to StaticMappingQ1::mapping.
If the polynomial degree used for the current object is one, then the qp_mapping and q1_mapping variables point to the same underlying object.

Definition at line 352 of file mapping_q.h.

◆ qp_mapping

template<int dim, int spacedim = dim>
std::shared_ptr<const MappingQGeneric<dim, spacedim> > MappingQ< dim, spacedim >::qp_mapping
protected

Pointer to a Q_p mapping. This mapping is used on boundary cells unless use_mapping_q_on_all_cells was set in the call to the constructor (in which case it is used for all cells).

Note
MappingQEulerian and MappingC1 reset this pointer to an object of their own implementation to ensure that the Q_p mapping also knows about the proper shifts and transformations of the Eulerian displacements (Eulerian case) and proper choice of support points (C1 case).
If the polynomial degree used for the current object is one, then the qp_mapping and q1_mapping variables point to the same underlying object.

Definition at line 368 of file mapping_q.h.


The documentation for this class was generated from the following files: