]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Fixed failing tests.
authorLuca Heltai <luca.heltai@sissa.it>
Sun, 8 Apr 2018 08:25:50 +0000 (10:25 +0200)
committerLuca Heltai <luca.heltai@sissa.it>
Mon, 9 Apr 2018 12:32:21 +0000 (14:32 +0200)
26 files changed:
examples/step-53/step-53.cc
include/deal.II/grid/composition_manifold.h
include/deal.II/grid/manifold_lib.h
include/deal.II/grid/tensor_product_manifold.h
source/grid/grid_tools.cc
source/grid/manifold.cc
source/grid/manifold_lib.cc
tests/bits/distorted_cells_06.cc
tests/grid/grid_test.cc
tests/manifold/chart_manifold_01.cc
tests/manifold/chart_manifold_01_embedded.cc
tests/manifold/chart_manifold_02.cc
tests/manifold/chart_manifold_02_embedded.cc
tests/manifold/chart_manifold_03.cc
tests/manifold/chart_manifold_04.cc
tests/manifold/chart_manifold_04_embedded.cc
tests/manifold/chart_manifold_05.cc
tests/manifold/chart_manifold_05_embedded.cc
tests/manifold/chart_manifold_06.cc
tests/manifold/chart_manifold_06_embedded.cc
tests/manifold/chart_manifold_07.cc
tests/manifold/chart_manifold_08.cc
tests/manifold/projection_manifold_01.cc
tests/manifold/transfinite_manifold_05.cc
tests/mappings/mapping_q_convergence.cc
tests/mappings/mapping_q_manifold_01.cc

index eb2035251776038dffdc23264ed5feaa8ce9d7e5..e8d4a9b2ceb8370ee67ce770ddb798f0fe372a2f 100644 (file)
 #include <boost/iostreams/filter/gzip.hpp>
 #include <boost/iostreams/device/file.hpp>
 
+// The last include file is required because we will be using a feature that is
+// not part of the cxx11 standard. The deal.II library, however, can be installed
+// with a cxx11 compliant compiler, without assuming that cxx14 or cxx17 features are
+// available. As some of these features are very useful, we provide their
+// implementation in an internal namespace, if the compiler does not support them:
+#include <deal.II/base/std_cxx14/memory.h>
+
 #include <iostream>
 #include <fstream>
 
@@ -254,11 +261,18 @@ namespace Step53
 
 
   // This function is required by the interface of the Manifold base
-  // class, and allows you to clone the AfricaGeometry class:
+  // class, and allows you to clone the AfricaGeometry class. This is
+  // where we use a feature that is only available in cxx14, namely the
+  // make_unique function, that simplifies the creation of
+  // std::unique_ptr objects. Notice that, while the function returns a
+  // std::unique_ptr<Manifold<3,3> >, we internally create a
+  // unique_ptr<AfricaGeometry>. C++11 knows how to handle these cases,
+  // and is able to transform a unique pointer to a derived class to a
+  // unique pointer to its base class automatically:
   std::unique_ptr<Manifold<3,3> >
   AfricaGeometry::clone() const
   {
-    return std::unique_ptr<Manifold<3,3> >(new AfricaGeometry());
+    return std_cxx14::make_unique<AfricaGeometry>();
   }
 
 
index 02b81642246a36e887ebad024fb54f1af617d116..da5ca095620e72be5639e78e65ff64e2ea999b46 100644 (file)
@@ -25,6 +25,7 @@
 #include <deal.II/base/thread_management.h>
 #include <deal.II/base/point.h>
 #include <deal.II/base/derivative_form.h>
+#include <deal.II/base/std_cxx14/memory.h>
 #include <deal.II/grid/tria.h>
 #include <deal.II/grid/tria_iterator.h>
 #include <deal.II/grid/tria_accessor.h>
@@ -75,6 +76,11 @@ public:
   CompositionManifold(const ChartManifold<dim1, intermediate_dim, chartdim> &F,
                       const ChartManifold<dim2, spacedim, intermediate_dim> &G);
 
