deal.II version GIT relicensing-6834-g5b78e6bcdf 2026-10-01 11: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_p1.cc
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) 2025 - 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
17#include <deal.II/base/tensor.h>
18
22
24
25#include <algorithm>
26#include <cmath>
27#include <memory>
28
29
31
32namespace
33{
34 template <int dim, int spacedim>
36 compute_linear_transformation(
38 {
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];
43 return result;
44 }
45} // namespace
46
47
48
49template <int dim, int spacedim>
51 const ArrayView<const Point<dim>> &quadrature_points)
52{
53 quadrature.initialize(quadrature_points);
54}
55
56
57
58template <int dim, int spacedim>
60 const Quadrature<dim> &quadrature)
61 : quadrature(quadrature)
62{}
63
64
65
66template <int dim, int spacedim>
67void
69 const UpdateFlags update_flags,
70 const Quadrature<dim> &quadrature)
71{
72 this->quadrature = quadrature;
73 this->update_each = update_flags;
74}
75
76
77
78template <int dim, int spacedim>
79std::size_t
89
90
91
92template <int dim, int spacedim>
93bool
98
99
100
101template <int dim, int spacedim>
102bool
104 const ReferenceCell<dim> &reference_cell) const
105{
106 return reference_cell.is_simplex();
107}
108
109
110
111template <int dim, int spacedim>
114{
115 // Like MappingCartesian, this mapping is simple and has minimal update
116 // interdependencies
117 UpdateFlags out = in;
118 if (out & update_boundary_forms)
120
121 return out;
122}
123
124
125
126template <int dim, int spacedim>
127std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
129 const Quadrature<dim> &quadrature) const
130{
131 auto data_ptr = std::make_unique<InternalData>(quadrature);
132
133 // verify that we have computed the transitive hull of the required
134 // flags and that FEValues has faithfully passed them on to us
135 Assert(update_flags == requires_update_flags(update_flags),
137
138 // store the flags in the internal data object so we can access them
139 // in fill_fe_*_values(). use the transitive hull of the required
140 // flags
141 data_ptr->update_each = requires_update_flags(update_flags);
142
143 return data_ptr;
144}
145
146
147
148template <int dim, int spacedim>
149std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
151 const UpdateFlags update_flags,
152 const hp::QCollection<dim - 1> &quadrature) const
153{
154 auto data_ptr = std::make_unique<InternalData>(
155 QProjector<dim>::project_to_all_faces(ReferenceCells::get_simplex<dim>(),
156 quadrature));
157
158 // verify that we have computed the transitive hull of the required
159 // flags and that FEValues has faithfully passed them on to us
160 Assert(update_flags == requires_update_flags(update_flags),
162
163 // store the flags in the internal data object so we can access them
164 // in fill_fe_*_values()
165 data_ptr->update_each = update_flags;
166
167 return data_ptr;
168}
169
170
171
172template <int dim, int spacedim>
173std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
175 const UpdateFlags update_flags,
176 const Quadrature<dim - 1> &quadrature) const
177{
178 auto data_ptr = std::make_unique<InternalData>(
179 QProjector<dim>::project_to_all_subfaces(ReferenceCells::get_simplex<dim>(),
180 quadrature));
181
182 // verify that we have computed the transitive hull of the required
183 // flags and that FEValues has faithfully passed them on to us
184 Assert(update_flags == requires_update_flags(update_flags),
186
187 // store the flags in the internal data object so we can access them
188 // in fill_fe_*_values()
189 data_ptr->update_each = update_flags;
190
191 return data_ptr;
192}
193
194
195
196template <int dim, int spacedim>
197void
200 const InternalData &data) const
201{
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();
206}
207
208
209
210template <int dim, int spacedim>
211void
214 const InternalData &data,
215 const typename QProjector<dim>::DataSetDescriptor &offset,
216 std::vector<Point<spacedim>> &quadrature_points) const
217{
218 Assert(cell->vertex(0) == data.affine_component, ExcInternalError());
219 for (unsigned int i = 0; i < quadrature_points.size(); ++i)
220 quadrature_points[i] =
221 data.affine_component +
222 apply_transformation(data.contravariant,
223 data.quadrature.point(offset + i));
224}
225
226
227
228template <int dim, int spacedim>
229void
231 const unsigned int face_no,
232 const InternalData &data,
233 std::vector<Tensor<1, spacedim>> &normal_vectors) const
234{
235 const Tensor<1, dim> ref_normal_vector =
236 ReferenceCells::get_simplex<dim>().face_normal_vector(face_no);
237 Tensor<1, spacedim> normal_vector =
238 apply_transformation(data.covariant, ref_normal_vector);
239 normal_vector /= normal_vector.norm();
240
241 std::fill(normal_vectors.begin(), normal_vectors.end(), normal_vector);
242}
243
244
245
246template <int dim, int spacedim>
247void
249 const InternalData &data,
250 const CellSimilarity::Similarity cell_similarity,
252 &output_data) const
253{
254 // The Jacobian is constant so its derivatives are zero
255 if (cell_similarity != CellSimilarity::translation)
256 {
257 if (data.update_each & update_jacobian_grads)
258 std::fill(output_data.jacobian_grads.begin(),
259 output_data.jacobian_grads.end(),
261
263 std::fill(output_data.jacobian_pushed_forward_grads.begin(),
264 output_data.jacobian_pushed_forward_grads.end(),
266
267 if (data.update_each & update_jacobian_2nd_derivatives)
268 std::fill(output_data.jacobian_2nd_derivatives.begin(),
269 output_data.jacobian_2nd_derivatives.end(),
271
273 std::fill(output_data.jacobian_pushed_forward_2nd_derivatives.begin(),
276
277 if (data.update_each & update_jacobian_3rd_derivatives)
278 std::fill(output_data.jacobian_3rd_derivatives.begin(),
279 output_data.jacobian_3rd_derivatives.end(),
281
283 std::fill(output_data.jacobian_pushed_forward_3rd_derivatives.begin(),
286 }
287}
288
289
290
291template <int dim, int spacedim>
292void
294 const InternalData &data,
295 const CellSimilarity::Similarity cell_similarity,
297 &output_data) const
298{
299 // "compute" Jacobian at the quadrature points, which are all the
300 // same
301 if (data.update_each & update_jacobians)
302 if (cell_similarity != CellSimilarity::translation)
303 std::fill(output_data.jacobians.begin(),
304 output_data.jacobians.end(),
305 data.contravariant);
306}
307
308
309
310template <int dim, int spacedim>
311void
313 const InternalData &data,
314 const CellSimilarity::Similarity cell_similarity,
316 &output_data) const
317{
318 if (data.update_each & update_inverse_jacobians)
319 if (cell_similarity != CellSimilarity::translation)
320 {
321 const auto inverse = data.covariant.transpose();
322 std::fill(output_data.inverse_jacobians.begin(),
323 output_data.inverse_jacobians.end(),
324 inverse);
325 }
326}
327
328
329
330template <int dim, int spacedim>
334 const CellSimilarity::Similarity cell_similarity,
335 const Quadrature<dim> &quadrature,
336 const typename Mapping<dim, spacedim>::InternalDataBase &internal_data,
338 &output_data) const
339{
340 Assert(dynamic_cast<const InternalData *>(&internal_data) != nullptr,
342 const InternalData &data = static_cast<const InternalData &>(internal_data);
343
345 if (data.update_each & update_quadrature_points)
347 data,
349 output_data.quadrature_points);
350
351 // A special property of this mapping is that the Jacobian is constant over
352 // the cell
353 if (data.update_each & update_JxW_values)
354 if (cell_similarity != CellSimilarity::translation)
355 {
356 for (unsigned int i = 0; i < output_data.JxW_values.size(); ++i)
357 output_data.JxW_values[i] =
358 data.volume_element * quadrature.weight(i);
359 }
360
361 maybe_update_jacobians(data, cell_similarity, output_data);
362 maybe_update_jacobian_derivatives(data, cell_similarity, output_data);
363 maybe_update_inverse_jacobians(data, cell_similarity, output_data);
364
365 if (data.update_each & update_normal_vectors)
366 {
367 Assert(spacedim == dim + 1,
368 ExcMessage("There is no (unique) cell normal for " +
370 "-dimensional cells in " +
371 Utilities::int_to_string(spacedim) +
372 "-dimensional space. This only works if the "
373 "space dimension is one greater than the "
374 "dimensionality of the mesh cells."));
375
376 Tensor<1, spacedim> normal;
377 // avoid warnings by only computing cross products in supported dimensions
378 if constexpr (dim == 1 && spacedim == 2)
379 normal = cross_product_2d(-data.contravariant.transpose()[0]);
380 else if constexpr (dim == 2 && spacedim == 3)
381 {
382 const auto transpose = data.contravariant.transpose();
383 normal = cross_product_3d(transpose[0], transpose[1]);
384 }
385 else
387 normal /= normal.norm();
388
389 if (cell->direction_flag() == false)
390 normal *= -1.0;
391
392 std::fill(output_data.normal_vectors.begin(),
393 output_data.normal_vectors.end(),
394 normal);
395 }
396
397 return cell_similarity;
398}
399
400
401
402template <int dim, int spacedim>
403void
406 const ArrayView<const Point<dim>> &unit_points,
407 const UpdateFlags update_flags,
409 &output_data) const
410{
411 if (update_flags == update_default)
412 return;
413
414 Assert(update_flags & update_inverse_jacobians ||
415 update_flags & update_jacobians ||
416 update_flags & update_quadrature_points,
418
419 output_data.initialize(unit_points.size(), update_flags);
420
421 InternalData data(unit_points);
422 data.update_each = update_flags;
424
425 if (data.update_each & update_quadrature_points)
427 data,
429 output_data.quadrature_points);
430
433}
434
435
436
437template <int dim, int spacedim>
438void
441 const unsigned int face_no,
442 const hp::QCollection<dim - 1> &quadrature_collection,
443 const typename Mapping<dim, spacedim>::InternalDataBase &internal_data,
445 &output_data) const
446{
447 Assert(dynamic_cast<const InternalData *>(&internal_data) != nullptr,
449 const InternalData &data = static_cast<const InternalData &>(internal_data);
450
452 const auto offset =
453 QProjector<dim>::DataSetDescriptor::face(cell->reference_cell(),
454 face_no,
455 cell->combined_face_orientation(
456 face_no),
457 quadrature_collection);
458 if (data.update_each & update_quadrature_points)
460 data,
461 offset,
462 output_data.quadrature_points);
463
464 maybe_update_normal_vectors(face_no, data, output_data.normal_vectors);
465
466 if (data.update_each & (update_JxW_values | update_boundary_forms))
467 {
468 // Since the quadrature weights presently sum to
469 // cell->reference_cell().face_measure(face_no), we have to rescale so
470 // they sum to the area of the face
471 const double J = cell->face(face_no)->measure() /
472 cell->reference_cell().face_measure(face_no);
473 if (data.update_each & update_JxW_values)
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);
476
477 if (data.update_each & update_boundary_forms)
478 for (unsigned int i = 0; i < output_data.boundary_forms.size(); ++i)
479 output_data.boundary_forms[i] = J * output_data.normal_vectors[i];
480 }
481
485}
486
487
488
489template <int dim, int spacedim>
490void
493 const unsigned int face_no,
494 const unsigned int subface_no,
495 const Quadrature<dim - 1> &quadrature,
496 const typename Mapping<dim, spacedim>::InternalDataBase &internal_data,
498 &output_data) const
499{
500 Assert(dynamic_cast<const InternalData *>(&internal_data) != nullptr,
502 const InternalData &data = static_cast<const InternalData &>(internal_data);
503
505 const auto offset =
506 QProjector<dim>::DataSetDescriptor::subface(cell->reference_cell(),
507 face_no,
508 subface_no,
509 cell->combined_face_orientation(
510 face_no),
511 quadrature.size(),
512 cell->subface_case(face_no));
513 if (data.update_each & update_quadrature_points)
515 data,
516 offset,
517 output_data.quadrature_points);
518
519 maybe_update_normal_vectors(face_no, data, output_data.normal_vectors);
520
521 if (data.update_each & (update_JxW_values | update_boundary_forms))
522 {
523 // Same as fill_fe_face_values()
524 const double J =
525 cell->face(face_no)->measure() /
526 cell->face(face_no)->reference_cell().volume() /
527 // TODO: once we support 3d refinement this should be updated to the
528 // simplex version of GeometryInfo::subface_ratio()
529 (dim == 2 ? 2 : 4);
530 if (data.update_each & update_JxW_values)
531 for (unsigned int i = 0; i < output_data.JxW_values.size(); ++i)
532 output_data.JxW_values[i] = J * quadrature.weight(i);
533
534 if (data.update_each & update_boundary_forms)
535 for (unsigned int i = 0; i < output_data.boundary_forms.size(); ++i)
536 output_data.boundary_forms[i] = J * output_data.normal_vectors[i];
537 }
538
542}
543
544
545
546template <int dim, int spacedim>
547void
549 const ArrayView<const Tensor<1, dim>> &input,
550 const MappingKind mapping_kind,
551 const typename Mapping<dim, spacedim>::InternalDataBase &mapping_data,
552 const ArrayView<Tensor<1, spacedim>> &output) const
553{
554 AssertDimension(input.size(), output.size());
555 Assert(dynamic_cast<const InternalData *>(&mapping_data) != nullptr,
557 const InternalData &data = static_cast<const InternalData &>(mapping_data);
558
559 switch (mapping_kind)
560 {
562 {
563 for (unsigned int i = 0; i < output.size(); ++i)
564 output[i] = apply_transformation(data.covariant, input[i]);
565 return;
566 }
567
569 {
570 for (unsigned int i = 0; i < output.size(); ++i)
571 output[i] = apply_transformation(data.contravariant, input[i]);
572 return;
573 }
574 case mapping_piola:
575 {
576 auto transformation = data.contravariant;
577 Assert(data.volume_element > 0.0, ExcDivideByZero());
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)
581 output[i] = apply_transformation(transformation, input[i]);
582 return;
583 }
584 default:
586 }
587}
588
589
590
591template <int dim, int spacedim>
592void
595 const MappingKind mapping_kind,
596 const typename Mapping<dim, spacedim>::InternalDataBase &mapping_data,
597 const ArrayView<Tensor<2, spacedim>> &output) const
598{
599 AssertDimension(input.size(), output.size());
600 Assert(dynamic_cast<const InternalData *>(&mapping_data) != nullptr,
602 const InternalData &data = static_cast<const InternalData &>(mapping_data);
603
604 switch (mapping_kind)
605 {
607 {
608 for (unsigned int i = 0; i < output.size(); ++i)
609 output[i] = apply_transformation(data.covariant, input[i]);
610
611 return;
612 }
613 default:
615 }
616}
617
618
619
620template <int dim, int spacedim>
621void
623 const ArrayView<const Tensor<2, dim>> &input,
624 const MappingKind mapping_kind,
625 const typename Mapping<dim, spacedim>::InternalDataBase &mapping_data,
626 const ArrayView<Tensor<2, spacedim>> &output) const
627{
628 AssertDimension(input.size(), output.size());
629 Assert(dynamic_cast<const InternalData *>(&mapping_data) != nullptr,
631 const InternalData &data = static_cast<const InternalData &>(mapping_data);
632
633 switch (mapping_kind)
634 {
636 {
639 "update_covariant_transformation"));
640
641 for (unsigned int i = 0; i < output.size(); ++i)
642 output[i] = apply_transformation(data.covariant, input[i]);
643 return;
644 }
645
647 {
650 "update_contravariant_transformation"));
651
652 for (unsigned int i = 0; i < output.size(); ++i)
653 output[i] = apply_transformation(data.contravariant, input[i]);
654 return;
655 }
656
658 {
661 "update_covariant_transformation"));
662
663 for (unsigned int i = 0; i < output.size(); ++i)
664 {
666 apply_transformation(data.covariant, transpose(input[i]));
667 output[i] = apply_transformation(data.covariant, A.transpose());
668 }
669 return;
670 }
671
673 {
676 "update_covariant_transformation"));
677
678 for (unsigned int i = 0; i < output.size(); ++i)
679 {
681 apply_transformation(data.contravariant, transpose(input[i]));
682 output[i] = apply_transformation(data.covariant, A.transpose());
683 }
684
685 return;
686 }
687
689 {
692 "update_contravariant_transformation"));
693
694 for (unsigned int i = 0; i < output.size(); ++i)
695 output[i] = internal::apply_piola_gradient(data.covariant,
696 data.contravariant,
697 data.volume_element,
698 input[i]);
699
700
701 return;
702 }
703
704 default:
705 Assert(false, ExcNotImplemented());
706 }
707}
708
709
710
711template <int dim, int spacedim>
712void
715 const MappingKind mapping_kind,
716 const typename Mapping<dim, spacedim>::InternalDataBase &mapping_data,
717 const ArrayView<Tensor<3, spacedim>> &output) const
718{
719 AssertDimension(input.size(), output.size());
720 Assert(dynamic_cast<const InternalData *>(&mapping_data) != nullptr,
722 const InternalData &data = static_cast<const InternalData &>(mapping_data);
723
724 switch (mapping_kind)
725 {
727 {
730 "update_covariant_transformation"));
731
732 for (unsigned int i = 0; i < output.size(); ++i)
733 output[i] =
734 internal::apply_covariant_gradient(data.covariant, input[i]);
735
736 return;
737 }
738 default:
740 }
741}
742
743
744
745template <int dim, int spacedim>
746void
748 const ArrayView<const Tensor<3, dim>> &input,
749 const MappingKind mapping_kind,
750 const typename Mapping<dim, spacedim>::InternalDataBase &mapping_data,
751 const ArrayView<Tensor<3, spacedim>> &output) const
752{
753 AssertDimension(input.size(), output.size());
754 Assert(dynamic_cast<const InternalData *>(&mapping_data) != nullptr,
756 const InternalData &data = static_cast<const InternalData &>(mapping_data);
757
758 switch (mapping_kind)
759 {
761 {
764 "update_covariant_transformation"));
767 "update_contravariant_transformation"));
768
769 for (unsigned int i = 0; i < output.size(); ++i)
770 output[i] =
772 data.contravariant,
773 input[i]);
774
775 return;
776 }
777
779 {
782 "update_covariant_transformation"));
783
784 for (unsigned int i = 0; i < output.size(); ++i)
785 output[i] =
786 internal::apply_covariant_hessian(data.covariant, input[i]);
787
788 return;
789 }
790
792 {
795 "update_covariant_transformation"));
798 "update_contravariant_transformation"));
799
800 for (unsigned int i = 0; i < output.size(); ++i)
801 output[i] = internal::apply_piola_hessian(data.covariant,
802 data.contravariant,
803 data.volume_element,
804 input[i]);
805
806 return;
807 }
808
809 default:
811 }
812}
813
814
815
816template <int dim, int spacedim>
820 const Point<dim> &p) const
821{
822 const DerivativeForm<1, dim, spacedim> contravariant =
823 compute_linear_transformation<dim, spacedim>(cell);
824 const Tensor<1, spacedim> sheared = apply_transformation(contravariant, p);
825 return cell->vertex(0) + sheared;
826}
827
828
829
830template <int dim, int spacedim>
834 const Point<spacedim> &p) const
835{
836 const DerivativeForm<1, spacedim, dim> contravariant =
837 compute_linear_transformation<dim, spacedim>(cell)
839 .transpose();
840 const Tensor<1, spacedim> offset = cell->vertex(0);
841 return Point<dim>(apply_transformation(contravariant, p - offset));
842}
843
844
845
846template <int dim, int spacedim>
847void
850 const ArrayView<const Point<spacedim>> &real_points,
851 const ArrayView<Point<dim>> &unit_points) const
852{
853 const DerivativeForm<1, spacedim, dim> contravariant =
854 compute_linear_transformation<dim, spacedim>(cell)
856 .transpose();
857 const Tensor<1, spacedim> offset = cell->vertex(0);
858 for (unsigned int i = 0; i < real_points.size(); ++i)
859 unit_points[i] =
860 Point<dim>(apply_transformation(contravariant, real_points[i] - offset));
861}
862
863
864
865template <int dim, int spacedim>
866std::unique_ptr<Mapping<dim, spacedim>>
868{
869 return std::make_unique<MappingP1<dim, spacedim>>(*this);
870}
871
872
873//---------------------------------------------------------------------------
874// explicit instantiations
875#include "fe/mapping_p1.inst"
876
877
DerivativeForm< 1, dim, spacedim, Number > covariant_form() const
DerivativeForm< 1, spacedim, dim, Number > transpose() const
virtual void reinit(const UpdateFlags update_flags, const Quadrature< dim > &quadrature) override
Definition mapping_p1.cc:68
DerivativeForm< 1, dim, spacedim > contravariant
Definition mapping_p1.h:229
Quadrature< dim > quadrature
Definition mapping_p1.h:245
InternalData(const ArrayView< const Point< dim > > &quadrature_points)
Definition mapping_p1.cc:50
virtual std::size_t memory_consumption() const override
Definition mapping_p1.cc:80
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
Definition mapping_p1.cc:94
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.
Definition mapping.h:318
Definition point.h:111
Class storing the offset index into a Quadrature rule created by project_to_all_faces() or project_to...
Definition qprojector.h:204
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.
Definition qprojector.h:68
double weight(const unsigned int i) const
unsigned int size() const
numbers::NumberTraits< Number >::real_type norm() const
std::vector< DerivativeForm< 1, spacedim, dim > > inverse_jacobians
void initialize(const unsigned int n_quadrature_points, const UpdateFlags flags)
std::vector< Tensor< 5, spacedim > > jacobian_pushed_forward_3rd_derivatives
std::vector< DerivativeForm< 4, dim, spacedim > > jacobian_3rd_derivatives
std::vector< DerivativeForm< 3, dim, spacedim > > jacobian_2nd_derivatives
std::vector< Tensor< 4, spacedim > > jacobian_pushed_forward_2nd_derivatives
std::vector< Tensor< 3, spacedim > > jacobian_pushed_forward_grads
std::vector< DerivativeForm< 2, dim, spacedim > > jacobian_grads
std::vector< DerivativeForm< 1, dim, spacedim > > jacobians
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
DerivativeForm< 1, spacedim, dim, Number > transpose(const DerivativeForm< 1, dim, spacedim, Number > &DF)
Tensor< 1, spacedim, typename ProductType< Number1, Number2 >::type > apply_transformation(const DerivativeForm< 1, dim, spacedim, Number1 > &grad_F, const Tensor< 1, dim, Number2 > &d_x)
#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)
UpdateFlags
@ 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
MappingKind
Definition mapping.h:79
@ mapping_piola
Definition mapping.h:114
@ mapping_covariant_gradient
Definition mapping.h:100
@ mapping_covariant
Definition mapping.h:89
@ mapping_contravariant
Definition mapping.h:94
@ mapping_contravariant_hessian
Definition mapping.h:156
@ mapping_covariant_hessian
Definition mapping.h:150
@ mapping_contravariant_gradient
Definition mapping.h:106
@ mapping_piola_gradient
Definition mapping.h:120
@ mapping_piola_hessian
Definition mapping.h:162
std::vector< index_type > data
Definition mpi.cc:734
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)
Definition utilities.cc:464
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)