]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Added SmoothnessEstimator::default_fe_series() functions returning default FESeries...
authorMarc Fehling <marc.fehling@gmx.net>
Wed, 29 Apr 2020 17:13:58 +0000 (19:13 +0200)
committerMarc Fehling <marc.fehling@gmx.net>
Tue, 12 May 2020 14:03:33 +0000 (16:03 +0200)
Removed default constructor and initialize() functions for FESeries objects.

15 files changed:
doc/news/changes/minor/20200121Fehling [moved from doc/news/changes/minor/20200121Fehling-2 with 100% similarity]
doc/news/changes/minor/20200121Fehling-1 [deleted file]
examples/step-27/step-27.cc
include/deal.II/fe/fe_series.h
include/deal.II/numerics/smoothness_estimator.h
source/fe/fe_series_fourier.cc
source/fe/fe_series_legendre.cc
source/numerics/smoothness_estimator.cc
source/numerics/smoothness_estimator.inst.in
tests/hp/laplace_mitchell2014_04_peak.cc
tests/hp/step-27.cc
tests/mpi/petsc_step-27.cc
tests/mpi/trilinos_step-27.cc
tests/numerics/smoothness_estimator_01.cc
tests/numerics/smoothness_estimator_02.cc

diff --git a/doc/news/changes/minor/20200121Fehling-1 b/doc/news/changes/minor/20200121Fehling-1
deleted file mode 100644 (file)
index 15f4f7d..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-New: Both classes FESeries::Fourier and FESeries::Legendre now offer a
-default constructor and can be initialized after their instantiation.
-<br>
-(Marc Fehling, 2020/01/21)
index 70d163efdb2b58d7e495430fa00f30a54034b97b..87f3bb252d31ee30ba02c6197556c082abf9bcaf 100644 (file)
@@ -110,10 +110,10 @@ namespace Step27
     hp::QCollection<dim>     quadrature_collection;
     hp::QCollection<dim - 1> face_quadrature_collection;
 
-    hp::QCollection<dim>             fourier_q_collection;
-    FESeries::Fourier<dim>           fourier;
-    std::vector<double>              ln_k;
-    Table<dim, std::complex<double>> fourier_coefficients;
+    hp::QCollection<dim>                    fourier_q_collection;
+    std::unique_ptr<FESeries::Fourier<dim>> fourier;
+    std::vector<double>                     ln_k;
+    Table<dim, std::complex<double>>        fourier_coefficients;
 
     AffineConstraints<double> constraints;
 
@@ -232,9 +232,8 @@ namespace Step27
     // Now we are ready to set-up the FESeries::Fourier object
     const std::vector<unsigned int> n_coefficients_per_direction(
       fe_collection.size(), N);
-    fourier.initialize(n_coefficients_per_direction,
-                       fe_collection,
-                       fourier_q_collection);
+    fourier = std_cxx14::make_unique<FESeries::Fourier<dim>>(
+      n_coefficients_per_direction, fe_collection, fourier_q_collection);
 
     // We need to resize the matrix of fourier coefficients according to the
     // number of modes N.
@@ -679,9 +678,9 @@ namespace Step27
         local_dof_values.reinit(cell->get_fe().dofs_per_cell);
         cell->get_dof_values(solution, local_dof_values);
 
-        fourier.calculate(local_dof_values,
-                          cell->active_fe_index(),
-                          fourier_coefficients);
+        fourier->calculate(local_dof_values,
+                           cell->active_fe_index(),
+                           fourier_coefficients);
 
         // The next thing, as explained in the introduction, is that we wanted
         // to only fit our exponential decay of Fourier coefficients to the
index dc4fe342342a645488e5d1c4585644f62a9b7cde..6a76cf24d815a1aae5162571790023a925b9322e 100644 (file)
@@ -93,14 +93,6 @@ namespace FESeries
   public:
     using CoefficientType = typename std::complex<double>;
 
