deal.II version GIT relicensing-6809-ge913b9bb34 2026-09-25 17:20:01+00:00
\(\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\}}\)
Loading...
Searching...
No Matches
mapping_q.h
Go to the documentation of this file.
1// -----------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception OR LGPL-2.1-or-later
4// Copyright (C) 2001 - 2026 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Detailed license information governing the source code and contributions
9// can be found in LICENSE.md and CONTRIBUTING.md at the top level directory.
10//
11// -----------------------------------------------------------------------------
12
13#ifndef dealii_mapping_q_h
14#define dealii_mapping_q_h
15
16
17#include <deal.II/base/config.h>
18
21#include <deal.II/base/table.h>
23
24#include <deal.II/fe/mapping.h>
25
27
29
30#include <array>
31#include <cmath>
32
34
35#ifndef DOXYGEN
36template <int, int>
37class MappingQCache;
38template <int, int>
39class FE_DGQ;
40#endif
41
107template <int dim, int spacedim = dim>
108class MappingQ : public Mapping<dim, spacedim>
109{
110public:
116 MappingQ(const unsigned int polynomial_degree);
117
121 MappingQ(const MappingQ<dim, spacedim> &mapping);
122
123 // for documentation, see the Mapping base class
124 virtual std::unique_ptr<Mapping<dim, spacedim>>
125 clone() const override;
126
131 unsigned int
132 get_degree() const;
133
138 virtual bool
140
141 // for documentation, see the Mapping base class
144 &cell) const override;
145
146 virtual bool
147 is_compatible_with(const ReferenceCell<dim> &reference_cell) const override;
148
154 // for documentation, see the Mapping base class
155 virtual Point<spacedim>
158 const Point<dim> &p) const override;
159
160 // for documentation, see the Mapping base class
161 virtual Point<dim>
164 const Point<spacedim> &p) const override;
165
166 // for documentation, see the Mapping base class
167 virtual void
170 const ArrayView<const Point<spacedim>> &real_points,
171 const ArrayView<Point<dim>> &unit_points) const override;
172
182 // for documentation, see the Mapping base class
183 virtual void
184 transform(const ArrayView<const Tensor<1, dim>> &input,
185 const MappingKind kind,
187 const ArrayView<Tensor<1, spacedim>> &output) const override;
188
189 // for documentation, see the Mapping base class
190 virtual void
192 const MappingKind kind,
194 const ArrayView<Tensor<2, spacedim>> &output) const override;
195
196 // for documentation, see the Mapping base class
197 virtual void
198 transform(const ArrayView<const Tensor<2, dim>> &input,
199 const MappingKind kind,
201 const ArrayView<Tensor<2, spacedim>> &output) const override;
202
203 // for documentation, see the Mapping base class
204 virtual void
206 const MappingKind kind,
208 const ArrayView<Tensor<3, spacedim>> &output) const override;
209
210 // for documentation, see the Mapping base class
211 virtual void
212 transform(const ArrayView<const Tensor<3, dim>> &input,
213 const MappingKind kind,
215 const ArrayView<Tensor<3, spacedim>> &output) const override;
216
238 void
241 const ArrayView<const Point<dim>> &unit_points,
242 const UpdateFlags update_flags,
244 &output_data) const;
245
268 void
271 const unsigned int face_number,
272 const Quadrature<dim - 1> &face_quadrature,
273 const typename Mapping<dim, spacedim>::InternalDataBase &internal_data,
275 &output_data) const;
276
293 class InternalData : public Mapping<dim, spacedim>::InternalDataBase
294 {
295 public:
300 InternalData(const unsigned int polynomial_degree);
301
307 InternalData(const std::shared_ptr<const FE_DGQ<1, 1>> &fe_dgq_1d);
308
309 // Documentation see Mapping::InternalDataBase.
310 virtual void
311 reinit(const UpdateFlags update_flags,
312 const Quadrature<dim> &quadrature) override;
313
319 void
320 initialize_face(const UpdateFlags update_flags,
321 const Quadrature<dim> &quadrature,
322 const unsigned int n_original_q_points);
323
327 virtual std::size_t
328 memory_consumption() const override;
329
335 std::vector<Point<dim>> quadrature_points;
336
350 std::array<std::vector<Tensor<1, dim>>,
353
358 const unsigned int polynomial_degree;
359
364 const std::shared_ptr<const FE_DGQ<1, 1>> fe_dgq_1d;
365
375 const unsigned int n_shape_functions;
376
392 VectorizedArray<double,
393 std::min<std::size_t>(VectorizedArray<double>::size(),
394 (dim <= 2 ? 2 : 4))>;
395
402
408
413
417 mutable std::vector<AlignedVector<Tensor<1, spacedim>>> aux;
418
422 mutable std::vector<Point<spacedim>> mapping_support_points;
423
429
437 };
438
439protected:
440 // documentation can be found in Mapping::requires_update_flags()
441 virtual UpdateFlags
442 requires_update_flags(const UpdateFlags update_flags) const override;
443
444 // documentation can be found in Mapping::get_data()
445 virtual std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
446 get_data(const UpdateFlags, const Quadrature<dim> &quadrature) const override;
447
448 using Mapping<dim, spacedim>::get_face_data;
449
450 // documentation can be found in Mapping::get_face_data()
451 virtual std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
453 const hp::QCollection<dim - 1> &quadrature) const override;
454
455 // documentation can be found in Mapping::get_subface_data()
456 virtual std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
458 const Quadrature<dim - 1> &quadrature) const override;
459
460 // documentation can be found in Mapping::fill_fe_values()
464 const CellSimilarity::Similarity cell_similarity,
465 const Quadrature<dim> &quadrature,
466 const typename Mapping<dim, spacedim>::InternalDataBase &internal_data,
468 &output_data) const override;
469
470 using Mapping<dim, spacedim>::fill_fe_face_values;
471
472 // documentation can be found in Mapping::fill_fe_face_values()
473 virtual void
476 const unsigned int face_no,
477 const hp::QCollection<dim - 1> &quadrature,
478 const typename Mapping<dim, spacedim>::InternalDataBase &internal_data,
480 &output_data) const override;
481
482 // documentation can be found in Mapping::fill_fe_subface_values()
483 virtual void
486 const unsigned int face_no,
487 const unsigned int subface_no,
488 const Quadrature<dim - 1> &quadrature,
489 const typename Mapping<dim, spacedim>::InternalDataBase &internal_data,
491 &output_data) const override;
492
493 // documentation can be found in Mapping::fill_fe_immersed_surface_values()
494 virtual void
498 const typename Mapping<dim, spacedim>::InternalDataBase &internal_data,
500 &output_data) const override;
501
510 const unsigned int polynomial_degree;
511
516 const std::shared_ptr<const FE_DGQ<1, 1>> fe_dgq_1d;
517
518 /*
519 * The one-dimensional polynomials defined as Lagrange polynomials from the
520 * line support points. These are used for point evaluations and match the
521 * polynomial space of an FE_Q<1>(this->degree).
522 */
523 const std::vector<Polynomials::Polynomial<double>> polynomials_1d;
524
525 /*
526 * The numbering from the lexicographic to the hierarchical ordering used
527 * when expanding the tensor product with the mapping support points (which
528 * come in hierarchical numbers).
529 */
530 const std::vector<unsigned int> renumber_lexicographic_to_hierarchic;
531
532 /*
533 * The support points in reference coordinates. These are used for
534 * constructing approximations of the output of
535 * compute_mapping_support_points() when evaluating the mapping on the fly,
536 * rather than going through the FEValues interface provided by
537 * InternalData.
538 *
539 * The number of points depends on the degree of this class, and it matches
540 * the number of degrees of freedom of an FE_Q<dim>(this->degree).
541 */
542 const std::vector<Point<dim>> unit_cell_support_points;
543
563 const std::vector<Table<2, double>>
565
579
609 virtual void
612 boost::container::small_vector<Point<spacedim>, 200> &points) const;
613
621 const Point<spacedim> &p,
622 const Point<dim> &initial_p_unit) const;
623
637 virtual void
640 boost::container::small_vector<Point<spacedim>, 200> &points) const;
641
656 virtual void
659 boost::container::small_vector<Point<spacedim>, 200> &points) const;
660
661 // Make MappingQCache a friend since it needs to call the
662 // compute_mapping_support_points() function.
663 template <int, int>
664 friend class MappingQCache;
665};
666
667
668
674template <int dim, int spacedim = dim>
676
680/*----------------------------------------------------------------------*/
681
682#ifndef DOXYGEN
683
684template <int dim, int spacedim>
685inline bool
687{
688 return true;
689}
690
691#endif // DOXYGEN
692
693/* -------------- declaration of explicit specializations ------------- */
694
695
697
698#endif
virtual std::size_t memory_consumption() const override
Definition mapping_q.cc:73
const std::shared_ptr< const FE_DGQ< 1, 1 > > fe_dgq_1d
Definition mapping_q.h:364
std::vector< Point< spacedim > > mapping_support_points
Definition mapping_q.h:422
const unsigned int polynomial_degree
Definition mapping_q.h:358
std::array< std::vector< Tensor< 1, dim > >, GeometryInfo< dim >::faces_per_cell *(dim - 1)> unit_tangentials
Definition mapping_q.h:352
internal::MatrixFreeFunctions::ShapeInfo< double > shape_info
Definition mapping_q.h:401
virtual void reinit(const UpdateFlags update_flags, const Quadrature< dim > &quadrature) override
Definition mapping_q.cc:91
internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > * output_data
Definition mapping_q.h:436
std::vector< AlignedVector< Tensor< 1, spacedim > > > aux
Definition mapping_q.h:417
void initialize_face(const UpdateFlags update_flags, const Quadrature< dim > &quadrature, const unsigned int n_original_q_points)
Definition mapping_q.cc:168
AlignedVector< double > volume_elements
Definition mapping_q.h:428
std::vector< Point< dim > > quadrature_points
Definition mapping_q.h:335
const unsigned int n_shape_functions
Definition mapping_q.h:375
AlignedVector< VectorizedArrayType > scratch
Definition mapping_q.h:407
const std::vector< unsigned int > renumber_lexicographic_to_hierarchic
Definition mapping_q.h:530
const Table< 2, double > support_point_weights_cell
Definition mapping_q.h:578
virtual std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > get_data(const UpdateFlags, const Quadrature< dim > &quadrature) const override
Definition mapping_q.cc:806
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 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 std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > get_subface_data(const UpdateFlags, const Quadrature< dim - 1 > &quadrature) const override
Definition mapping_q.cc:838
virtual void add_line_support_points(const typename Triangulation< dim, spacedim >::cell_iterator &cell, boost::container::small_vector< Point< spacedim >, 200 > &points) const
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
Definition mapping_q.cc:856
virtual bool is_compatible_with(const ReferenceCell< dim > &reference_cell) 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
Definition mapping_q.h:510
virtual bool preserves_vertex_locations() const override
virtual std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > get_face_data(const UpdateFlags, const hp::QCollection< dim - 1 > &quadrature) const override
Definition mapping_q.cc:818
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
Definition mapping_q.cc:652
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
Definition mapping_q.cc:332
virtual void add_quad_support_points(const typename Triangulation< dim, spacedim >::cell_iterator &cell, boost::container::small_vector< Point< spacedim >, 200 > &points) const
const std::vector< Table< 2, double > > support_point_weights_perimeter_to_interior
Definition mapping_q.h:564
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
virtual void compute_mapping_support_points(const typename Triangulation< dim, spacedim >::cell_iterator &cell, boost::container::small_vector< Point< spacedim >, 200 > &points) const
virtual Point< spacedim > transform_unit_to_real_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< dim > &p) const override
Definition mapping_q.cc:287
const std::vector< Polynomials::Polynomial< double > > polynomials_1d
Definition mapping_q.h:523
virtual std::unique_ptr< Mapping< dim, spacedim > > clone() const override
Definition mapping_q.cc:269
const std::vector< Point< dim > > unit_cell_support_points
Definition mapping_q.h:542
virtual Point< dim > transform_real_to_unit_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< spacedim > &p) const override
Definition mapping_q.cc:531
const std::shared_ptr< const FE_DGQ< 1, 1 > > fe_dgq_1d
Definition mapping_q.h:516
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const override
Definition mapping_q.cc:750
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
unsigned int get_degree() const
Definition mapping_q.cc:278
Abstract base class for mapping classes.
Definition mapping.h:318
Definition point.h:111
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
UpdateFlags
MappingKind
Definition mapping.h:79