From e4ce1e4086ca94437a54f064294af20b7dc36a76 Mon Sep 17 00:00:00 2001
From: Ned Coltman <edward.coltman@iws.uni-stuttgart.de>
Date: Fri, 9 Oct 2020 09:42:56 +0200
Subject: [PATCH] [rans][walldistance] Rewrite wall distance calculation

* Include non-  normal axis distances
* Cleanup wall and flow normal axis variables
* Include scvf corners as possible wall locations
---
 .../freeflow/subcontrolvolumeface.hh          |  2 +
 dumux/freeflow/rans/problem.hh                | 96 ++++++++++++-------
 dumux/freeflow/rans/twoeq/kepsilon/problem.hh | 58 ++++++-----
 dumux/freeflow/rans/volumevariables.hh        |  8 +-
 dumux/freeflow/rans/zeroeq/problem.hh         | 23 ++---
 dumux/freeflow/rans/zeroeq/volumevariables.hh |  4 +-
 test/freeflow/rans/problem.hh                 |  2 +-
 7 files changed, 107 insertions(+), 86 deletions(-)

diff --git a/dumux/discretization/staggered/freeflow/subcontrolvolumeface.hh b/dumux/discretization/staggered/freeflow/subcontrolvolumeface.hh
index 9805aa626a..6a7d6a76af 100644
--- a/dumux/discretization/staggered/freeflow/subcontrolvolumeface.hh
+++ b/dumux/discretization/staggered/freeflow/subcontrolvolumeface.hh
@@ -142,6 +142,8 @@ class FreeFlowStaggeredSubControlVolumeFace
 public:
     using GlobalPosition = typename T::GlobalPosition;
 
+    static constexpr int numCornersPerFace = 2 * (dim - 1);
+
     //! State the traits public and thus export all types
     using Traits = T;
 
diff --git a/dumux/freeflow/rans/problem.hh b/dumux/freeflow/rans/problem.hh
index 1b5721d002..c46d30aa35 100644
--- a/dumux/freeflow/rans/problem.hh
+++ b/dumux/freeflow/rans/problem.hh
@@ -76,6 +76,7 @@ class RANSProblemBase : public NavierStokesProblem<TypeTag>
     using GlobalPosition = typename SubControlVolumeFace::GlobalPosition;
 
     static constexpr auto dim = GridView::dimension;
+    static constexpr int numCorners = SubControlVolumeFace::numCornersPerFace;
     using DimVector = GlobalPosition;
     using DimMatrix = Dune::FieldMatrix<Scalar, dim, dim>;
 
@@ -111,15 +112,19 @@ public:
         velocityGradients_.resize(this->gridGeometry().elementMapper().size(), DimMatrix(0.0));
         stressTensorScalarProduct_.resize(this->gridGeometry().elementMapper().size(), 0.0);
         vorticityTensorScalarProduct_.resize(this->gridGeometry().elementMapper().size(), 0.0);
-        flowNormalAxis_.resize(this->gridGeometry().elementMapper().size(), 0);
-        wallNormalAxis_.resize(this->gridGeometry().elementMapper().size(), 1);
+        flowNormalAxis_.resize(this->gridGeometry().elementMapper().size(), fixedFlowNormalAxis_);
+        wallNormalAxis_.resize(this->gridGeometry().elementMapper().size(), fixedWallNormalAxis_);
         kinematicViscosity_.resize(this->gridGeometry().elementMapper().size(), 0.0);
         sandGrainRoughness_.resize(this->gridGeometry().elementMapper().size(), 0.0);
 
-        // retrieve all wall intersections and corresponding elements
-        std::vector<unsigned int> wallElements;
-        std::vector<GlobalPosition> wallPositions;
-        std::vector<unsigned int> wallNormalAxisTemp;
+        // store the element indicies for all elements with an intersection on the wall
+        std::vector<unsigned int> wallElementIndicies;
+
+        // for each wall element, store the location of the face center and each corner.
+        std::vector<std::array<GlobalPosition, numCorners+1>> wallPositions;
+
+        // for each wall element, store the faces normal axis
+        std::vector<unsigned int> wallFaceNormalAxis;
 
         const auto gridView = this->gridGeometry().gridView();
         auto fvGeometry = localView(this->gridGeometry());
