diff --git a/dumux/porousmediumflow/nonisothermal/volumevariables.hh b/dumux/porousmediumflow/nonisothermal/volumevariables.hh index 3d7447e6988c3159e60671b82a4af0ec4e9f01ef..ef6395fe32dbcb33aa1a3d64b1c6e65bc63eb5d0 100644 --- a/dumux/porousmediumflow/nonisothermal/volumevariables.hh +++ b/dumux/porousmediumflow/nonisothermal/volumevariables.hh @@ -26,6 +26,7 @@ #define DUMUX_ENERGY_VOLUME_VARIABLES_HH #include <type_traits> +#include <dune/common/std/type_traits.hh> #include <dumux/material/solidsystems/inertsolidphase.hh> #include <dumux/porousmediumflow/volumevariables.hh> @@ -34,35 +35,29 @@ namespace Dumux { #ifndef DOXYGEN namespace Detail { -// helper struct detecting if the user-defined spatial params class has user-specified functions +// helper structs and functions detecting if the user-defined spatial params class has user-specified functions // for solidHeatCapacity, solidDensity, and solidThermalConductivity. -// for g++ > 5.3, this can be replaced by a lambda -template<class E, class SCV, class ES, class SS> -struct hasSolidHeatCapacity -{ - template<class SpatialParams> - auto operator()(const SpatialParams& a) - -> decltype(a.solidHeatCapacity(std::declval<E>(), std::declval<SCV>(), std::declval<ES>(), std::declval<SS>())) - {} -}; -template<class E, class SCV, class ES, class SS> -struct hasSolidDensity -{ - template<class SpatialParams> - auto operator()(const SpatialParams& a) - -> decltype(a.solidDensity(std::declval<E>(), std::declval<SCV>(), std::declval<ES>(), std::declval<SS>())) - {} -}; +template <typename T, typename ...Ts> +using SolidHeatCapacityDetector = decltype(std::declval<T>().solidHeatCapacity(std::declval<Ts>()...)); -template<class E, class SCV, class ES, class SS> -struct hasSolidThermalConductivity -{ - template<class SpatialParams> - auto operator()(const SpatialParams& a) - -> decltype(a.solidThermalConductivity(std::declval<E>(), std::declval<SCV>(), std::declval<ES>(), std::declval<SS>())) - {} -}; +template<class T, typename ...Args> +static constexpr bool hasSolidHeatCapacity() +{ return Dune::Std::is_detected<SolidHeatCapacityDetector, T, Args...>::value; } + +template <typename T, typename ...Ts> +using SolidDensityDetector = decltype(std::declval<T>().solidDensity(std::declval<Ts>()...)); + +template<class T, typename ...Args> +static constexpr bool hasSolidDensity() +{ return Dune::Std::is_detected<SolidDensityDetector, T, Args...>::value; } + +template <typename T, typename ...Ts> +using SolidThermalConductivityDetector = decltype(std::declval<T>().solidThermalConductivity(std::declval<Ts>()...)); + +template<class T, typename ...Args> +static constexpr bool hasSolidThermalConductivity() +{ return Dune::Std::is_detected<SolidThermalConductivityDetector, T, Args...>::value; } template<class SolidSystem> struct isInertSolidPhase : public std::false_type {}; @@ -319,15 +314,13 @@ private: * \param solidState the solid state * \note this gets selected if the user uses the solidsystem / solidstate interface */ - template<class ElemSol, class Problem, class Element, class Scv> - auto solidHeatCapacity_(const ElemSol& elemSol, - const Problem& problem, - const Element& element, - const Scv& scv, - const SolidState& solidState) - -> typename std::enable_if_t<!decltype( - isValid(Detail::hasSolidHeatCapacity<Element, Scv, ElemSol, SolidState>())(problem.spatialParams()) - )::value, Scalar> + template<class ElemSol, class Problem, class Element, class Scv, + std::enable_if_t<!Detail::hasSolidHeatCapacity<typename Problem::SpatialParams, Element, Scv, ElemSol, SolidState>(), int> = 0> + Scalar solidHeatCapacity_(const ElemSol& elemSol, + const Problem& problem, + const Element& element, + const Scv& scv, + const SolidState& solidState) { return SolidSystem::heatCapacity(solidState); } @@ -341,15 +334,13 @@ private: * \param solidState the solid state * \note this gets selected if the user uses the solidsystem / solidstate interface */ - template<class ElemSol, class Problem, class Element, class Scv> - auto solidDensity_(const ElemSol& elemSol, - const Problem& problem, - const Element& element, - const Scv& scv, - const SolidState& solidState) - -> typename std::enable_if_t<!decltype( - isValid(Detail::hasSolidDensity<Element, Scv, ElemSol, SolidState>())(problem.spatialParams()) - )::value, Scalar> + template<class ElemSol, class Problem, class Element, class Scv, + std::enable_if_t<!Detail::hasSolidDensity<typename Problem::SpatialParams, Element, Scv, ElemSol, SolidState>(), int> = 0> + Scalar solidDensity_(const ElemSol& elemSol, + const Problem& problem, + const Element& element, + const Scv& scv, + const SolidState& solidState) { return SolidSystem::density(solidState); } @@ -363,15 +354,13 @@ private: * \param solidState the solid state * \note this gets selected if the user uses the solidsystem / solidstate interface */ - template<class ElemSol, class Problem, class Element, class Scv> - auto solidThermalConductivity_(const ElemSol& elemSol, - const Problem& problem, - const Element& element, - const Scv& scv, - const SolidState& solidState) - -> typename std::enable_if_t<!decltype( - isValid(Detail::hasSolidThermalConductivity<Element, Scv, ElemSol, SolidState>())(problem.spatialParams()) - )::value, Scalar> + template<class ElemSol, class Problem, class Element, class Scv, + std::enable_if_t<!Detail::hasSolidThermalConductivity<typename Problem::SpatialParams, Element, Scv, ElemSol, SolidState>(), int> = 0> + Scalar solidThermalConductivity_(const ElemSol& elemSol, + const Problem& problem, + const Element& element, + const Scv& scv, + const SolidState& solidState) { return SolidSystem::thermalConductivity(solidState); } @@ -394,15 +383,13 @@ private: * \note this gets selected if the user uses the simple spatial params interface in * combination with an InertSolidPhase as solid system */ - template<class ElemSol, class Problem, class Element, class Scv> - auto solidHeatCapacity_(const ElemSol& elemSol, - const Problem& problem, - const Element& element, - const Scv& scv, - const SolidState& solidState) - -> typename std::enable_if_t<decltype( - isValid(Detail::hasSolidHeatCapacity<Element, Scv, ElemSol, SolidState>())(problem.spatialParams()) - )::value, Scalar> + template<class ElemSol, class Problem, class Element, class Scv, + std::enable_if_t<Detail::hasSolidHeatCapacity<typename Problem::SpatialParams, Element, Scv, ElemSol, SolidState>(), int> = 0> + Scalar solidHeatCapacity_(const ElemSol& elemSol, + const Problem& problem, + const Element& element, + const Scv& scv, + const SolidState& solidState) { static_assert(Detail::isInertSolidPhase<SolidSystem>::value, "solidHeatCapacity can only be overwritten in the spatial params when the solid system is a simple InertSolidPhase\n" @@ -420,15 +407,13 @@ private: * \note this gets selected if the user uses the simple spatial params interface in * combination with an InertSolidPhase as solid system */ - template<class ElemSol, class Problem, class Element, class Scv> - auto solidDensity_(const ElemSol& elemSol, - const Problem& problem, - const Element& element, - const Scv& scv, - const SolidState& solidState) - -> typename std::enable_if_t<decltype( - isValid(Detail::hasSolidDensity<Element, Scv, ElemSol, SolidState>())(problem.spatialParams()) - )::value, Scalar> + template<class ElemSol, class Problem, class Element, class Scv, + std::enable_if_t<Detail::hasSolidDensity<typename Problem::SpatialParams, Element, Scv, ElemSol, SolidState>(), int> = 0> + Scalar solidDensity_(const ElemSol& elemSol, + const Problem& problem, + const Element& element, + const Scv& scv, + const SolidState& solidState) { static_assert(Detail::isInertSolidPhase<SolidSystem>::value, "solidDensity can only be overwritten in the spatial params when the solid system is a simple InertSolidPhase\n" @@ -446,15 +431,13 @@ private: * \note this gets selected if the user uses the simple spatial params interface in * combination with an InertSolidPhase as solid system */ - template<class ElemSol, class Problem, class Element, class Scv> - auto solidThermalConductivity_(const ElemSol& elemSol, - const Problem& problem, - const Element& element, - const Scv& scv, - const SolidState& solidState) - -> typename std::enable_if_t<decltype( - isValid(Detail::hasSolidThermalConductivity<Element, Scv, ElemSol, SolidState>())(problem.spatialParams()) - )::value, Scalar> + template<class ElemSol, class Problem, class Element, class Scv, + std::enable_if_t<Detail::hasSolidThermalConductivity<typename Problem::SpatialParams, Element, Scv, ElemSol, SolidState>(), int> = 0> + Scalar solidThermalConductivity_(const ElemSol& elemSol, + const Problem& problem, + const Element& element, + const Scv& scv, + const SolidState& solidState) { static_assert(Detail::isInertSolidPhase<SolidSystem>::value, "solidThermalConductivity can only be overwritten in the spatial params when the solid system is a simple InertSolidPhase\n"