-    /**
-     * Default constructor.
-     *
-     * Leaves all members in an empty or uninitialized state. Please call
-     * initialize() once you have all data structures ready.
-     */
-    Fourier() = default;
-
     /**
      * Constructor that initializes all required data structures.
      *
@@ -127,17 +119,6 @@ namespace FESeries
             const hp::FECollection<dim, spacedim> &fe_collection,
             const hp::QCollection<dim> &           q_collection);
 
-    /**
-     * Initialize and overwrite all mandatory data structures for the
-     * calculation calculation of transformation matrices.
-     *
-     * All previously calculated transformation matrices will be cleared.
-     */
-    void
-    initialize(const std::vector<unsigned int> &n_coefficients_per_direction,
-               const hp::FECollection<dim, spacedim> &fe_collection,
-               const hp::QCollection<dim> &           q_collection);
-
     /**
      * Calculate @p fourier_coefficients of the cell vector field given by
      * @p local_dof_values corresponding to FiniteElement with
@@ -201,7 +182,7 @@ namespace FESeries
      * Number of coefficients in each direction for each finite element in the
      * registered hp::FECollection.
      */
-    std::vector<unsigned int> n_coefficients_per_direction;
+    const std::vector<unsigned int> n_coefficients_per_direction;
 
     /**
      * hp::FECollection for which transformation matrices will be calculated.
@@ -211,7 +192,7 @@ namespace FESeries
     /**
      * hp::QCollection used in calculation of transformation matrices.
      */
-    SmartPointer<const hp::QCollection<dim>> q_collection;
+    const hp::QCollection<dim> q_collection;
 
     /**
      * Angular frequencies $ 2 \pi {\bf k} $ .
@@ -280,14 +261,6 @@ namespace FESeries
   public:
     using CoefficientType = double;
 
-    /**
-     * Default constructor.
-     *
-     * Leaves all members in an empty or uninitialized state. Please call
-     * initialize() once you have all data structures ready.
-     */
-    Legendre() = default;
-
     /**
      * Constructor that initializes all required data structures.
      *
@@ -313,17 +286,6 @@ namespace FESeries
              const hp::FECollection<dim, spacedim> &fe_collection,
              const hp::QCollection<dim> &           q_collection);
 
-    /**
-     * Initialize and overwrite all mandatory data structures for the
-     * calculation of transformation matrices.
-     *
-     * All previously calculated transformation matrices will be cleared.
-     */
-    void
-    initialize(const std::vector<unsigned int> &n_coefficients_per_direction,
-               const hp::FECollection<dim, spacedim> &fe_collection,
-               const hp::QCollection<dim> &           q_collection);
-
     /**
      * Calculate @p legendre_coefficients of the cell vector field given by
      * @p local_dof_values corresponding to FiniteElement with
@@ -387,7 +349,7 @@ namespace FESeries
      * Number of coefficients in each direction for each finite element in the
      * registered hp::FECollection.
      */
-    std::vector<unsigned int> n_coefficients_per_direction;
+    const std::vector<unsigned int> n_coefficients_per_direction;
 
     /**
      * hp::FECollection for which transformation matrices will be calculated.
@@ -397,7 +359,7 @@ namespace FESeries
     /**
      * hp::QCollection used in calculation of transformation matrices.
      */
-    SmartPointer<const hp::QCollection<dim>> q_collection;
+    const hp::QCollection<dim> q_collection;
 
     /**
      * Transformation matrices for each FiniteElement.
index 659ad330492afd60d253b9c690b750fd57613105..e73762196d1840e27821d2c7499f76da1bb4499b 100644 (file)
@@ -225,29 +225,18 @@ namespace SmoothnessEstimator
       const bool           only_flagged_cells       = false);
 
     /**
-     * Number of modes for the default configuration of the Legendre series
-     * expansion FESeries::Legendre.
+     * Returns a FESeries::Legendre object for Legendre series expansions with
+     * the default configuration for smoothness estimation purposes.
      *
-     * We use as many modes as the highest polynomial of all finite elements
-     * used plus one, since we start with the first Legendre polynomial which is
-     * just a constant.
-     */
-    template <int dim, int spacedim>
-    std::vector<unsigned int>
-    default_number_of_coefficients_per_direction(
-      const hp::FECollection<dim, spacedim> &fe_collection);
-
-    /**
-     * Quadrature collection for the default configuration of the Legendre
-     * series expansion FESeries::Legendre.
-     *
-     * We use Gaussian quadrature designed to yield exact results for the
+     * For each finite element of the provided @p fe_collection, we use as many
+     * modes as its polynomial degree plus one, since we start with the first
+     * Legendre polynomial which is just a constant. Further for each element,
+     * we use a Gaussian quadrature designed to yield exact results for the
      * highest order Legendre polynomial used.
      */
     template <int dim, int spacedim>
