From 09ad102d408790421492905009a637ae0148ac47 Mon Sep 17 00:00:00 2001
From: Simon Scholz <simon.scholz@iws.uni-stuttgart.de>
Date: Fri, 21 Dec 2018 11:50:11 +0100
Subject: [PATCH] [biomin] update biomin example, free from wrong perm matrix

---
 .../biominproblem.hh                          |  9 ++---
 .../biominspatialparams.hh                    | 39 +++----------------
 .../chemistry/simplebiominreactions.hh        | 21 ++++------
 .../exercisebiomin.input                      |  3 --
 .../biominproblem.hh                          |  9 ++---
 .../biominspatialparams.hh                    | 39 +++----------------
 .../chemistry/simplebiominreactions.hh        | 13 ++-----
 .../exercisebiomin_solution.input             |  3 --
 8 files changed, 30 insertions(+), 106 deletions(-)

diff --git a/exercises/exercise-biomineralization/biominproblem.hh b/exercises/exercise-biomineralization/biominproblem.hh
index c72dff46..20d0790b 100644
--- a/exercises/exercise-biomineralization/biominproblem.hh
+++ b/exercises/exercise-biomineralization/biominproblem.hh
@@ -95,11 +95,11 @@ struct SpatialParams<TypeTag, TTag::ExerciseFourBioMin> {
 };
 
 template<class TypeTag>
-struct EnableFVGridGeometryCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = false; };
+struct EnableFVGridGeometryCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = true; };
 template<class TypeTag>
-struct EnableGridVolumeVariablesCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = false; };
+struct EnableGridVolumeVariablesCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = true; };
 template<class TypeTag>
-struct EnableGridFluxVariablesCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = false; };
+struct EnableGridFluxVariablesCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = true; };
 
 } // end namespace properties
 /*!
@@ -169,9 +169,6 @@ public:
     ExerciseFourBioMinProblem(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
     : ParentType(fvGridGeometry)
     {
-#if !DUNE_VERSION_NEWER(DUNE_COMMON,2,7)
-        Dune::FMatrixPrecision<Scalar>::set_singular_limit(1e-35);
-#endif
         name_           = getParam<std::string>("Problem.Name");
         //initial values
         densityW_       = getParam<Scalar>("Initial.InitDensityW");
diff --git a/exercises/exercise-biomineralization/biominspatialparams.hh b/exercises/exercise-biomineralization/biominspatialparams.hh
index 393bd57d..3815f373 100644
--- a/exercises/exercise-biomineralization/biominspatialparams.hh
+++ b/exercises/exercise-biomineralization/biominspatialparams.hh
@@ -229,10 +229,14 @@ public:
                 const auto& dofPosition = scv.dofPosition();
                 const bool isInAquitardNotFaultZone = isInAquitard_(dofPosition) && !isFaultZone_(dofPosition);
                 auto kInit = isInAquitardNotFaultZone ? aquitardPermeability_ : initialPermeability_;
+                PermeabilityType K (0.0);
+                for (int i = 0; i < dimWorld; ++i)
+                    K[i][i] = kInit;
                 const auto refPoro = referencePorosity(element, scv);
                 const auto poro = porosity(element, scv, elemSol);
-                auto kEvaluated = permLaw_.evaluatePermeability(kInit, refPoro, poro);
-                referencePermeability_[eIdx][scv.indexInElement()] = calculateKRef(kInit, kEvaluated);
+                auto kEvaluated = permLaw_.evaluatePermeability(K, refPoro, poro);
+                K *= K[0][0]/kEvaluated[0][0];
+                referencePermeability_[eIdx][scv.indexInElement()] = K;
             }
         }
     }
@@ -275,39 +279,8 @@ public:
     { return FluidSystem::liquidPhaseIdx; }
 
 private:
-
     static constexpr Scalar eps_ = 1e-6;
 
-    //! calculateKRef for tensorial permeabilities
-    PermeabilityType calculateKRef(PermeabilityType K, PermeabilityType kEvaluated)
-    {
-        //TODO this assumes the change in permeability is homogeneous as currently also assumed in PermeabilityKozenyCarman.
-        // there also might be nicer/safer ways to calculate this.
-        Scalar factor = 0.0;
-        int counter = 0;
-        for (int i = 0; i < dimWorld; ++i)
-            for (int j = 0; i < dimWorld; ++i)
-                if(kEvaluated[i][j]!=0)
-                {
-                factor += K[i][j] / kEvaluated[i][j];
-                    ++counter;
-                }
-        factor /= counter;
-        K *= factor;
-
-        return K;
-    }
-
-    //! calculateKRef for scalar permeabilities
-    template<class PT = PermeabilityType,
-             std::enable_if_t<Dune::IsNumber< PT >::value, int> = 0>
-    PermeabilityType calculateKRef(PermeabilityType K, PermeabilityType kEvaluated)
-    {
-        Scalar factor = K / kEvaluated;
-        K *= factor;
-        return K;
-    }
-
     Scalar calculatephiRef(Scalar phiInit, Scalar phiEvaluated)
     { return 2*phiInit - phiEvaluated;}
 
diff --git a/exercises/exercise-biomineralization/chemistry/simplebiominreactions.hh b/exercises/exercise-biomineralization/chemistry/simplebiominreactions.hh
index 8a18560d..f7a0f62a 100644
--- a/exercises/exercise-biomineralization/chemistry/simplebiominreactions.hh
+++ b/exercises/exercise-biomineralization/chemistry/simplebiominreactions.hh
@@ -95,28 +95,23 @@ public:
         Scalar molalityUrea = moleFracToMolality(volVars.moleFraction(liquidPhaseIdx,UreaIdx),
                                                  xwCa,
                                                  volVars.moleFraction(liquidPhaseIdx,CO2Idx));  // [mol_urea/kg_H2O]
-        if (molalityUrea < 0)
-            molalityUrea = 0;
 
         // TODO: dumux-course-task
         // compute rate of ureolysis by implementing Z_urease,biofilm and r_urea
 
         // compute/set dissolution and precipitation rate of calcite
-        Scalar rprec = 0;
-
-        // regularize so that we do not get precipitation where there is no calcium
-        if (xwCa > 1e-8)
-            rprec = rurea;
+        Scalar rprec = 0.0;
+        rprec = rurea;
 
         // set source terms
         // TODO: dumux-course-task
         // update terms according to stochiometry
-        q[H2OIdx]     += 0;
-        q[CO2Idx]     += 0;
-        q[CaIdx]      += 0;
-        q[UreaIdx]    += 0;
-        q[BiofilmIdx] += 0;
-        q[CalciteIdx] += 0;
+        q[H2OIdx]     += 0.0;
+        q[CO2Idx]     += 0.0;
+        q[CaIdx]      += 0.0;
+        q[UreaIdx]    += 0.0;
+        q[BiofilmIdx] += 0.0;
+        q[CalciteIdx] += 0.0;
     }
 
 private:
diff --git a/exercises/exercise-biomineralization/exercisebiomin.input b/exercises/exercise-biomineralization/exercisebiomin.input
index 0f3d3e41..fb2df919 100644
--- a/exercises/exercise-biomineralization/exercisebiomin.input
+++ b/exercises/exercise-biomineralization/exercisebiomin.input
@@ -11,9 +11,6 @@ Name = biomin
 UpperRight = 20 15 # x-/y-coordinates of the upper-right corner of the grid [m]
 Cells = 20 15 # x-/y-resolution of the grid
 
-[Newton]
-MaxRelativeShift = 1e-6 #
-
 [Initial]
 InitDensityW = 997 # [kg/m³] initial wetting density
 InitPressure = 1e5 # [Pa] initial pressure
diff --git a/exercises/solution/exercise-biomineralization/biominproblem.hh b/exercises/solution/exercise-biomineralization/biominproblem.hh
index 2c41e437..756b7537 100644
--- a/exercises/solution/exercise-biomineralization/biominproblem.hh
+++ b/exercises/solution/exercise-biomineralization/biominproblem.hh
@@ -96,11 +96,11 @@ struct SpatialParams<TypeTag, TTag::ExerciseFourBioMin> {
 };
 
 template<class TypeTag>
-struct EnableFVGridGeometryCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = false; };
+struct EnableFVGridGeometryCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = true; };
 template<class TypeTag>
-struct EnableGridVolumeVariablesCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = false; };
+struct EnableGridVolumeVariablesCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = true; };
 template<class TypeTag>
-struct EnableGridFluxVariablesCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = false; };
+struct EnableGridFluxVariablesCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = true; };
 
 } // end namespace properties
 /*!
@@ -172,9 +172,6 @@ public:
     ExerciseFourBioMinProblem(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
     : ParentType(fvGridGeometry)
     {
-#if !DUNE_VERSION_NEWER(DUNE_COMMON,2,7)
-        Dune::FMatrixPrecision<Scalar>::set_singular_limit(1e-35);
-#endif
         name_           = getParam<std::string>("Problem.Name");
         //initial values
         densityW_       = getParam<Scalar>("Initial.InitDensityW");
diff --git a/exercises/solution/exercise-biomineralization/biominspatialparams.hh b/exercises/solution/exercise-biomineralization/biominspatialparams.hh
index 393bd57d..3815f373 100644
--- a/exercises/solution/exercise-biomineralization/biominspatialparams.hh
+++ b/exercises/solution/exercise-biomineralization/biominspatialparams.hh
@@ -229,10 +229,14 @@ public:
                 const auto& dofPosition = scv.dofPosition();
                 const bool isInAquitardNotFaultZone = isInAquitard_(dofPosition) && !isFaultZone_(dofPosition);
                 auto kInit = isInAquitardNotFaultZone ? aquitardPermeability_ : initialPermeability_;
+                PermeabilityType K (0.0);
+                for (int i = 0; i < dimWorld; ++i)
+                    K[i][i] = kInit;
                 const auto refPoro = referencePorosity(element, scv);
                 const auto poro = porosity(element, scv, elemSol);
-                auto kEvaluated = permLaw_.evaluatePermeability(kInit, refPoro, poro);
-                referencePermeability_[eIdx][scv.indexInElement()] = calculateKRef(kInit, kEvaluated);
+                auto kEvaluated = permLaw_.evaluatePermeability(K, refPoro, poro);
+                K *= K[0][0]/kEvaluated[0][0];
+                referencePermeability_[eIdx][scv.indexInElement()] = K;
             }
         }
     }
@@ -275,39 +279,8 @@ public:
     { return FluidSystem::liquidPhaseIdx; }
 
 private:
-
     static constexpr Scalar eps_ = 1e-6;
 
-    //! calculateKRef for tensorial permeabilities
-    PermeabilityType calculateKRef(PermeabilityType K, PermeabilityType kEvaluated)
-    {
-        //TODO this assumes the change in permeability is homogeneous as currently also assumed in PermeabilityKozenyCarman.
-        // there also might be nicer/safer ways to calculate this.
-        Scalar factor = 0.0;
-        int counter = 0;
-        for (int i = 0; i < dimWorld; ++i)
-            for (int j = 0; i < dimWorld; ++i)
-                if(kEvaluated[i][j]!=0)
-                {
-                factor += K[i][j] / kEvaluated[i][j];
-                    ++counter;
-                }
-        factor /= counter;
-        K *= factor;
-
-        return K;
-    }
-
-    //! calculateKRef for scalar permeabilities
-    template<class PT = PermeabilityType,
-             std::enable_if_t<Dune::IsNumber< PT >::value, int> = 0>
-    PermeabilityType calculateKRef(PermeabilityType K, PermeabilityType kEvaluated)
-    {
-        Scalar factor = K / kEvaluated;
-        K *= factor;
-        return K;
-    }
-
     Scalar calculatephiRef(Scalar phiInit, Scalar phiEvaluated)
     { return 2*phiInit - phiEvaluated;}
 
diff --git a/exercises/solution/exercise-biomineralization/chemistry/simplebiominreactions.hh b/exercises/solution/exercise-biomineralization/chemistry/simplebiominreactions.hh
index 66331ec4..250333fa 100644
--- a/exercises/solution/exercise-biomineralization/chemistry/simplebiominreactions.hh
+++ b/exercises/solution/exercise-biomineralization/chemistry/simplebiominreactions.hh
@@ -96,8 +96,6 @@ public:
         Scalar molalityUrea = moleFracToMolality(volVars.moleFraction(liquidPhaseIdx,UreaIdx),
                                                  xwCa,
                                                  volVars.moleFraction(liquidPhaseIdx,CO2Idx));  // [mol_urea/kg_H2O]
-        if (molalityUrea < 0)
-            molalityUrea = 0;
 
         // TODO: dumux-course-task
         // compute rate of ureolysis by implementing Z_urease,biofilm and r_urea
@@ -105,20 +103,17 @@ public:
         Scalar rurea = kurease_ * Zub * molalityUrea / (ku_ + molalityUrea); // [mol/m³s]
 
         // compute/set dissolution and precipitation rate of calcite
-        Scalar rprec = 0;
-
-        // regularize so that we do not get precipitation where there is no calcium
-        if (xwCa > 1e-8)
-            rprec = rurea;
+        Scalar rprec = 0.0;
+        rprec = rurea;
 
         // set source terms
         // TODO: dumux-course-task
         // update terms according to stochiometry
-        q[H2OIdx]     += 0;
+        q[H2OIdx]     += 0.0;
         q[CO2Idx]     += rurea - rprec ;
         q[CaIdx]      += - rprec;
         q[UreaIdx]    += - rurea;
-        q[BiofilmIdx] += 0;
+        q[BiofilmIdx] += 0.0;
         q[CalciteIdx] += rprec;
     }
 
diff --git a/exercises/solution/exercise-biomineralization/exercisebiomin_solution.input b/exercises/solution/exercise-biomineralization/exercisebiomin_solution.input
index 0f3d3e41..fb2df919 100644
--- a/exercises/solution/exercise-biomineralization/exercisebiomin_solution.input
+++ b/exercises/solution/exercise-biomineralization/exercisebiomin_solution.input
@@ -11,9 +11,6 @@ Name = biomin
 UpperRight = 20 15 # x-/y-coordinates of the upper-right corner of the grid [m]
 Cells = 20 15 # x-/y-resolution of the grid
 
-[Newton]
-MaxRelativeShift = 1e-6 #
-
 [Initial]
 InitDensityW = 997 # [kg/m³] initial wetting density
 InitPressure = 1e5 # [Pa] initial pressure
-- 
GitLab