@@ -135,46 +140,51 @@ public:
 
                 if (asImp_().isOnWall(scvf))
                 {
-                    wallElements.push_back(this->gridGeometry().elementMapper().index(element));
-                    wallPositions.push_back(scvf.center());
-                    wallNormalAxisTemp.push_back(scvf.directionIndex());
+                    // element has an scvf on the wall, store element index
+                    wallElementIndicies.push_back(this->gridGeometry().elementMapper().index(element));
+
+                    // store the location of the wall adjacent face's center and all corners
+                    std::array<GlobalPosition, numCorners+1> wallElementPosition;
+                    wallElementPosition[0] = scvf.center();
+                    for (int i = 1; i <= numCorners; i++)
+                        wallElementPosition[i] = scvf.corner(i-1);
+                    wallPositions.push_back(wallElementPosition);
+
+                    // Store the wall adjacent face's normal direction
+                    wallFaceNormalAxis.push_back(scvf.directionIndex());
                 }
             }
         }
+        // output the number of wall adjacent faces. Check that this is non-zero.
         std::cout << "NumWallIntersections=" << wallPositions.size() << std::endl;
         if (wallPositions.size() == 0)
             DUNE_THROW(Dune::InvalidStateException,
                        "No wall intersections have been found. Make sure that the isOnWall(globalPos) is working properly.");
 
 
-        // search for shortest distance to wall for each element
+        // search for shortest distance to the wall for each element
         for (const auto& element : elements(gridView))
         {
             unsigned int elementIdx = this->gridGeometry().elementMapper().index(element);
+
+            // Store the cell center position for each element
             cellCenter_[elementIdx] = element.geometry().center();
+
             for (unsigned int i = 0; i < wallPositions.size(); ++i)
             {
-                static const int problemWallNormalAxis
-                    = getParamFromGroup<int>(this->paramGroup(), "RANS.WallNormalAxis", -1);
-                int searchAxis = problemWallNormalAxis;
-
-                // search along wall normal axis of the intersection
-                if (problemWallNormalAxis < 0 || problemWallNormalAxis >= dim)
-                {
-                    searchAxis = wallNormalAxisTemp[i];
-                }
+                // Find the minimum distance from the cell center to the wall face (center and corners)
+                std::array<Scalar,numCorners+1> cellToWallDistances;
+                for (unsigned int j = 0; j < wallPositions[i].size(); j++)
+                    cellToWallDistances[j] = (cellCenter(elementIdx) - wallPositions[i][j]).two_norm();
+                Scalar distanceToWall = *std::min_element(cellToWallDistances.begin(), cellToWallDistances.end());
 
-                GlobalPosition global = element.geometry().center();
-                global -= wallPositions[i];
-                // second and argument ensures to use only aligned elements
-                if (abs(global[searchAxis]) < wallDistance_[elementIdx]
-                    && abs(global[searchAxis]) < global.two_norm() + 1e-8
-                    && abs(global[searchAxis]) > global.two_norm() - 1e-8)
+                if (distanceToWall < wallDistance_[elementIdx])
                 {
-                    wallDistance_[elementIdx] = abs(global[searchAxis]);
-                    wallElementIdx_[elementIdx] = wallElements[i];
-                    wallNormalAxis_[elementIdx] = searchAxis;
-                    sandGrainRoughness_[elementIdx] = asImp_().sandGrainRoughnessAtPos(wallPositions[i]);
+                    wallDistance_[elementIdx] = distanceToWall;
+                    wallElementIdx_[elementIdx] = wallElementIndicies[i];
+                    if ( !(hasParam("RANS.WallNormalAxis")) )
+                        wallNormalAxis_[elementIdx] = wallFaceNormalAxis[i];
+                    sandGrainRoughness_[elementIdx] = asImp_().sandGrainRoughnessAtPos(wallPositions[i][0]);
                 }
             }
         }
@@ -232,9 +242,6 @@ public:
             DUNE_THROW(Dune::InvalidStateException,
                        "You have to call updateStaticWallProperties() once before you call updateDynamicWallProperties().");
 