-    hp::QCollection<dim>
-    default_quadrature_collection(
-      const hp::FECollection<dim, spacedim> &fe_collection);
+    FESeries::Legendre<dim, spacedim>
+    default_fe_series(const hp::FECollection<dim, spacedim> &fe_collection);
   } // namespace Legendre
 
 
@@ -465,29 +454,18 @@ namespace SmoothnessEstimator
       const bool           only_flagged_cells       = false);
 
     /**
-     * Number of modes for the default configuration of the Fourier series
-     * expansion FESeries::Fourier.
-     *
-     * We use as many modes as the highest polynomial degree of all finite
-     * elements used plus one, and at least three modes.
-     */
-    template <int dim, int spacedim>
-    std::vector<unsigned int>
-    default_number_of_coefficients_per_direction(
-      const hp::FECollection<dim, spacedim> &fe_collection);
-
-    /**
-     * Quadrature collection for the default configuration of the Fourier series
-     * expansion FESeries::Fourier.
+     * Returns a FESeries::Fourier object for Fourier series expansions with
+     * the default configuration for smoothness estimation purposes.
      *
-     * We use a 4-point Gaussian quarature iterated in each dimension by the
-     * maximal wave number, which is the number of modes decresed by one since
-     * we start with $k = 0$.
+     * For each finite element of the provided @p fe_collection, we use as many
+     * modes as its polynomial degree plus one, and at least three modes.
+     * Further for each element, we use a 4-point Gaussian quarature iterated in
+     * each dimension by the maximal wave number, which is the number of modes
+     * decreased by one since we start with $k = 0$.
      */
     template <int dim, int spacedim>
-    hp::QCollection<dim>
-    default_quadrature_collection(
-      const hp::FECollection<dim, spacedim> &fe_collection);
+    FESeries::Fourier<dim, spacedim>
+    default_fe_series(const hp::FECollection<dim, spacedim> &fe_collection);
   } // namespace Fourier
 } // namespace SmoothnessEstimator
 
index e810baa426de9bd27d354526ad8d36c21060f799..814592253b4b154c2871b533d0335fc98af26047 100644 (file)
@@ -179,7 +179,7 @@ namespace FESeries
     const hp::QCollection<dim> &           q_collection)
     : n_coefficients_per_direction(n_coefficients_per_direction)
     , fe_collection(&fe_collection)
