From 30c7705db37b350671ed4c35e1ffe2a2e5e5d8cc Mon Sep 17 00:00:00 2001
From: Wenqing Wang <wenqing.wang@ufz.de>
Date: Thu, 10 Nov 2016 13:10:59 +0100
Subject: [PATCH] [Unsat] Some corrections and changes according to the
 Christoph's comments

---
 .../CreateRelativePermeabilityModel.cpp       | 50 ++++++++++---------
 .../NonWettingPhaseBrookCoreyOilGas.cpp       |  2 +-
 .../NonWettingPhaseBrookCoreyOilGas.h         |  2 +-
 .../NonWettingPhaseVanGenuchten.cpp           |  2 +-
 .../NonWettingPhaseVanGenuchten.h             |  2 +-
 .../RelativePermeability.h                    |  2 +-
 ...ityCurve.h => RelativePermeabilityCurve.h} | 12 ++---
 .../WettingPhaseVanGenuchten.cpp              |  5 +-
 .../TestRelativePermeabilityModel.cpp         |  9 ++--
 9 files changed, 43 insertions(+), 43 deletions(-)
 rename MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/{ReletivePermeabilityCurve.h => RelativePermeabilityCurve.h} (83%)

diff --git a/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/CreateRelativePermeabilityModel.cpp b/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/CreateRelativePermeabilityModel.cpp
index 71aa2a46c21..dde81f5ada5 100644
--- a/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/CreateRelativePermeabilityModel.cpp
+++ b/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/CreateRelativePermeabilityModel.cpp
@@ -14,7 +14,6 @@
 
 #include <array>
 #include <memory>
-#include <sstream>
 #include <string>
 #include <vector>
 
@@ -24,7 +23,7 @@
 #include "MathLib/InterpolationAlgorithms/PiecewiseLinearInterpolation.h"
 
 #include "RelativePermeability.h"
-#include "ReletivePermeabilityCurve.h"
+#include "RelativePermeabilityCurve.h"
 #include "WettingPhaseVanGenuchten.h"
 #include "NonWettingPhaseVanGenuchten.h"
 #include "WettingPhaseBrookCoreyOilGas.h"
@@ -59,11 +58,11 @@ std::unique_ptr<RelativePermeability> createWettingPhaseVanGenuchten(
             "The exponent parameter of WettingPhaseVanGenuchten relative\n"
             " permeability model, m, must be in an interval of [0, 1]");
     }