+  /**
+   * Make a clone of this Manifold.
+   */
+  virtual std::unique_ptr<Manifold<dim, spacedim> > clone() const override;
+
   /**
    * Pull back the given point in spacedim to the Euclidean chartdim
    * dimensional space. This function calls the pull_back() function
@@ -135,6 +141,14 @@ CompositionManifold<dim,spacedim,chartdim,intermediate_dim,dim1,dim2>::Compositi
 }
 
 
+template <int dim, int spacedim, int chartdim, int intermediate_dim,
+          int dim1, int dim2>
+std::unique_ptr<Manifold<dim,spacedim> >
+CompositionManifold<dim,spacedim,chartdim,intermediate_dim,dim1,dim2>::clone() const
+{
+  return std_cxx14::make_unique<CompositionManifold<dim,spacedim,chartdim,intermediate_dim,dim1,dim2> >(*F, *G);
+}
+
 
 template <int dim, int spacedim, int chartdim, int intermediate_dim,
           int dim1, int dim2>
index 4fd7cf0b6109cd87d569d0a45ca3f70491c54dae..6756e2176162ba4ce2f5523a21979be85a1757b3 100644 (file)
@@ -993,7 +993,7 @@ private:
   std::vector<bool> coarse_cell_is_flat;
 
   /**
-   * A flat manifold used to compute new points in the chart space where it we
+   * A flat manifold used to compute new points in the chart space where we
    * use a FlatManifold description.
    */
   FlatManifold<dim> chart_manifold;
index 3253b3d34d316cb1b3e38ccc52b74dc4a19bc811..34fa3b6a5ee4158dbae773b67f056a8931b16533 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <deal.II/base/config.h>
 #include <deal.II/base/subscriptor.h>
+#include <deal.II/base/std_cxx14/memory.h>
 #include <deal.II/base/point.h>
 #include <deal.II/grid/manifold.h>
 
@@ -82,26 +83,32 @@ public:
     const ChartManifold<dim_A, spacedim_A, chartdim_A> &manifold_A,
     const ChartManifold<dim_B, spacedim_B, chartdim_B> &manifold_B);
 
+  /**
+   * Clone this manifold.
+   */
+  virtual std::unique_ptr<Manifold<dim,spacedim_A+spacedim_B> >
+  clone() const override;
+
   /**
    * Pull back operation.
    */
   virtual
   Point<chartdim>
-  pull_back(const Point<spacedim> &space_point) const;
+  pull_back(const Point<spacedim> &space_point) const override;
 
   /**
    * Push forward operation.
    */
   virtual
   Point<spacedim>
-  push_forward(const Point<chartdim> &chart_point) const;
+  push_forward(const Point<chartdim> &chart_point) const override;
 
   /**
    * Gradient.
    */
   virtual
   DerivativeForm<1,chartdim,spacedim>
-  push_forward_gradient(const Point<chartdim> &chart_point) const;
+  push_forward_gradient(const Point<chartdim> &chart_point) const override;
 
 private:
   SmartPointer<const ChartManifold<dim_A, spacedim_A, chartdim_A>,
@@ -170,6 +177,16 @@ TensorProductManifold<dim, dim_A, spacedim_A, chartdim_A, dim_B, spacedim_B, cha
   manifold_B (&manifold_B)
 {}
 
+template <int dim,
+          int dim_A, int spacedim_A, int chartdim_A,
+          int dim_B, int spacedim_B, int chartdim_B>
+std::unique_ptr<Manifold<dim,spacedim_A+spacedim_B> >
+TensorProductManifold<dim, dim_A, spacedim_A, chartdim_A, dim_B, spacedim_B, chartdim_B>::clone() const
+{
+  return std_cxx14::make_unique<TensorProductManifold<dim, dim_A, spacedim_A, chartdim_A, dim_B, spacedim_B, chartdim_B> >
+         (*manifold_A, *manifold_B);
+}
+
 template <int dim,
           int dim_A, int spacedim_A, int chartdim_A,
           int dim_B, int spacedim_B, int chartdim_B>
index 71d05f6dc40af719b042282c940afa3e80de1062..803ab44fd747a6eb4fc6a069ff895e08c390a8b5 100644 (file)
@@ -3681,11 +3681,11 @@ next_cell:
 
     // Save manifolds
     auto manifold_ids = tria.get_manifold_ids();
-    std::map<types::manifold_id, const Manifold<dim,spacedim>*> manifolds;
+    std::map<types::manifold_id, std::unique_ptr<Manifold<dim,spacedim> > > manifolds;
     // Set manifolds in new Triangulation
     for (auto manifold_id: manifold_ids)
       if (manifold_id != numbers::invalid_manifold_id)
-        manifolds[manifold_id] = &tria.get_manifold(manifold_id);
+        manifolds[manifold_id] = tria.get_manifold(manifold_id).clone();
 
     tria.clear();
 
index 94b0f266e2f9290ea24dd2a552895212f40c997e..2692746c6312394227965a154d3fbdb81a24a0d3 100644 (file)
@@ -15,6 +15,7 @@
 
 #include <deal.II/base/tensor.h>
 #include <deal.II/base/table.h>
+#include <deal.II/base/std_cxx14/memory.h>
 #include <deal.II/grid/manifold.h>
 #include <deal.II/grid/tria.h>
 #include <deal.II/grid/tria_iterator.h>