-    , q_collection(&q_collection)
+    , q_collection(q_collection)
     , fourier_transform_matrices(fe_collection.size())
   {
     Assert(n_coefficients_per_direction.size() == fe_collection.size() &&
@@ -219,7 +219,7 @@ namespace FESeries
     return (
       (n_coefficients_per_direction == fourier.n_coefficients_per_direction) &&
       (*fe_collection == *(fourier.fe_collection)) &&
-      (*q_collection == *(fourier.q_collection)) &&
+      (q_collection == fourier.q_collection) &&
       (k_vectors == fourier.k_vectors) &&
       (fourier_transform_matrices == fourier.fourier_transform_matrices));
   }
@@ -235,7 +235,7 @@ namespace FESeries
       task_group += Threads::new_task([&, fe]() {
         ensure_existence(n_coefficients_per_direction,
                          *fe_collection,
-                         *q_collection,
+                         q_collection,
                          k_vectors,
                          fe,
                          fourier_transform_matrices);
@@ -246,41 +246,6 @@ namespace FESeries
 
 
 
-  template <int dim, int spacedim>
-  void
-  Fourier<dim, spacedim>::initialize(
-    const std::vector<unsigned int> &      n_coefficients_per_direction,
-    const hp::FECollection<dim, spacedim> &fe_collection,
-    const hp::QCollection<dim> &           q_collection)
-  {
-    Assert(n_coefficients_per_direction.size() == fe_collection.size() &&
-             n_coefficients_per_direction.size() == q_collection.size(),
-           ExcMessage("All parameters are supposed to have the same size."));
-
-    // set members
-    this->n_coefficients_per_direction = n_coefficients_per_direction;
-    this->fe_collection =
-      SmartPointer<const hp::FECollection<dim, spacedim>>(&fe_collection);
-    this->q_collection =
-      SmartPointer<const hp::QCollection<dim>>(&q_collection);
-
-    // clean up auxiliary members
-    k_vectors.reset_values();
-    const unsigned int max_n_coefficients_per_direction =
-      *std::max_element(n_coefficients_per_direction.cbegin(),
-                        n_coefficients_per_direction.cend());
-    set_k_vectors(k_vectors, max_n_coefficients_per_direction);
-
-    fourier_transform_matrices.clear();
-    fourier_transform_matrices.resize(fe_collection.size());
-
-    unrolled_coefficients.clear();
-    // reserve sufficient memory
-    unrolled_coefficients.reserve(k_vectors.n_elements());
-  }
-
-
-
   template <int dim, int spacedim>
   unsigned int
   Fourier<dim, spacedim>::get_n_coefficients_per_direction(
@@ -299,15 +264,13 @@ namespace FESeries
     const unsigned int           cell_active_fe_index,
     Table<dim, CoefficientType> &fourier_coefficients)
   {
-    Assert(fe_collection != nullptr && q_collection != nullptr,
-           ExcMessage("Initialize this FESeries object first!"));
     for (unsigned int d = 0; d < dim; ++d)
       AssertDimension(fourier_coefficients.size(d),
                       n_coefficients_per_direction[cell_active_fe_index]);
 
     ensure_existence(n_coefficients_per_direction,
                      *fe_collection,
-                     *q_collection,
+                     q_collection,
                      k_vectors,
                      cell_active_fe_index,
                      fourier_transform_matrices);
index 6be7a8a4f0e239f06c13d25d0e0be807e6511fce..17e1a7739bf062c9a14665eed2db5d46eee02322 100644 (file)
@@ -201,7 +201,7 @@ namespace FESeries
     const hp::QCollection<dim> &           q_collection)
     : n_coefficients_per_direction(n_coefficients_per_direction)
     , fe_collection(&fe_collection)
-    , q_collection(&q_collection)
+    , q_collection(q_collection)
     , legendre_transform_matrices(fe_collection.size())
   {
     Assert(n_coefficients_per_direction.size() == fe_collection.size() &&
@@ -240,7 +240,7 @@ namespace FESeries
     return (
       (n_coefficients_per_direction == legendre.n_coefficients_per_direction) &&
       (*fe_collection == *(legendre.fe_collection)) &&
-      (*q_collection == *(legendre.q_collection)) &&
+      (q_collection == legendre.q_collection) &&
       (legendre_transform_matrices == legendre.legendre_transform_matrices));
   }
 
@@ -255,7 +255,7 @@ namespace FESeries
       task_group += Threads::new_task([&, fe]() {
         ensure_existence(n_coefficients_per_direction,
                          *fe_collection,
-                         *q_collection,
+                         q_collection,
                          fe,
                          legendre_transform_matrices);
       });
@@ -265,39 +265,6 @@ namespace FESeries
 
 
 
-  template <int dim, int spacedim>
-  void
-  Legendre<dim, spacedim>::initialize(
-    const std::vector<unsigned int> &      n_coefficients_per_direction,
-    const hp::FECollection<dim, spacedim> &fe_collection,
-    const hp::QCollection<dim> &           q_collection)
-  {
-    Assert(n_coefficients_per_direction.size() == fe_collection.size() &&
-             n_coefficients_per_direction.size() == q_collection.size(),
-           ExcMessage("All parameters are supposed to have the same size."));
-
-    // set members
-    this->n_coefficients_per_direction = n_coefficients_per_direction;
-    this->fe_collection =
-      SmartPointer<const hp::FECollection<dim, spacedim>>(&fe_collection);
-    this->q_collection =
-      SmartPointer<const hp::QCollection<dim>>(&q_collection);
-
-    // clean up auxiliary members
-    legendre_transform_matrices.clear();
-    legendre_transform_matrices.resize(fe_collection.size());
-
-    unrolled_coefficients.clear();
-    // reserve sufficient memory
-    const unsigned int max_n_coefficients_per_direction =
-      *std::max_element(n_coefficients_per_direction.cbegin(),
-                        n_coefficients_per_direction.cend());
-    unrolled_coefficients.reserve(
-      Utilities::fixed_power<dim>(max_n_coefficients_per_direction));
-  }
-
-
-
   template <int dim, int spacedim>
   unsigned int
   Legendre<dim, spacedim>::get_n_coefficients_per_direction(
@@ -316,15 +283,13 @@ namespace FESeries
     const unsigned int            cell_active_fe_index,
     Table<dim, CoefficientType> & legendre_coefficients)
   {
-    Assert(fe_collection != nullptr && q_collection != nullptr,
-           ExcMessage("Initialize this FESeries object first!"));
     for (unsigned int d = 0; d < dim; ++d)
       AssertDimension(legendre_coefficients.size(d),
                       n_coefficients_per_direction[cell_active_fe_index]);
 
     ensure_existence(n_coefficients_per_direction,
                      *fe_collection,
-                     *q_collection,
+                     q_collection,
                      cell_active_fe_index,
                      legendre_transform_matrices);
 
index 568765d245c8d32dd34afb3e7a27d61992ba83d0..9a2234853451c562f6a0b283f4b8b566db281ccc 100644 (file)
@@ -286,27 +286,16 @@ namespace SmoothnessEstimator
 
 
     template <int dim, int spacedim>
-    std::vector<unsigned int>
-    default_number_of_coefficients_per_direction(
-      const hp::FECollection<dim, spacedim> &fe_collection)
+    FESeries::Legendre<dim, spacedim>
+    default_fe_series(const hp::FECollection<dim, spacedim> &fe_collection)
     {
+      // Default number of coefficients per direction.
       std::vector<unsigned int> n_coefficients_per_direction;
       for (unsigned int i = 0; i < fe_collection.size(); ++i)
         n_coefficients_per_direction.push_back(fe_collection[i].degree + 1);
 
-      return n_coefficients_per_direction;
-    }
-
-
-
-    template <int dim, int spacedim>
-    hp::QCollection<dim>
-    default_quadrature_collection(
-      const hp::FECollection<dim, spacedim> &fe_collection)
-    {
-      const std::vector<unsigned int> n_modes =
-        default_number_of_coefficients_per_direction(fe_collection);
-
+      // Default quadrature collection.
+      //
       // We initialize a FESeries::Legendre expansion object object which will
       // be used to calculate the expansion coefficients. In addition to the
       // hp::FECollection, we need to provide quadrature rules hp::QCollection
@@ -317,18 +306,20 @@ namespace SmoothnessEstimator
       // rule. As a default, we use the same quadrature formula for each finite
       // element, namely a Gauss formula that yields exact results for the
       // highest order Legendre polynomial used.
-
+      //
       // We start with the zeroth Legendre polynomial which is just a constant,
       // so the highest Legendre polynomial will be of order (n_modes - 1).
       hp::QCollection<dim> q_collection;
       for (unsigned int i = 0; i < fe_collection.size(); ++i)
         {
-          const QGauss<dim>  quadrature(n_modes[i]);
+          const QGauss<dim>  quadrature(n_coefficients_per_direction[i]);
           const QSorted<dim> quadrature_sorted(quadrature);
           q_collection.push_back(quadrature_sorted);
         }
 
-      return q_collection;
+      return FESeries::Legendre<dim, spacedim>(n_coefficients_per_direction,
+                                               fe_collection,
+                                               q_collection);
     }
   } // namespace Legendre
 
@@ -578,28 +569,17 @@ namespace SmoothnessEstimator
 
 
     template <int dim, int spacedim>
-    std::vector<unsigned int>
-    default_number_of_coefficients_per_direction(
-      const hp::FECollection<dim, spacedim> &fe_collection)
+    FESeries::Fourier<dim, spacedim>
+    default_fe_series(const hp::FECollection<dim, spacedim> &fe_collection)
     {
+      // Default number of coefficients per direction.
       std::vector<unsigned int> n_coefficients_per_direction;
       for (unsigned int i = 0; i < fe_collection.size(); ++i)
         n_coefficients_per_direction.push_back(
           std::max<unsigned int>(3, fe_collection[i].degree + 1));
 
-      return n_coefficients_per_direction;
-    }
-
-
-
-    template <int dim, int spacedim>
-    hp::QCollection<dim>
-    default_quadrature_collection(
-      const hp::FECollection<dim, spacedim> &fe_collection)
-    {
-      const std::vector<unsigned int> n_modes =
-        default_number_of_coefficients_per_direction(fe_collection);
-
+      // Default quadrature collection.
+      //
       // We initialize a series expansion object object which will be used to
       // calculate the expansion coefficients. In addition to the
       // hp::FECollection, we need to provide quadrature rules hp::QCollection
@@ -616,12 +596,15 @@ namespace SmoothnessEstimator
       hp::QCollection<dim> q_collection;
       for (unsigned int i = 0; i < fe_collection.size(); ++i)
         {
-          const QIterated<dim> quadrature(base_quadrature, n_modes[i] - 1);
+          const QIterated<dim> quadrature(base_quadrature,
+                                          n_coefficients_per_direction[i] - 1);
           const QSorted<dim>   quadrature_sorted(quadrature);
           q_collection.push_back(quadrature_sorted);
         }
 
-      return q_collection;
+      return FESeries::Fourier<dim, spacedim>(n_coefficients_per_direction,
+                                              fe_collection,
+                                              q_collection);
     }
   } // namespace Fourier
 } // namespace SmoothnessEstimator
index 912fa2d70c3c09b554708a5fb144442afce9adfc..030466be4c74e910c5715771617bacfb28b77d7f 100644 (file)
@@ -64,20 +64,14 @@ for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : SPACE_DIMENSIONS;
 for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : SPACE_DIMENSIONS)
   {
 #if deal_II_dimension <= deal_II_space_dimension
-    template std::vector<unsigned int> SmoothnessEstimator::Legendre::
-      default_number_of_coefficients_per_direction<deal_II_dimension,
-                                                   deal_II_space_dimension>(
-        const hp::FECollection<deal_II_dimension, deal_II_space_dimension> &);
-    template hp::QCollection<deal_II_dimension> SmoothnessEstimator::Legendre::
-      default_quadrature_collection<deal_II_dimension, deal_II_space_dimension>(
-        const hp::FECollection<deal_II_dimension, deal_II_space_dimension> &);
+    template FESeries::Legendre<deal_II_dimension, deal_II_space_dimension>
+    SmoothnessEstimator::Legendre::default_fe_series<deal_II_dimension,
+                                                     deal_II_space_dimension>(
+      const hp::FECollection<deal_II_dimension, deal_II_space_dimension> &);
 
-    template std::vector<unsigned int> SmoothnessEstimator::Fourier::
-      default_number_of_coefficients_per_direction<deal_II_dimension,
-                                                   deal_II_space_dimension>(
-        const hp::FECollection<deal_II_dimension, deal_II_space_dimension> &);
-    template hp::QCollection<deal_II_dimension> SmoothnessEstimator::Fourier::
-      default_quadrature_collection<deal_II_dimension, deal_II_space_dimension>(
-        const hp::FECollection<deal_II_dimension, deal_II_space_dimension> &);
+    template FESeries::Fourier<deal_II_dimension, deal_II_space_dimension>
+    SmoothnessEstimator::Fourier::default_fe_series<deal_II_dimension,
+                                                    deal_II_space_dimension>(
+      const hp::FECollection<deal_II_dimension, deal_II_space_dimension> &);
 #endif
   }
index 26d7c49527cbcd194a8408e59be7025cd94475b9..2b16cfdd8cf8340b78a0c8b92ee40b3b2f3cb4af 100644 (file)
@@ -111,9 +111,7 @@ private:
 
   hp::QCollection<dim - 1> quadrature_face;
 
-  std::vector<unsigned int> n_coefficients_per_direction;
-  hp::QCollection<dim>      expansion_q_collection;
-  FESeries::Legendre<dim>   legendre;
+  std::unique_ptr<FESeries::Legendre<dim>> legendre;
 };
 
 template <int dim>