-    //! \ogs_file_param{material_property__porous_medium__porous_medium__relative_permeability__WettingPhaseVanGenuchten__m}
-    const double krel_max = config.getConfigParameter<double>("krel_min");
+    //! \ogs_file_param{material_property__porous_medium__porous_medium__relative_permeability__WettingPhaseVanGenuchten__krel_min}
+    const double krel_min = config.getConfigParameter<double>("krel_min");
 
     return std::unique_ptr<RelativePermeability>(
-        new WettingPhaseVanGenuchten(Sr, Smax, m, krel_max));
+        new WettingPhaseVanGenuchten(Sr, Smax, m, krel_min));
 }
 
 /**
@@ -91,11 +90,12 @@ std::unique_ptr<RelativePermeability> createNonWettingPhaseVanGenuchten(
             "The exponent parameter of NonWettingPhaseVanGenuchten relative\n"
             " permeability model, m, must be in an interval of [0, 1]");
     }
-    //! \ogs_file_param{material_property__porous_medium__porous_medium__relative_permeability__NonWettingPhaseVanGenuchten__m}
-    const double krel_max = config.getConfigParameter<double>("krel_min");
+
+    //! \ogs_file_param{material_property__porous_medium__porous_medium__relative_permeability__NonWettingPhaseVanGenuchten__krel_min}
+    const double krel_min = config.getConfigParameter<double>("krel_min");
 
     return std::unique_ptr<RelativePermeability>(
-        new NonWettingPhaseVanGenuchten(Sr, Smax, m, krel_max));
+        new NonWettingPhaseVanGenuchten(Sr, Smax, m, krel_min));
 }
 
 /**
@@ -123,11 +123,12 @@ std::unique_ptr<RelativePermeability> createWettingPhaseBrookCoreyOilGas(
             "The exponent parameter of WettingPhaseBrookCoreyOilGas\n"
             "relative permeability model, m, must not be smaller than 1");
     }
-    //! \ogs_file_param{material_property__porous_medium__porous_medium__relative_permeability__WettingPhaseBrookCoreyOilGas__m}
-    const double krel_max = config.getConfigParameter<double>("krel_min");
+
+    //! \ogs_file_param{material_property__porous_medium__porous_medium__relative_permeability__WettingPhaseBrookCoreyOilGas__krel_min}
+    const double krel_min = config.getConfigParameter<double>("krel_min");
 
     return std::unique_ptr<RelativePermeability>(
-        new WettingPhaseBrookCoreyOilGas(Sr, Smax, m, krel_max));
+        new WettingPhaseBrookCoreyOilGas(Sr, Smax, m, krel_min));
 }
 
 /**
@@ -155,11 +156,12 @@ std::unique_ptr<RelativePermeability> createNonWettingPhaseBrookCoreyOilGas(
             "The exponent parameter of NonWettingPhaseBrookCoreyOilGas\n"
             "relative permeability model, m, must not be smaller than 1");
     }
-    //! \ogs_file_param{material_property__porous_medium__porous_medium__relative_permeability__NonWettingPhaseBrookCoreyOilGas__m}
-    const double krel_max = config.getConfigParameter<double>("krel_min");
+
+    //! \ogs_file_param{material_property__porous_medium__porous_medium__relative_permeability__NonWettingPhaseBrookCoreyOilGas__krel_min}
+    const double krel_min = config.getConfigParameter<double>("krel_min");
 
     return std::unique_ptr<RelativePermeability>(
-        new NonWettingPhaseBrookCoreyOilGas(Sr, Smax, m, krel_max));
+        new NonWettingPhaseBrookCoreyOilGas(Sr, Smax, m, krel_min));
 }
 
 std::unique_ptr<RelativePermeability> createRelativePermeabilityModel(
@@ -192,22 +194,22 @@ std::unique_ptr<RelativePermeability> createRelativePermeabilityModel(
         //! \ogs_file_param{material_property__porous_medium__porous_medium__relative_permeability__Curve__curve}
         auto const& curve_config = config.getConfigSubtree("curve");
         for (
-            auto const& data_string :
-            //! \ogs_file_param{material_property__porous_medium__porous_medium__relative_permeability__Curve_curve__data}
-            curve_config.getConfigParameterList<std::string>("data"))
+            auto const& point_config :
+            //! \ogs_file_param{material_property__porous_medium__porous_medium__relative_permeability__Curve_curve__point}
+            curve_config.getConfigSubtreeList("point"))
         {
-            std::stringstream ss(data_string);
-            double var, val;
-            ss >> var >> val;
-            ss.clear();
-            variables.push_back(var);
-            values.push_back(val);
+            const auto& point =
+                //! \ogs_file_param{material_property__porous_medium__porous_medium__relative_permeability__Curve_curve__points__data}
+                point_config.getConfigParameter<std::vector<double>>("data");
+            assert(point.size() == 2);
+            variables.push_back(point[0]);
+            values.push_back(point[1]);
         }
         auto curve = std::unique_ptr<MathLib::PiecewiseLinearInterpolation>(
             new MathLib::PiecewiseLinearInterpolation(
                 std::move(variables), std::move(values), true));
         return std::unique_ptr<RelativePermeability>(
-            new ReletivePermeabilityCurve(curve));
+            new RelativePermeabilityCurve(curve));
     }
     else
     {
diff --git a/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/NonWettingPhaseBrookCoreyOilGas.cpp b/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/NonWettingPhaseBrookCoreyOilGas.cpp
index 67c0377484a..5a6d09da797 100644
--- a/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/NonWettingPhaseBrookCoreyOilGas.cpp
+++ b/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/NonWettingPhaseBrookCoreyOilGas.cpp
@@ -27,7 +27,7 @@ double NonWettingPhaseBrookCoreyOilGas::getValue(
         saturation_w, _Sr + _minor_offset, _Smax - _minor_offset);
     const double Se = (S - _Sr) / (_Smax - _Sr);
     const double krel =
-        std::pow(1.0 - Se, 2) * (1.0 - std::pow(Se, 1.0 + 2.0 / _mm));
+        (1.0 - Se) * (1.0 - Se) * (1.0 - std::pow(Se, 1.0 + 2.0 / _mm));
     return krel < _krel_min ? _krel_min : krel;
 }
 
diff --git a/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/NonWettingPhaseBrookCoreyOilGas.h b/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/NonWettingPhaseBrookCoreyOilGas.h
index fbbc8afc1fe..32a91922a79 100644
--- a/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/NonWettingPhaseBrookCoreyOilGas.h
+++ b/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/NonWettingPhaseBrookCoreyOilGas.h
@@ -57,7 +57,7 @@ public:
     }
 
     /// Get relative permeability value.
-    /// \param saturation_w Non-wetting phase saturation
+    /// \param saturation_w Wetting phase saturation
     double getValue(const double saturation_w) const override;
 
 private:
diff --git a/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/NonWettingPhaseVanGenuchten.cpp b/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/NonWettingPhaseVanGenuchten.cpp
index fc4a3df74ae..435c52dc387 100644
--- a/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/NonWettingPhaseVanGenuchten.cpp
+++ b/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/NonWettingPhaseVanGenuchten.cpp
@@ -25,7 +25,7 @@ double NonWettingPhaseVanGenuchten::getValue(const double saturation_w) const
     const double S = MathLib::limitValueInInterval(
         saturation_w, _Sr + _minor_offset, _Smax - _minor_offset);
     const double Se = (S - _Sr) / (_Smax - _Sr);
-    const double krel = std::pow(1.0 - Se, 1.0 / 3.0) *
+    const double krel = std::cbrt(1.0 - Se) *
                         std::pow(1.0 - std::pow(Se, 1.0 / _mm), 2.0 * _mm);
     return krel < _krel_min ? _krel_min : krel;
 }
diff --git a/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/NonWettingPhaseVanGenuchten.h b/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/NonWettingPhaseVanGenuchten.h
index 91e1c3dfa2d..f24ecd4d22c 100644
--- a/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/NonWettingPhaseVanGenuchten.h
+++ b/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/NonWettingPhaseVanGenuchten.h
@@ -59,7 +59,7 @@ public:
     }
 
     /// Get relative permeability value.
-    /// \param saturation_w Non-wetting phase saturation
+    /// \param saturation_w Wetting phase saturation
     double getValue(const double saturation_w) const override;
 
 private:
diff --git a/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/RelativePermeability.h b/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/RelativePermeability.h
index ace2c329dc8..0b62d8ac50b 100644
--- a/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/RelativePermeability.h
+++ b/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/RelativePermeability.h
@@ -29,7 +29,7 @@ public:
     virtual std::string getName() const = 0;
 
     /// Get relative permeability value.
-    /// \param saturation Non-wetting phase saturation
+    /// \param saturation Wetting phase saturation
     virtual double getValue(const double saturation) const = 0;
 
 protected:
diff --git a/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/ReletivePermeabilityCurve.h b/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/RelativePermeabilityCurve.h
similarity index 83%
rename from MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/ReletivePermeabilityCurve.h
rename to MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/RelativePermeabilityCurve.h
index aeffb179749..8232932a5ef 100644
--- a/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/ReletivePermeabilityCurve.h
+++ b/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/RelativePermeabilityCurve.h
@@ -5,13 +5,13 @@
  *              See accompanying file LICENSE.txt or
  *              http://www.opengeosys.org/project/license
  *
- *  \file   ReletivePermeabilityCurve.h
+ *  \file   RelativePermeabilityCurve.h
  *
  * Created on November 2, 2016, 1:41 PM
  */
 
-#ifndef OGS_RELETIVE_PERMEABILITY_CURVE_H
-#define OGS_RELETIVE_PERMEABILITY_CURVE_H
+#ifndef OGS_RELATIVE_PERMEABILITY_CURVE_H
+#define OGS_RELATIVE_PERMEABILITY_CURVE_H
 
 #include <memory>
 #include "RelativePermeability.h"
@@ -23,10 +23,10 @@ namespace MaterialLib
 {
 namespace PorousMedium
 {
-class ReletivePermeabilityCurve final : public RelativePermeability
+class RelativePermeabilityCurve final : public RelativePermeability
 {
 public:
-    ReletivePermeabilityCurve(
+    RelativePermeabilityCurve(
         std::unique_ptr<MathLib::PiecewiseLinearInterpolation>& curve_data)
         : _Sr(curve_data->getSupportMin()),
           _Smax(curve_data->getSupportMax()),
@@ -57,4 +57,4 @@ private:
 };
 }  // end namespace
 }  // end namespace
-#endif /* OGS_RELETIVE_PERMEABILITY_CURVE_H */
+#endif /* OGS_RELATIVE_PERMEABILITY_CURVE_H */
diff --git a/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/WettingPhaseVanGenuchten.cpp b/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/WettingPhaseVanGenuchten.cpp
index f57b66716b8..fdcb70908ac 100644
--- a/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/WettingPhaseVanGenuchten.cpp
+++ b/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/WettingPhaseVanGenuchten.cpp
@@ -25,9 +25,8 @@ double WettingPhaseVanGenuchten::getValue(const double saturation) const
     const double S = MathLib::limitValueInInterval(
         saturation, _Sr + _minor_offset, _Smax - _minor_offset);
     const double Se = (S - _Sr) / (_Smax - _Sr);
-    const double krel =
-        std::sqrt(Se) *
-        std::pow(1.0 - std::pow(1.0 - std::pow(Se, 1.0 / _mm), _mm), 2);
+    const double val = 1.0 - std::pow(1.0 - std::pow(Se, 1.0 / _mm), _mm);
+    const double krel = std::sqrt(Se) * val * val;
     return krel < _krel_min ? _krel_min : krel;
 }
 
