Reference documentation for deal.II version 9.1.0-pre
manifold_lib.h
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 1999 - 2018 by the deal.II authors
4 //
5 // This file is part of the deal.II library.
6 //
7 // The deal.II library is free software; you can use it, redistribute
8 // it, and/or modify it under the terms of the GNU Lesser General
9 // Public License as published by the Free Software Foundation; either
10 // version 2.1 of the License, or (at your option) any later version.
11 // The full text of the license can be found in the file LICENSE.md at
12 // the top level directory of deal.II.
13 //
14 // ---------------------------------------------------------------------
15 
16 #ifndef dealii_manifold_lib_h
17 #define dealii_manifold_lib_h
18 
19 
20 #include <deal.II/base/config.h>
21 
22 #include <deal.II/base/function.h>
23 #include <deal.II/base/function_parser.h>
24 
25 #include <deal.II/grid/manifold.h>
26 
27 #include <boost/container/small_vector.hpp>
28 
29 DEAL_II_NAMESPACE_OPEN
30 
62 template <int dim, int spacedim = dim>
63 class PolarManifold : public ChartManifold<dim, spacedim, spacedim>
64 {
65 public:
75 
79  virtual std::unique_ptr<Manifold<dim, spacedim>>
80  clone() const override;
81 
87  virtual Point<spacedim>
88  pull_back(const Point<spacedim> &space_point) const override;
89 
95  virtual Point<spacedim>
96  push_forward(const Point<spacedim> &chart_point) const override;
97 
111  push_forward_gradient(const Point<spacedim> &chart_point) const override;
112 
117 
118 private:
123  static Tensor<1, spacedim>
124  get_periodicity();
125 };
126 
127 
128 
222 template <int dim, int spacedim = dim>
223 class SphericalManifold : public Manifold<dim, spacedim>
224 {
225 public:
230 
234  virtual std::unique_ptr<Manifold<dim, spacedim>>
235  clone() const override;
236 
244  virtual Point<spacedim>
246  const Point<spacedim> &p2,
247  const double w) const override;
248 
253  virtual Tensor<1, spacedim>
255  const Point<spacedim> &x2) const override;
256 
260  virtual Tensor<1, spacedim>
262  const typename Triangulation<dim, spacedim>::face_iterator &face,
263  const Point<spacedim> &p) const override;
264 
268  virtual void
270  const typename Triangulation<dim, spacedim>::face_iterator &face,
271  typename Manifold<dim, spacedim>::FaceVertexNormals &face_vertex_normals)
272  const override;
273 
288  virtual void
289  get_new_points(const ArrayView<const Point<spacedim>> &surrounding_points,
290  const Table<2, double> & weights,
291  ArrayView<Point<spacedim>> new_points) const override;
292 
297  virtual Point<spacedim>
298  get_new_point(const ArrayView<const Point<spacedim>> &vertices,
299  const ArrayView<const double> & weights) const override;
300 
305 
306 private:
313  std::pair<double, Tensor<1, spacedim>>
314  guess_new_point(const ArrayView<const Tensor<1, spacedim>> &directions,
315  const ArrayView<const double> & distances,
316  const ArrayView<const double> & weights) const;
317 
334  get_new_point(const ArrayView<const Tensor<1, spacedim>> &directions,
335  const ArrayView<const double> & distances,
336  const ArrayView<const double> & weights,
337  const Point<spacedim> &candidate_point) const;
338 
352  virtual void
353  get_new_points(const ArrayView<const Point<spacedim>> &surrounding_points,
354  const ArrayView<const double> & weights,
355  ArrayView<Point<spacedim>> new_points) const;
356 
361 };
362 
378 template <int dim, int spacedim = dim>
379 class CylindricalManifold : public ChartManifold<dim, spacedim, 3>
380 {
381 public:
388  CylindricalManifold(const unsigned int axis = 0,
389  const double tolerance = 1e-10);
390 
398  CylindricalManifold(const Tensor<1, spacedim> &direction,
399  const Point<spacedim> & point_on_axis,
400  const double tolerance = 1e-10);
401 
405  virtual std::unique_ptr<Manifold<dim, spacedim>>
406  clone() const override;
407 
412  virtual Point<3>
413  pull_back(const Point<spacedim> &space_point) const override;
414 
421  virtual Point<spacedim>
422  push_forward(const Point<3> &chart_point) const override;
423 
431  push_forward_gradient(const Point<3> &chart_point) const override;
432 
437  virtual Point<spacedim>
438  get_new_point(const ArrayView<const Point<spacedim>> &surrounding_points,
439  const ArrayView<const double> & weights) const override;
440 
441 protected:
446 
451 
456 
457 private:
461  double tolerance;
462 };
463 
464 
465 
482 template <int dim, int spacedim = dim, int chartdim = dim>
483 class FunctionManifold : public ChartManifold<dim, spacedim, chartdim>
484 {
485 public:
496  const Function<chartdim> & push_forward_function,
497  const Function<spacedim> & pull_back_function,
498  const Tensor<1, chartdim> &periodicity = Tensor<1, chartdim>(),
499  const double tolerance = 1e-10);
500 
516  const std::string push_forward_expression,
517  const std::string pull_back_expression,
518  const Tensor<1, chartdim> &periodicity = Tensor<1, chartdim>(),
519  const typename FunctionParser<spacedim>::ConstMap =
521  const std::string chart_vars =
523  const std::string space_vars =
525  const double tolerance = 1e-10,
526  const double h = 1e-8);
527 
531  virtual ~FunctionManifold() override;
532 
536  virtual std::unique_ptr<Manifold<dim, spacedim>>
537  clone() const override;
538 
544  virtual Point<spacedim>
545  push_forward(const Point<chartdim> &chart_point) const override;
546 
568  push_forward_gradient(const Point<chartdim> &chart_point) const override;
569 
575  virtual Point<chartdim>
576  pull_back(const Point<spacedim> &space_point) const override;
577 
578 private:
583 
590 
597 
603  const double tolerance;
604 
612  const bool owns_pointers;
613 
617  const std::string push_forward_expression;
618 
622  const std::string pull_back_expression;
623 
627  const std::string chart_vars;
628 
632  const std::string space_vars;
633 
638 };
639 
640 
641 
656 template <int dim>
657 class TorusManifold : public ChartManifold<dim, 3, 3>
658 {
659 public:
660  static const int chartdim = 3;
661  static const int spacedim = 3;
662 
668  TorusManifold(const double R, const double r);
669 
673  virtual std::unique_ptr<Manifold<dim, 3>>
674  clone() const override;
675 
679  virtual Point<3>
680  pull_back(const Point<3> &p) const override;
681 
685  virtual Point<3>
686  push_forward(const Point<3> &chart_point) const override;
687 
692  push_forward_gradient(const Point<3> &chart_point) const override;
693 
694 private:
695  double r, R;
696 };
697 
698 
699 
835 template <int dim, int spacedim = dim>
836 class TransfiniteInterpolationManifold : public Manifold<dim, spacedim>
837 {
838 public:
843 
847  virtual ~TransfiniteInterpolationManifold() override;
848 
852  virtual std::unique_ptr<Manifold<dim, spacedim>>
853  clone() const override;
854 
867  void
868  initialize(const Triangulation<dim, spacedim> &triangulation);
869 
885  virtual Point<spacedim>
886  get_new_point(const ArrayView<const Point<spacedim>> &surrounding_points,
887  const ArrayView<const double> & weights) const override;
888 
908  virtual void
909  get_new_points(const ArrayView<const Point<spacedim>> &surrounding_points,
910  const Table<2, double> & weights,
911  ArrayView<Point<spacedim>> new_points) const override;
912 
913 private:
925  std::array<unsigned int, 20>
926  get_possible_cells_around_points(
927  const ArrayView<const Point<spacedim>> &surrounding_points) const;
928 
937  compute_chart_points(
938  const ArrayView<const Point<spacedim>> &surrounding_points,
939  ArrayView<Point<dim>> chart_points) const;
940 
957  Point<dim>
959  const Point<spacedim> & p,
960  const Point<dim> &initial_guess) const;
961 
975  const Point<dim> &chart_point) const;
976 
990  const typename Triangulation<dim, spacedim>::cell_iterator &cell,
991  const Point<dim> & chart_point,
992  const Point<spacedim> &pushed_forward_chart_point) const;
993 
998 
1004 
1010  std::vector<bool> coarse_cell_is_flat;
1011 
1017 
1022  boost::signals2::connection clear_signal;
1023 };
1024 
1025 DEAL_II_NAMESPACE_CLOSE
1026 
1027 #endif
FlatManifold< dim > chart_manifold
const double tolerance
Definition: manifold_lib.h:603
static Tensor< 1, spacedim > get_periodicity()
const Triangulation< dim, spacedim > * triangulation
Definition: manifold_lib.h:997
const Point< spacedim > point_on_axis
Definition: manifold_lib.h:455
std::vector< bool > coarse_cell_is_flat
const double finite_difference_step
Definition: manifold_lib.h:637
const std::string pull_back_expression
Definition: manifold_lib.h:622
const Point< spacedim > center
Definition: manifold_lib.h:116
SmartPointer< const Function< spacedim >, FunctionManifold< dim, spacedim, chartdim > > pull_back_function
Definition: manifold_lib.h:596
PolarManifold(const Point< spacedim > center=Point< spacedim >())
const PolarManifold< spacedim > polar_manifold
Definition: manifold_lib.h:360
const std::string chart_vars
Definition: manifold_lib.h:627
virtual Point< spacedim > push_forward(const Point< spacedim > &chart_point) const override
SmartPointer< const Function< chartdim >, FunctionManifold< dim, spacedim, chartdim > > push_forward_function
Definition: manifold_lib.h:589
const Point< spacedim > center
Definition: manifold_lib.h:304
virtual void get_new_points(const ArrayView< const Point< spacedim >> &surrounding_points, const Table< 2, double > &weights, ArrayView< Point< spacedim >> new_points) const override
virtual Tensor< 1, spacedim > get_tangent_vector(const Point< spacedim > &x1, const Point< spacedim > &x2) const override
virtual Tensor< 1, spacedim > normal_vector(const typename Triangulation< dim, spacedim >::face_iterator &face, const Point< spacedim > &p) const
Definition: manifold.cc:231
virtual Point< spacedim > pull_back(const Point< spacedim > &space_point) const override
const std::string space_vars
Definition: manifold_lib.h:632
virtual Point< spacedim > get_new_point(const ArrayView< const Point< spacedim >> &surrounding_points, const ArrayView< const double > &weights) const override
const Tensor< 1, spacedim > direction
Definition: manifold_lib.h:450
const std::string push_forward_expression
Definition: manifold_lib.h:617
std::array< Tensor< 1, spacedim >, GeometryInfo< dim >::vertices_per_face > FaceVertexNormals
Definition: manifold.h:350
const Tensor< 1, spacedim > normal_direction
Definition: manifold_lib.h:445
const FunctionParser< spacedim >::ConstMap const_map
Definition: manifold_lib.h:582
boost::signals2::connection clear_signal
const bool owns_pointers
Definition: manifold_lib.h:612
virtual void get_normals_at_vertices(const typename Triangulation< dim, spacedim >::face_iterator &face, FaceVertexNormals &face_vertex_normals) const
Definition: manifold.cc:295
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
virtual Point< spacedim > get_intermediate_point(const Point< spacedim > &p1, const Point< spacedim > &p2, const double w) const override