From ec5e8e82f07b2901aa966b0afe4f57bfdd36e646 Mon Sep 17 00:00:00 2001
From: Timo Koch <timo.koch@iws.uni-stuttgart.de>
Date: Tue, 14 Nov 2017 19:18:31 +0100
Subject: [PATCH] [1p][test] make 1d3dnetwork test pass again

---
 .../1p/implicit/test_1pfv_network1d3d.cc      |  3 ++
 .../1p/implicit/tubesconvergencetest.py       |  5 +-
 .../1p/implicit/tubesproblem.hh               | 54 ++++++++-----------
 3 files changed, 27 insertions(+), 35 deletions(-)

diff --git a/test/porousmediumflow/1p/implicit/test_1pfv_network1d3d.cc b/test/porousmediumflow/1p/implicit/test_1pfv_network1d3d.cc
index 9c22775178..087fce42d1 100644
--- a/test/porousmediumflow/1p/implicit/test_1pfv_network1d3d.cc
+++ b/test/porousmediumflow/1p/implicit/test_1pfv_network1d3d.cc
@@ -186,6 +186,9 @@ int main(int argc, char** argv) try
                            << "have been saved to restart files.");
         }
 
+        // output l2 norm for convergence analysis
+        problem->outputL2Norm(x);
+
         // make the new solution the old solution
         xOld = x;
         gridVariables->advanceTimeStep();
diff --git a/test/porousmediumflow/1p/implicit/tubesconvergencetest.py b/test/porousmediumflow/1p/implicit/tubesconvergencetest.py
index 066651907e..bcb21d0864 100755
--- a/test/porousmediumflow/1p/implicit/tubesconvergencetest.py
+++ b/test/porousmediumflow/1p/implicit/tubesconvergencetest.py
@@ -4,11 +4,12 @@ from math import *
 import subprocess
 import sys
 
-if len(sys.argv) != 2:
+if len(sys.argv) < 2:
     sys.stderr.write('Please provide a single argument <testname> to the script\n')
     sys.exit(1)
 
 testname = str(sys.argv[1])
+testargs = [str(i) for i in sys.argv][2:]
 
 # remove the old log file
 subprocess.call(['rm', testname + '.log'])
@@ -16,7 +17,7 @@ print("Removed old log file ({})!".format(testname + '.log'))
 
 # do the runs with different refinement
 for i in [0, 1, 2, 3, 4, 5]:
-    subprocess.call(['./' + testname, '-Grid.Refinement', str(i),
+    subprocess.call(['./' + testname] + testargs + ['-Grid.Refinement', str(i),
                                       '-Problem.Name', testname])
 
 # check the rates and append them to the log file
diff --git a/test/porousmediumflow/1p/implicit/tubesproblem.hh b/test/porousmediumflow/1p/implicit/tubesproblem.hh
index e261f79fb9..6b601eb815 100644
--- a/test/porousmediumflow/1p/implicit/tubesproblem.hh
+++ b/test/porousmediumflow/1p/implicit/tubesproblem.hh
@@ -29,6 +29,8 @@
 #include <dune/geometry/quadraturerules.hh>
 
 #include <dumux/discretization/cellcentered/tpfa/properties.hh>
+#include <dumux/discretization/box/properties.hh>
+#include <dumux/discretization/methods.hh>
 #include <dumux/porousmediumflow/1p/implicit/model.hh>
 #include <dumux/porousmediumflow/problem.hh>
 #include <dumux/material/components/constant.hh>
@@ -94,23 +96,24 @@ class TubesTestProblem : public PorousMediumFlowProblem<TypeTag>
 
     using PrimaryVariables = typename GET_PROP_TYPE(TypeTag, PrimaryVariables);
     using BoundaryTypes = typename GET_PROP_TYPE(TypeTag, BoundaryTypes);
-    using TimeManager = typename GET_PROP_TYPE(TypeTag, TimeManager);
     using Element = typename GridView::template Codim<0>::Entity;
+    using FVGridGeometry = typename GET_PROP_TYPE(TypeTag, FVGridGeometry);
+    using SolutionVector = typename GET_PROP_TYPE(TypeTag, SolutionVector);
     using FVElementGeometry = typename GET_PROP_TYPE(TypeTag, FVElementGeometry);
     using SubControlVolume = typename GET_PROP_TYPE(TypeTag, SubControlVolume);
     using GlobalPosition = Dune::FieldVector<Scalar, dimWorld>;
 
-    enum { isBox = GET_PROP_VALUE(TypeTag, ImplicitIsBox) };
+    enum { isBox = GET_PROP_VALUE(TypeTag, DiscretizationMethod) == DiscretizationMethods::Box };
 
 public:
     TubesTestProblem(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
     : ParentType(fvGridGeometry)
     {
-        name_ = getParam<std::string>( "Problem.Name");
+        name_ = getParam<std::string>("Problem.Name");
 
         //get hMax_ of the grid
         hMax_ = 0.0;
-        for (const auto& element : elements(this->gridView()))
+        for (const auto& element : elements(fvGridGeometry->gridView()))
            hMax_ = std::max(element.geometry().volume(), hMax_);
     }
 
@@ -185,19 +188,6 @@ public:
         return PrimaryVariables(0.0);
     }
 
-    /*!
-     * \brief Evaluate the boundary conditions for a neumann
-     *        boundary segment.
-     *
-     * For this method, the \a priVars parameter stores the mass flux
-     * in normal direction of each component. Negative values mean
-     * influx.
-     */
-    PrimaryVariables neumannAtPos(const GlobalPosition& globalPos) const
-    {
-        return PrimaryVariables(0.0);
-    }
-
     // \}
 
     /*!
@@ -232,8 +222,7 @@ public:
 
         const auto& globalPos = scv.center();
         const auto& volVars = elemVolVars[scv];
-        const auto K = this->spatialParams().permeability(element, scv,
-                                    this->model().elementSolution(element, this->model().curSol()));
+        const auto K = this->spatialParams().permeability(element, scv, ElementSolutionVector());
 
         using std::sin;
         if (globalPos[2] > 0.5 - eps_)
@@ -260,19 +249,18 @@ public:
 
     // \}
 
-    void postTimeStep()
+    void outputL2Norm(const SolutionVector solution) const
     {
-        const auto& solution = this->model().curSol();
-
         // calculate the discrete L2-Norm
-        Scalar LTwoNorm = 0.0;
+        Scalar lTwoNorm = 0.0;
 
         // get the Gaussian quadrature rule for intervals
         const auto& quad = Dune::QuadratureRules<Scalar, dim>::rule(Dune::GeometryType(1), 1);
 
-        for (const auto& element : elements(this->gridView()))
+        const auto& gg = this->fvGridGeometry();
+        for (const auto& element : elements(gg.gridView()))
         {
-            const unsigned int eIdx = this->elementMapper().index(element);
+            const auto eIdx = gg.elementMapper().index(element);
             const auto geometry = element.geometry();
             for(auto&& qp : quad)
             {
@@ -289,22 +277,23 @@ public:
                     const auto& localFiniteElement = feCache_.get(geometry.type());
                     localFiniteElement.localBasis().evaluateFunction(qp.position(), shapeValues);
                     for (unsigned int i = 0; i < shapeValues.size(); ++i)
-                        p += shapeValues[i]*solution[this->model().dofMapper().subIndex(element, i, dim)][pressureIdx];
+                        p += shapeValues[i]*solution[gg.dofMapper().subIndex(element, i, dim)][pressureIdx];
                 }
-                LTwoNorm += (p - pe)*(p - pe)*qp.weight()*integrationElement;
+                lTwoNorm += (p - pe)*(p - pe)*qp.weight()*integrationElement;
             }
         }
-        LTwoNorm = std::sqrt(LTwoNorm);
+        lTwoNorm = std::sqrt(lTwoNorm);
 
         // write the norm into a log file
-        logFile_.open(this->name() + ".log", std::ios::app);
-        logFile_ << "[ConvergenceTest] L2-norm(pressure) = " << LTwoNorm  << " hMax = " << hMax_ << std::endl;
-        logFile_.close();
+        std::ofstream logFile;
+        logFile.open(this->name() + ".log", std::ios::app);
+        logFile << "[ConvergenceTest] L2-norm(pressure) = " << lTwoNorm  << " hMax = " << hMax_ << std::endl;
+        logFile.close();
     }
 
 private:
 
-    Scalar exactPressure_(const GlobalPosition& globalPos)
+    Scalar exactPressure_(const GlobalPosition& globalPos) const
     {
         using std::sin;
         return sin(4.0*M_PI*globalPos[2]);
@@ -315,7 +304,6 @@ private:
 
     Scalar hMax_;
 
-    std::ofstream logFile_;
     typename Dune::PQkLocalFiniteElementCache<Scalar, Scalar, dim, 1> feCache_;
 };
 
-- 
GitLab