From dc1c94618454d71f43dd1b5056722c7f828a599d Mon Sep 17 00:00:00 2001 From: Kilian Weishaupt <kilian.weishaupt@iws.uni-stuttgart.de> Date: Mon, 12 Jul 2021 10:17:08 +0200 Subject: [PATCH] [python][common] Add volVar bindings --- dumux/python/common/volumevariables.hh | 82 ++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 dumux/python/common/volumevariables.hh diff --git a/dumux/python/common/volumevariables.hh b/dumux/python/common/volumevariables.hh new file mode 100644 index 0000000000..cce94ab1cb --- /dev/null +++ b/dumux/python/common/volumevariables.hh @@ -0,0 +1,82 @@ +#ifndef DUMUX_PYTHON_COMMON_VOLUMEVARIABLES_HH +#define DUMUX_PYTHON_COMMON_VOLUMEVARIABLES_HH + +#include <dune/python/pybind11/pybind11.h> +#include <dune/python/pybind11/stl.h> + +#include <dune/python/common/typeregistry.hh> +#include <dune/common/classname.hh> + +namespace Dumux::Python::Impl { + +// helper structs and functions for detecting member functions in volVars +template <class VolumeVariables> +using PhaseTemperatureDetector = decltype(std::declval<VolumeVariables>().temperature(0)); + +template<class VolumeVariables> +static constexpr bool hasPhaseTemperature() +{ return Dune::Std::is_detected<PhaseTemperatureDetector, VolumeVariables>::value; } + +template <class VolumeVariables> +using MoleFractionDetector = decltype(std::declval<VolumeVariables>().moleFraction(0, 0)); + +template<class VolumeVariables> +static constexpr bool hasMoleFraction() +{ return Dune::Std::is_detected<MoleFractionDetector, VolumeVariables>::value; } + +template <class VolumeVariables> +using MassFractionDetector = decltype(std::declval<VolumeVariables>().massFraction(0, 0)); + +template<class VolumeVariables> +static constexpr bool hasMassFraction() +{ return Dune::Std::is_detected<MassFractionDetector, VolumeVariables>::value; } + +template <class VolumeVariables> +using SaturationDetector = decltype(std::declval<VolumeVariables>().saturation(0)); + +template<class VolumeVariables> +static constexpr bool hasSaturation() +{ return Dune::Std::is_detected<SaturationDetector, VolumeVariables>::value; } + +template <class VolumeVariables> +using PermeabilityDetector = decltype(std::declval<VolumeVariables>().permeability()); + +template<class VolumeVariables> +static constexpr bool hasPermeability() +{ return Dune::Std::is_detected<PermeabilityDetector, VolumeVariables>::value; } + +template<class VolumeVariables> +void registerVolumeVariables(pybind11::handle scope) +{ + using namespace Dune::Python; + + auto [cls, addedToRegistry] = insertClass<VolumeVariables>( + scope, "VolumeVariables", + GenerateTypeName(Dune::className<VolumeVariables>()), + IncludeFiles{} + ); + + if (addedToRegistry) + { + using pybind11::operator""_a; + + cls.def("pressure", &VolumeVariables::pressure, "phaseIdx"_a=0); + cls.def("density", &VolumeVariables::density, "phaseIdx"_a=0); + cls.def("temperature", &VolumeVariables::temperature); + + if constexpr(hasSaturation<VolumeVariables>()) + cls.def("saturation", &VolumeVariables::saturation, "saturation"_a=0); + if constexpr(hasPhaseTemperature<VolumeVariables>()) + cls.def("temperature", &VolumeVariables::temperature, "phaseIdx"_a=0); + if constexpr(hasMoleFraction<VolumeVariables>()) + cls.def("moleFraction", &VolumeVariables::moleFraction, "phaseIdx"_a, "compIdx"_a); + if constexpr(hasMassFraction<VolumeVariables>()) + cls.def("massFraction", &VolumeVariables::massFraction, "phaseIdx"_a, "compIdx"_a); + if constexpr(hasPermeability<VolumeVariables>()) + cls.def("permeability", &VolumeVariables::permeability); + } +} + +} // namespace Dumux::Python + +#endif -- GitLab