Loading [MathJax]/extensions/TeX/AMSsymbols.js
 deal.II version GIT relicensing-2968-g5f01c80b02 2025-03-29 13:10:00+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\}}\)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
manifold_lib.h
Go to the documentation of this file.
1// ------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: LGPL-2.1-or-later
4// Copyright (C) 2014 - 2024 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Part of the source code is dual licensed under Apache-2.0 WITH
9// LLVM-exception OR LGPL-2.1-or-later. Detailed license information
10// governing the source code and code contributions can be found in
11// LICENSE.md and CONTRIBUTING.md at the top level directory of deal.II.
12//
13// ------------------------------------------------------------------------
14
15#ifndef dealii_manifold_lib_h
16#define dealii_manifold_lib_h
17
18
19#include <deal.II/base/config.h>
20
23
25
26#include <boost/signals2/connection.hpp>
27
28
30
31// forward declaration
32namespace internal
33{
34 namespace MappingQImplementation
35 {
36 template <int, int>
37 class InverseQuadraticApproximation;
38 }
39} // namespace internal
40
41
85template <int dim, int spacedim = dim>
86class PolarManifold : public ChartManifold<dim, spacedim, spacedim>
87{
88public:
96
100 virtual std::unique_ptr<Manifold<dim, spacedim>>
101 clone() const override;
102
107 virtual Point<spacedim>
108 pull_back(const Point<spacedim> &space_point) const override;
109
114 virtual Point<spacedim>
115 push_forward(const Point<spacedim> &chart_point) const override;
116
130 push_forward_gradient(const Point<spacedim> &chart_point) const override;
131
135 virtual Tensor<1, spacedim>
138 const Point<spacedim> &p) const override;
139
143 const Point<spacedim> &
144 get_center() const;
145
152 "Access the center with get_center() instead.")
153 const Point<spacedim> center;
154
155private:
161 const Point<spacedim> p_center;
162
167 static Tensor<1, spacedim>
169};
170
171
172
264template <int dim, int spacedim = dim>
265class SphericalManifold : public Manifold<dim, spacedim>
266{
267public:
275
279 virtual std::unique_ptr<Manifold<dim, spacedim>>
280 clone() const override;
281
289 virtual Point<spacedim>
291 const Point<spacedim> &p2,
292 const double w) const override;
293
298 virtual Tensor<1, spacedim>
300 const Point<spacedim> &x2) const override;
301
305 virtual Tensor<1, spacedim>
308 const Point<spacedim> &p) const override;
309
313 virtual void
316 typename Manifold<dim, spacedim>::FaceVertexNormals &face_vertex_normals)
317 const override;
318
333 virtual void
334 get_new_points(const ArrayView<const Point<spacedim>> &surrounding_points,
335 const Table<2, double> &weights,
336 ArrayView<Point<spacedim>> new_points) const override;
337
342 virtual Point<spacedim>
343 get_new_point(const ArrayView<const Point<spacedim>> &vertices,
344 const ArrayView<const double> &weights) const override;
345
349 const Point<spacedim> &
350 get_center() const;
351
358 "Access the center with get_center() instead.")
359 const Point<spacedim> center;
360
361private:
367 const Point<spacedim> p_center;
368
375 std::pair<double, Tensor<1, spacedim>>
376 guess_new_point(const ArrayView<const Tensor<1, spacedim>> &directions,
377 const ArrayView<const double> &distances,
378 const ArrayView<const double> &weights) const;
379
397 void
398 do_get_new_points(const ArrayView<const Point<spacedim>> &surrounding_points,
399 const ArrayView<const double> &weights,
400 ArrayView<Point<spacedim>> new_points) const;
401
405 const PolarManifold<spacedim> polar_manifold;
406};
407
421template <int dim, int spacedim = dim>
422class CylindricalManifold : public ChartManifold<dim, spacedim, 3>
423{
424public:
431 CylindricalManifold(const unsigned int axis = 0,
432 const double tolerance = 1e-10);
433
442 const Point<spacedim> &point_on_axis,
443 const double tolerance = 1e-10);
444
448 virtual std::unique_ptr<Manifold<dim, spacedim>>
449 clone() const override;
450
457 virtual Point<3>
458 pull_back(const Point<spacedim> &space_point) const override;
459
466 virtual Point<spacedim>
467 push_forward(const Point<3> &chart_point) const override;
468
476 push_forward_gradient(const Point<3> &chart_point) const override;
477
482 virtual Point<spacedim>
483 get_new_point(const ArrayView<const Point<spacedim>> &surrounding_points,
484 const ArrayView<const double> &weights) const override;
485
489 const Tensor<1, spacedim> &
490 get_direction() const;
491
498 const Point<spacedim> &
499 get_point_on_axis() const;
500
504 double
505 get_tolerance() const;
506
507private:
512
517
522
526 const double tolerance;
527
532};
533
565template <int dim, int spacedim = dim>
566class EllipticalManifold : public ChartManifold<dim, spacedim, spacedim>
567{
568public:
581 const Tensor<1, spacedim> &major_axis_direction,
582 const double eccentricity);
583
584 virtual std::unique_ptr<Manifold<dim, spacedim>>
585 clone() const override;
586
590 virtual Point<spacedim>
591 pull_back(const Point<spacedim> &space_point) const override;
592
596 virtual Point<spacedim>
597 push_forward(const Point<spacedim> &chart_point) const override;
598
603 push_forward_gradient(const Point<spacedim> &chart_point) const override;
604
608 const Tensor<1, spacedim> &
609 get_major_axis_direction() const;
610
614 const Point<spacedim> &
615 get_center() const;
616
620 double
621 get_eccentricity() const;
622
623private:
628
633
637 const double eccentricity;
638
642 const double cosh_u;
643 const double sinh_u;
644
652 get_periodicity();
653};
654
655
670template <int dim, int spacedim = dim, int chartdim = dim>
671class FunctionManifold : public ChartManifold<dim, spacedim, chartdim>
672{
673public:
688 const Function<chartdim> &push_forward_function,
689 const Function<spacedim> &pull_back_function,
690 const Tensor<1, chartdim> &periodicity = Tensor<1, chartdim>(),
691 const double tolerance = 1e-10);
692
705 std::unique_ptr<Function<chartdim>> push_forward,
706 std::unique_ptr<Function<spacedim>> pull_back,
707 const Tensor<1, chartdim> &periodicity = Tensor<1, chartdim>(),
708 const double tolerance = 1e-10);
709
725 const std::string push_forward_expression,
726 const std::string pull_back_expression,
727 const Tensor<1, chartdim> &periodicity = Tensor<1, chartdim>(),
730 const std::string chart_vars =
732 const std::string space_vars =
734 const double tolerance = 1e-10,
735 const double h = 1e-8);
736
740 virtual ~FunctionManifold() override;
741
745 virtual std::unique_ptr<Manifold<dim, spacedim>>
746 clone() const override;
747
753 virtual Point<spacedim>
754 push_forward(const Point<chartdim> &chart_point) const override;
755
777 push_forward_gradient(const Point<chartdim> &chart_point) const override;
778
784 virtual Point<chartdim>
785 pull_back(const Point<spacedim> &space_point) const override;
786
787private:
792
799
806
812 const double tolerance;
813
822
826 const std::string push_forward_expression;
827
831 const std::string pull_back_expression;
832
836 const std::string chart_vars;
837
841 const std::string space_vars;
842
847};
848
849
850
863template <int dim>
864class TorusManifold : public ChartManifold<dim, 3, 3>
865{
866public:
867 static const int chartdim = 3;
868 static const int spacedim = 3;
869
875 TorusManifold(const double centerline_radius, const double inner_radius);
876
880 virtual std::unique_ptr<Manifold<dim, 3>>
881 clone() const override;
882
886 virtual Point<3>
887 pull_back(const Point<3> &p) const override;
888
892 virtual Point<3>
893 push_forward(const Point<3> &chart_point) const override;
894
899 push_forward_gradient(const Point<3> &chart_point) const override;
900
904 double
905 get_centerline_radius() const;
906
910 double
911 get_inner_radius() const;
912
913private:
915
917};
918
919
920
1058template <int dim, int spacedim = dim>
1059class TransfiniteInterpolationManifold : public Manifold<dim, spacedim>
1060{
1061public:
1066
1070 virtual ~TransfiniteInterpolationManifold() override;
1071
1075 virtual std::unique_ptr<Manifold<dim, spacedim>>
1076 clone() const override;
1077
1090 void
1092
1108 virtual Point<spacedim>
1109 get_new_point(const ArrayView<const Point<spacedim>> &surrounding_points,
1110 const ArrayView<const double> &weights) const override;
1111
1131 virtual void
1132 get_new_points(const ArrayView<const Point<spacedim>> &surrounding_points,
1133 const Table<2, double> &weights,
1134 ArrayView<Point<spacedim>> new_points) const override;
1135
1136private:
1148 std::array<unsigned int, 20>
1149 get_possible_cells_around_points(
1150 const ArrayView<const Point<spacedim>> &surrounding_points) const;
1151
1160 compute_chart_points(
1161 const ArrayView<const Point<spacedim>> &surrounding_points,
1162 ArrayView<Point<dim>> chart_points) const;
1163
1181 pull_back(const typename Triangulation<dim, spacedim>::cell_iterator &cell,
1182 const Point<spacedim> &p,
1183 const Point<dim> &initial_guess) const;
1184
1197 push_forward(const typename Triangulation<dim, spacedim>::cell_iterator &cell,
1198 const Point<dim> &chart_point) const;
1199
1212 push_forward_gradient(
1214 const Point<dim> &chart_point,
1215 const Point<spacedim> &pushed_forward_chart_point) const;
1216
1221
1227
1233 std::vector<bool> coarse_cell_is_flat;
1234
1240
1245 std::vector<internal::MappingQImplementation::
1246 InverseQuadraticApproximation<dim, spacedim>>
1248
1253 boost::signals2::connection clear_signal;
1254};
1255
1256/*----------------------------- inline functions -----------------------------*/
1257
1258template <int dim, int spacedim>
1259inline const Point<spacedim> &
1264
1265
1266
1267template <int dim, int spacedim>
1268inline const Point<spacedim> &
1273
1274
1275
1276template <int dim, int spacedim>
1277inline const Tensor<1, spacedim> &
1279{
1280 return direction;
1281}
1282
1283
1284
1285template <int dim, int spacedim>
1286inline const Point<spacedim> &
1288{
1289 return point_on_axis;
1290}
1291
1292
1293
1294template <int dim, int spacedim>
1295inline double
1297{
1298 return tolerance;
1299}
1300
1301
1302
1303template <int dim, int spacedim>
1304inline const Tensor<1, spacedim> &
1306{
1307 return direction;
1308}
1309
1310
1311
1312template <int dim, int spacedim>
1313inline const Point<spacedim> &
1318
1319
1320
1321template <int dim, int spacedim>
1322inline double
1324{
1325 return eccentricity;
1326}
1327
1328
1329
1330template <int dim>
1331inline double
1333{
1334 return centerline_radius;
1335}
1336
1337
1338
1339template <int dim>
1340inline double
1342{
1343 return inner_radius;
1344}
1345
1347
1348#endif
virtual void get_new_points(const ArrayView< const Point< spacedim > > &surrounding_points, const Table< 2, double > &weights, ArrayView< Point< spacedim > > new_points) const override
Definition manifold.cc:1051
virtual Tensor< 1, spacedim > get_tangent_vector(const Point< spacedim > &x1, const Point< spacedim > &x2) const override
Definition manifold.cc:1090
virtual Point< spacedim > get_intermediate_point(const Point< spacedim > &p1, const Point< spacedim > &p2, const double w) const override
Definition manifold.cc:1016
virtual Point< spacedim > get_new_point(const ArrayView< const Point< spacedim > > &surrounding_points, const ArrayView< const double > &weights) const override
Definition manifold.cc:1030
const Tensor< 1, spacedim > dxn
const Tensor< 1, spacedim > normal_direction
const Point< spacedim > point_on_axis
const double tolerance
const Tensor< 1, spacedim > direction
double get_tolerance() const
const Point< spacedim > & get_point_on_axis() const
const Tensor< 1, spacedim > & get_direction() const
const Tensor< 1, spacedim > & get_major_axis_direction() const
const Point< spacedim > & get_center() const
double get_eccentricity() const
const Point< spacedim > center
const double eccentricity
const Tensor< 1, spacedim > direction
const double sinh_u
const double cosh_u
const double tolerance
const FunctionParser< spacedim >::ConstMap const_map
const std::string chart_vars
const std::string pull_back_expression
const std::string space_vars
const double finite_difference_step
const std::string push_forward_expression
ObserverPointer< const Function< chartdim >, FunctionManifold< dim, spacedim, chartdim > > push_forward_function
ObserverPointer< const Function< spacedim >, FunctionManifold< dim, spacedim, chartdim > > pull_back_function
std::map< std::string, double > ConstMap
virtual void get_normals_at_vertices(const typename Triangulation< dim, spacedim >::face_iterator &face, FaceVertexNormals &face_vertex_normals) const
std::array< Tensor< 1, spacedim >, GeometryInfo< dim >::vertices_per_face > FaceVertexNormals
Definition manifold.h:306
Definition point.h:113
static Tensor< 1, spacedim > get_periodicity()
virtual std::unique_ptr< Manifold< dim, spacedim > > clone() const override
virtual DerivativeForm< 1, spacedim, spacedim > push_forward_gradient(const Point< spacedim > &chart_point) const override
const Point< spacedim > center
const Point< spacedim > p_center
virtual Tensor< 1, spacedim > normal_vector(const typename Triangulation< dim, spacedim >::face_iterator &face, const Point< spacedim > &p) const override
virtual Point< spacedim > push_forward(const Point< spacedim > &chart_point) const override
virtual Point< spacedim > pull_back(const Point< spacedim > &space_point) const override
const Point< spacedim > & get_center() const
const Point< spacedim > & get_center() const
double inner_radius
double get_centerline_radius() const
double centerline_radius
double get_inner_radius() const
const Triangulation< dim, spacedim > * triangulation
boost::signals2::connection clear_signal
std::vector< internal::MappingQImplementation::InverseQuadraticApproximation< dim, spacedim > > quadratic_approximation
FlatManifold< dim > chart_manifold
std::vector< bool > coarse_cell_is_flat
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:40
#define DEAL_II_DEPRECATED_WITH_COMMENT(comment)
Definition config.h:284
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:41
STL namespace.
const ::parallel::distributed::Triangulation< dim, spacedim > * triangulation