-        static const int flowNormalAxis
-            = getParamFromGroup<int>(this->paramGroup(), "RANS.FlowNormalAxis", -1);
-
         // re-initialize min and max values
         velocityMaximum_.assign(this->gridGeometry().elementMapper().size(), DimVector(1e-16));
         velocityMinimum_.assign(this->gridGeometry().elementMapper().size(), DimVector(std::numeric_limits<Scalar>::max()));
@@ -529,19 +536,38 @@ public:
     }
 
 public:
+    int wallNormalAxis(const int elementIdx) const
+    { return wallNormalAxis_[elementIdx]; }
+
+    int flowNormalAxis(const int elementIdx) const
+    { return flowNormalAxis_[elementIdx]; }
+
+    unsigned int wallElementIndex(const int elementIdx) const
+    { return wallElementIdx_[elementIdx]; }
+
+    Scalar wallDistance(const int elementIdx) const
+    { return wallDistance_[elementIdx]; }
+
+
     bool calledUpdateStaticWallProperties = false;
-    std::vector<unsigned int> wallElementIdx_;
+
+    const int fixedFlowNormalAxis_ = getParam<int>("RANS.FlowNormalAxis", 0);
+    const int fixedWallNormalAxis_ = getParam<int>("RANS.WallNormalAxis", 1);
+
+    std::vector<unsigned int> wallNormalAxis_;
+    std::vector<unsigned int> flowNormalAxis_;
     std::vector<Scalar> wallDistance_;
+    std::vector<unsigned int> wallElementIdx_;
     std::vector<std::array<std::array<unsigned int, 2>, dim>> neighborIdx_;
     std::vector<GlobalPosition> cellCenter_;
     std::vector<DimVector> velocity_;
     std::vector<DimVector> velocityMaximum_;
     std::vector<DimVector> velocityMinimum_;
     std::vector<DimMatrix> velocityGradients_;
+
     std::vector<Scalar> stressTensorScalarProduct_;
     std::vector<Scalar> vorticityTensorScalarProduct_;
-    std::vector<unsigned int> wallNormalAxis_;
-    std::vector<unsigned int> flowNormalAxis_;
+
     std::vector<Scalar> kinematicViscosity_;
     std::vector<Scalar> sandGrainRoughness_;
 
diff --git a/dumux/freeflow/rans/twoeq/kepsilon/problem.hh b/dumux/freeflow/rans/twoeq/kepsilon/problem.hh
index 1efb32c5b4..7b0382947f 100644
--- a/dumux/freeflow/rans/twoeq/kepsilon/problem.hh
+++ b/dumux/freeflow/rans/twoeq/kepsilon/problem.hh
@@ -144,17 +144,17 @@ public:
         for (const auto& element : elements(this->gridGeometry().gridView()))
         {
             unsigned int elementIdx = this->gridGeometry().elementMapper().index(element);
-            unsigned int wallNormalAxis = asImp_().wallNormalAxis_[elementIdx];
-            unsigned int neighborIdx0 = asImp_().neighborIdx_[elementIdx][wallNormalAxis][0];
-            unsigned int neighborIdx1 = asImp_().neighborIdx_[elementIdx][wallNormalAxis][1];
+            unsigned int wallNormalAxis = asImp_().wallNormalAxis(elementIdx);
+            unsigned int neighborIndex0 = asImp_().neighborIndex(elementIdx, wallNormalAxis, 0);
+            unsigned int neighborIndex1 = asImp_().neighborIndex(elementIdx, wallNormalAxis, 1);
             numElementsInNearWallRegion = inNearWallRegion(elementIdx)
                                           ? numElementsInNearWallRegion + 1
                                           : numElementsInNearWallRegion + 0;
-            if ((!inNearWallRegion(elementIdx) && (inNearWallRegion(neighborIdx0) || inNearWallRegion(neighborIdx1)))
-                || (!inNearWallRegion(elementIdx) && elementIdx == asImp_().wallElementIdx_[elementIdx])
-                || (inNearWallRegion(elementIdx) && (asImp_().wallElementIdx_[neighborIdx0] != asImp_().wallElementIdx_[neighborIdx1])))
+            if ((!inNearWallRegion(elementIdx) && (inNearWallRegion(neighborIndex0) || inNearWallRegion(neighborIndex1)))
+                || (!inNearWallRegion(elementIdx) && elementIdx == asImp_().wallElementIndex(elementIdx))
+                || (inNearWallRegion(elementIdx) && (asImp_().wallElementIndex(neighborIndex0) != asImp_().wallElementIndex(neighborIndex1))))
             {
-                matchingPointIdx_[asImp_().wallElementIdx_[elementIdx]] = elementIdx;
+                matchingPointIdx_[asImp_().wallElementIndex(elementIdx)] = elementIdx;
             }
         }
         std::cout << "numElementsInNearWallRegion: " << numElementsInNearWallRegion << std::endl;
