From edb9361e5af532b64844acc3f49c42b454c0e0d0 Mon Sep 17 00:00:00 2001
From: Ned Coltman <edward.coltman@iws.uni-stuttgart.de>
Date: Fri, 8 May 2020 18:16:47 +0200
Subject: [PATCH] [freeflow][staggeredupwindfluxvars] reduce the
 getFrontalUpwindingMomenta_ functions with if constexpr

---
 .../staggered/staggeredupwindfluxvariables.hh | 74 +++++--------------
 1 file changed, 20 insertions(+), 54 deletions(-)

diff --git a/dumux/freeflow/navierstokes/staggered/staggeredupwindfluxvariables.hh b/dumux/freeflow/navierstokes/staggered/staggeredupwindfluxvariables.hh
index 492f215d99..e12db01f29 100644
--- a/dumux/freeflow/navierstokes/staggered/staggeredupwindfluxvariables.hh
+++ b/dumux/freeflow/navierstokes/staggered/staggeredupwindfluxvariables.hh
@@ -92,17 +92,8 @@ public:
                                                                const Scalar transportingVelocity)
     {
         const bool canHigherOrder = canFrontalSecondOrder_(scvf, transportingVelocity);
-
-        if (canHigherOrder)
-        {
-            const auto upwindingMomenta = getFrontalUpwindingMomenta_(scvf, elemFaceVars, elemVolVars[scvf.insideScvIdx()].density(),
-                                                                      transportingVelocity, std::integral_constant<bool, useHigherOrder>{});
-        }
-        else
-        {
-            const auto upwindingMomenta = getFrontalUpwindingMomenta_(scvf, elemFaceVars, elemVolVars[scvf.insideScvIdx()].density(),
-                                                                      transportingVelocity, std::integral_constant<bool, false>{});
-        }
+        const auto upwindingMomenta = getFrontalUpwindingMomenta_(scvf, elemFaceVars, elemVolVars[scvf.insideScvIdx()].density(),
+                                                                  transportingVelocity, canHigherOrder);
         return doFrontalMomentumUpwinding_(scvf, upwindingMomenta, transportingVelocity, gridFluxVarsCache, canHigherOrder);
     }
 
@@ -181,29 +172,6 @@ private:
             return false;
     }
 
-    /*!
-     * \brief Returns an array of the two momenta needed for basic upwinding methods.
-     *
-     * \param scvf The sub control volume face
-     * \param elemFaceVars The element face variables
-     * \param density The given density \f$\mathrm{[kg/m^3]}\f$
-     * \param transportingVelocity The average of the self and opposite velocities.
-     * \param false_type False if higher order methods are not enabled.
-     */
-    static std::array<Scalar, 2> getFrontalUpwindingMomenta_(const SubControlVolumeFace& scvf,
-                                                             const ElementFaceVariables& elemFaceVars,
-                                                             const Scalar density,
-                                                             const Scalar transportingVelocity,
-                                                             std::false_type)
-    {
-        const Scalar momentumSelf = elemFaceVars[scvf].velocitySelf() * density;
-        const Scalar momentumOpposite = elemFaceVars[scvf].velocityOpposite() * density;
-        const bool selfIsUpstream = scvf.directionSign() != sign(transportingVelocity);
-
-        return selfIsUpstream ? std::array<Scalar, 2>{momentumOpposite, momentumSelf}
-                              : std::array<Scalar, 2>{momentumSelf, momentumOpposite};
-    }
-
     /*!
      * \brief Returns an array of the three momenta needed for higher order upwinding methods.
      *
@@ -211,33 +179,31 @@ private:
      * \param elemFaceVars The element face variables
      * \param density The given density \f$\mathrm{[kg/m^3]}\f$
      * \param transportingVelocity The average of the self and opposite velocities.
-     * \param true_type True if higher order methods are enabled.
      */
-    static std::array<Scalar, 3> getFrontalUpwindingMomenta_(const SubControlVolumeFace& scvf,
-                                                             const ElementFaceVariables& elemFaceVars,
-                                                             const Scalar density,
-                                                             const Scalar transportingVelocity,
-                                                             std::true_type)
+    static auto getFrontalUpwindingMomenta_(const SubControlVolumeFace& scvf,
+                                            const ElementFaceVariables& elemFaceVars,
+                                            const Scalar density,
+                                            const Scalar transportingVelocity,
+                                            [[maybe_unused]] const bool canHigherOrder)
     {
         const bool selfIsUpstream = scvf.directionSign() != sign(transportingVelocity);
-        std::array<Scalar, 3> momenta;
+        const Scalar momentumSelf = elemFaceVars[scvf].velocitySelf() * density;
+        const Scalar momentumOpposite = elemFaceVars[scvf].velocityOpposite() * density;
 
-        if (selfIsUpstream)
+        if constexpr (useHigherOrder)
         {
-            momenta[0] = elemFaceVars[scvf].velocityOpposite() * density;
-            momenta[1] = elemFaceVars[scvf].velocitySelf() * density;
-            momenta[2] = elemFaceVars[scvf].velocityForward(0) * density;
+            if (canHigherOrder)
+                return selfIsUpstream ? std::array<Scalar, 3>{momentumOpposite, momentumSelf,
+                                                              elemFaceVars[scvf].velocityForward(0)*density}
+                                      : std::array<Scalar, 3>{momentumSelf, momentumOpposite,
+                                                              elemFaceVars[scvf].velocityBackward(0)*density};
+            else
+                return selfIsUpstream ? std::array<Scalar, 3>{momentumOpposite, momentumSelf}
+                                      : std::array<Scalar, 3>{momentumSelf, momentumOpposite};
         }
         else
-        {
-            momenta[0] = elemFaceVars[scvf].velocitySelf() * density;
-            momenta[1] = elemFaceVars[scvf].velocityOpposite() * density;
-            momenta[2] = elemFaceVars[scvf].velocityBackward(0) * density;
-        }
-
-        return momenta;
-    }
-
+            return selfIsUpstream ? std::array<Scalar, 2>{momentumOpposite, momentumSelf}
+                                  : std::array<Scalar, 2>{momentumSelf, momentumOpposite};
     }
 
     /*!
-- 
GitLab