@@ -516,7 +517,7 @@ template<int dim, int spacedim>
 std::unique_ptr<Manifold<dim, spacedim> >
 FlatManifold<dim,spacedim>::clone() const
 {
-  return std::unique_ptr<Manifold<dim,spacedim> >(new FlatManifold<dim,spacedim>(periodicity, tolerance));
+  return std_cxx14::make_unique<FlatManifold<dim,spacedim> >(periodicity, tolerance);
 }
 
 
index 36dff043d27a8efb0397bf6ad327fb43c6c4ebbd..ea5f129b645ea3a78efe712a467bc5d097f7295a 100644 (file)
@@ -15,6 +15,7 @@
 
 #include <deal.II/base/tensor.h>
 #include <deal.II/base/table.h>
+#include <deal.II/base/std_cxx14/memory.h>
 #include <deal.II/grid/tria.h>
 #include <deal.II/grid/tria_iterator.h>
 #include <deal.II/grid/tria_accessor.h>
@@ -126,7 +127,7 @@ template<int dim, int spacedim>
 std::unique_ptr<Manifold<dim, spacedim> >
 PolarManifold<dim,spacedim>::clone() const
 {
-  return std::unique_ptr<Manifold<dim,spacedim> >(new PolarManifold<dim,spacedim>(center));
+  return std_cxx14::make_unique<PolarManifold<dim,spacedim> >(center);
 }
 
 
@@ -281,7 +282,7 @@ template<int dim, int spacedim>
 std::unique_ptr<Manifold<dim, spacedim> >
 SphericalManifold<dim,spacedim>::clone() const
 {
-  return std::unique_ptr<Manifold<dim,spacedim> >(new SphericalManifold<dim,spacedim>(center));
+  return std_cxx14::make_unique<SphericalManifold<dim,spacedim> >(center);
 }
 
 
@@ -970,8 +971,7 @@ template<int dim, int spacedim>
 std::unique_ptr<Manifold<dim, spacedim> >
 CylindricalManifold<dim,spacedim>::clone() const
 {
-  return std::unique_ptr<Manifold<dim,spacedim> >
-         (new CylindricalManifold<dim,spacedim>(direction, point_on_axis, tolerance));
+  return std_cxx14::make_unique<CylindricalManifold<dim,spacedim> >(direction, point_on_axis, tolerance);
 }
 
 
@@ -1165,24 +1165,32 @@ template<int dim, int spacedim, int chartdim>
 std::unique_ptr<Manifold<dim, spacedim> >
 FunctionManifold<dim,spacedim,chartdim>::clone() const
 {
+  // This manifold can be constructed either by providing an expression for the
+  // push forward and the pull back charts, or by providing two Function
+  // objects. In the first case, the push_forward and pull_back functions are
+  // created internally in FunctionManifold, and destroyed when this object is
+  // deleted. We need to make sure that our cloned object is constructed in the
+  // same way this class was constructed, and that its internal Function
+  // pointers point either to the same Function objects used to construct this
+  // function (owns_pointers == false) or that the newly generated manifold
+  // creates internally the push_forward and pull_back functions using the same
+  // expressions that were used to construct this class (own_pointers == true).
   if (owns_pointers == true)
     {
-      return std::unique_ptr<Manifold<dim,spacedim> >
-             (new FunctionManifold<dim,spacedim,chartdim>(push_forward_expression,
-                                                          pull_back_expression,
-                                                          this->get_periodicity(),
-                                                          const_map,
-                                                          chart_vars,
-                                                          space_vars,
-                                                          tolerance,
-                                                          finite_difference_step));
+      return std_cxx14::make_unique<FunctionManifold<dim,spacedim,chartdim> >(push_forward_expression,
+             pull_back_expression,
+             this->get_periodicity(),
+             const_map,
+             chart_vars,
+             space_vars,
+             tolerance,
+             finite_difference_step);
     }
   else
-    return std::unique_ptr<Manifold<dim,spacedim> >
-           (new FunctionManifold<dim,spacedim,chartdim>(*push_forward_function,
-                                                        *pull_back_function,
-                                                        this->get_periodicity(),
-                                                        tolerance));
+    return std_cxx14::make_unique<FunctionManifold<dim,spacedim,chartdim> >(*push_forward_function,
+           *pull_back_function,
+           this->get_periodicity(),
+           tolerance);
 }
 
 
@@ -1293,7 +1301,7 @@ template<int dim>
 std::unique_ptr<Manifold<dim, 3> >
 TorusManifold<dim>::clone() const
 {
-  return std::unique_ptr<Manifold<dim,3> >(new TorusManifold<dim>(R,r));
+  return std_cxx14::make_unique<TorusManifold<dim> >(R,r);
 }
 
 
