diff --git a/dumux/material/fluidmatrixinteractions/mp/2poftadapter.hh b/dumux/material/fluidmatrixinteractions/mp/2poftadapter.hh index 44a4bc7a7404d249b48397fe5f4ebb3ee97dad83..292267a457833b2e42eda4015b56765fec9f2be6 100644 --- a/dumux/material/fluidmatrixinteractions/mp/2poftadapter.hh +++ b/dumux/material/fluidmatrixinteractions/mp/2poftadapter.hh @@ -23,27 +23,38 @@ * available under the M-phase API for material laws. * Also use the temperature dependent version of the material laws. */ -#ifndef DUMUX_MP_2P_OFT_ADAPTER_HH -#define DUMUX_MP_2P_OFT_ADAPTER_HH +#ifndef DUMUX_MP_OFT_ADAPTER_HH +#define DUMUX_MP_OFT_ADAPTER_HH #include <algorithm> +#include <cassert> +#include <dumux/common/typetraits/typetraits.hh> -namespace Dumux +namespace Dumux { + +/*! + * \ingroup Fluidmatrixinteractions + * \brief Adapts the interface of the MpNc material law to the standard-Dumux material law. + * Also use the temperature dependent version of the material laws. + */ +template <class MaterialLaw, int numPhases> +class MPOfTAdapter { + static_assert(AlwaysFalse<MaterialLaw>::value, "Adapter not implemented for the specified number of phases"); +}; + + /*! * \ingroup Fluidmatrixinteractions * \brief Adapts the interface of the MpNc material law to the standard-Dumux material law. * Also use the temperature dependent version of the material laws. */ -template <int wPhaseIdx, class TwoPLaw> -class TwoPOfTAdapter +template <class MaterialLaw> +class MPOfTAdapter<MaterialLaw, 2> { - enum { nPhaseIdx = (wPhaseIdx == 0)?1:0 }; public: - using Params = typename TwoPLaw::Params; - using Scalar = typename Params::Scalar; - enum { numPhases = 2 }; + using Params = typename MaterialLaw::Params; /*! * \brief The capillary pressure-saturation curve. @@ -56,13 +67,16 @@ public: static void capillaryPressures(pcContainerT &pc, const Params ¶ms, const FluidState &fluidState, - int wPhaseIdx = 0) + int wPhaseIdx) { + assert(pc.size() == 2); + const int nPhaseIdx = 1 - wPhaseIdx; + // non-wetting phase gets the capillary pressure added pc[nPhaseIdx] = 0; // wetting phase does not get anything added - pc[wPhaseIdx] = - TwoPLaw::pc(params, fluidState.saturation(wPhaseIdx), fluidState.temperature(wPhaseIdx)); + pc[wPhaseIdx] = - MaterialLaw::pc(params, fluidState.saturation(wPhaseIdx), fluidState.temperature(wPhaseIdx)); } /*! @@ -70,14 +84,18 @@ public: * \param kr Container for relative permeability * \param params Array of parameters * \param fluidState Fluidstate + * \param wPhaseIdx the phase index of the wetting phase */ template <class krContainerT, class FluidState> static void relativePermeabilities(krContainerT &kr, - const Params ¶ms, - const FluidState &fluidState) + const Params ¶ms, + const FluidState &fluidState, + int wPhaseIdx) { - kr[wPhaseIdx] = TwoPLaw::krw(params, fluidState.saturation(wPhaseIdx)); - kr[nPhaseIdx] = TwoPLaw::krn(params, fluidState.saturation(wPhaseIdx)); + assert(kr.size() == 2); + const int nPhaseIdx = 1 - wPhaseIdx; + kr[wPhaseIdx] = MaterialLaw::krw(params, fluidState.saturation(wPhaseIdx)); + kr[nPhaseIdx] = MaterialLaw::krn(params, fluidState.saturation(wPhaseIdx)); } }; } diff --git a/dumux/material/fluidmatrixinteractions/mp/mpadapter.hh b/dumux/material/fluidmatrixinteractions/mp/mpadapter.hh index 050135d640b02f46b8877739fd23e640ae56c5da..093a509aa54c3d24edd3a486e857b7ce646fdf72 100644 --- a/dumux/material/fluidmatrixinteractions/mp/mpadapter.hh +++ b/dumux/material/fluidmatrixinteractions/mp/mpadapter.hh @@ -74,13 +74,14 @@ public: * \param values Container for the return values * \param params Array of parameters * \param state Fluidstate + * \param wPhaseIdx the phase index of the wetting phase */ template <class ContainerT, class FluidState> static void relativePermeabilities(ContainerT &values, const Params ¶ms, - const FluidState &state) + const FluidState &state, + int wPhaseIdx) { - const int wPhaseIdx = state.wettingPhase(); assert(values.size() == 2); const int nPhaseIdx = 1 - wPhaseIdx; values[wPhaseIdx] = MaterialLaw::krw(params, state.saturation(wPhaseIdx)); diff --git a/dumux/material/fluidmatrixinteractions/mp/mplinearmaterial.hh b/dumux/material/fluidmatrixinteractions/mp/mplinearmaterial.hh index 055ef6bfae89a77773224f85862ee83d8c786f91..049d7b57bafa06fde5adbbb213540ed19a0b328d 100644 --- a/dumux/material/fluidmatrixinteractions/mp/mplinearmaterial.hh +++ b/dumux/material/fluidmatrixinteractions/mp/mplinearmaterial.hh @@ -86,7 +86,8 @@ public: template <class ContainerT, class FluidState> static void relativePermeabilities(ContainerT &values, const Params ¶ms, - const FluidState &state) + const FluidState &state, + int wPhaseIdx = 0) { using std::max; using std::min; diff --git a/dumux/porousmediumflow/mpnc/volumevariables.hh b/dumux/porousmediumflow/mpnc/volumevariables.hh index 904f7cb6be5c73e0971dc30c1fb62064e1854b31..6a1d378a361fd5225abe0344f2953e707281c9b5 100644 --- a/dumux/porousmediumflow/mpnc/volumevariables.hh +++ b/dumux/porousmediumflow/mpnc/volumevariables.hh @@ -106,14 +106,15 @@ public: //calculate the remaining quantities const auto& materialParams = problem.spatialParams().materialLawParams(element, scv, elemSol); + const int wPhaseIdx = problem.spatialParams().template wettingPhase<FluidSystem>(element, scv, elemSol); // relative permeabilities using MaterialLaw = typename Problem::SpatialParams::MaterialLaw; using MPAdapter = MPAdapter<MaterialLaw, numFluidPhases()>; - MPAdapter::relativePermeabilities(relativePermeability_, - materialParams, - fluidState_); + MPAdapter::relativePermeabilities(relativePermeability_, materialParams, fluidState_, wPhaseIdx); + typename FluidSystem::ParameterCache paramCache; paramCache.updateAll(fluidState_); + if (enableDiffusion) { for (int phaseIdx = 0; phaseIdx < numFluidPhases(); ++phaseIdx) @@ -561,13 +562,12 @@ public: //calculate the remaining quantities const auto& materialParams = problem.spatialParams().materialLawParams(element, scv, elemSol); + const int wPhaseIdx = problem.spatialParams().template wettingPhase<FluidSystem>(element, scv, elemSol); // relative permeabilities using MaterialLaw = typename Problem::SpatialParams::MaterialLaw; using MPAdapter = MPAdapter<MaterialLaw, numFluidPhases()>; - MPAdapter::relativePermeabilities(relativePermeability_, - materialParams, - fluidState_); + MPAdapter::relativePermeabilities(relativePermeability_, materialParams, fluidState_, wPhaseIdx); typename FluidSystem::ParameterCache paramCache; paramCache.updateAll(fluidState_); if (enableDiffusion)