24#ifndef DUMUX_PYTHON_COMMON_VOLUMEVARIABLES_HH
25#define DUMUX_PYTHON_COMMON_VOLUMEVARIABLES_HH
27#include <dune/common/std/type_traits.hh>
28#include <dune/python/pybind11/pybind11.h>
29#include <dune/python/pybind11/stl.h>
31#include <dune/python/common/typeregistry.hh>
32#include <dune/common/classname.hh>
34namespace Dumux::Python::Impl {
37template <
class VolumeVariables>
38using PhaseTemperatureDetector =
decltype(std::declval<VolumeVariables>().temperature(0));
40template<
class VolumeVariables>
41static constexpr bool hasPhaseTemperature()
42{
return Dune::Std::is_detected<PhaseTemperatureDetector, VolumeVariables>::value; }
44template <
class VolumeVariables>
45using MoleFractionDetector =
decltype(std::declval<VolumeVariables>().moleFraction(0, 0));
47template<
class VolumeVariables>
48static constexpr bool hasMoleFraction()
49{
return Dune::Std::is_detected<MoleFractionDetector, VolumeVariables>::value; }
51template <
class VolumeVariables>
52using MassFractionDetector =
decltype(std::declval<VolumeVariables>().massFraction(0, 0));
54template<
class VolumeVariables>
55static constexpr bool hasMassFraction()
56{
return Dune::Std::is_detected<MassFractionDetector, VolumeVariables>::value; }
58template <
class VolumeVariables>
59using SaturationDetector =
decltype(std::declval<VolumeVariables>().saturation(0));
61template<
class VolumeVariables>
62static constexpr bool hasSaturation()
63{
return Dune::Std::is_detected<SaturationDetector, VolumeVariables>::value; }
65template <
class VolumeVariables>
66using PermeabilityDetector =
decltype(std::declval<VolumeVariables>().permeability());
68template<
class VolumeVariables>
69static constexpr bool hasPermeability()
70{
return Dune::Std::is_detected<PermeabilityDetector, VolumeVariables>::value; }
72template<
class VolumeVariables>
73void registerVolumeVariables(pybind11::handle scope)
75 using namespace Dune::Python;
77 auto [cls, addedToRegistry] = insertClass<VolumeVariables>(
78 scope,
"VolumeVariables",
79 GenerateTypeName(Dune::className<VolumeVariables>()),
85 using pybind11::operator
""_a;
87 cls.def(
"pressure", &VolumeVariables::pressure,
"phaseIdx"_a=0);
88 cls.def(
"density", &VolumeVariables::density,
"phaseIdx"_a=0);
89 cls.def(
"temperature", &VolumeVariables::temperature);
91 if constexpr(hasSaturation<VolumeVariables>())
92 cls.def(
"saturation", &VolumeVariables::saturation,
"saturation"_a=0);
93 if constexpr(hasPhaseTemperature<VolumeVariables>())
94 cls.def(
"temperature", &VolumeVariables::temperature,
"phaseIdx"_a=0);
95 if constexpr(hasMoleFraction<VolumeVariables>())
96 cls.def(
"moleFraction", &VolumeVariables::moleFraction,
"phaseIdx"_a,
"compIdx"_a);
97 if constexpr(hasMassFraction<VolumeVariables>())
98 cls.def(
"massFraction", &VolumeVariables::massFraction,
"phaseIdx"_a,
"compIdx"_a);
99 if constexpr(hasPermeability<VolumeVariables>())
100 cls.def(
"permeability", &VolumeVariables::permeability);