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
manifold_lib.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) 2014 - 2025 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_manifold_lib_h
14#define dealii_manifold_lib_h
15
16
17#include <deal.II/base/config.h>
18
21
23
24#include <boost/signals2/connection.hpp>
25
26
28
29// forward declaration
30namespace internal
31{
32 namespace MappingQImplementation
33 {
34 template <int, int>
35 class InverseQuadraticApproximation;
36 }
37} // namespace internal
38
39
83template <int dim, int spacedim = dim>
84class PolarManifold : public ChartManifold<dim, spacedim, spacedim>
85{
86public:
94
98 virtual std::unique_ptr<Manifold<dim, spacedim>>
99 clone() const override;
100
105 virtual Point<spacedim>
106 pull_back(const Point<spacedim> &space_point) const override;
107
112 virtual Point<spacedim>
113 push_forward(const Point<spacedim> &chart_point) const override;
114
128 push_forward_gradient(const Point<spacedim> &chart_point) const override;
129
133 virtual Tensor<1, spacedim>
136 const Point<spacedim> &p) const override;
137
141 const Point<spacedim> &
142 get_center() const;
143
150 "Access the center with get_center() instead.")
151 const Point<spacedim> center;
152
153private:
159 const Point<spacedim> p_center;
160
165 static Tensor<1, spacedim>
167};
168
169
170
262template <int dim, int spacedim = dim>
263class SphericalManifold : public Manifold<dim, spacedim>
264{
265public:
273
277 virtual std::unique_ptr<Manifold<dim, spacedim>>
278 clone() const override;
279
287 virtual Point<spacedim>
289 const Point<spacedim> &p2,
290 const double w) const override;
291
296 virtual Tensor<1, spacedim>
298 const Point<spacedim> &x2) const override;
299
303 virtual Tensor<1, spacedim>
306 const Point<spacedim> &p) const override;
307
311 virtual void
314 typename Manifold<dim, spacedim>::FaceVertexNormals &face_vertex_normals)
315 const override;
316
331 virtual void
332 get_new_points(const ArrayView<const Point<spacedim>> &surrounding_points,
333 const Table<2, double> &weights,
334 ArrayView<Point<spacedim>> new_points) const override;
335
340 virtual Point<spacedim>
341 get_new_point(const ArrayView<const Point<spacedim>> &vertices,
342 const ArrayView<const double> &weights) const override;
343
347 const Point<spacedim> &
348 get_center() const;
349
356 "Access the center with get_center() instead.")
357 const Point<spacedim> center;
358
359private:
365 const Point<spacedim> p_center;
366
373 std::pair<double, Tensor<1, spacedim>>
374 guess_new_point(const ArrayView<const Tensor<1, spacedim>> &directions,
375 const ArrayView<const double> &distances,
376 const ArrayView<const double> &weights) const;
377
395 void
396 do_get_new_points(const ArrayView<const Point<spacedim>> &surrounding_points,
397 const ArrayView<const double> &weights,
398 ArrayView<Point<spacedim>> new_points) const;
399
403 const PolarManifold<spacedim> polar_manifold;
404};
405
419template <int dim, int spacedim = dim>
420class CylindricalManifold : public ChartManifold<dim, spacedim, 3>
421{
422public:
429 CylindricalManifold(const unsigned int axis = 0,
430 const double tolerance = 1e-10);
431
440 const Point<spacedim> &point_on_axis,
441 const double tolerance = 1e-10);
442
446 virtual std::unique_ptr<Manifold<dim, spacedim>>
447 clone() const override;
448
455 virtual Point<3>
456 pull_back(const Point<spacedim> &space_point) const override;
457
464 virtual Point<spacedim>
465 push_forward(const Point<3> &chart_point) const override;
466
474 push_forward_gradient(const Point<3> &chart_point) const override;
475
480 virtual Point<spacedim>
481 get_new_point(const ArrayView<const Point<spacedim>> &surrounding_points,
482 const ArrayView<const double> &weights) const override;
483
487 const Tensor<1, spacedim> &
488 get_direction() const;
489
496 const Point<spacedim> &
497 get_point_on_axis() const;
498
502 double
503 get_tolerance() const;
504
505private:
510
515
520
524 const double tolerance;
525
530};
531
563template <int dim, int spacedim = dim>
564class EllipticalManifold : public ChartManifold<dim, spacedim, spacedim>
565{
566public:
579 const Tensor<1, spacedim> &major_axis_direction,
580 const double eccentricity);
581
582 virtual std::unique_ptr<Manifold<dim, spacedim>>
583 clone() const override;
584
588 virtual Point<spacedim>
589 pull_back(const Point<spacedim> &space_point) const override;
590
594 virtual Point<spacedim>
595 push_forward(const Point<spacedim> &chart_point) const override;
596
601 push_forward_gradient(const Point<spacedim> &chart_point) const override;
602
606 const Tensor<1, spacedim> &
607 get_major_axis_direction() const;
608
612 const Point<spacedim> &
613 get_center() const;
614
618 double
619 get_eccentricity() const;
620
621private:
626
631
635 const double eccentricity;
636
640 const double cosh_u;
641 const double sinh_u;
642
650 get_periodicity();
651};
652
653
668template <int dim, int spacedim = dim, int chartdim = dim>
669class FunctionManifold : public ChartManifold<dim, spacedim, chartdim>
670{
671public:
686 const Function<chartdim> &push_forward_function,
687 const Function<spacedim> &pull_back_function,
688 const Tensor<1, chartdim> &periodicity = Tensor<1, chartdim>(),
689 const double tolerance = 1e-10);
690
703 std::unique_ptr<Function<chartdim>> push_forward,
704 std::unique_ptr<Function<spacedim>> pull_back,
705 const Tensor<1, chartdim> &periodicity = Tensor<1, chartdim>(),
706 const double tolerance = 1e-10);
707
723 const std::string push_forward_expression,
724 const std::string pull_back_expression,
725 const Tensor<1, chartdim> &periodicity = Tensor<1, chartdim>(),
728 const std::string chart_vars =
730 const std::string space_vars =
732 const double tolerance = 1e-10,
733 const double h = 1e-8);
734
738 virtual ~FunctionManifold() override;
739
743 virtual std::unique_ptr<Manifold<dim, spacedim>>
744 clone() const override;
745
751 virtual Point<spacedim>
752 push_forward(const Point<chartdim> &chart_point) const override;
753
775 push_forward_gradient(const Point<chartdim> &chart_point) const override;
776
782 virtual Point<chartdim>
783 pull_back(const Point<spacedim> &space_point) const override;
784
785private:
790
797
804
810 const double tolerance;
811
820
824 const std::string push_forward_expression;
825
829 const std::string pull_back_expression;
830
834 const std::string chart_vars;
835
839 const std::string space_vars;
840
845};
846
847
848
861template <int dim>
862class TorusManifold : public ChartManifold<dim, 3, 3>
863{
864public:
865 static const int chartdim = 3;
866 static const int spacedim = 3;
867
873 TorusManifold(const double centerline_radius, const double inner_radius);
874
878 virtual std::unique_ptr<Manifold<dim, 3>>
879 clone() const override;
880
884 virtual Point<3>
885 pull_back(const Point<3> &p) const override;
886
890 virtual Point<3>
891 push_forward(const Point<3> &chart_point) const override;
892
897 push_forward_gradient(const Point<3> &chart_point) const override;
898
902 double
903 get_centerline_radius() const;
904
908 double
909 get_inner_radius() const;
910
911private:
913
915};
916
917
918
1056template <int dim, int spacedim = dim>
1057class TransfiniteInterpolationManifold : public Manifold<dim, spacedim>
1058{
1059public:
1064
1068 virtual ~TransfiniteInterpolationManifold() override;
1069
1073 virtual std::unique_ptr<Manifold<dim, spacedim>>
1074 clone() const override;
1075
1088 void
1089 initialize(const Triangulation<dim, spacedim> &triangulation);
1090
1106 virtual Point<spacedim>
1107 get_new_point(const ArrayView<const Point<spacedim>> &surrounding_points,
1108 const ArrayView<const double> &weights) const override;
1109
1129 virtual void
1130 get_new_points(const ArrayView<const Point<spacedim>> &surrounding_points,
1131 const Table<2, double> &weights,
1132 ArrayView<Point<spacedim>> new_points) const override;
1133
1134private:
1146 std::array<unsigned int, 20>
1147 get_possible_cells_around_points(
1148 const ArrayView<const Point<spacedim>> &surrounding_points) const;
1149
1158 compute_chart_points(
1159 const ArrayView<const Point<spacedim>> &surrounding_points,
1160 ArrayView<Point<dim>> chart_points) const;
1161
1179 pull_back(const typename Triangulation<dim, spacedim>::cell_iterator &cell,
1180 const Point<spacedim> &p,
1181 const Point<dim> &initial_guess) const;
1182
1195 push_forward(const typename Triangulation<dim, spacedim>::cell_iterator &cell,
1196 const Point<dim> &chart_point) const;
1197
1210 push_forward_gradient(
1212 const Point<dim> &chart_point,
1213 const Point<spacedim> &pushed_forward_chart_point) const;
1214
1219
1225
1231 std::vector<bool> coarse_cell_is_flat;
1232
1238
1243 std::vector<internal::MappingQImplementation::
1244 InverseQuadraticApproximation<dim, spacedim>>
1246
1251 boost::signals2::connection clear_signal;
1252};
1253
1254/*----------------------------- inline functions -----------------------------*/
1255
1256template <int dim, int spacedim>
1257inline const Point<spacedim> &
1262
1263
1264
1265template <int dim, int spacedim>
1266inline const Point<spacedim> &
1271
1272
1273
1274template <int dim, int spacedim>
1275inline const Tensor<1, spacedim> &
1277{
1278 return direction;
1279}
1280
1281
1282
1283template <int dim, int spacedim>
1284inline const Point<spacedim> &
1286{
1287 return point_on_axis;
1288}
1289
1290
1291
1292template <int dim, int spacedim>
1293inline double
1295{
1296 return tolerance;
1297}
1298
1299
1300
1301template <int dim, int spacedim>
1302inline const Tensor<1, spacedim> &
1304{
1305 return direction;
1306}
1307
1308
1309
1310template <int dim, int spacedim>
1311inline const Point<spacedim> &
1316
1317
1318
1319template <int dim, int spacedim>
1320inline double
1322{
1323 return eccentricity;
1324}
1325
1326
1327
1328template <int dim>
1329inline double
1331{
1332 return centerline_radius;
1333}
1334
1335
1336
1337template <int dim>
1338inline double
1340{
1341 return inner_radius;
1342}
1343
1345
1346#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:1056
virtual Tensor< 1, spacedim > get_tangent_vector(const Point< spacedim > &x1, const Point< spacedim > &x2) const override
Definition manifold.cc:1095
virtual Point< spacedim > get_intermediate_point(const Point< spacedim > &p1, const Point< spacedim > &p2, const double w) const override
Definition manifold.cc:1021
virtual Point< spacedim > get_new_point(const ArrayView< const Point< spacedim > > &surrounding_points, const ArrayView< const double > &weights) const override
Definition manifold.cc:1035
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:304
Definition point.h:111
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:38
#define DEAL_II_DEPRECATED_WITH_COMMENT(comment)
Definition config.h:295
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
STL namespace.