@@ -143,15 +141,8 @@ Problem4<dim>::Problem4(const Function<dim> &force_function,
 
   // after the FECollection has been generated, create a corresponding legendre
   // series expansion object
-  n_coefficients_per_direction =
-    SmoothnessEstimator::Legendre::default_number_of_coefficients_per_direction(
-      Laplace<dim>::fe);
-  expansion_q_collection =
-    SmoothnessEstimator::Legendre::default_quadrature_collection(
-      Laplace<dim>::fe);
-  legendre.initialize(n_coefficients_per_direction,
-                      Laplace<dim>::fe,
-                      expansion_q_collection);
+  legendre = std_cxx14::make_unique<FESeries::Legendre<dim>>(
+    SmoothnessEstimator::Legendre::default_fe_series(Laplace<dim>::fe));
 }
 
 
@@ -163,7 +154,7 @@ Problem4<dim>::substitute_h_for_p()
   Vector<float> smoothness_indicators(
     Laplace<dim>::triangulation.n_active_cells());
   SmoothnessEstimator::Legendre::coefficient_decay_per_direction(
-    legendre,
+    *legendre,
     Laplace<dim>::dof_handler,
     Laplace<dim>::solution,
     smoothness_indicators);
index eafadd5c0eeb01c8eb40b43811bf306b0535d02a..6fbe477f99a18f4fafde62250262bc77d3597b3a 100644 (file)
@@ -104,9 +104,9 @@ namespace Step27
     Vector<double> solution;
     Vector<double> system_rhs;
 
