]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Use 'if constexpr' to avoid many explicit specializations. 18230/head
authorWolfgang Bangerth <bangerth@colostate.edu>
Wed, 12 Mar 2025 03:58:43 +0000 (21:58 -0600)
committerWolfgang Bangerth <bangerth@colostate.edu>
Wed, 12 Mar 2025 03:59:10 +0000 (21:59 -0600)
include/deal.II/fe/fe_tools.templates.h
source/fe/fe_tools.cc

index 5cd3518c77bc072a54cf7736c8f72daae7fbbdc9..420be5f268997d908ca096d42f2b617f500b7cca 100644 (file)
@@ -1050,11 +1050,50 @@ namespace FETools
 
 
 
-  // Not implemented in the general case.
   template <class FE>
   std::unique_ptr<FiniteElement<FE::dimension, FE::space_dimension>>
-  FEFactory<FE>::get(const Quadrature<1> &) const
+  FEFactory<FE>::get(const Quadrature<1> &quad) const
   {
+    // Specializations for FE_Q.
+    if constexpr (std::is_same_v<FE, FE_Q<1, 1>>)
+      return std::make_unique<FE_Q<1>>(quad);
+    if constexpr (std::is_same_v<FE, FE_Q<2, 2>>)
+      return std::make_unique<FE_Q<2>>(quad);
+    if constexpr (std::is_same_v<FE, FE_Q<3, 3>>)
+      return std::make_unique<FE_Q<3>>(quad);
+
+    // Specializations for FE_Q_DG0.
+    if constexpr (std::is_same_v<FE, FE_Q_DG0<1, 1>>)
+      return std::make_unique<FE_Q_DG0<1>>(quad);
+    if constexpr (std::is_same_v<FE, FE_Q_DG0<2, 2>>)
+      return std::make_unique<FE_Q_DG0<2>>(quad);
+    if constexpr (std::is_same_v<FE, FE_Q_DG0<3, 3>>)
+      return std::make_unique<FE_Q_DG0<3>>(quad);
+
+    // Specializations for FE_Q_Bubbles.
+    if constexpr (std::is_same_v<FE, FE_Q_Bubbles<1, 1>>)
+      return std::make_unique<FE_Q_Bubbles<1>>(quad);
+    if constexpr (std::is_same_v<FE, FE_Q_Bubbles<2, 2>>)
+      return std::make_unique<FE_Q_Bubbles<2>>(quad);
+    if constexpr (std::is_same_v<FE, FE_Q_Bubbles<3, 3>>)
+      return std::make_unique<FE_Q_Bubbles<3>>(quad);
+
+    // Specializations for FE_DGQArbitraryNodes.
+    if constexpr (std::is_same_v<FE, FE_DGQ<1>>)
+      return std::make_unique<FE_DGQArbitraryNodes<1>>(quad);
+    if constexpr (std::is_same_v<FE, FE_DGQ<1, 2>>)
+      return std::make_unique<FE_DGQArbitraryNodes<1, 2>>(quad);
+    if constexpr (std::is_same_v<FE, FE_DGQ<1, 3>>)
+      return std::make_unique<FE_DGQArbitraryNodes<1, 3>>(quad);
+
+    // Specializations for FE_DG.
+    if constexpr (std::is_same_v<FE, FE_DGQ<2>>)
+      return std::make_unique<FE_DGQArbitraryNodes<2>>(quad);
+    if constexpr (std::is_same_v<FE, FE_DGQ<2, 3>>)
+      return std::make_unique<FE_DGQArbitraryNodes<2, 3>>(quad);
+    if constexpr (std::is_same_v<FE, FE_DGQ<3>>)
+      return std::make_unique<FE_DGQArbitraryNodes<3>>(quad);
+
     DEAL_II_NOT_IMPLEMENTED();
     return nullptr;
   }
index acee0c345e394ca6dbb3792e9e520b4db09f6685..7d5e2b71ca6b96e16e5f50e193f4fc3305eb027a 100644 (file)
@@ -36,115 +36,6 @@ namespace FETools
 // these do not fit into the templates of the dimension in the inst file
 namespace FETools
 {
-  // Specializations for FE_Q.
-  template <>
-  std::unique_ptr<FiniteElement<1, 1>>
-  FEFactory<FE_Q<1, 1>>::get(const Quadrature<1> &quad) const
-  {
-    return std::make_unique<FE_Q<1>>(quad);
-  }
-
-  template <>
-  std::unique_ptr<FiniteElement<2, 2>>
-  FEFactory<FE_Q<2, 2>>::get(const Quadrature<1> &quad) const
-  {
-    return std::make_unique<FE_Q<2>>(quad);
-  }
-
-  template <>
-  std::unique_ptr<FiniteElement<3, 3>>
-  FEFactory<FE_Q<3, 3>>::get(const Quadrature<1> &quad) const
-  {
-    return std::make_unique<FE_Q<3>>(quad);
-  }
-
-  // Specializations for FE_Q_DG0.
-  template <>
-  std::unique_ptr<FiniteElement<1, 1>>
-  FEFactory<FE_Q_DG0<1, 1>>::get(const Quadrature<1> &quad) const
-  {
-    return std::make_unique<FE_Q_DG0<1>>(quad);
-  }
-
-  template <>
-  std::unique_ptr<FiniteElement<2, 2>>
-  FEFactory<FE_Q_DG0<2, 2>>::get(const Quadrature<1> &quad) const
-  {
-    return std::make_unique<FE_Q_DG0<2>>(quad);
-  }
-
-  template <>
-  std::unique_ptr<FiniteElement<3, 3>>
-  FEFactory<FE_Q_DG0<3, 3>>::get(const Quadrature<1> &quad) const
-  {
-    return std::make_unique<FE_Q_DG0<3>>(quad);
-  }
-
-  // Specializations for FE_Q_Bubbles.
-  template <>
-  std::unique_ptr<FiniteElement<1, 1>>
-  FEFactory<FE_Q_Bubbles<1, 1>>::get(const Quadrature<1> &quad) const
-  {
-    return std::make_unique<FE_Q_Bubbles<1>>(quad);
-  }
-
-  template <>
-  std::unique_ptr<FiniteElement<2, 2>>
-  FEFactory<FE_Q_Bubbles<2, 2>>::get(const Quadrature<1> &quad) const
-  {
-    return std::make_unique<FE_Q_Bubbles<2>>(quad);
-  }
-
-  template <>
-  std::unique_ptr<FiniteElement<3, 3>>
-  FEFactory<FE_Q_Bubbles<3, 3>>::get(const Quadrature<1> &quad) const
-  {
-    return std::make_unique<FE_Q_Bubbles<3>>(quad);
-  }
-
-  // Specializations for FE_DGQArbitraryNodes.
-  template <>
-  std::unique_ptr<FiniteElement<1, 1>>
-  FEFactory<FE_DGQ<1>>::get(const Quadrature<1> &quad) const
-  {
-    return std::make_unique<FE_DGQArbitraryNodes<1>>(quad);
-  }
-
-  template <>
-  std::unique_ptr<FiniteElement<1, 2>>
-  FEFactory<FE_DGQ<1, 2>>::get(const Quadrature<1> &quad) const
-  {
-    return std::make_unique<FE_DGQArbitraryNodes<1, 2>>(quad);
-  }
-
-  template <>
-  std::unique_ptr<FiniteElement<1, 3>>
-  FEFactory<FE_DGQ<1, 3>>::get(const Quadrature<1> &quad) const
-  {
-    return std::make_unique<FE_DGQArbitraryNodes<1, 3>>(quad);
-  }
-
-  template <>
-  std::unique_ptr<FiniteElement<2, 2>>
-  FEFactory<FE_DGQ<2>>::get(const Quadrature<1> &quad) const
-  {
-    return std::make_unique<FE_DGQArbitraryNodes<2>>(quad);
-  }
-
-  template <>
-  std::unique_ptr<FiniteElement<2, 3>>
-  FEFactory<FE_DGQ<2, 3>>::get(const Quadrature<1> &quad) const
-  {
-    return std::make_unique<FE_DGQArbitraryNodes<2, 3>>(quad);
-  }
-
-  template <>
-  std::unique_ptr<FiniteElement<3, 3>>
-  FEFactory<FE_DGQ<3>>::get(const Quadrature<1> &quad) const
-  {
-    return std::make_unique<FE_DGQArbitraryNodes<3>>(quad);
-  }
-
   template std::vector<unsigned int>
   hierarchic_to_lexicographic_numbering<0>(unsigned int);
 

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.