diff --git a/test/porousmediumflow/mpnc/implicit/2p2ccomparison/params.input b/test/porousmediumflow/mpnc/implicit/2p2ccomparison/params.input index 0ca290b1678da0e719fc2776801d042cb33af522..2fe2cab4408eabe4d0376f239cd31d1f91bd29b2 100644 --- a/test/porousmediumflow/mpnc/implicit/2p2ccomparison/params.input +++ b/test/porousmediumflow/mpnc/implicit/2p2ccomparison/params.input @@ -6,9 +6,13 @@ TEnd = 1e4 # [s] UpperRight = 60 40 Cells = 24 16 +[SpatialParams] +Swr = 0.2 +BrooksCoreyPcEntry = 1e4 +BrooksCoreyLambda = 2.0 + [LinearSolver] ResidualReduction = 1e-12 [Problem] Name = obstacle - diff --git a/test/porousmediumflow/mpnc/implicit/2p2ccomparison/problem.hh b/test/porousmediumflow/mpnc/implicit/2p2ccomparison/problem.hh index b97fd347eb06a3cad45865deed1cd6e3b4389a6b..14a844f864fefdf1737b1461e107eff33d4efde5 100644 --- a/test/porousmediumflow/mpnc/implicit/2p2ccomparison/problem.hh +++ b/test/porousmediumflow/mpnc/implicit/2p2ccomparison/problem.hh @@ -261,20 +261,16 @@ private: // set pressure of the gas phase fs.setPressure(gasPhaseIdx, 1e5); // calulate the capillary pressure - const auto& matParams = - this->spatialParams().materialLawParamsAtPos(globalPos); - PhaseVector pc; - using MaterialLaw = typename ParentType::SpatialParams::MaterialLaw; - using MPAdapter = MPAdapter<MaterialLaw, numPhases>; - + const auto& fm = + this->spatialParams().fluidMatrixInteractionAtPos(globalPos); const int wPhaseIdx = this->spatialParams().template wettingPhaseAtPos<FluidSystem>(globalPos); - MPAdapter::capillaryPressures(pc, matParams, fs, wPhaseIdx); + const auto pc = fm.capillaryPressures(fs, wPhaseIdx); fs.setPressure(liquidPhaseIdx, fs.pressure(gasPhaseIdx) + pc[liquidPhaseIdx] - pc[gasPhaseIdx]); // make the fluid state consistent with local thermodynamic // equilibrium - using MiscibleMultiPhaseComposition = Dumux::MiscibleMultiPhaseComposition<Scalar, FluidSystem>; + using MiscibleMultiPhaseComposition = Dumux::MiscibleMultiPhaseComposition<Scalar, FluidSystem>; ParameterCache paramCache; MiscibleMultiPhaseComposition::solve(fs, paramCache); diff --git a/test/porousmediumflow/mpnc/implicit/2p2ccomparison/spatialparams.hh b/test/porousmediumflow/mpnc/implicit/2p2ccomparison/spatialparams.hh index b3697ee9d1fadd515aa16b1bcddddd65f4afae09..2478cbe98faadc35620e32d7706f35ba48068084 100644 --- a/test/porousmediumflow/mpnc/implicit/2p2ccomparison/spatialparams.hh +++ b/test/porousmediumflow/mpnc/implicit/2p2ccomparison/spatialparams.hh @@ -27,10 +27,8 @@ #include <dumux/porousmediumflow/properties.hh> #include <dumux/material/spatialparams/fv.hh> -#include <dumux/material/fluidmatrixinteractions/2p/regularizedlinearmaterial.hh> -#include <dumux/material/fluidmatrixinteractions/2p/efftoabslaw.hh> - -#include <dumux/material/fluidmatrixinteractions/2p/regularizedbrookscorey.hh> +#include <dumux/material/fluidmatrixinteractions/2p/brookscorey.hh> +#include <dumux/material/fluidmatrixinteractions/mp/mpadapter.hh> namespace Dumux { @@ -53,14 +51,16 @@ class MPNCComparisonSpatialParams MPNCComparisonSpatialParams<GridGeometry, Scalar>>; using GlobalPosition = typename SubControlVolume::GlobalPosition; - using EffectiveLaw = RegularizedBrooksCorey<Scalar>; + + using PcKrSwCurve = FluidMatrix::BrooksCoreyDefault<Scalar>; + using MPAdapter = Dumux::FluidMatrix::MPAdapter<PcKrSwCurve, 2>; public: using PermeabilityType = Scalar; - using MaterialLaw = EffToAbsLaw<EffectiveLaw>; - using MaterialLawParams = typename MaterialLaw::Params; - MPNCComparisonSpatialParams(std::shared_ptr<const GridGeometry> gridGeometry) : ParentType(gridGeometry) + MPNCComparisonSpatialParams(std::shared_ptr<const GridGeometry> gridGeometry) + : ParentType(gridGeometry) + , pcKrSw_("SpatialParams") { // intrinsic permeabilities coarseK_ = 1e-12; @@ -68,18 +68,6 @@ public: // the porosity porosity_ = 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); } template<class ElementSolution> @@ -95,7 +83,6 @@ public: /*! * \brief Defines the porosity \f$[-]\f$ of the soil - * * \param globalPos The global Position */ Scalar porosityAtPos(const GlobalPosition& globalPos) const @@ -105,23 +92,16 @@ public: /*! * \brief Function for defining the parameters needed by constitutive relationships (kr-sw, pc-sw, etc.). - * * \param globalPos The global position of the sub-control volume. - * \return The material parameters object */ - const MaterialLawParams& materialLawParamsAtPos(const GlobalPosition& globalPos) const + auto fluidMatrixInteractionAtPos(const GlobalPosition& globalPos) const { - if (isFineMaterial_(globalPos)) - return fineMaterialParams_; - else - return coarseMaterialParams_; + return makeFluidMatrixInteraction(MPAdapter(pcKrSw_)); } /*! * \brief Function for defining which phase is to be considered as the wetting phase. - * * \param globalPos The global position - * \return The wetting phase index */ template<class FluidSystem> int wettingPhaseAtPos(const GlobalPosition& globalPos) const @@ -144,8 +124,7 @@ private: Scalar coarseK_; Scalar fineK_; Scalar porosity_; - MaterialLawParams fineMaterialParams_; - MaterialLawParams coarseMaterialParams_; + PcKrSwCurve pcKrSw_; static constexpr Scalar eps_ = 1e-6; }; diff --git a/test/porousmediumflow/mpnc/implicit/kinetic/problem.hh b/test/porousmediumflow/mpnc/implicit/kinetic/problem.hh index 8423989dd11f3e3ae9ae2c66c3bf6c780d63966b..24ed4fb559c1e6df61bc5fceea64b665a69ae0db 100644 --- a/test/porousmediumflow/mpnc/implicit/kinetic/problem.hh +++ b/test/porousmediumflow/mpnc/implicit/kinetic/problem.hh @@ -381,12 +381,10 @@ private: equilibriumFluidState.setTemperature(phaseIdx, TInitial_ ); } - std::vector<Scalar> capPress(numPhases); // obtain pc according to saturation - using MPAdapter = FluidMatrix::MPAdapter<numPhases>; - const int wPhaseIdx = this->spatialParams().template wettingPhaseAtPos<FluidSystem>(globalPos); - MPAdapter::capillaryPressures(capPress, this->spatialParams().fluidMatrixInteractionAtPos(globalPos), equilibriumFluidState, wPhaseIdx); + const auto& fm = this->spatialParams().fluidMatrixInteractionAtPos(globalPos); + const auto capPress = fm.capillaryPressures(equilibriumFluidState, wPhaseIdx); Scalar p[numPhases]; if (this->spatialParams().inPM_(globalPos)){ diff --git a/test/porousmediumflow/mpnc/implicit/kinetic/spatialparams.hh b/test/porousmediumflow/mpnc/implicit/kinetic/spatialparams.hh index 15c3c3863ce5c35f3dcbc1e147fb78aaace69a10..c1c2d0f1fcbcb2774fcf3f8622f2a8efe8ba4c0a 100644 --- a/test/porousmediumflow/mpnc/implicit/kinetic/spatialparams.hh +++ b/test/porousmediumflow/mpnc/implicit/kinetic/spatialparams.hh @@ -31,6 +31,7 @@ #include <dumux/material/fluidmatrixinteractions/fluidmatrixinteraction.hh> #include <dumux/material/fluidmatrixinteractions/2p/brookscorey.hh> +#include <dumux/material/fluidmatrixinteractions/mp/mpadapter.hh> #include <dumux/common/parameters.hh> @@ -62,6 +63,7 @@ class EvaporationAtmosphereSpatialParams static constexpr auto dimWorld = GridView::dimensionworld; using PcKrSwCurve = FluidMatrix::BrooksCoreyDefault<Scalar>; + using MPAdapter = Dumux::FluidMatrix::MPAdapter<PcKrSwCurve, 2>; using NonwettingSolidInterfacialArea = FluidMatrix::InterfacialArea<Scalar, FluidMatrix::InterfacialAreaExponentialCubic, @@ -246,9 +248,9 @@ public: auto fluidMatrixInteractionAtPos(const GlobalPosition &globalPos) const { if (inFF_(globalPos)) - return makeFluidMatrixInteraction(*pcKrSwCurveFF_, *aNsFreeFlow_, *aNwFreeFlow_, *aWs_); + return makeFluidMatrixInteraction(MPAdapter(*pcKrSwCurveFF_), *aNsFreeFlow_, *aNwFreeFlow_, *aWs_); else if (inPM_(globalPos)) - return makeFluidMatrixInteraction(*pcKrSwCurvePM_, *aNs_, *aNw_, *aWs_); + return makeFluidMatrixInteraction(MPAdapter(*pcKrSwCurvePM_), *aNs_, *aNw_, *aWs_); else DUNE_THROW(Dune::InvalidStateException, "You should not be here: x=" << globalPos[0] << " y= "<< globalPos[dimWorld-1]); } diff --git a/test/porousmediumflow/mpnc/implicit/obstacle/problem.hh b/test/porousmediumflow/mpnc/implicit/obstacle/problem.hh index 71ded1bbe22c15f8293d4f954461214d1dcbbb81..905fed1f690d0c21a984ca7b4a5687c137341cf5 100644 --- a/test/porousmediumflow/mpnc/implicit/obstacle/problem.hh +++ b/test/porousmediumflow/mpnc/implicit/obstacle/problem.hh @@ -331,11 +331,8 @@ private: // calculate the capillary pressure const auto fluidMatrixInteraction = this->spatialParams().fluidMatrixInteractionAtPos(globalPos); - PhaseVector pc; - using MPAdapter = FluidMatrix::MPAdapter<numPhases>; - const int wPhaseIdx = this->spatialParams().template wettingPhaseAtPos<FluidSystem>(globalPos); - MPAdapter::capillaryPressures(pc, fluidMatrixInteraction, fs, wPhaseIdx); + const auto pc = fluidMatrixInteraction.capillaryPressures(fs, wPhaseIdx); fs.setPressure(otherPhaseIdx, fs.pressure(refPhaseIdx) + (pc[otherPhaseIdx] - pc[refPhaseIdx])); diff --git a/test/porousmediumflow/mpnc/implicit/obstacle/spatialparams.hh b/test/porousmediumflow/mpnc/implicit/obstacle/spatialparams.hh index 16b9f81b3033c9dd4a3d1c4de5a923c1c9aaa95e..a7843b25266fe4d82952e98c6b82cc572297f1f9 100644 --- a/test/porousmediumflow/mpnc/implicit/obstacle/spatialparams.hh +++ b/test/porousmediumflow/mpnc/implicit/obstacle/spatialparams.hh @@ -29,6 +29,7 @@ #include <dumux/material/spatialparams/fv.hh> #include <dumux/material/fluidmatrixinteractions/fluidmatrixinteraction.hh> #include <dumux/material/fluidmatrixinteractions/2p/smoothedlinearlaw.hh> +#include <dumux/material/fluidmatrixinteractions/mp/mpadapter.hh> namespace Dumux { @@ -53,6 +54,7 @@ class ObstacleSpatialParams using GlobalPosition = typename SubControlVolume::GlobalPosition; using PcKrSwCurve = FluidMatrix::SmoothedLinearLaw<Scalar>; + using MPAdapter = Dumux::FluidMatrix::MPAdapter<PcKrSwCurve, 2>; public: //! Export the type used for the permeability @@ -91,7 +93,7 @@ public: */ auto fluidMatrixInteractionAtPos(const GlobalPosition &globalPos) const { - return makeFluidMatrixInteraction(pcKrSwCurve_); + return makeFluidMatrixInteraction(MPAdapter(pcKrSwCurve_)); } /*! diff --git a/test/porousmediumflow/mpnc/implicit/thermalnonequilibrium/problem.hh b/test/porousmediumflow/mpnc/implicit/thermalnonequilibrium/problem.hh index 8b68189255f8de4fdf9a83559ecee61ffe0c8acf..48ffdd6503a6377799d5d636591e3a80765dbad1 100644 --- a/test/porousmediumflow/mpnc/implicit/thermalnonequilibrium/problem.hh +++ b/test/porousmediumflow/mpnc/implicit/thermalnonequilibrium/problem.hh @@ -449,12 +449,11 @@ private: ////////////////////////////////////// priVars[energyEq0Idx] = thisTemperature; priVars[energyEqSolidIdx] = thisTemperature; - std::array<Scalar, numPhases> capPress; //obtain pc according to saturation const int wettingPhaseIdx = this->spatialParams().template wettingPhaseAtPos<FluidSystem>(globalPos); - using MPAdapter = FluidMatrix::MPAdapter<numPhases>; - MPAdapter::capillaryPressures(capPress, this->spatialParams().fluidMatrixInteractionAtPos(globalPos), fluidState, wettingPhaseIdx); + const auto& fm = this->spatialParams().fluidMatrixInteractionAtPos(globalPos); + const auto capPress = fm.capillaryPressures(fluidState, wettingPhaseIdx); Scalar p[numPhases]; diff --git a/test/porousmediumflow/mpnc/implicit/thermalnonequilibrium/spatialparams.hh b/test/porousmediumflow/mpnc/implicit/thermalnonequilibrium/spatialparams.hh index fbfd4fca8356a0fd84a3b559d00e3d62ffd1646a..bcef6650c9b90d8578c055e930283ce4ece6080f 100644 --- a/test/porousmediumflow/mpnc/implicit/thermalnonequilibrium/spatialparams.hh +++ b/test/porousmediumflow/mpnc/implicit/thermalnonequilibrium/spatialparams.hh @@ -31,6 +31,7 @@ #include <dumux/material/spatialparams/fvnonequilibrium.hh> #include <dumux/material/fluidmatrixinteractions/2p/heatpipelaw.hh> +#include <dumux/material/fluidmatrixinteractions/mp/mpadapter.hh> #include <dumux/material/fluidmatrixinteractions/1pia/fluidsolidinterfacialareashiwang.hh> #include <dumux/porousmediumflow/properties.hh> #include <dumux/material/spatialparams/fv.hh> @@ -56,6 +57,7 @@ class CombustionSpatialParams using GlobalPosition = typename SubControlVolume::GlobalPosition; using PcKrSwCurve = FluidMatrix::HeatPipeLaw<Scalar>; + using MPAdapter = Dumux::FluidMatrix::MPAdapter<PcKrSwCurve, 2>; public: //! Export the type used for the permeability @@ -192,7 +194,7 @@ public: */ auto fluidMatrixInteractionAtPos(const GlobalPosition &globalPos) const { - return makeFluidMatrixInteraction(*pcKrSwCurve_); + return makeFluidMatrixInteraction(MPAdapter(*pcKrSwCurve_)); } private: