1#ifndef DUMUX_PYTHON_COMMON_VOLUMEVARIABLES_HH
2#define DUMUX_PYTHON_COMMON_VOLUMEVARIABLES_HH
4#include <dune/common/std/type_traits.hh>
5#include <dune/python/pybind11/pybind11.h>
6#include <dune/python/pybind11/stl.h>
8#include <dune/python/common/typeregistry.hh>
9#include <dune/common/classname.hh>
11namespace Dumux::Python::Impl {
14template <
class VolumeVariables>
15using PhaseTemperatureDetector =
decltype(std::declval<VolumeVariables>().temperature(0));
17template<
class VolumeVariables>
18static constexpr bool hasPhaseTemperature()
19{
return Dune::Std::is_detected<PhaseTemperatureDetector, VolumeVariables>::value; }
21template <
class VolumeVariables>
22using MoleFractionDetector =
decltype(std::declval<VolumeVariables>().moleFraction(0, 0));
24template<
class VolumeVariables>
25static constexpr bool hasMoleFraction()
26{
return Dune::Std::is_detected<MoleFractionDetector, VolumeVariables>::value; }
28template <
class VolumeVariables>
29using MassFractionDetector =
decltype(std::declval<VolumeVariables>().massFraction(0, 0));
31template<
class VolumeVariables>
32static constexpr bool hasMassFraction()
33{
return Dune::Std::is_detected<MassFractionDetector, VolumeVariables>::value; }
35template <
class VolumeVariables>
36using SaturationDetector =
decltype(std::declval<VolumeVariables>().saturation(0));
38template<
class VolumeVariables>
39static constexpr bool hasSaturation()
40{
return Dune::Std::is_detected<SaturationDetector, VolumeVariables>::value; }
42template <
class VolumeVariables>
43using PermeabilityDetector =
decltype(std::declval<VolumeVariables>().permeability());
45template<
class VolumeVariables>
46static constexpr bool hasPermeability()
47{
return Dune::Std::is_detected<PermeabilityDetector, VolumeVariables>::value; }
49template<
class VolumeVariables>
50void registerVolumeVariables(pybind11::handle scope)
52 using namespace Dune::Python;
54 auto [cls, addedToRegistry] = insertClass<VolumeVariables>(
55 scope,
"VolumeVariables",
56 GenerateTypeName(Dune::className<VolumeVariables>()),
62 using pybind11::operator
""_a;
64 cls.def(
"pressure", &VolumeVariables::pressure,
"phaseIdx"_a=0);
65 cls.def(
"density", &VolumeVariables::density,
"phaseIdx"_a=0);
66 cls.def(
"temperature", &VolumeVariables::temperature);
68 if constexpr(hasSaturation<VolumeVariables>())
69 cls.def(
"saturation", &VolumeVariables::saturation,
"saturation"_a=0);
70 if constexpr(hasPhaseTemperature<VolumeVariables>())
71 cls.def(
"temperature", &VolumeVariables::temperature,
"phaseIdx"_a=0);
72 if constexpr(hasMoleFraction<VolumeVariables>())
73 cls.def(
"moleFraction", &VolumeVariables::moleFraction,
"phaseIdx"_a,
"compIdx"_a);
74 if constexpr(hasMassFraction<VolumeVariables>())
75 cls.def(
"massFraction", &VolumeVariables::massFraction,
"phaseIdx"_a,
"compIdx"_a);
76 if constexpr(hasPermeability<VolumeVariables>())
77 cls.def(
"permeability", &VolumeVariables::permeability);