@@ -174,7 +174,7 @@ public:
             for (const auto& element : elements(this->gridGeometry().gridView()))
             {
                 unsigned int elementIdx = this->gridGeometry().elementMapper().index(element);
-                unsigned int matchingPointIdx = matchingPointIdx_[asImp_().wallElementIdx_[elementIdx]];
+                unsigned int matchingPointIdx = matchingPointIdx_[asImp_().wallElementIndex(elementIdx)];
 
                 Scalar scalingFactor = storedDynamicEddyViscosity_[matchingPointIdx]
                                        / zeroEqDynamicEddyViscosity_[matchingPointIdx];
@@ -187,7 +187,7 @@ public:
             for (const auto& element : elements(this->gridGeometry().gridView()))
             {
                 unsigned int elementIdx = this->gridGeometry().elementMapper().index(element);
-                unsigned int matchingPointIdx = matchingPointIdx_[asImp_().wallElementIdx_[elementIdx]];
+                unsigned int matchingPointIdx = matchingPointIdx_[asImp_().wallElementIndex(elementIdx)];
                 if (isMatchingPoint(elementIdx))
                 {
                     zeroEqDynamicEddyViscosity_[matchingPointIdx] = storedDynamicEddyViscosity_[matchingPointIdx];
@@ -201,7 +201,7 @@ public:
      */
     bool inNearWallRegion(unsigned int elementIdx) const
     {
-        unsigned int wallElementIdx = asImp_().wallElementIdx_[elementIdx];
+        unsigned int wallElementIdx = asImp_().wallElementIndex(elementIdx);
         unsigned int matchingPointIdx = matchingPointIdx_[wallElementIdx];
         return wallElementIdx == matchingPointIdx ? yPlusNominal(elementIdx) < yPlusThreshold_
                                                 : yPlus(elementIdx) < yPlusThreshold_;
@@ -211,23 +211,23 @@ public:
      * \brief Returns if an element is the matching point
      */
     bool isMatchingPoint(unsigned int elementIdx) const
-    { return matchingPointIdx_[asImp_().wallElementIdx_[elementIdx]] == elementIdx; }
+    { return matchingPointIdx_[asImp_().wallElementIndex(elementIdx)] == elementIdx; }
 
     /*!
      * \brief Returns the \f$ y^+ \f$ value at an element center
      */
     const Scalar yPlus(unsigned int elementIdx) const
     {
-        return asImp_().wallDistance_[elementIdx] * uStar(elementIdx)
-               / asImp_().kinematicViscosity_[elementIdx];
+        return asImp_().wallDistance(elementIdx) * uStar(elementIdx)
+             / asImp_().kinematicViscosity(elementIdx);
     }
     /*!
      * \brief Returns the nominal \f$ y^+ \f$ value at an element center
      */
     const Scalar yPlusNominal(unsigned int elementIdx) const
     {
-        return asImp_().wallDistance_[elementIdx] * uStarNominal(elementIdx)
-               / asImp_().kinematicViscosity_[elementIdx];
+        return asImp_().wallDistance(elementIdx) * uStarNominal(elementIdx)
+             / asImp_().kinematicViscosity(elementIdx);
     }
 
     /*!
@@ -244,14 +244,14 @@ public:
         Scalar mixingLength = 0.0;
         if (yPlusValue > 0.0)
         {
-            mixingLength = asImp_().karmanConstant() * asImp_().wallDistance_[elementIdx]
+            mixingLength = asImp_().karmanConstant() * asImp_().wallDistance(elementIdx)
                            * (1.0 - exp(-yPlusValue / 26.0 ))
                            / sqrt(1.0 - exp(-0.26 * yPlusValue));
         }
 
-        unsigned int wallNormalAxis = asImp_().wallNormalAxis_[elementIdx];
-        unsigned int flowNormalAxis = asImp_().flowNormalAxis_[elementIdx];
-        Scalar velocityGradient = asImp_().velocityGradients_[elementIdx][flowNormalAxis][wallNormalAxis];
+        unsigned int wallNormalAxis = asImp_().wallNormalAxis(elementIdx);
+        unsigned int flowNormalAxis = asImp_().flowNormalAxis(elementIdx);
+        Scalar velocityGradient = asImp_().velocityGradient(elementIdx, flowNormalAxis, wallNormalAxis);
         return mixingLength * mixingLength * abs(velocityGradient) * storedDensity_[elementIdx];
     }
 
@@ -260,11 +260,11 @@ public:
     {
         using std::abs;
         using std::sqrt;
-        unsigned int wallElementIdx = asImp_().wallElementIdx_[elementIdx];
-        unsigned int wallNormalAxis = asImp_().wallNormalAxis_[elementIdx];
-        unsigned int flowNormalAxis = asImp_().flowNormalAxis_[elementIdx];
-        return sqrt(asImp_().kinematicViscosity_[wallElementIdx]
-                    * abs(asImp_().velocityGradients_[wallElementIdx][flowNormalAxis][wallNormalAxis]));
+        unsigned int wallElementIdx = asImp_().wallElementIndex(elementIdx);
+        unsigned int wallNormalAxis = asImp_().wallNormalAxis(elementIdx);
+        unsigned int flowNormalAxis = asImp_().flowNormalAxis(elementIdx);
+        return sqrt(asImp_().kinematicViscosity(wallElementIdx)
+                    * abs(asImp_().velocityGradient(wallElementIdx, flowNormalAxis, wallNormalAxis)));
     }
 
     //! \brief Returns the nominal wall shear stress velocity (accounts for poor approximation of viscous sublayer)
@@ -272,9 +272,8 @@ public:
     {
         using std::pow;
         using std::sqrt;
-        unsigned int matchingPointIdx = matchingPointIdx_[asImp_().wallElementIdx_[elementIdx]];
-        return pow(cMu(), 0.25)
-               * sqrt(storedTurbulentKineticEnergy_[matchingPointIdx]);
+        unsigned int matchingPointIdx = matchingPointIdx_[asImp_().wallElementIndex(elementIdx)];
+        return pow(cMu(), 0.25) * sqrt(storedTurbulentKineticEnergy_[matchingPointIdx]);
     }
 
     /*!
@@ -283,7 +282,7 @@ public:
     const Scalar dissipationWallFunction(unsigned int elementIdx) const
     {
         return uStarNominal(elementIdx) * uStarNominal(elementIdx) * uStarNominal(elementIdx)
-               / asImp_().karmanConstant() / asImp_().wallDistance_[elementIdx];
+               / asImp_().karmanConstant() / asImp_().wallDistance(elementIdx);
     }
 
     /*!
@@ -291,8 +290,7 @@ public:
      */
     const Scalar turbulentKineticEnergyWallFunction(unsigned int elementIdx) const
     {
-        unsigned int wallElementIdx = asImp_().wallElementIdx_[elementIdx];
-        unsigned int matchingPointIdx = matchingPointIdx_[wallElementIdx];
+        unsigned int matchingPointIdx = matchingPointIdx_[asImp_().wallElementIndex(elementIdx)];
         return storedTurbulentKineticEnergy_[matchingPointIdx];
     }
 
diff --git a/dumux/freeflow/rans/volumevariables.hh b/dumux/freeflow/rans/volumevariables.hh
index e1ed768072..cecf13e0ff 100644
--- a/dumux/freeflow/rans/volumevariables.hh
+++ b/dumux/freeflow/rans/volumevariables.hh
@@ -93,15 +93,14 @@ public:
 
         // calculate characteristic properties of the turbulent flow
         elementIdx_ = problem.gridGeometry().elementMapper().index(element);
-        wallElementIdx_ = problem.wallElementIdx_[elementIdx_];
-        wallDistance_ = problem.wallDistance_[elementIdx_];
+        wallDistance_ = problem.wallDistance(elementIdx_);
         velocity_ = problem.velocity_[elementIdx_];
         velocityMaximum_ = problem.velocityMaximum_[wallElementIdx_];
         velocityGradients_ = problem.velocityGradients_[elementIdx_];
-        const auto flowNormalAxis = problem.flowNormalAxis_[elementIdx_];
-        const auto wallNormalAxis = problem.wallNormalAxis_[elementIdx_];
         uStar_ = sqrt(problem.kinematicViscosity_[wallElementIdx_]
                       * abs(problem.velocityGradients_[wallElementIdx_][flowNormalAxis][wallNormalAxis]));
+        const auto flowNormalAxis = problem.flowNormalAxis(elementIdx_);
+        const auto wallNormalAxis = problem.wallNormalAxis(elementIdx_);
         uStar_ = max(uStar_, 1e-10); // zero values lead to numerical problems in some turbulence models
         yPlus_ = wallDistance_ * uStar_ / problem.kinematicViscosity_[elementIdx_];
         uPlus_ = velocity_[flowNormalAxis] / uStar_;
@@ -258,7 +257,6 @@ protected:
     DimVector velocityMaximum_;
     DimMatrix velocityGradients_;
     std::size_t elementIdx_;
-    std::size_t wallElementIdx_;
     Scalar wallDistance_;
     Scalar karmanConstant_;
     Scalar uStar_;
diff --git a/dumux/freeflow/rans/zeroeq/problem.hh b/dumux/freeflow/rans/zeroeq/problem.hh
index 86e09ad0a7..b6479fbf26 100644
--- a/dumux/freeflow/rans/zeroeq/problem.hh
+++ b/dumux/freeflow/rans/zeroeq/problem.hh
@@ -134,14 +134,14 @@ public:
                 }
                 if (ksPlus > 2000.)
                 {
-                    std::cout << "info: equivalent sand grain roughness ks+=" << ksPlus << " at " << this->cellCenter_[this->wallElementIdx_[elementIdx]]
+                    std::cout << "info: equivalent sand grain roughness ks+=" << ksPlus << " at " << asImp_().cellCenter(asImp_().wallElementIndex(elementIdx))
                               << " is not in the valid range (ksPlus < 2000),"
                               << " for high ksPlus values the roughness function reaches a turning point."<< std::endl;
                     DUNE_THROW(Dune::InvalidStateException, "Unphysical roughness behavior.");
                 }
                 else if (ksPlus > 0.0 && ksPlus < 4.535 && !printedRangeWarning)
                 {
-                    Dune::dinfo << "info: equivalent sand grain roughness ks+=" << ksPlus << " at " << this->cellCenter_[this->wallElementIdx_[elementIdx]]
+                    Dune::dinfo << "info: equivalent sand grain roughness ks+=" << ksPlus << " at " << asImp_().cellCenter(asImp_().wallElementIndex(elementIdx))
                                 << " is not in the valid range (ksPlus > 4.535) and now set to 0.0"<< std::endl;
                     ksPlus = 0.0;
                     printedRangeWarning = true;
@@ -186,10 +186,10 @@ public:
         for (const auto& element : elements(this->gridGeometry().gridView()))
         {
             unsigned int elementIdx = this->gridGeometry().elementMapper().index(element);
-            unsigned int wallElementIdx = this->wallElementIdx_[elementIdx];
-            Scalar wallDistance = this->wallDistance_[elementIdx] + additionalRoughnessLength_[elementIdx];
-            unsigned int flowNormalAxis = this->flowNormalAxis_[elementIdx];
-            unsigned int wallNormalAxis = this->wallNormalAxis_[elementIdx];
+            Scalar effectiveWallDistance = asImp_().wallDistance(elementIdx) + additionalRoughnessLength_[elementIdx];
+            unsigned int flowNormalAxis = this->flowNormalAxis(elementIdx);
+            unsigned int wallNormalAxis = this->wallNormalAxis(elementIdx);
+
 
             Scalar omegaAbs = abs(this->velocityGradients_[elementIdx][flowNormalAxis][wallNormalAxis]
                                   - this->velocityGradients_[elementIdx][wallNormalAxis][flowNormalAxis]);
@@ -211,8 +211,7 @@ public:
         for (const auto& element : elements(this->gridGeometry().gridView()))
         {
             unsigned int elementIdx = this->gridGeometry().elementMapper().index(element);
-            unsigned int wallElementIdx = this->wallElementIdx_[elementIdx];
-            Scalar wallDistance = this->wallDistance_[elementIdx] + additionalRoughnessLength_[elementIdx];
+            Scalar effectiveWallDistance = asImp_().wallDistance(elementIdx) + additionalRoughnessLength_[elementIdx];
 
             Scalar maxVelocityNorm = 0.0;
             Scalar minVelocityNorm = 0.0;
@@ -238,8 +237,7 @@ public:
         for (const auto& element : elements(this->gridGeometry().gridView()))
         {
             unsigned int elementIdx = this->gridGeometry().elementMapper().index(element);
-            unsigned int wallElementIdx = this->wallElementIdx_[elementIdx];
-            Scalar wallDistance = this->wallDistance_[elementIdx] + additionalRoughnessLength_[elementIdx];
+            Scalar effectiveWallDistance = asImp_().wallDistance(elementIdx) + additionalRoughnessLength_[elementIdx];
 
             // checks if sign switches, by multiplication
             Scalar check = kinematicEddyViscosityDifference[wallElementIdx] * kinematicEddyViscosityDifference[elementIdx];
@@ -254,11 +252,10 @@ public:
         for (const auto& element : elements(this->gridGeometry().gridView()))
         {
             unsigned int elementIdx = this->gridGeometry().elementMapper().index(element);
-            unsigned int wallElementIdx = this->wallElementIdx_[elementIdx];
-            Scalar wallDistance = this->wallDistance_[elementIdx] + additionalRoughnessLength_[elementIdx];
+            Scalar effectiveWallDistance = asImp_().wallDistance(elementIdx) + additionalRoughnessLength_[elementIdx];
 
             kinematicEddyViscosity_[elementIdx] = kinematicEddyViscosityInner[elementIdx];
-            if (wallDistance >= switchingPosition[wallElementIdx])
+            if (effectiveWallDistance >= switchingPosition[asImp_().wallElementIndex(elementIdx)])
             {
                 kinematicEddyViscosity_[elementIdx] = kinematicEddyViscosityOuter[elementIdx];
             }
diff --git a/dumux/freeflow/rans/zeroeq/volumevariables.hh b/dumux/freeflow/rans/zeroeq/volumevariables.hh
index e8b3560be8..6a444925fd 100644
--- a/dumux/freeflow/rans/zeroeq/volumevariables.hh
+++ b/dumux/freeflow/rans/zeroeq/volumevariables.hh
@@ -108,8 +108,8 @@ public:
         using std::exp;
         using std::sqrt;
         Scalar kinematicEddyViscosity = 0.0;
-        unsigned int flowNormalAxis = problem.flowNormalAxis_[RANSParentType::elementIdx()];
-        unsigned int wallNormalAxis = problem.wallNormalAxis_[RANSParentType::elementIdx()];
+        unsigned int flowNormalAxis = problem.flowNormalAxis(RANSParentType::elementIdx());
+        unsigned int wallNormalAxis = problem.wallNormalAxis(RANSParentType::elementIdx());
         Scalar velGrad = abs(RANSParentType::velocityGradients()[flowNormalAxis][wallNormalAxis]);
 
         if (modelName.compare("none") == 0)
diff --git a/test/freeflow/rans/problem.hh b/test/freeflow/rans/problem.hh
index 32fd52316f..926bf9386c 100644
--- a/test/freeflow/rans/problem.hh
+++ b/test/freeflow/rans/problem.hh
@@ -429,7 +429,7 @@ private:
         {
             static_assert(ModelTraits::turbulenceModel() == TurbulenceModel::komega, "Only valid for Komega");
             // For the komega model we set a fixed value for the dissipation
-            const auto wallDistance = ParentType::wallDistance_[elementIdx];
+            const auto wallDistance = ParentType::wallDistance(elementIdx);
             using std::pow;
             values[Indices::dissipationEqIdx] = 6.0 * ParentType::kinematicViscosity_[elementIdx]
                                                     / (ParentType::betaOmega() * wallDistance * wallDistance);
-- 
GitLab