diff --git a/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/CreateRelativePermeabilityModel.cpp b/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/CreateRelativePermeabilityModel.cpp index 71aa2a46c21eff6608615807db64cefb0fbd2134..dde81f5ada5fbee7c5f9f078454fa4bd4ef1410a 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 67c0377484a20126b89a7cb9a5a242f382aedf94..5a6d09da7976996570438a115f7105538b8a74e4 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 fbbc8afc1fe84dc71e5eaaa33ccab41489cb2501..32a91922a796eba81e641bf057ba042f3f837a19 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 fc4a3df74aebc074e5a13454dca451d44153fc60..435c52dc3872e47de4db2a03ceef3a5f953e9775 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 91e1c3dfa2ddc167e53af9907ece2a80f3627c4a..f24ecd4d22c73687d64ba8ac71b012fca6a30a87 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 ace2c329dc87bef48187d14de088af460242304f..0b62d8ac50ba0e1e20cc6f4bb4616b5901bf8f36 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 aeffb1797490a3d359dbdec3b5f91a2c07315925..8232932a5ef3a91af62e2961860f709e6f906228 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 f57b66716b8e3fce42369eb1736a5c8a797acedd..fdcb70908ac17d658756c9425a3c01c44312f99c 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 5207c8486cbb47fa3cc4183fc31f2cf6c8735613..ae340266fab13e01d2aa5928b0cfcbfba6b15a56 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);