deal.II version 9.8.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\}}\)
Loading...
Searching...
No Matches
qprojector.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) 2020 - 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
20
21#include <boost/container/small_vector.hpp>
22
23
25
26
27namespace internal
28{
29 namespace QProjector
30 {
31 namespace
32 {
39 void
40 project_to_hex_face_and_append(
41 const std::vector<Point<2>> &points,
42 const unsigned int face_no,
43 std::vector<Point<3>> &q_points,
45 const unsigned int subface_no = 0)
46 {
47 // one coordinate is at a const value. for faces 0, 2 and 4 this value
48 // is 0.0, for faces 1, 3 and 5 it is 1.0
49 const double const_value = face_no % 2;
50
51 // local 2d coordinates are xi and eta, global 3d coordinates are x, y
52 // and z. those have to be mapped. the following indices tell, which
53 // global coordinate (0->x, 1->y, 2->z) corresponds to which local one
54 const unsigned int xi_index = (1 + face_no / 2) % 3,
55 eta_index = (2 + face_no / 2) % 3,
56 const_index = face_no / 2;
57
58 // for a standard face (no refinement), we use the default values of
59 // the xi and eta scales and translations, otherwise the xi and eta
60 // values will be scaled (by factor 0.5 or factor 1.0) depending on
61 // the refinement case and translated (by 0.0 or 0.5) depending on the
62 // refinement case and subface_no
63 double xi_scale = 1.0, eta_scale = 1.0, xi_translation = 0.0,
64 eta_translation = 0.0;
65
66 // set the scale and translation parameter for individual subfaces
67 switch (ref_case)
68 {
70 break;
72 xi_scale = 0.5;
73 xi_translation = subface_no % 2 * 0.5;
74 break;
76 eta_scale = 0.5;
77 eta_translation = subface_no % 2 * 0.5;
78 break;
80 xi_scale = 0.5;
81 eta_scale = 0.5;
82 xi_translation = int(subface_no % 2) * 0.5;
83 eta_translation = int(subface_no / 2) * 0.5;
84 break;
85 default:
87 break;
88 }
89
90 // finally, compute the scaled, translated, projected quadrature
91 // points
92 for (const Point<2> &p : points)
93 {
94 Point<3> cell_point;
95 cell_point[xi_index] = xi_scale * p[0] + xi_translation;
96 cell_point[eta_index] = eta_scale * p[1] + eta_translation;
97 cell_point[const_index] = const_value;
98 q_points.push_back(cell_point);
99 }
100 }
101
128 template <int dim>
129 void
130 append_subobject_rule(
131 const ReferenceCell<dim - 1> &face_reference_cell,
132 const Quadrature<dim - 1> &quadrature,
136 const double measure,
137 const types::geometric_orientation combined_orientation,
138 std::vector<Point<dim>> &points,
139 std::vector<double> &weights)
140 {
141 AssertDimension(points.size(), weights.size());
142 points.reserve(points.size() + quadrature.size());
143 weights.reserve(weights.size() + quadrature.size());
144
145 const auto support_points =
146 face_reference_cell.permute_by_combined_orientation(
147 ArrayView<const Point<dim>>(vertices),
148 face_reference_cell.get_inverse_combined_orientation(
149 combined_orientation));
150 for (unsigned int j = 0; j < quadrature.size(); ++j)
151 {
152 Point<dim> mapped_point;
153
154 // map reference quadrature point
155 for (const unsigned int vertex_no :
156 face_reference_cell.vertex_indices())
157 mapped_point +=
158 support_points[vertex_no] *
159 face_reference_cell.d_linear_shape_function(quadrature.point(j),
160 vertex_no);
161
162 points.push_back(mapped_point);
163
164 // rescale quadrature weights so that the sum of the weights on
165 // each face equals the measure of that face.
166 weights.push_back(quadrature.weight(j) * measure /
167 face_reference_cell.volume());
168 }
169 }
170 } // namespace
171 } // namespace QProjector
172} // namespace internal
173
174
175
176template <>
177void
179 const Quadrature<0> &quadrature,
180 const unsigned int face_no,
181 std::vector<Point<1>> &q_points)
182{
183 AssertDimension(quadrature.size(), q_points.size());
184 const auto face_quadrature =
185 QProjector<1>::project_to_face(reference_cell,
186 quadrature,
187 face_no,
189 q_points = face_quadrature.get_points();
190}
191
192
193
194template <>
195void
197 const Quadrature<1> &quadrature,
198 const unsigned int face_no,
199 std::vector<Point<2>> &q_points)
200{
201 AssertDimension(quadrature.size(), q_points.size());
202 const auto face_quadrature =
203 QProjector<2>::project_to_face(reference_cell,
204 quadrature,
205 face_no,
207 q_points = face_quadrature.get_points();
208}
209
210
211
212template <>
213void
215 const Quadrature<2> &quadrature,
216 const unsigned int face_no,
217 std::vector<Point<3>> &q_points)
218{
220 (void)reference_cell;
221
223 Assert(q_points.size() == quadrature.size(),
224 ExcDimensionMismatch(q_points.size(), quadrature.size()));
225 q_points.clear();
226 internal::QProjector::project_to_hex_face_and_append(quadrature.get_points(),
227 face_no,
228 q_points);
229}
230
231
232
233template <int dim>
236 const ReferenceCell<dim> &reference_cell,
237 const Quadrature<dim - 1> &quadrature,
238 const unsigned int face_no,
239 const bool face_orientation,
240 const bool face_flip,
241 const bool face_rotation)
242{
244 reference_cell,
245 quadrature,
246 face_no,
248 face_rotation,
249 face_flip));
250}
251
252
253
254template <int dim>
257 const ReferenceCell<dim> &reference_cell,
258 const Quadrature<dim - 1> &quadrature,
259 const unsigned int face_no,
260 const types::geometric_orientation combined_orientation)
261{
262 AssertIndexRange(face_no, reference_cell.n_faces());
263 AssertIndexRange(combined_orientation,
264 reference_cell.n_face_orientations(face_no));
265 AssertDimension(reference_cell.get_dimension(), dim);
266
267 std::vector<Point<dim>> points;
268 std::vector<double> weights;
269
270 const ReferenceCell face_reference_cell =
271 reference_cell.face_reference_cell(face_no);
274 face_vertices(face_reference_cell.n_vertices());
275 for (const unsigned int vertex_no : face_reference_cell.vertex_indices())
276 face_vertices[vertex_no] =
277 reference_cell.face_vertex_location(face_no, vertex_no);
278 internal::QProjector::append_subobject_rule(face_reference_cell,
279 quadrature,
280 face_vertices,
281 reference_cell.face_measure(
282 face_no),
283 combined_orientation,
284 points,
285 weights);
286
287 return Quadrature<dim>(std::move(points), std::move(weights));
288}
289
290
291
292template <>
293void
295 const Quadrature<0> &,
296 const unsigned int face_no,
297 const unsigned int,
298 std::vector<Point<1>> &q_points,
299 const RefinementCase<0> &)
300{
301 Assert(reference_cell == ReferenceCells::Line, ExcNotImplemented());
302 (void)reference_cell;
303
304 const unsigned int dim = 1;
306 AssertDimension(q_points.size(), 1);
307
308 q_points[0] = Point<dim>(static_cast<double>(face_no));
309}
310
311
312
313template <>
314void
316 const Quadrature<1> &quadrature,
317 const unsigned int face_no,
318 const unsigned int subface_no,
319 std::vector<Point<2>> &q_points,
320 const RefinementCase<1> &ref_case)
321{
322 AssertDimension(quadrature.size(), q_points.size());
323 const auto face_quadrature =
324 project_to_subface(reference_cell,
325 quadrature,
326 face_no,
327 subface_no,
329 ref_case);
330 q_points = face_quadrature.get_points();
331}
332
333
334
335template <>
336void
338 const Quadrature<2> &quadrature,
339 const unsigned int face_no,
340 const unsigned int subface_no,
341 std::vector<Point<3>> &q_points,
342 const RefinementCase<2> &ref_case)
343{
345 (void)reference_cell;
346 AssertDimension(quadrature.size(), q_points.size());
347 const auto face_quadrature =
348 project_to_subface(reference_cell,
349 quadrature,
350 face_no,
351 subface_no,
353 ref_case);
354 q_points = face_quadrature.get_points();
355}
356
357
358
359template <int dim>
362 const ReferenceCell<dim> &reference_cell,
363 const Quadrature<dim - 1> &quadrature,
364 const unsigned int face_no,
365 const unsigned int subface_no,
366 const bool,
367 const bool,
368 const bool,
370{
372 reference_cell,
373 quadrature,
374 face_no,
375 subface_no,
377}
378
379
380
381template <int dim>
384 const ReferenceCell<dim> &reference_cell,
385 const SubQuadrature &quadrature,
386 const unsigned int face_no,
387 const unsigned int subface_no,
388 const types::geometric_orientation combined_orientation,
389 const RefinementCase<dim - 1> &ref_case)
390{
391 AssertIndexRange(face_no, reference_cell.n_faces());
392 AssertIndexRange(combined_orientation,
393 reference_cell.n_face_orientations(face_no));
394 AssertDimension(reference_cell.get_dimension(), dim);
395 if (dim > 1)
396 AssertIndexRange(subface_no,
397 reference_cell.face_reference_cell(face_no).n_children(
398 ref_case));
399 if (dim == 1)
400 AssertDimension(quadrature.size(), 1);
401
402 std::vector<Point<dim>> points;
403 std::vector<double> weights;
406 vertices;
407 for (const unsigned int subface_vertex_no :
408 reference_cell.face_reference_cell(face_no).vertex_indices())
409 vertices.push_back(reference_cell.subface_vertex_location(
410 face_no, subface_no, subface_vertex_no, ref_case));
411 internal::QProjector::append_subobject_rule(
412 reference_cell.face_reference_cell(face_no),
413 quadrature,
414 vertices,
415 reference_cell.face_measure(face_no),
416 combined_orientation,
417 points,
418 weights);
419
420 return Quadrature<dim>(std::move(points), std::move(weights));
421}
422
423
424
425template <int dim>
428 const ReferenceCell<dim> &reference_cell,
429 const hp::QCollection<dim - 1> &quadrature)
430{
431 std::size_t n_points = 0;
432 for (const unsigned int face_no : reference_cell.face_indices())
433 n_points += quadrature[quadrature.size() == 1 ? 0 : face_no].size() *
434 reference_cell.n_face_orientations(face_no);
435
436 std::vector<Point<dim>> points;
437 std::vector<double> weights;
438 points.reserve(n_points);
439 weights.reserve(n_points);
440
441 for (const unsigned int face_no : reference_cell.face_indices())
442 {
443 const ReferenceCell face_reference_cell =
444 reference_cell.face_reference_cell(face_no);
447 face_vertices(face_reference_cell.n_vertices());
448 for (const unsigned int vertex_no : face_reference_cell.vertex_indices())
449 face_vertices[vertex_no] =
450 reference_cell.face_vertex_location(face_no, vertex_no);
451
452 for (types::geometric_orientation combined_orientation = 0;
453 combined_orientation < reference_cell.n_face_orientations(face_no);
454 ++combined_orientation)
455 internal::QProjector::append_subobject_rule(
456 face_reference_cell,
457 quadrature[quadrature.size() == 1 ? 0 : face_no],
458 face_vertices,
459 reference_cell.face_measure(face_no),
460 combined_orientation,
461 points,
462 weights);
463 }
464
465 return Quadrature<dim>(std::move(points), std::move(weights));
466}
467
468
469
470template <int dim>
473 const ReferenceCell<dim> &reference_cell,
474 const Quadrature<dim - 1> &quadrature)
475{
476 AssertDimension(reference_cell.get_dimension(), dim);
477 if (dim == 1)
478 AssertDimension(quadrature.size(), 1);
479
480 std::size_t n_points = 0;
481 for (const unsigned int face_no : reference_cell.face_indices())
482 {
483 const auto n_orientations = reference_cell.n_face_orientations(face_no);
484 const auto face_reference_cell =
485 reference_cell.face_reference_cell(face_no);
486 for (const auto &refinement_case : face_reference_cell.refinement_cases())
487 {
488 const auto n_children =
489 dim > 1 ? face_reference_cell.n_children(refinement_case) : 1;
490 n_points += n_children * n_orientations * quadrature.size();
491 }
492 }
493
494 std::vector<Point<dim>> points;
495 std::vector<double> weights;
496 points.reserve(n_points);
497 weights.reserve(n_points);
498
499 // project to each face and copy results
500 for (unsigned int face_no = 0; face_no < reference_cell.n_faces(); ++face_no)
501 {
502 const auto face_reference_cell =
503 reference_cell.face_reference_cell(face_no);
504 const auto &refinement_cases = face_reference_cell.refinement_cases();
505 for (const auto &refinement_case : refinement_cases)
506 {
507 const auto n_children =
508 dim > 1 ? face_reference_cell.n_children(refinement_case) : 1;
509 for (types::geometric_orientation combined_orientation = 0;
510 combined_orientation <
511 reference_cell.n_face_orientations(face_no);
512 ++combined_orientation)
513 for (unsigned int subface_no = 0; subface_no < n_children;
514 ++subface_no)
515 {
519 vertices;
520 for (const unsigned int subface_vertex_no :
521 reference_cell.face_reference_cell(face_no)
522 .vertex_indices())
523 vertices.push_back(reference_cell.subface_vertex_location(
524 face_no, subface_no, subface_vertex_no, refinement_case));
525 internal::QProjector::append_subobject_rule(
526 reference_cell.face_reference_cell(face_no),
527 quadrature,
528 vertices,
529 reference_cell.face_measure(face_no),
530 combined_orientation,
531 points,
532 weights);
533 }
534 }
535 }
536
537 return Quadrature<dim>(std::move(points), std::move(weights));
538}
539
540
541
542template <int dim>
545 const Quadrature<dim> &quadrature,
546 const unsigned int child_no)
547{
548 Assert(reference_cell == ReferenceCells::get_hypercube<dim>(),
550 (void)reference_cell;
551
553
554 const unsigned int n_q_points = quadrature.size();
555
556 std::vector<Point<dim>> q_points(n_q_points);
557 for (unsigned int i = 0; i < n_q_points; ++i)
558 q_points[i] =
560 child_no);
561
562 // for the weights, things are
563 // equally simple: copy them and
564 // scale them
565 std::vector<double> weights = quadrature.get_weights();
566 for (unsigned int i = 0; i < n_q_points; ++i)
567 weights[i] *= (1. / GeometryInfo<dim>::max_children_per_cell);
568
569 return Quadrature<dim>(q_points, weights);
570}
571
572
573
574template <int dim>
577 const ReferenceCell<dim> &reference_cell,
578 const Quadrature<dim> &quadrature)
579{
580 Assert(reference_cell == ReferenceCells::get_hypercube<dim>(),
582 (void)reference_cell;
583
584 const unsigned int n_points = quadrature.size(),
586
587 std::vector<Point<dim>> q_points(n_points * n_children);
588 std::vector<double> weights(n_points * n_children);
589
590 // project to each child and copy
591 // results
592 for (unsigned int child = 0; child < n_children; ++child)
593 {
594 Quadrature<dim> help =
595 project_to_child(reference_cell, quadrature, child);
596 for (unsigned int i = 0; i < n_points; ++i)
597 {
598 q_points[child * n_points + i] = help.point(i);
599 weights[child * n_points + i] = help.weight(i);
600 }
601 }
602 return Quadrature<dim>(q_points, weights);
603}
604
605
606
607template <int dim>
610 const Quadrature<1> &quadrature,
611 const Point<dim> &p1,
612 const Point<dim> &p2)
613{
614 Assert(reference_cell == ReferenceCells::get_hypercube<dim>(),
616 (void)reference_cell;
617
618 const unsigned int n = quadrature.size();
619 std::vector<Point<dim>> points(n);
620 std::vector<double> weights(n);
621 const double length = p1.distance(p2);
622
623 for (unsigned int k = 0; k < n; ++k)
624 {
625 const double alpha = quadrature.point(k)[0];
626 points[k] = alpha * p2;
627 points[k] += (1. - alpha) * p1;
628 weights[k] = length * quadrature.weight(k);
629 }
630 return Quadrature<dim>(points, weights);
631}
632
633
634
635template <int dim>
638 const ReferenceCell<dim> &reference_cell,
639 const unsigned int face_no,
640 const bool face_orientation,
641 const bool face_flip,
642 const bool face_rotation,
643 const unsigned int n_quadrature_points)
644{
645 return face(reference_cell,
646 face_no,
648 face_rotation,
649 face_flip),
650 n_quadrature_points);
651}
652
653
654
655template <int dim>
658 const ReferenceCell<dim> &reference_cell,
659 const unsigned int face_no,
660 const types::geometric_orientation combined_orientation,
661 const unsigned int n_quadrature_points)
662{
663 AssertIndexRange(face_no, reference_cell.n_faces());
664 AssertIndexRange(combined_orientation,
665 reference_cell.n_face_orientations(face_no));
666 AssertDimension(reference_cell.get_dimension(), dim);
667
668
669 return {(reference_cell.n_face_orientations(face_no) * face_no +
670 combined_orientation) *
671 n_quadrature_points};
672}
673
674
675
676template <int dim>
679 const ReferenceCell<dim> &reference_cell,
680 const unsigned int face_no,
681 const bool face_orientation,
682 const bool face_flip,
683 const bool face_rotation,
684 const hp::QCollection<dim - 1> &quadrature)
685{
686 return face(reference_cell,
687 face_no,
689 face_rotation,
690 face_flip),
691 quadrature);
692}
693
694
695
696template <int dim>
699 const ReferenceCell<dim> &reference_cell,
700 const unsigned int face_no,
701 const types::geometric_orientation combined_orientation,
702 const hp::QCollection<dim - 1> &quadrature)
703{
704 AssertIndexRange(face_no, reference_cell.n_faces());
705 AssertIndexRange(combined_orientation,
706 reference_cell.n_face_orientations(face_no));
707 AssertDimension(reference_cell.get_dimension(), dim);
708
709 unsigned int offset = 0;
710 for (unsigned int i = 0; i < face_no; ++i)
711 offset += reference_cell.n_face_orientations(i) *
712 quadrature[quadrature.size() == 1 ? 0 : i].size();
713
714 return {offset + combined_orientation *
715 quadrature[quadrature.size() == 1 ? 0 : face_no].size()};
716}
717
718
719
720template <int dim>
723 const ReferenceCell<dim> &reference_cell,
724 const unsigned int face_no,
725 const unsigned int subface_no,
726 const bool face_orientation,
727 const bool face_flip,
728 const bool face_rotation,
729 const unsigned int n_quadrature_points,
730 const internal::SubfaceCase<dim> ref_case)
731{
733 reference_cell,
734 face_no,
735 subface_no,
737 face_rotation,
738 face_flip),
739 n_quadrature_points,
740 ref_case);
741}
742
743
744
745template <int dim>
748 const ReferenceCell<dim> &reference_cell,
749 const unsigned int face_no,
750 const unsigned int subface_no,
751 const types::geometric_orientation combined_orientation,
752 const unsigned int n_quadrature_points,
753 const internal::SubfaceCase<dim> ref_case)
754{
755 AssertDimension(reference_cell.get_dimension(), dim);
756 AssertIndexRange(face_no, reference_cell.n_faces());
757 AssertIndexRange(combined_orientation,
758 reference_cell.n_face_orientations(face_no));
759
760 const auto [final_subface_no, final_refinement_case] =
761 reference_cell.equivalent_refinement_case(combined_orientation,
762 ref_case,
763 subface_no);
764 if (dim > 1)
765 AssertIndexRange(final_subface_no,
766 reference_cell.face_reference_cell(face_no).n_children(
767 final_refinement_case));
768
769 // This function can't work with mixed elements since, in general, those may
770 // have a different number of quadrature points per face
771 Assert(reference_cell != ReferenceCells::Pyramid &&
772 reference_cell != ReferenceCells::Wedge,
774
775 // Calculate the total number of points per face:
776 const auto face_reference_cell = reference_cell.face_reference_cell(face_no);
777 const auto &refinement_cases = face_reference_cell.refinement_cases();
778 unsigned int points_per_face = 0;
779 for (const auto &refinement_case : refinement_cases)
780 {
781 const auto n_children =
782 dim > 1 ? face_reference_cell.n_children(refinement_case) : 1;
783 points_per_face += reference_cell.n_face_orientations(face_no) *
784 n_children * n_quadrature_points;
785 }
786
787 // Next, calculate where we are in the current face's enumeration of
788 // quadrature rules:
789 unsigned int index = points_per_face * face_no;
790 for (const auto &refinement_case : refinement_cases)
791 {
792 const auto n_children =
793 dim > 1 ? face_reference_cell.n_children(refinement_case) : 1;
794
795 if (refinement_case == final_refinement_case)
796 return index + (combined_orientation * n_children + final_subface_no) *
797 n_quadrature_points;
798 else
799 index += reference_cell.n_face_orientations(face_no) * n_children *
800 n_quadrature_points;
801 }
803
804 return index;
805}
806
807
808
809template <int dim>
812 const SubQuadrature &quadrature,
813 const unsigned int face_no)
814{
815 Assert(reference_cell == ReferenceCells::get_hypercube<dim>(),
817 (void)reference_cell;
818
819 std::vector<Point<dim>> points(quadrature.size());
820 project_to_face(reference_cell, quadrature, face_no, points);
821 return Quadrature<dim>(points, quadrature.get_weights());
822}
823
824
825
826template <int dim>
829 const SubQuadrature &quadrature,
830 const unsigned int face_no,
831 const unsigned int subface_no,
832 const RefinementCase<dim - 1> &ref_case)
833{
834 Assert(reference_cell == ReferenceCells::get_hypercube<dim>(),
836 (void)reference_cell;
837
838 std::vector<Point<dim>> points(quadrature.size());
840 reference_cell, quadrature, face_no, subface_no, points, ref_case);
841 return Quadrature<dim>(points, quadrature.get_weights());
842}
843
844
845// explicit instantiations; note: we need them all for all dimensions
846template class QProjector<1>;
847template class QProjector<2>;
848template class QProjector<3>;
849
Definition point.h:111
numbers::NumberTraits< Number >::real_type distance(const Point< dim, Number > &p) const
Class storing the offset index into a Quadrature rule created by project_to_all_faces() or project_to...
Definition qprojector.h:333
static DataSetDescriptor subface(const ReferenceCell< dim > &reference_cell, const unsigned int face_no, const unsigned int subface_no, const bool face_orientation, const bool face_flip, const bool face_rotation, const unsigned int n_quadrature_points, const internal::SubfaceCase< dim > ref_case=internal::SubfaceCase< dim >::case_isotropic)
static DataSetDescriptor face(const ReferenceCell< dim > &reference_cell, const unsigned int face_no, const bool face_orientation, const bool face_flip, const bool face_rotation, const unsigned int n_quadrature_points)
Class which transforms dim - 1-dimensional quadrature rules to dim-dimensional face quadratures.
Definition qprojector.h:68
static Quadrature< dim > project_to_all_faces(const ReferenceCell< dim > &reference_cell, const hp::QCollection< dim - 1 > &quadrature)
static Quadrature< dim > project_to_oriented_face(const ReferenceCell< dim > &reference_cell, const SubQuadrature &quadrature, const unsigned int face_no, const bool face_orientation, const bool face_flip, const bool face_rotation)
static void project_to_subface(const ReferenceCell< dim > &reference_cell, const SubQuadrature &quadrature, const unsigned int face_no, const unsigned int subface_no, std::vector< Point< dim > > &q_points, const RefinementCase< dim - 1 > &ref_case=RefinementCase< dim - 1 >::isotropic_refinement)
static Quadrature< dim > project_to_all_subfaces(const ReferenceCell< dim > &reference_cell, const SubQuadrature &quadrature)
static void project_to_face(const ReferenceCell< dim > &reference_cell, const SubQuadrature &quadrature, const unsigned int face_no, std::vector< Point< dim > > &q_points)
static Quadrature< dim > project_to_all_children(const ReferenceCell< dim > &reference_cell, const Quadrature< dim > &quadrature)
static Quadrature< dim > project_to_line(const ReferenceCell< dim > &reference_cell, const Quadrature< 1 > &quadrature, const Point< dim > &p1, const Point< dim > &p2)
static Quadrature< dim > project_to_oriented_subface(const ReferenceCell< dim > &reference_cell, const SubQuadrature &quadrature, const unsigned int face_no, const unsigned int subface_no, const bool face_orientation, const bool face_flip, const bool face_rotation, const internal::SubfaceCase< dim > ref_case)
Quadrature< dim - 1 > SubQuadrature
Definition qprojector.h:74
static Quadrature< dim > project_to_child(const ReferenceCell< dim > &reference_cell, const Quadrature< dim > &quadrature, const unsigned int child_no)
const Point< dim > & point(const unsigned int i) const
double weight(const unsigned int i) const
const std::vector< double > & get_weights() const
const std::vector< Point< dim > > & get_points() const
unsigned int size() const
double volume() const
constexpr unsigned int n_vertices() const
double d_linear_shape_function(const Point< dim > &xi, const unsigned int i) const
std_cxx20::ranges::iota_view< unsigned int, unsigned int > vertex_indices() const
boost::container::small_vector< T, 8 > permute_by_combined_orientation(const ArrayView< const T > &vertices, const types::geometric_orientation orientation) const
types::geometric_orientation get_inverse_combined_orientation(const types::geometric_orientation orientation) const
unsigned int size() const
Definition collection.h:314
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
#define DEAL_II_ASSERT_UNREACHABLE()
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
constexpr ReferenceCell< 3 > Hexahedron
constexpr ReferenceCell< 1 > Line
constexpr unsigned int max_n_vertices()
constexpr ReferenceCell< 3 > Pyramid
constexpr const ReferenceCell< dim > & get_hypercube()
constexpr ReferenceCell< 3 > Wedge
types::geometric_orientation combined_face_orientation(const bool face_orientation, const bool face_rotation, const bool face_flip)
constexpr types::geometric_orientation default_geometric_orientation
Definition types.h:350
std::uint8_t geometric_orientation
Definition types.h:38
*  const unsigned int n_q_points
static constexpr unsigned int faces_per_cell
static Point< dim > child_to_cell_coordinates(const Point< dim > &p, const unsigned int child_index, const RefinementCase< dim > refine_case=RefinementCase< dim >::isotropic_refinement)
static constexpr unsigned int max_children_per_cell