diff --git a/test/porousmediumflow/2p2c/implicit/waterair/params.input b/test/porousmediumflow/2p2c/implicit/waterair/params.input index 14fd8b735969e415c12a05115e9509a3c31190b8..d9191a92bb2ccf2a9ebb40f40c2d005173f68dd4 100644 --- a/test/porousmediumflow/2p2c/implicit/waterair/params.input +++ b/test/porousmediumflow/2p2c/implicit/waterair/params.input @@ -24,3 +24,9 @@ MaxRelativeShift = 1e-13 SolidDensity = 2700 SolidThermalConductivity = 2.8 SolidHeatCapacity = 790 + +[SpatialParams] +BrooksCoreyPcEntry = 1e4 +BrooksCoreyLambda = 2 +Swr = 0.2 +Snr = 0.0 diff --git a/test/porousmediumflow/2p2c/implicit/waterair/problem.hh b/test/porousmediumflow/2p2c/implicit/waterair/problem.hh index 3cdd37b7fbc5786b3384c1a4b018b8ecc1da098c..89dd1fdf7f185a6ab6883ee874ae5edfdd2891dd 100644 --- a/test/porousmediumflow/2p2c/implicit/waterair/problem.hh +++ b/test/porousmediumflow/2p2c/implicit/waterair/problem.hh @@ -266,9 +266,8 @@ public: values[contiN2EqIdx] = useMoles ? -1e-3/FluidSystem::molarMass(N2Idx) : -1e-3; // kg/(m^2*s) or mole/(m^2*s) const auto initialValues = initial_(globalPos); - const auto& mParams = this->spatialParams().materialLawParamsAtPos(globalPos); - using MaterialLaw = typename ParentType::SpatialParams::MaterialLaw; - const auto pn = initialValues[pressureIdx] + MaterialLaw::endPointPc(mParams); + const auto& fluidMatrixInteraction = this->spatialParams().fluidMatrixInteractionAtPos(globalPos); + const auto pn = initialValues[pressureIdx] + fluidMatrixInteraction.endPointPc(); const auto t = initialValues[temperatureIdx]; // note: energy equation is always formulated in terms of mass specific quantities, not per mole diff --git a/test/porousmediumflow/2p2c/implicit/waterair/spatialparams.hh b/test/porousmediumflow/2p2c/implicit/waterair/spatialparams.hh index f39d59d99c6f8e0953ee080b8d84d89d76fc0938..138079d15f3b9b4afb3569f4b53255311c9d400d 100644 --- a/test/porousmediumflow/2p2c/implicit/waterair/spatialparams.hh +++ b/test/porousmediumflow/2p2c/implicit/waterair/spatialparams.hh @@ -24,14 +24,14 @@ #ifndef DUMUX_WATER_AIR_SPATIAL_PARAMS_HH #define DUMUX_WATER_AIR_SPATIAL_PARAMS_HH +#include <dumux/common/math.hh> #include <dumux/io/gnuplotinterface.hh> #include <dumux/io/ploteffectivediffusivitymodel.hh> -#include <dumux/io/plotmateriallaw.hh> +#include <dumux/io/plotpckrsw.hh> #include <dumux/io/plotthermalconductivitymodel.hh> #include <dumux/porousmediumflow/properties.hh> #include <dumux/material/spatialparams/fv.hh> -#include <dumux/material/fluidmatrixinteractions/2p/regularizedbrookscorey.hh> -#include <dumux/material/fluidmatrixinteractions/2p/efftoabslaw.hh> +#include <dumux/material/fluidmatrixinteractions/2p/brookscorey.hh> namespace Dumux { @@ -52,15 +52,16 @@ class WaterAirSpatialParams static constexpr int dimWorld = GridView::dimensionworld; using GlobalPosition = typename Element::Geometry::GlobalCoordinate; + using PcKrSwCurve = FluidMatrix::BrooksCoreyDefault<Scalar>; + public: //! Export the type used for the permeability using PermeabilityType = Scalar; - //! Export the type used for the material law - using MaterialLaw = EffToAbsLaw<RegularizedBrooksCorey<Scalar>>; - using MaterialLawParams = typename MaterialLaw::Params; + WaterAirSpatialParams(std::shared_ptr<const GridGeometry> gridGeometry) : ParentType(gridGeometry) + , pcKrSwCurve_("SpatialParams") { layerBottom_ = 22.0; @@ -72,18 +73,6 @@ public: finePorosity_ = 0.3; coarsePorosity_ = 0.3; - // residual saturations - fineMaterialParams_.setSwr(0.2); - fineMaterialParams_.setSnr(0.0); - coarseMaterialParams_.setSwr(0.2); - coarseMaterialParams_.setSnr(0.0); - - // parameters for the Brooks-Corey law - fineMaterialParams_.setPe(1e4); - coarseMaterialParams_.setPe(1e4); - fineMaterialParams_.setLambda(2.0); - coarseMaterialParams_.setLambda(2.0); - plotFluidMatrixInteractions_ = getParam<bool>("Output.PlotFluidMatrixInteractions"); } @@ -93,18 +82,21 @@ public: */ void plotMaterialLaw() { - PlotMaterialLaw<Scalar, MaterialLaw> plotMaterialLaw; GnuplotInterface<Scalar> gnuplot(plotFluidMatrixInteractions_); gnuplot.setOpenPlotWindow(plotFluidMatrixInteractions_); - plotMaterialLaw.addpcswcurve(gnuplot, fineMaterialParams_, 0.2, 1.0, "fine", "w lp"); - plotMaterialLaw.addpcswcurve(gnuplot, coarseMaterialParams_, 0.2, 1.0, "coarse", "w l"); + + const auto sw = linspace(0.2, 1.0, 1000); + + const auto pc = samplePcSw(pcKrSwCurve_, sw); + Gnuplot::addPcSw(gnuplot, sw, pc, "pc-Sw", "w lp"); gnuplot.setOption("set xrange [0:1]"); gnuplot.setOption("set label \"residual\\nsaturation\" at 0.1,100000 center"); gnuplot.plot("pc-Sw"); gnuplot.resetAll(); - plotMaterialLaw.addkrcurves(gnuplot, fineMaterialParams_, 0.2, 1.0, "fine"); - plotMaterialLaw.addkrcurves(gnuplot, coarseMaterialParams_, 0.2, 1.0, "coarse"); + + const auto [krw, krn] = sampleRelPerms(makeFluidMatrixInteraction(pcKrSwCurve_), sw); // test wrapped law + Gnuplot::addRelPerms(gnuplot, sw, krw, krn, "kr-Sw", "w lp"); gnuplot.plot("kr"); } @@ -134,17 +126,13 @@ public: return coarsePorosity_; } - /*! * \brief Returns the parameters for the material law at a given location * \param globalPos The global coordinates for the given location */ - const MaterialLawParams& materialLawParamsAtPos(const GlobalPosition& globalPos) const + auto fluidMatrixInteractionAtPos(const GlobalPosition& globalPos) const { - if (isFineMaterial_(globalPos)) - return fineMaterialParams_; - else - return coarseMaterialParams_; + return makeFluidMatrixInteraction(pcKrSwCurve_); } /*! @@ -168,8 +156,7 @@ private: Scalar finePorosity_; Scalar coarsePorosity_; - MaterialLawParams fineMaterialParams_; - MaterialLawParams coarseMaterialParams_; + const PcKrSwCurve pcKrSwCurve_; bool plotFluidMatrixInteractions_; };