-    const unsigned int     max_degree;
-    hp::QCollection<dim>   fourier_q_collection;
-    FESeries::Fourier<dim> fourier;
+    const unsigned int                      max_degree;
+    hp::QCollection<dim>                    fourier_q_collection;
+    std::unique_ptr<FESeries::Fourier<dim>> fourier;
   };
 
 
@@ -155,9 +155,8 @@ namespace Step27
 
     const std::vector<unsigned int> n_coefficients_per_direction(
       fe_collection.size(), max_degree);
-    fourier.initialize(n_coefficients_per_direction,
-                       fe_collection,
-                       fourier_q_collection);
+    fourier = std_cxx14::make_unique<FESeries::Fourier<dim>>(
+      n_coefficients_per_direction, fe_collection, fourier_q_collection);
   }
 
 
@@ -292,7 +291,7 @@ namespace Step27
 
     Vector<float> smoothness_indicators;
     SmoothnessEstimator::Fourier::coefficient_decay(
-      fourier,
+      *fourier,
       dof_handler,
       solution,
       smoothness_indicators,
index eb95c3caffb934c0ab141a03e307670e66515544..f461b06a80916ea8ad39e35faecc52cc77f674bf 100644 (file)
@@ -107,8 +107,8 @@ namespace Step27
     hp::QCollection<dim>     quadrature_collection;
     hp::QCollection<dim - 1> face_quadrature_collection;
 
-    hp::QCollection<dim>   fourier_q_collection;
-    FESeries::Fourier<dim> fourier;
+    hp::QCollection<dim>                    fourier_q_collection;
+    std::unique_ptr<FESeries::Fourier<dim>> fourier;
 
     AffineConstraints<double> constraints;
 
@@ -188,9 +188,8 @@ namespace Step27
 
     const std::vector<unsigned int> n_coefficients_per_direction(
       fe_collection.size(), max_degree);
-    fourier.initialize(n_coefficients_per_direction,
-                       fe_collection,
-                       fourier_q_collection);
+    fourier = std_cxx14::make_unique<FESeries::Fourier<dim>>(
+      n_coefficients_per_direction, fe_collection, fourier_q_collection);
   }
 
 
