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