index f55a9061c7b98e16b734ad192c289743979a5fcd..4cb3fda265b77e4e4257f1812d2e10f9b6ac7812 100644 (file)
 template <int dim>
 class MyManifold : public Manifold<dim>
 {
+  virtual std::unique_ptr<Manifold<dim> > clone() const override
+  {
+    return std::unique_ptr<Manifold<dim> >(new MyManifold<dim>());
+  }
+
   virtual Point<dim>
   get_new_point_on_line (const typename Triangulation<dim>::line_iterator &line) const
   {
index d31ee45a930c7cde214d5731530586e99ad7c9b7..ee86071797aabe99e01a8c2086968a94edf8cce0 100644 (file)
@@ -38,7 +38,7 @@ class Ball :
 public:
   virtual Point<dim>
   get_new_point (const ArrayView<const Point<dim>> &surrounding_points,
-                 const ArrayView<const double>     &weights) const
+                 const ArrayView<const double>     &weights) const override
   {
     Point<dim> middle = FlatManifold<dim>::get_new_point(surrounding_points, weights);
 
@@ -50,6 +50,11 @@ public:
 
     return middle;
   }
+
+  virtual std::unique_ptr<Manifold<dim,dim> > clone() const override
+  {
+    return std::unique_ptr<Manifold<dim,dim> >(new Ball<dim>());
+  }
 };
 
 