@@ -376,7 +375,7 @@ namespace Step27
 
     Vector<float> smoothness_indicators(triangulation.n_active_cells());
     SmoothnessEstimator::Fourier::coefficient_decay(
-      fourier,
+      *fourier,
       dof_handler,
       solution,
       smoothness_indicators,
index 692a3c2c6139711020a0bb6874d5fc529e62d3e9..555936712a24d61ebaf6eea3cef214599b00853a 100644 (file)
@@ -107,8 +107,8 @@ namespace Step27
     hp::QCollection<dim>     quadrature_collection;
     hp::QCollection<dim - 1> face_quadrature_collection;
 
-    hp::QCollection<dim>   fourier_q_collection;
-    FESeries::Fourier<dim> fourier;
+    hp::QCollection<dim>                    fourier_q_collection;
+    std::unique_ptr<FESeries::Fourier<dim>> fourier;
 
     AffineConstraints<double> constraints;
 
@@ -188,9 +188,8 @@ namespace Step27
 
     const std::vector<unsigned int> n_coefficients_per_direction(
       fe_collection.size(), max_degree);
-    fourier.initialize(n_coefficients_per_direction,
-                       fe_collection,
-                       fourier_q_collection);
+    fourier = std_cxx14::make_unique<FESeries::Fourier<dim>>(
+      n_coefficients_per_direction, fe_collection, fourier_q_collection);
   }
 
 
