]> https://gitweb.dealii.org/ - dealii.git/commitdiff
QCollection<dim> accept Quadrature<1> 11176/head
authorPeter Munch <peterrmuench@gmail.com>
Thu, 12 Nov 2020 11:49:51 +0000 (12:49 +0100)
committerPeter Munch <peterrmuench@gmail.com>
Thu, 12 Nov 2020 13:05:19 +0000 (14:05 +0100)
doc/news/changes/minor/20201112Munch [new file with mode: 0644]
include/deal.II/hp/q_collection.h

diff --git a/doc/news/changes/minor/20201112Munch b/doc/news/changes/minor/20201112Munch
new file mode 100644 (file)
index 0000000..c378175
--- /dev/null
@@ -0,0 +1,7 @@
+Improved: QCollection<dim> now also accepts Quadrature<1> and converts this
+input quadrature rule to a dim-dimensional quadrature rule internally via
+tensor product. Furthermore, a copy constructor has been added
+accepting QCollection<1>.
+<br>
+(Peter Munch, 2020/11/12)
+
index 0ead13dc43e4a4457ab2f58329ede8596966ae26..073bac7968435bca933b3dfbd3c576ed824058b8 100644 (file)
@@ -52,13 +52,20 @@ namespace hp
      */
     QCollection() = default;
 
+    /**
+     * Copy constructor.
+     */
+    template <int dim_in>
+    QCollection(const QCollection<dim_in> &other);
+
     /**
      * Conversion constructor. This constructor creates a QCollection from a
      * single quadrature rule. More quadrature formulas can be added with
      * push_back(), if desired, though it would probably be clearer to add all
      * mappings the same way.
      */
-    explicit QCollection(const Quadrature<dim> &quadrature);
+    template <int dim_in>
+    explicit QCollection(const Quadrature<dim_in> &quadrature);
 
     /**
      * Constructor. This constructor creates a QCollection from one or
@@ -93,8 +100,9 @@ namespace hp
      * is later destroyed by this object upon destruction of the entire
      * collection.
      */
+    template <int dim_in>
     void
-    push_back(const Quadrature<dim> &new_quadrature);
+    push_back(const Quadrature<dim_in> &new_quadrature);
 
     /**
      * Return a reference to the quadrature rule specified by the argument.
@@ -150,21 +158,41 @@ namespace hp
 
   /* --------------- inline functions ------------------- */
 
+  template <int dim>
+  template <int dim_in>
+  QCollection<dim>::QCollection(const QCollection<dim_in> &other)
+  {
+    for (unsigned int i = 0; i < other.size(); ++i)
+      push_back(other[i]);
+  }
+
+
+
   template <int dim>
   template <class... QTypes>
   QCollection<dim>::QCollection(const QTypes &... quadrature_objects)
   {
-    static_assert(is_base_of_all<Quadrature<dim>, QTypes...>::value,
-                  "Not all of the input arguments of this function "
-                  "are derived from Quadrature<dim>!");
-
     // loop over all of the given arguments and add the quadrature objects to
     // this collection. Inlining the definition of q_pointers causes internal
     // compiler errors on GCC 7.1.1 so we define it separately:
-    const auto q_pointers = {
-      (static_cast<const Quadrature<dim> *>(&quadrature_objects))...};
-    for (const auto p : q_pointers)
-      push_back(*p);
+    if (is_base_of_all<Quadrature<dim>, QTypes...>::value)
+      {
+        const auto q_pointers = {
+          (reinterpret_cast<const Quadrature<dim> *>(&quadrature_objects))...};
+        for (const auto p : q_pointers)
+          push_back(*p);
+      }
+    else if (is_base_of_all<Quadrature<1>, QTypes...>::value)
+      {
+        const auto q_pointers = {
+          (reinterpret_cast<const Quadrature<1> *>(&quadrature_objects))...};
+        for (const auto p : q_pointers)
+          push_back(*p);
+      }
+    else
+      {
+        Assert(false, ExcNotImplemented());
+      }
   }
 
 
@@ -223,7 +251,8 @@ namespace hp
 
 
   template <int dim>
-  inline QCollection<dim>::QCollection(const Quadrature<dim> &quadrature)
+  template <int dim_in>
+  inline QCollection<dim>::QCollection(const Quadrature<dim_in> &quadrature)
   {
     quadratures.push_back(std::make_shared<const Quadrature<dim>>(quadrature));
   }
@@ -239,8 +268,9 @@ namespace hp
 
 
   template <int dim>
+  template <int dim_in>
   inline void
-  QCollection<dim>::push_back(const Quadrature<dim> &new_quadrature)
+  QCollection<dim>::push_back(const Quadrature<dim_in> &new_quadrature)
   {
     quadratures.push_back(
       std::make_shared<const Quadrature<dim>>(new_quadrature));

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.