diff --git a/dumux/material/fluidmatrixinteractions/mp/mpadapter.hh b/dumux/material/fluidmatrixinteractions/mp/mpadapter.hh index bb3b4a2c9aa42a940ceefb28d9c582ba68e74a68..afc9e3e09619c7f6a6ec4340a46c4aa8b4e516a7 100644 --- a/dumux/material/fluidmatrixinteractions/mp/mpadapter.hh +++ b/dumux/material/fluidmatrixinteractions/mp/mpadapter.hh @@ -107,7 +107,7 @@ namespace Dumux::FluidMatrix { * \ingroup Fluidmatrixinteractions * \brief An adapter for mpnc to use the capillary pressure-saturation relationships */ -template <class MaterialLaw, int numFluidPhases = MaterialLaw::numFluidPhases()> +template <class MaterialLaw, int numFluidPhases = std::decay_t<MaterialLaw>::numFluidPhases()> class MPAdapter { static_assert(AlwaysFalse<MaterialLaw>::value, "Adapter not implemented for the specified number of phases"); @@ -119,10 +119,10 @@ class MPAdapter<MaterialLaw, 2> : public Adapter<MPAdapter<MaterialLaw, 2>, MultiPhasePcKrSw> { public: - using Scalar = typename MaterialLaw::Scalar; + using Scalar = typename std::decay_t<MaterialLaw>::Scalar; - MPAdapter(const MaterialLaw& pcKrS) - : pcKrS_(pcKrS) + MPAdapter(MaterialLaw&& pcKrS) + : pcKrS_(std::forward<MaterialLaw>(pcKrS)) {} /*! @@ -161,9 +161,18 @@ public: return values; } private: - const MaterialLaw& pcKrS_; + MaterialLaw pcKrS_; }; +/*! + * \ingroup Fluidmatrixinteractions + * \brief Deduction guide for the MPAdapter class. + * Makes sure that MPAdapter stores a copy of T if + * the constructor is called with a temporary object. + */ +template<typename T> +MPAdapter(T&&) -> MPAdapter<T>; + } // end namespace Dumux::FluidMatrix diff --git a/test/porousmediumflow/mpnc/2p2ccomparison/spatialparams.hh b/test/porousmediumflow/mpnc/2p2ccomparison/spatialparams.hh index 2478cbe98faadc35620e32d7706f35ba48068084..ab9a55a8ef81a199c3a122bf4e416929d8176af7 100644 --- a/test/porousmediumflow/mpnc/2p2ccomparison/spatialparams.hh +++ b/test/porousmediumflow/mpnc/2p2ccomparison/spatialparams.hh @@ -53,7 +53,6 @@ class MPNCComparisonSpatialParams using GlobalPosition = typename SubControlVolume::GlobalPosition; using PcKrSwCurve = FluidMatrix::BrooksCoreyDefault<Scalar>; - using MPAdapter = Dumux::FluidMatrix::MPAdapter<PcKrSwCurve, 2>; public: using PermeabilityType = Scalar; @@ -96,7 +95,7 @@ public: */ auto fluidMatrixInteractionAtPos(const GlobalPosition& globalPos) const { - return makeFluidMatrixInteraction(MPAdapter(pcKrSw_)); + return makeFluidMatrixInteraction(FluidMatrix::MPAdapter(pcKrSw_)); } /*! diff --git a/test/porousmediumflow/mpnc/kinetic/spatialparams.hh b/test/porousmediumflow/mpnc/kinetic/spatialparams.hh index ca8ba66062229e4eb99596cb27a5957d1706b69e..cd381c9ab29b3ea309325ec67e9bb55dc495897b 100644 --- a/test/porousmediumflow/mpnc/kinetic/spatialparams.hh +++ b/test/porousmediumflow/mpnc/kinetic/spatialparams.hh @@ -63,7 +63,6 @@ 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, @@ -248,9 +247,9 @@ public: auto fluidMatrixInteractionAtPos(const GlobalPosition &globalPos) const { if (inFF_(globalPos)) - return makeFluidMatrixInteraction(MPAdapter(*pcKrSwCurveFF_), *aNsFreeFlow_, *aNwFreeFlow_, *aWs_); + return makeFluidMatrixInteraction(FluidMatrix::MPAdapter(*pcKrSwCurveFF_), *aNsFreeFlow_, *aNwFreeFlow_, *aWs_); else if (inPM_(globalPos)) - return makeFluidMatrixInteraction(MPAdapter(*pcKrSwCurvePM_), *aNs_, *aNw_, *aWs_); + return makeFluidMatrixInteraction(FluidMatrix::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/obstacle/spatialparams.hh b/test/porousmediumflow/mpnc/obstacle/spatialparams.hh index 5b60e7488a70c4c66a292578d81aa3df8a947ef3..dac344e23b0a5a782733dbe70294124e105a5585 100644 --- a/test/porousmediumflow/mpnc/obstacle/spatialparams.hh +++ b/test/porousmediumflow/mpnc/obstacle/spatialparams.hh @@ -54,7 +54,6 @@ 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 @@ -93,7 +92,7 @@ public: */ auto fluidMatrixInteractionAtPos(const GlobalPosition &globalPos) const { - return makeFluidMatrixInteraction(MPAdapter(pcKrSwCurve_)); + return makeFluidMatrixInteraction(FluidMatrix::MPAdapter(pcKrSwCurve_)); } /*! diff --git a/test/porousmediumflow/mpnc/thermalnonequilibrium/spatialparams.hh b/test/porousmediumflow/mpnc/thermalnonequilibrium/spatialparams.hh index 460d1bbf1afa727ef2343fb7e13889acd4251a1f..6aa521c5274038231b6e0da893fa7d43c273b1f7 100644 --- a/test/porousmediumflow/mpnc/thermalnonequilibrium/spatialparams.hh +++ b/test/porousmediumflow/mpnc/thermalnonequilibrium/spatialparams.hh @@ -58,7 +58,6 @@ 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 @@ -195,7 +194,7 @@ public: */ auto fluidMatrixInteractionAtPos(const GlobalPosition &globalPos) const { - return makeFluidMatrixInteraction(MPAdapter(*pcKrSwCurve_)); + return makeFluidMatrixInteraction(FluidMatrix::MPAdapter(*pcKrSwCurve_)); } private: