]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Convert to std::unique_ptr
authorDaniel Arndt <daniel.arndt@iwr.uni-heidelberg.de>
Sun, 30 Jul 2017 15:37:20 +0000 (17:37 +0200)
committerDaniel Arndt <daniel.arndt@iwr.uni-heidelberg.de>
Sun, 30 Jul 2017 15:49:18 +0000 (17:49 +0200)
include/deal.II/base/quadrature.h
source/base/quadrature.cc
source/base/quadrature_lib.cc
tests/base/quadrature_is_tensor_product.cc
tests/base/quadrature_is_tensor_product.output

index 4aebe91b02728fbb655a36f4377785c790c6a8fe..50d578fbb00a55de82117ac5651939fcd4851539 100644 (file)
@@ -22,6 +22,7 @@
 #include <deal.II/base/subscriptor.h>
 #include <vector>
 #include <array>
+#include <memory>
 
 DEAL_II_NAMESPACE_OPEN
 
@@ -130,7 +131,7 @@ public:
   /**
    * Copy constructor.
    */
-  Quadrature (const Quadrature<dim> &q) = default;
+  Quadrature (const Quadrature<dim> &q);
 
   /**
    * Move constructor. Construct a new quadrature object by transferring the
@@ -170,7 +171,7 @@ public:
    * Assignment operator. Copies contents of #weights and #quadrature_points
    * as well as size.
    */
-  Quadrature &operator = (const Quadrature<dim> &) = default;
+  Quadrature &operator = (const Quadrature<dim> &);
 
   /**
    * Test for equality of two quadratures.
@@ -261,7 +262,7 @@ protected:
    * Stores the one-dimensional tensor basis objects in case this object
    * can be represented by a tensor product.
    */
-  typename std::conditional<dim==1, int, std::array<Quadrature<1>,dim>>::type tensor_basis;
+  std::unique_ptr<std::array<Quadrature<1>,dim>> tensor_basis;
 };
 
 
index 7e6b09099792a833a507d21ed867971a3d08655e..98aa8bada22623e74bfe71f0e2dc1175745d7829 100644 (file)
@@ -18,6 +18,7 @@
 #include <deal.II/base/qprojector.h>
 #include <deal.II/base/memory_consumption.h>
 #include <deal.II/base/utilities.h>
+#include <deal.II/base/std_cxx14/memory.h>
 
 #include <cmath>
 #include <cstdlib>
@@ -42,8 +43,7 @@ Quadrature<dim>::Quadrature (const unsigned int n_q)
   quadrature_points (n_q, Point<dim>()),
   weights (n_q, 0),
   is_tensor_product_flag (dim==1)
-{
-}
+{}
 
 
 
@@ -91,16 +91,18 @@ Quadrature<dim>::Quadrature (const Point<dim> &point)
   :
   quadrature_points(std::vector<Point<dim> > (1, point)),
   weights(std::vector<double> (1, 1.)),
-  is_tensor_product_flag (true)
+  is_tensor_product_flag (true),
+  tensor_basis (new std::array<Quadrature<1>, dim>())
 {
   for (unsigned int i=0; i<dim; ++i)
     {
       const std::vector<Point<1> > quad_vec_1d (1, Point<1>(point[i]));
-      tensor_basis[i] = Quadrature<1>(quad_vec_1d, weights);
+      (*tensor_basis)[i] = Quadrature<1>(quad_vec_1d, weights);
     }
 }
 
 
+
 template <>
 Quadrature<1>::Quadrature (const Point<1> &point)
   :
@@ -111,6 +113,7 @@ Quadrature<1>::Quadrature (const Point<1> &point)
 }
 
 
+
 template <>
 Quadrature<0>::Quadrature (const SubQuadrature &,
                            const Quadrature<1> &)
@@ -161,9 +164,10 @@ Quadrature<dim>::Quadrature (const SubQuadrature &q1,
 
   if (is_tensor_product_flag)
     {
+      tensor_basis.reset(new std::array<Quadrature<1>, dim>());
       for (unsigned int i=0; i<dim-1; ++i)
-        tensor_basis[i] = q1.get_tensor_basis()[i];
-      tensor_basis[dim-1] = q2;;
+        (*tensor_basis)[i] = q1.get_tensor_basis()[i];
+      (*tensor_basis)[dim-1] = q2;
     }
 }
 
@@ -261,13 +265,15 @@ Subscriptor(),
             weights[k] *= q.weight(i2);
           ++k;
         }
+
+  tensor_basis.reset (new std::array<Quadrature<1>, dim>());
   for (unsigned int i=0; i<dim; ++i)
-    tensor_basis[i] = q;
+    (*tensor_basis)[i] = q;
 }
 
 
 
-/*template <int dim>
+template <int dim>
 Quadrature<dim>::Quadrature (const Quadrature<dim> &q)
   :
   Subscriptor(),
@@ -275,65 +281,28 @@ Quadrature<dim>::Quadrature (const Quadrature<dim> &q)
   weights (q.weights),
   is_tensor_product_flag (q.is_tensor_product_flag)
 {
-  if (is_tensor_product_flag)
-    tensor_basis = q.tensor_basis;
+  if (dim>1 && is_tensor_product_flag)
+    tensor_basis = std_cxx14::make_unique<std::array<Quadrature<1>, dim>> (*q.tensor_basis);
 }
 
 
 
-template <>
-Quadrature<1>::Quadrature (const Quadrature<1> &q)
-  :
-  Subscriptor(),
-  quadrature_points (q.quadrature_points),
-  weights (q.weights),
-  is_tensor_product_flag (q.is_tensor_product_flag)
-{}*/
-
-
-
-/*template <int dim>
+template <int dim>
 Quadrature<dim> &
 Quadrature<dim>::operator= (const Quadrature<dim> &q)
 {
   weights = q.weights;
   quadrature_points = q.quadrature_points;
   is_tensor_product_flag = q.is_tensor_product_flag;
-  tensor_basis = q.tensor_basis;
-  return *this;
-}
-
-template <>
-Quadrature<1> &
-Quadrature<1>::operator= (const Quadrature<1> &q)
-{
-  std::cout << tensor_basis << std::endl;
-
-  Assert (q.size() == q.weights.size(), ExcInternalError());
-  Assert (q.size() == q.quadrature_points.size(), ExcInternalError());
-  for (unsigned int i=0; i<q.size(); ++i)
-    {
-      std::cout << q.weights[i] << std::endl;
-      std::cout << q.quadrature_points[i] << std::endl;
-    }
-
-  Assert (size() == weights.size(),
-          ExcDimensionMismatch (size(), weights.size()));
-  Assert (size() == quadrature_points.size(),
-          ExcDimensionMismatch(size(), quadrature_points.size()));
-  for (unsigned int i=0; i<size(); ++i)
+  if (dim >1 && is_tensor_product_flag)
     {
-      std::cout << weights[i] << std::endl;
-      std::cout << quadrature_points[i] << std::endl;
+      if (tensor_basis == nullptr)
+        tensor_basis = std_cxx14::make_unique<std::array<Quadrature<1>, dim>> (*q.tensor_basis);
+      else
+        *tensor_basis = *q.tensor_basis;
     }
-
-  weights = q.weights;
-  quadrature_points = q.quadrature_points;
-  is_tensor_product_flag = q.is_tensor_product_flag;
-  tensor_basis = q.tensor_basis;
   return *this;
-}*/
-
+}
 
 
 
@@ -365,8 +334,9 @@ Quadrature<dim>::get_tensor_basis () const
   Assert (this->is_tensor_product_flag == true,
           ExcMessage("This function only makes sense if "
                      "this object represents a tensor product!"));
+  Assert (tensor_basis != nullptr, ExcInternalError());
 
-  return tensor_basis;
+  return *tensor_basis;
 }
 
 
@@ -398,14 +368,14 @@ QAnisotropic<dim>::QAnisotropic(const Quadrature<1> &qx)
     }
   Assert (k==this->size(), ExcInternalError());
   this->is_tensor_product_flag = true;
-  //this->tensor_basis[0] = qx;
 }
 
 
 
 template <int dim>
-QAnisotropic<dim>::QAnisotropic(const Quadrature<1> &,
-                                const Quadrature<1> &)
+QAnisotropic<dim>::QAnisotropic(const Quadrature<1> &qx,
+                                const Quadrature<1> &qy)
+  :  Quadrature<dim>(qx.size()*qy.size())
 {
   Assert (dim==2, ExcImpossibleInDim(dim));
 }
@@ -427,8 +397,8 @@ QAnisotropic<2>::QAnisotropic(const Quadrature<1> &qx,
       }
   Assert (k==this->size(), ExcInternalError());
   this->is_tensor_product_flag = true;
-  this->tensor_basis[0] = qx;
-  this->tensor_basis[1] = qy;
+  const std::array<Quadrature<1>, 2> q_array = {qx, qy};
+  this->tensor_basis = std_cxx14::make_unique<std::array<Quadrature<1>, 2>>(q_array);
 }
 
 
@@ -462,9 +432,8 @@ QAnisotropic<3>::QAnisotropic(const Quadrature<1> &qx,
         }
   Assert (k==this->size(), ExcInternalError());
   this->is_tensor_product_flag = true;
-  this->tensor_basis[0] = qx;
-  this->tensor_basis[1] = qy;
-  this->tensor_basis[2] = qz;
+  const std::array<Quadrature<1>, 3> q_array = {qx, qy, qz};
+  this->tensor_basis = std_cxx14::make_unique<std::array<Quadrature<1>, 3>>(q_array);
 }
 
 
index 23fc5b2ba67397e6f543e0d4ae8879fac955adbe..afc11887f480cae5df56f0b02213ef19bb36e7d7 100644 (file)
@@ -939,14 +939,12 @@ QSorted<dim>::QSorted(const Quadrature<dim> &quad) :
                       std::placeholders::_1,
                       std::placeholders::_2));
 
-  this->quadrature_points = quad.get_points();
-  Assert (quad.size() == quad.get_points().size(), ExcInternalError());
-  Assert (quad.size() == quad.get_weights().size(), ExcInternalError());
-  Assert (this->quadrature_points.size()==quad.size(), ExcInternalError());
   for (unsigned int i=0; i<quad.size(); ++i)
     {
       this->weights[i]           = quad.weight(permutation[i]);
       this->quadrature_points[i] = quad.point(permutation[i]);
+      if (permutation[i] != i)
+        this->is_tensor_product_flag = false;
     }
 }
 
index 0f076b59f8bab16854d2190b64bcdff32205864d..fec03146a3461e2ac39d8ee0b6d5c57ecd6ed075 100644 (file)
@@ -76,7 +76,7 @@ print_is_tensor_product()
   deallog << "QGaussLobattoChebyshev<" << dim << ">: "
           << q_11.is_tensor_product() << std::endl;
 
-  QSorted<dim> q_16(QGauss<dim>(2));
+  QSorted<dim> q_16(QGauss<dim>(3));
   deallog << "QSorted<" << dim << ">: "
           << q_16.is_tensor_product() << std::endl;
 
index ab53fc52fa6fd46c8f47cd9a7dc07c50a51d7409..d355ebb8c236674fd02a88a903721086f99f07a7 100644 (file)
@@ -11,7 +11,7 @@ DEAL::QWeddle<1>: true
 DEAL::QGaussChebyshev<1>: true
 DEAL::QGaussRadauChebyshev<1>: true
 DEAL::QGaussLobattoChebyshev<1>: true
-DEAL::QSorted<1>: true
+DEAL::QSorted<1>: false
 DEAL::QTelles<1>: true
 DEAL::QAnisotropic<1>: true
 DEAL::QGaussLog<1>: true

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.