diff --git a/Tests/MaterialLib/TestRelativePermeabilityModel.cpp b/Tests/MaterialLib/TestRelativePermeabilityModel.cpp
index 5207c8486cb..ae340266fab 100644
--- a/Tests/MaterialLib/TestRelativePermeabilityModel.cpp
+++ b/Tests/MaterialLib/TestRelativePermeabilityModel.cpp
@@ -32,8 +32,7 @@ std::unique_ptr<RelativePermeability> createRelativePermeabilityModel(
     BaseLib::ConfigTree conf(ptree, "", BaseLib::ConfigTree::onerror,
                              BaseLib::ConfigTree::onwarning);
     auto const& sub_config = conf.getConfigSubtree("relative_permeability");
-    //! \ogs_file_attr{prj__material_property__porous_medium__porous_medium__id}
-    auto const id = sub_config.getConfigAttributeOptional<int>("id");
+    sub_config.ignoreConfigAttribute("id");
     return MaterialLib::PorousMedium::createRelativePermeabilityModel(
         sub_config);
 }
@@ -146,9 +145,9 @@ TEST(MaterialPorousMedium, checkReletivePermeabilityCurve)
         "<relative_permeability id=\"0\">"
         "   <type>Curve</type>"
         "       <curve>"
-        "           <data> 0. 0.9  </data>"
-        "           <data> 0.4 0.5 </data>"
-        "           <data> 0.9 0.01 </data>"
+        "           <point><data> 0. 0.9   </data></point>"
+        "           <point><data> 0.4 0.5  </data></point>"
+        "           <point><data> 0.9 0.01 </data></point>"
         "       </curve>"
         "</relative_permeability>";
     auto const perm_model = createRelativePermeabilityModel(xml);
-- 
GitLab