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
quadrature_generator.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) 2020 - 2024 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_non_matching_quadrature_generator_h
14#define dealii_non_matching_quadrature_generator_h
15
16#include <deal.II/base/config.h>
17
22
24
25#include <deal.II/grid/tria.h>
26
28
30
31#include <functional>
32#include <optional>
33
35namespace NonMatching
36{
37 namespace internal
38 {
39 namespace QuadratureGeneratorImplementation
40 {
41 template <int dim, int spacedim>
42 class QGenerator;
43 } // namespace QuadratureGeneratorImplementation
44
45
46 namespace DiscreteQuadratureGeneratorImplementation
47 {
48 template <int dim>
49 class CellWiseFunction;
50 } // namespace DiscreteQuadratureGeneratorImplementation
51 } // namespace internal
52
53
58 {
62 AdditionalQGeneratorData(const unsigned int max_box_splits = 4,
63 const double lower_bound_implicit_function = 1e-11,
64 const double min_distance_between_roots = 1e-12,
65 const double limit_to_be_definite = 1e-11,
66 const double root_finder_tolerance = 1e-12,
67 const unsigned int max_root_finder_splits = 2,
68 bool split_in_half = true);
69
74 unsigned int max_box_splits;
75
94
100
109
114
120
127 };
128
129
130
181 template <int dim>
183 {
184 public:
186
195 const hp::QCollection<1> &quadratures1D,
196 const AdditionalData &additional_data = AdditionalData());
197
201 void
203
216 void
217 generate(const Function<dim> &level_set, const BoundingBox<dim> &box);
218
223 void
224 generate_append(const Function<dim> &level_set,
225 const BoundingBox<dim> &box);
226
233 const Quadrature<dim> &
234 get_inside_quadrature() const;
235
242 const Quadrature<dim> &
244
255
260 void
261 set_1D_quadrature(const unsigned int q_index);
262
263 private:
270 };
271
272
299 template <int dim>
301 {
302 public:
304
313 const hp::QCollection<1> &quadratures1D,
314 const AdditionalData &additional_data = AdditionalData());
315
319 void
321
334 void
335 generate(const Function<dim> &level_set,
336 const BoundingBox<dim> &box,
337 const unsigned int face_index);
338
343 void
344 generate_append(const Function<dim> &level_set,
345 const BoundingBox<dim> &box,
346 const unsigned int face_index);
347
354 const Quadrature<dim - 1> &
355 get_inside_quadrature() const;
356
363 const Quadrature<dim - 1> &
365
374 const ImmersedSurfaceQuadrature<dim - 1, dim> &
376
381 void
382 set_1D_quadrature(const unsigned int q_index);
383
384 private:
390
396 };
397
398
415 template <>
417 {
418 public:
420
426 const hp::QCollection<1> &quadratures1D,
427 const AdditionalData &additional_data = AdditionalData());
428
432 void
434
444 void
445 generate(const Function<1> &level_set,
446 const BoundingBox<1> &box,
447 const unsigned int face_index);
448
453 void
454 generate_append(const Function<1> &level_set,
455 const BoundingBox<1> &box,
456 const unsigned int face_index);
457
461 const Quadrature<0> &
462 get_inside_quadrature() const;
463
467 const Quadrature<0> &
469
479
484 void
485 set_1D_quadrature(const unsigned int q_index);
486
487 private:
494
501
508 };
509
510
528 template <int dim>
530 {
531 public:
533
541 template <typename Number>
543 const hp::QCollection<1> &quadratures1D,
544 const DoFHandler<dim> &dof_handler,
545 const ReadVector<Number> &level_set,
546 const AdditionalData &additional_data = AdditionalData());
547
555 void
557
558 private:
562 void
563 generate_fe_q_iso_q1(const BoundingBox<dim> &unit_box);
564
568 std::unique_ptr<internal::DiscreteQuadratureGeneratorImplementation::
569 CellWiseFunction<dim>>
571 };
572
590 template <int dim>
592 {
593 public:
595
603 template <typename Number>
605 const hp::QCollection<1> &quadratures1D,
606 const DoFHandler<dim> &dof_handler,
607 const ReadVector<Number> &level_set,
608 const AdditionalData &additional_data = AdditionalData());
609
617 void
619 const unsigned int face_index);
620
621 private:
625 void
627 unsigned int face_index);
628
632 std::unique_ptr<internal::DiscreteQuadratureGeneratorImplementation::
633 CellWiseFunction<dim>>
635 };
636
637
638 namespace internal
639 {
640 namespace QuadratureGeneratorImplementation
641 {
660 {
661 public:
666 {
670 AdditionalData(const double tolerance = 1e-12,
671 const unsigned int max_recursion_depth = 2,
672 const unsigned int max_iterations = 500);
673
678 double tolerance;
679
685
690 unsigned int max_iterations;
691 };
692
693
698
706 void
707 find_roots(const std::vector<std::reference_wrapper<const Function<1>>>
708 &functions,
709 const BoundingBox<1> &interval,
710 std::vector<double> &roots);
711
712 private:
718 void
719 find_roots(const Function<1> &function,
720 const BoundingBox<1> &interval,
721 const unsigned int recursion_depth,
722 std::vector<double> &roots);
723
725 };
726
727
740 template <int dim>
742 {
743 public:
749
753 ExtendableQuadrature(const Quadrature<dim> &quadrature);
754
758 void
759 clear();
760
764 void
765 push_back(const Point<dim> &point, const double weight);
766 };
767
768
772 enum class Definiteness
773 {
774 negative,
775 positive,
777 };
778
779
809 template <int dim>
850
851
890 template <int dim, int spacedim>
892 {
893 public:
900
906 void
907 generate(const std::vector<std::reference_wrapper<const Function<dim>>>
908 &level_sets,
909 const BoundingBox<dim> &box,
910 const Quadrature<dim - 1> &low_dim_quadrature,
911 const unsigned int height_function_direction,
912 QPartitioning<dim> &q_partitioning);
913
918 void
919 set_1D_quadrature(const unsigned int q_index);
920
921 private:
930 void
932 const Point<dim - 1> &point,
933 const double weight,
934 const std::vector<std::reference_wrapper<const Function<dim>>>
935 &level_sets,
936 const BoundingBox<dim> &box,
937 const unsigned int height_function_direction,
938 ImmersedSurfaceQuadrature<dim> &surface_quadrature);
939
945
950
955 unsigned int q_index;
956
962
967
974 std::vector<double> roots;
975 };
976
977
995 {
1001
1002
1006 unsigned int direction;
1007
1013 };
1014
1015
1020 template <int dim, int spacedim>
1062
1063
1147 template <int dim, int spacedim>
1148 class QGenerator : public QGeneratorBase<dim, spacedim>
1149 {
1150 public:
1156
1167 void
1168 generate(const std::vector<std::reference_wrapper<const Function<dim>>>
1169 &level_sets,
1170 const BoundingBox<dim> &box,
1171 const unsigned int n_box_splits);
1172
1177 void
1178 set_1D_quadrature(const unsigned int q_index);
1179
1180 private:
1187 void
1189 const unsigned int height_function_direction,
1190 const std::vector<std::reference_wrapper<const Function<dim>>>
1191 &level_sets,
1192 const BoundingBox<dim> &box,
1193 const unsigned int n_box_splits);
1194
1200 void
1202 const unsigned int height_function_direction,
1203 const std::vector<std::reference_wrapper<const Function<dim>>>
1204 &level_sets,
1205 const BoundingBox<dim> &box);
1206
1212 void
1214 const std::vector<std::reference_wrapper<const Function<dim>>>
1215 &level_sets,
1216 const BoundingBox<dim> &box,
1217 const std::optional<HeightDirectionData> &direction_data,
1218 const unsigned int n_box_splits);
1219
1229 void
1231 const std::vector<std::reference_wrapper<const Function<dim>>>
1232 &level_sets,
1233 const BoundingBox<dim> &box);
1234
1239 QGenerator<dim - 1, spacedim> low_dim_algorithm;
1240
1246
1252 };
1253
1254
1270 template <int spacedim>
1271 class QGenerator<1, spacedim> : public QGeneratorBase<1, spacedim>
1272 {
1273 public:
1277 QGenerator(const hp::QCollection<1> &quadratures1D,
1279
1286 void
1287 generate(const std::vector<std::reference_wrapper<const Function<1>>>
1288 &level_sets,
1289 const BoundingBox<1> &box,
1290 const unsigned int n_box_splits);
1291
1296 void
1297 set_1D_quadrature(const unsigned int q_index);
1298
1299 private:
1304 void
1305 create_surface_points(
1306 const std::vector<std::reference_wrapper<const Function<1>>>
1307 &level_sets);
1308
1313
1317 std::vector<double> roots;
1318
1323 const unsigned int direction = 0;
1324
1330 const double unit_weight = 1;
1331 };
1332
1333
1342 template <int dim>
1343 void
1345 const double weight,
1346 const Quadrature<1> &quadrature1D,
1347 const double start,
1348 const double end,
1349 const unsigned int component_in_dim,
1350 ExtendableQuadrature<dim> &quadrature);
1351
1352
1359 template <int dim>
1362 const std::vector<std::reference_wrapper<const Function<dim>>>
1363 &functions,
1364 const Point<dim> &point);
1365
1366
1371 template <int dim>
1373 {
1374 public:
1378 std::pair<double, double> value;
1379
1383 std::array<std::pair<double, double>, dim> gradient;
1384 };
1385
1386
1394 template <int dim>
1395 std::pair<double, double>
1397 const std::vector<FunctionBounds<dim>> &all_function_bounds);
1398
1399
1432 template <int dim>
1433 std::optional<HeightDirectionData>
1435 const std::vector<FunctionBounds<dim>> &all_function_bounds);
1436
1437 } // namespace QuadratureGeneratorImplementation
1438
1439
1440 namespace DiscreteQuadratureGeneratorImplementation
1441 {
1447 template <int dim>
1448 class CellWiseFunction : public Function<dim>
1449 {
1450 public:
1454 virtual ~CellWiseFunction() = default;
1455
1459 virtual void
1461 const typename Triangulation<dim>::active_cell_iterator &cell) = 0;
1462
1467 virtual void
1468 set_subcell(const std::vector<unsigned int> &mask,
1469 const BoundingBox<dim> &subcell_box) = 0;
1470
1474 virtual bool
1475 is_fe_q_iso_q1() const = 0;
1476
1480 virtual unsigned int
1481 n_subdivisions() const = 0;
1482 };
1483
1484 } // namespace DiscreteQuadratureGeneratorImplementation
1485 } // namespace internal
1486
1487} // namespace NonMatching
1489
1490#endif /* dealii_non_matching_quadrature_generator_h */
*  iterator end()
void generate(const typename Triangulation< dim >::active_cell_iterator &cell, const unsigned int face_index)
std::unique_ptr< internal::DiscreteQuadratureGeneratorImplementation::CellWiseFunction< dim > > reference_space_level_set
void generate_fe_q_iso_q1(const BoundingBox< dim > &unit_box, unsigned int face_index)
void generate(const typename Triangulation< dim >::active_cell_iterator &cell)
std::unique_ptr< internal::DiscreteQuadratureGeneratorImplementation::CellWiseFunction< dim > > reference_space_level_set
void generate_fe_q_iso_q1(const BoundingBox< dim > &unit_box)
const ImmersedSurfaceQuadrature< 0, 1 > surface_quadrature
const Quadrature< dim - 1 > & get_inside_quadrature() const
void generate(const Function< dim > &level_set, const BoundingBox< dim > &box, const unsigned int face_index)
ImmersedSurfaceQuadrature< dim - 1, dim > surface_quadrature
void set_1D_quadrature(const unsigned int q_index)
void generate_append(const Function< dim > &level_set, const BoundingBox< dim > &box, const unsigned int face_index)
const ImmersedSurfaceQuadrature< dim - 1, dim > & get_surface_quadrature() const
QuadratureGenerator< dim - 1 > quadrature_generator
const Quadrature< dim - 1 > & get_outside_quadrature() const
void generate_append(const Function< dim > &level_set, const BoundingBox< dim > &box)
void set_1D_quadrature(const unsigned int q_index)
AdditionalQGeneratorData AdditionalData
const Quadrature< dim > & get_inside_quadrature() const
const Quadrature< dim > & get_outside_quadrature() const
internal::QuadratureGeneratorImplementation::QGenerator< dim, dim > q_generator
const ImmersedSurfaceQuadrature< dim > & get_surface_quadrature() const
void generate(const Function< dim > &level_set, const BoundingBox< dim > &box)
virtual void set_subcell(const std::vector< unsigned int > &mask, const BoundingBox< dim > &subcell_box)=0
virtual void set_active_cell(const typename Triangulation< dim >::active_cell_iterator &cell)=0
const ObserverPointer< const hp::QCollection< 1 > > q_collection1D
void create_high_dim_quadratures(const unsigned int height_function_direction, const std::vector< std::reference_wrapper< const Function< dim > > > &level_sets, const BoundingBox< dim > &box)
void generate(const std::vector< std::reference_wrapper< const Function< dim > > > &level_sets, const BoundingBox< dim > &box, const unsigned int n_box_splits)
void split_box_and_recurse(const std::vector< std::reference_wrapper< const Function< dim > > > &level_sets, const BoundingBox< dim > &box, const std::optional< HeightDirectionData > &direction_data, const unsigned int n_box_splits)
void use_midpoint_method(const std::vector< std::reference_wrapper< const Function< dim > > > &level_sets, const BoundingBox< dim > &box)
void create_low_dim_quadratures(const unsigned int height_function_direction, const std::vector< std::reference_wrapper< const Function< dim > > > &level_sets, const BoundingBox< dim > &box, const unsigned int n_box_splits)
ExtendableQuadrature< dim > & quadrature_by_definiteness(const Definiteness definiteness)
void find_roots(const std::vector< std::reference_wrapper< const Function< 1 > > > &functions, const BoundingBox< 1 > &interval, std::vector< double > &roots)
void generate(const std::vector< std::reference_wrapper< const Function< dim > > > &level_sets, const BoundingBox< dim > &box, const Quadrature< dim - 1 > &low_dim_quadrature, const unsigned int height_function_direction, QPartitioning< dim > &q_partitioning)
void create_surface_point(const Point< dim - 1 > &point, const double weight, const std::vector< std::reference_wrapper< const Function< dim > > > &level_sets, const BoundingBox< dim > &box, const unsigned int height_function_direction, ImmersedSurfaceQuadrature< dim > &surface_quadrature)
Definition point.h:111
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
std::vector< index_type > data
Definition mpi.cc:734
std::pair< double, double > find_extreme_values(const std::vector< FunctionBounds< dim > > &all_function_bounds)
std::optional< HeightDirectionData > find_best_height_direction(const std::vector< FunctionBounds< dim > > &all_function_bounds)
void tensor_point_with_1D_quadrature(const Point< dim - 1 > &point, const double weight, const Quadrature< 1 > &quadrature1D, const double start, const double end, const unsigned int component_in_dim, ExtendableQuadrature< dim > &quadrature)
Definiteness pointwise_definiteness(const std::vector< std::reference_wrapper< const Function< dim > > > &functions, const Point< dim > &point)