@@ -377,7 +376,7 @@ namespace Step27
 
     Vector<float> smoothness_indicators(triangulation.n_active_cells());
     SmoothnessEstimator::Fourier::coefficient_decay(
-      fourier,
+      *fourier,
       dof_handler,
       solution,
       smoothness_indicators,
index a08429ace5432b980b177317b96343b7d2629ffb..f5bd97c58dc5941fa163398226608d0a90d28a16 100644 (file)
@@ -179,11 +179,12 @@ test(const LegendreFunction<dim> &func, const unsigned int poly_degree)
   for (unsigned int p = 1; p <= max_poly; p++)
     fe_collection.push_back(FE_Q<dim>(p));
 
-  const unsigned int              fe_index = poly_degree - 1;
-  const std::vector<unsigned int> n_coefficients_per_direction =
-    SmoothnessEstimator::Legendre::default_number_of_coefficients_per_direction(
-      fe_collection);
-  const unsigned int n_modes = n_coefficients_per_direction[fe_index];
+  FESeries::Legendre<dim> legendre =
+    SmoothnessEstimator::Legendre::default_fe_series(fe_collection);
+
+  const unsigned int fe_index = poly_degree - 1;
+  const unsigned int n_modes =
+    legendre.get_n_coefficients_per_direction(fe_index);
 
   // custom predicate:
   // p-ref for linear elements and use j=1,...,pe otherwise.
@@ -201,12 +202,6 @@ test(const LegendreFunction<dim> &func, const unsigned int poly_degree)
   Vector<double> values(dof_handler.n_dofs());
   VectorTools::interpolate(dof_handler, func, values);
 
-  hp::QCollection<dim> q_collection =
-    SmoothnessEstimator::Legendre::default_quadrature_collection(fe_collection);
-  FESeries::Legendre<dim> legendre(n_coefficients_per_direction,
-                                   fe_collection,
-                                   q_collection);
-
   const Table<dim, double> &coeff_in = func.get_coefficients();
   Table<dim, double>        coeff_out;
   resize(coeff_out, n_modes);
index 0b59a5299b84fd2e0d487d0eedb885787a2e1a8b..6c007b521a332f50f7dc6847f4a6382eb34d586c 100644 (file)
@@ -193,11 +193,12 @@ test(const unsigned int poly_degree)
   for (unsigned int p = 1; p <= max_poly; ++p)
     fe_collection.push_back(FE_Q<dim>(p));
 
-  const unsigned int              fe_index = poly_degree - 1;
-  const std::vector<unsigned int> n_coefficients_per_direction =
-    SmoothnessEstimator::Fourier::default_number_of_coefficients_per_direction(
-      fe_collection);
-  const unsigned int n_modes = n_coefficients_per_direction[fe_index];
+  FESeries::Fourier<dim> fourier =
+    SmoothnessEstimator::Fourier::default_fe_series(fe_collection);
+
+  const unsigned int fe_index = poly_degree - 1;
+  const unsigned int n_modes =
+    fourier.get_n_coefficients_per_direction(fe_index);
 
   Assert((poly_degree >= 1) && (poly_degree <= max_poly), ExcInternalError());
   Assert((n_modes >= 3) && (n_modes <= max_poly + 1), ExcInternalError());
@@ -277,12 +278,6 @@ test(const unsigned int poly_degree)
   local_dof_values.reinit(cell->get_fe().dofs_per_cell);
   cell->get_dof_values(values, local_dof_values);
 
-  hp::QCollection<dim> q_collection =
-    SmoothnessEstimator::Fourier::default_quadrature_collection(fe_collection);
-  FESeries::Fourier<dim> fourier(n_coefficients_per_direction,
-                                 fe_collection,
-                                 q_collection);
-
   Table<dim, std::complex<double>> coeff_out;
   coeff_out.reinit(size);
   fourier.calculate(local_dof_values, cell->active_fe_index(), coeff_out);

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.