index b0823e650564b109b9ad46824e5fd3bdddb6cd90..e1d5943d3d29acd498975fbf89e8710e1c00492c 100644 (file)
@@ -29,9 +29,15 @@ template <int dim, int spacedim>
 class MyFlatManifold : public ChartManifold<dim,spacedim,spacedim>
 {
 public:
+  virtual std::unique_ptr<Manifold<dim,spacedim> >
+  clone () const override
+  {
+    return std::unique_ptr<Manifold<dim,spacedim> >(new MyFlatManifold());
+  }
+
   virtual
   Point<spacedim>
-  pull_back(const Point<spacedim> &space_point) const
+  pull_back(const Point<spacedim> &space_point) const override
   {
     return space_point;
   }
@@ -39,14 +45,14 @@ public:
 
   virtual
   Point<spacedim>
-  push_forward(const Point<spacedim> &chart_point) const
+  push_forward(const Point<spacedim> &chart_point) const override
   {
     return chart_point;
   }
 
   virtual
   DerivativeForm<1,spacedim,spacedim>
-  push_forward_gradient(const Point<spacedim> &chart_point) const
+  push_forward_gradient(const Point<spacedim> &chart_point) const override
   {
     DerivativeForm<1,spacedim,spacedim> x;
     for (unsigned int d=0; d<spacedim; ++d)
index caccf3750f1c73719c993d71ed054f6d6c2d8bde..33c57b7b74f65337473e2321131c4fadd5af482f 100644 (file)
@@ -31,9 +31,15 @@ template <int dim, int spacedim>
 class MyFlatManifold : public ChartManifold<dim,spacedim,spacedim+1>
 {
 public:
+  virtual std::unique_ptr<Manifold<dim,spacedim> >
+  clone () const override
+  {
+    return std::unique_ptr<Manifold<dim,spacedim> >(new MyFlatManifold());
+  }
+
   virtual
   Point<spacedim+1>
-  pull_back(const Point<spacedim> &space_point) const
+  pull_back(const Point<spacedim> &space_point) const override
   {
     Point<spacedim+1> p;
     for (unsigned int d=0; d<spacedim; ++d)
@@ -44,7 +50,7 @@ public:
 
   virtual
   Point<spacedim>
-  push_forward(const Point<spacedim+1> &chart_point) const
+  push_forward(const Point<spacedim+1> &chart_point) const override
   {
     Point<spacedim> p;
     for (unsigned int d=0; d<spacedim; ++d)
@@ -54,7 +60,7 @@ public:
 
   virtual
   DerivativeForm<1,spacedim+1,spacedim>
-  push_forward_gradient(const Point<spacedim+1> &chart_point) const
+  push_forward_gradient(const Point<spacedim+1> &chart_point) const override
   {
     DerivativeForm<1,spacedim+1,spacedim> x;
     for (unsigned int d=0; d<spacedim; ++d)
index 7711e12d13e6cecb770df304b6a64e0643e327aa..d60293f45ee2b54f8084580be4810cd817a806de 100644 (file)
@@ -31,24 +31,30 @@ template <int dim, int spacedim>
 class MyFlatManifold : public ChartManifold<dim,spacedim,spacedim>
 {
 public:
+  virtual
+  std::unique_ptr<Manifold<dim,spacedim> >
+  clone() const override
+  {
+    return std::unique_ptr<Manifold<dim,spacedim> >(new MyFlatManifold<dim,spacedim>());
+  }
+
   virtual
   Point<spacedim>
-  pull_back(const Point<spacedim> &space_point) const
+  pull_back(const Point<spacedim> &space_point) const override
   {
     return space_point;
   }
 
-
   virtual
   Point<spacedim>
-  push_forward(const Point<spacedim> &chart_point) const
+  push_forward(const Point<spacedim> &chart_point) const override
   {
     return chart_point;
   }
 
   virtual
   DerivativeForm<1,spacedim,spacedim>
-  push_forward_gradient(const Point<spacedim> &chart_point) const
+  push_forward_gradient(const Point<spacedim> &chart_point) const override
   {
     DerivativeForm<1,spacedim,spacedim> x;
     for (unsigned int d=0; d<spacedim; ++d)
index d509424db5627cb2a1eebf72c188e02d86bcf55c..041dcec4e9363863ec831db8f287839adf02a004 100644 (file)
@@ -33,9 +33,16 @@ template <int dim, int spacedim>
 class MyFlatManifold : public ChartManifold<dim,spacedim,spacedim+1>
 {
 public:
+
+  virtual std::unique_ptr<Manifold<dim,spacedim> >
+  clone () const override
+  {
+    return std::unique_ptr<Manifold<dim,spacedim> >(new MyFlatManifold());
+  }
+
   virtual
   Point<spacedim+1>
-  pull_back(const Point<spacedim> &space_point) const
+  pull_back(const Point<spacedim> &space_point) const override
   {
     Point<spacedim+1> p;
     for (unsigned int d=0; d<spacedim; ++d)
@@ -46,7 +53,7 @@ public:
 
   virtual
   Point<spacedim>
-  push_forward(const Point<spacedim+1> &chart_point) const
+  push_forward(const Point<spacedim+1> &chart_point) const override
   {
     Point<spacedim> p;
     for (unsigned int d=0; d<spacedim; ++d)
@@ -56,7 +63,7 @@ public:
 
   virtual
   DerivativeForm<1,spacedim+1,spacedim>
-  push_forward_gradient(const Point<spacedim+1> &chart_point) const
+  push_forward_gradient(const Point<spacedim+1> &chart_point) const override
   {
     DerivativeForm<1,spacedim+1,spacedim> x;
     for (unsigned int d=0; d<spacedim; ++d)
index 7f35f38c035493a6006aea3fb3d3a0706da8a246..6b5d13eae7546b7bfa901991c2690b3de79b218b 100644 (file)
@@ -34,10 +34,15 @@ public:
     ChartManifold<dim,spacedim,spacedim> (periodicity)
   {}
 
+  virtual std::unique_ptr<Manifold<dim,spacedim> >
+  clone () const override
+  {
+    return std::unique_ptr<Manifold<dim,spacedim> >(new MyFlatManifold(this->get_periodicity()));
+  }
 
   virtual
   Point<spacedim>
-  pull_back(const Point<spacedim> &space_point) const
+  pull_back(const Point<spacedim> &space_point) const override
   {
     return space_point;
   }
@@ -45,14 +50,14 @@ public:
 
   virtual
   Point<spacedim>
-  push_forward(const Point<spacedim> &chart_point) const
+  push_forward(const Point<spacedim> &chart_point) const override
   {
     return chart_point;
   }
 
   virtual
   DerivativeForm<1,spacedim,spacedim>
-  push_forward_gradient(const Point<spacedim> &chart_point) const
+  push_forward_gradient(const Point<spacedim> &chart_point) const override
   {
     DerivativeForm<1,spacedim,spacedim> x;
     for (unsigned int d=0; d<spacedim; ++d)
index 15e130ca28d14d1e8db7342869bd02d13145ab42..4256d9f4ad7a379d7454743bd6db84e05b2353a1 100644 (file)
@@ -34,9 +34,15 @@ template <int dim, int spacedim>
 class MyFlatManifold : public ChartManifold<dim,spacedim,spacedim>
 {
 public:
+  virtual std::unique_ptr<Manifold<dim,spacedim> >
+  clone () const override
+  {
+    return std::unique_ptr<Manifold<dim,spacedim> >(new MyFlatManifold());
+  }
+
   virtual
   Point<spacedim>
-  pull_back(const Point<spacedim> &space_point) const
+  pull_back(const Point<spacedim> &space_point) const override
   {
     return space_point;
   }
@@ -44,14 +50,14 @@ public:
 
   virtual
   Point<spacedim>
-  push_forward(const Point<spacedim> &chart_point) const
+  push_forward(const Point<spacedim> &chart_point) const override
   {
     return chart_point;
   }
 
   virtual
   DerivativeForm<1,spacedim,spacedim>
-  push_forward_gradient(const Point<spacedim> &chart_point) const
+  push_forward_gradient(const Point<spacedim> &chart_point) const override
   {
     DerivativeForm<1,spacedim,spacedim> x;
     for (unsigned int d=0; d<spacedim; ++d)
index ef2bffe2b7aa75dac4714c201fe640bb292cae1e..28621a7571fd1ff00caa380fc9b6eb5b09c71996 100644 (file)
@@ -36,9 +36,16 @@ template <int dim, int spacedim>
 class MyFlatManifold : public ChartManifold<dim,spacedim,spacedim+1>
 {
 public:
+  std::unique_ptr<Manifold<dim,spacedim> >
+  clone () const override
+  {
+    return std::unique_ptr<Manifold<dim,spacedim> >(new MyFlatManifold());
+  }
+
+
   virtual
   Point<spacedim+1>
-  pull_back(const Point<spacedim> &space_point) const
+  pull_back(const Point<spacedim> &space_point) const override
   {
     Point<spacedim+1> p;
     for (unsigned int d=0; d<spacedim; ++d)
@@ -49,7 +56,7 @@ public:
 
   virtual
   Point<spacedim>
-  push_forward(const Point<spacedim+1> &chart_point) const
+  push_forward(const Point<spacedim+1> &chart_point) const override
   {
     Point<spacedim> p;
     for (unsigned int d=0; d<spacedim; ++d)
@@ -59,7 +66,7 @@ public:
 
   virtual
   DerivativeForm<1,spacedim+1,spacedim>
-  push_forward_gradient(const Point<spacedim+1> &chart_point) const
+  push_forward_gradient(const Point<spacedim+1> &chart_point) const override
   {
     DerivativeForm<1,spacedim+1,spacedim> x;
     for (unsigned int d=0; d<spacedim; ++d)
index d85417c9469c43a5fd8cb1e9b2aa27ee6d043e7c..20b818d20c0fd29c32a71b9ffcc04ea23ad4caea 100644 (file)
@@ -21,9 +21,15 @@ template <int dim, int spacedim>
 class MyFlatManifold : public ChartManifold<dim,spacedim,spacedim>
 {
 public:
+  virtual std::unique_ptr<Manifold<dim,spacedim> >
+  clone () const override
+  {
+    return std::unique_ptr<Manifold<dim,spacedim> >(new MyFlatManifold());
+  }
+
   virtual
   Point<spacedim>
-  pull_back(const Point<spacedim> &space_point) const
+  pull_back(const Point<spacedim> &space_point) const override
   {
     return space_point;
   }
@@ -31,14 +37,14 @@ public:
 
   virtual
   Point<spacedim>
-  push_forward(const Point<spacedim> &chart_point) const
+  push_forward(const Point<spacedim> &chart_point) const override
   {
     return chart_point;
   }
 
   virtual
   DerivativeForm<1,spacedim,spacedim>
-  push_forward_gradient(const Point<spacedim> &chart_point) const
+  push_forward_gradient(const Point<spacedim> &chart_point) const override
   {
     DerivativeForm<1,spacedim,spacedim> x;
     for (unsigned int d=0; d<spacedim; ++d)
index 817f88b94537c2e0ba4f64cece1ee9cd3df2ecca..23e07a5875c4a9444aa1a2823130b34d4f08006a 100644 (file)
@@ -23,9 +23,15 @@ template <int dim, int spacedim>
 class MyFlatManifold : public ChartManifold<dim,spacedim,spacedim>
 {
 public:
+  virtual std::unique_ptr<Manifold<dim,spacedim> >
+  clone () const override
+  {
+    return std::unique_ptr<Manifold<dim,spacedim> >(new MyFlatManifold());
+  }
+
   virtual
   Point<spacedim>
-  pull_back(const Point<spacedim> &space_point) const
+  pull_back(const Point<spacedim> &space_point) const override
   {
     Point<spacedim> p;
     for (unsigned int d=0; d<spacedim; ++d)
@@ -36,7 +42,7 @@ public:
 
   virtual
   Point<spacedim>
-  push_forward(const Point<spacedim> &chart_point) const
+  push_forward(const Point<spacedim> &chart_point) const override
   {
     Point<spacedim> p;
     for (unsigned int d=0; d<spacedim; ++d)
@@ -46,7 +52,7 @@ public:
 
   virtual
   DerivativeForm<1,spacedim,spacedim>
-  push_forward_gradient(const Point<spacedim> &chart_point) const
+  push_forward_gradient(const Point<spacedim> &chart_point) const override
   {
     DerivativeForm<1,spacedim,spacedim> x;
     for (unsigned int d=0; d<spacedim; ++d)
index 4b74bafceb788b43e42046e1c1872435e1aeb252..98e744d1426c2d5dbbb9f14b502bfaaf18bcf509 100644 (file)
@@ -28,6 +28,13 @@ public:
   {}
 
 
+  virtual std::unique_ptr<Manifold<dim,spacedim> >
+  clone () const override
+  {
+    return std::unique_ptr<Manifold<dim,spacedim> >(new MyFlatManifold(this->get_periodicity()));
+  }
+
+
   virtual
   Point<spacedim>
   pull_back(const Point<spacedim> &space_point) const
index afcf21d7d03160a8953cac00275fe3c3bdd502bf..c082491410fee1bbb15f882b723ab3183e70d99d 100644 (file)
@@ -27,9 +27,15 @@ public:
     ChartManifold<dim,spacedim,spacedim>(periodicity)
   {}
 
+  virtual std::unique_ptr<Manifold<dim,spacedim> >
+  clone () const override
+  {
+    return std::unique_ptr<Manifold<dim,spacedim> >(new MyFlatManifold(this->get_periodicity()));
+  }
+
   virtual
   Point<spacedim>
-  pull_back(const Point<spacedim> &space_point) const
+  pull_back(const Point<spacedim> &space_point) const override
   {
     Point<spacedim> p;
     for (unsigned int d=0; d<spacedim; ++d)
@@ -40,7 +46,7 @@ public:
 
   virtual
   Point<spacedim>
-  push_forward(const Point<spacedim> &chart_point) const
+  push_forward(const Point<spacedim> &chart_point) const override
   {
     Point<spacedim> p;
     for (unsigned int d=0; d<spacedim; ++d)
@@ -50,7 +56,7 @@ public:
 
   virtual
   DerivativeForm<1,spacedim,spacedim>
-  push_forward_gradient(const Point<spacedim> &chart_point) const
+  push_forward_gradient(const Point<spacedim> &chart_point) const override
   {
     DerivativeForm<1,spacedim,spacedim> x;
     for (unsigned int d=0; d<spacedim; ++d)
index e333f46c17bddffc7edf308d473b918f8fd5c8fd..a2c2956dcee1d83fca42db250c33427b92691b4c 100644 (file)
@@ -32,9 +32,16 @@ public:
   {}
 
 
+  virtual std::unique_ptr<Manifold<dim,spacedim> >
+  clone () const override
+  {
+    return std::unique_ptr<Manifold<dim,spacedim> >(new MyCylinderManifold());
+  }
+
+
   virtual
   Point<spacedim>
-  pull_back(const Point<spacedim> &space_point) const
+  pull_back(const Point<spacedim> &space_point) const override
   {
     const double x = space_point[0];
     const double y = space_point[1];
@@ -51,7 +58,7 @@ public:
 
   virtual
   Point<spacedim>
-  push_forward(const Point<spacedim> &chart_point) const
+  push_forward(const Point<spacedim> &chart_point) const override
   {
     const double r   = chart_point[0];
     const double phi = chart_point[1];
@@ -64,7 +71,7 @@ public:
 
   virtual
   DerivativeForm<1,spacedim,spacedim>
-  push_forward_gradient(const Point<spacedim> &chart_point) const
+  push_forward_gradient(const Point<spacedim> &chart_point) const override
   {
     DerivativeForm<1,spacedim,spacedim> g;
 
index 8d19bcfca5f40967aeb6ba1ed5c55bdcc05bd295..178e353ab348ada806c7dc88a4f5fe9a088d8128 100644 (file)
@@ -31,10 +31,16 @@ public:
     ChartManifold<dim,spacedim,spacedim>(periodicity)
   {}
 
+  virtual
+  std::unique_ptr<Manifold<2,3> >
+  clone() const override
+  {
+    return std::unique_ptr<Manifold<2,3> > (new MyCylinderManifold());
+  }
 
   virtual
   Point<spacedim>
-  pull_back(const Point<spacedim> &space_point) const
+  pull_back(const Point<spacedim> &space_point) const override
   {
     const double x = space_point[0];
     const double y = space_point[1];
@@ -51,7 +57,7 @@ public:
 
   virtual
   Point<spacedim>
-  push_forward(const Point<spacedim> &chart_point) const
+  push_forward(const Point<spacedim> &chart_point) const override
   {
     const double r   = chart_point[0];
     const double phi = chart_point[1];
@@ -64,7 +70,7 @@ public:
 
   virtual
   DerivativeForm<1,spacedim,spacedim>
-  push_forward_gradient(const Point<spacedim> &chart_point) const
+  push_forward_gradient(const Point<spacedim> &chart_point) const override
   {
     DerivativeForm<1,spacedim,spacedim> g;
 
index 40f01ff7024ea4d4fbbe56c5a87bcb737b212644..1f500163111a228f42f5a62771d478a41ef01362 100644 (file)
@@ -19,6 +19,7 @@
 
 
 // all include files you need here
+#include <deal.II/base/std_cxx14/memory.h>
 #include <deal.II/grid/tria.h>
 #include <deal.II/grid/tria_accessor.h>
 #include <deal.II/grid/tria_iterator.h>
@@ -40,6 +41,11 @@ public:
       p[1] = 4*p[0]*(1-p[0]);
     return p;
   }
+
+  std::unique_ptr<Manifold<dim,spacedim> > clone() const override
+  {
+    return std_cxx14::make_unique<MyManifold<dim,spacedim> >();
+  }
 };
 
 // Helper function
index 3b77101529923d0c9b5eb37b71193faa29a92ba5..1076dfa3d9b37c98b4e214f86fb676b34b517c0b 100644 (file)
@@ -47,9 +47,11 @@ int main ()
     }
   static const SphericalManifold<dim> spherical_manifold;
   tria.set_manifold(1, spherical_manifold);
-  static TransfiniteInterpolationManifold<dim> transfinite;
-  transfinite.initialize(tria);
-  tria.set_manifold(0, transfinite);
+  static TransfiniteInterpolationManifold<dim> transfinite0;
+  transfinite0.initialize(tria);
+  tria.set_manifold(0, transfinite0);
+
+  const auto &transfinite = tria.get_manifold(0);
 
   const std::array<Point<3>, 2> points({{Point<3>(0, 0.360566, 0), Point<3>(0, 0.321132, 0)}});
   const std::array<double, 2> weights({{0.4, 0.6}});
index a0eab4efb8286d508719fe3223a8b8ac881fe25a..0bfd2318b0903202bd5453b249a2bd23d676ed7a 100644 (file)
@@ -15,6 +15,7 @@
 
 #include <deal.II/base/function.h>
 #include <deal.II/base/quadrature_lib.h>
+#include <deal.II/base/std_cxx14/memory.h>
 
 #include <deal.II/dofs/dof_handler.h>
 
@@ -103,8 +104,9 @@ template <int dim>
 class Geometry: public ChartManifold<dim>
 {
 public:
-  virtual Point<dim> pull_back(const Point<dim> &space_point) const;
-  virtual Point<dim> push_forward(const Point<dim> &chart_point) const;
+  virtual Point<dim> pull_back(const Point<dim> &space_point) const override;
+  virtual Point<dim> push_forward(const Point<dim> &chart_point) const override;
+  virtual std::unique_ptr<Manifold<dim> >clone() const override;
 };
 
 template <int dim>
@@ -147,6 +149,12 @@ Point<dim> Geometry<dim>::push_forward(const Point<dim> &chart_point) const
   return p;
 }
 
+template <int dim>
+std::unique_ptr<Manifold<dim> >
+Geometry<dim>::clone() const
+{
+  return std_cxx14::make_unique<Geometry<dim> >();
+}
 
 
 template <int dim>
index 4b531fcfc0ad97df208a366688fa14ac6880fde4..60098c207dead17c6c0efc9380af09ffd3c47aea 100644 (file)
@@ -46,8 +46,9 @@ template <int dim>
 class Geometry: public ChartManifold<dim>
 {
 public:
-  virtual Point<dim> pull_back(const Point<dim> &space_point) const;
-  virtual Point<dim> push_forward(const Point<dim> &chart_point) const;
+  virtual Point<dim> pull_back(const Point<dim> &space_point) const override;
+  virtual Point<dim> push_forward(const Point<dim> &chart_point) const override;
+  virtual std::unique_ptr<Manifold<dim> >clone() const override;
 };
 
 template <int dim>
@@ -90,6 +91,13 @@ Point<dim> Geometry<dim>::push_forward(const Point<dim> &chart_point) const
   return p;
 }
 
+template <int dim>
+std::unique_ptr<Manifold<dim> >
+Geometry<dim>::clone() const
+{
+  return std_cxx14::make_unique<Geometry<dim> >();
+}
+
 template <int dim>
 class VectorFunction : public Function<dim>
 {

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.