Line data Source code
1 : #ifndef MODEL_GAS_THERMO_H_
2 : #define MODEL_GAS_THERMO_H_
3 :
4 : #include <vector>
5 : #include <memory>
6 : #include "Set/Set.H"
7 : #include <cmath>
8 : #include "IO/ParmParse.H"
9 : #include "Set/Set.H"
10 :
11 : namespace Model {
12 : namespace Gas {
13 : namespace Thermo {
14 :
15 : template<typename... OBJ>
16 : class Thermo {
17 : private:
18 : friend IO::ParmParse;
19 : std::tuple<OBJ...> obj;
20 : static constexpr const char* names[] = { OBJ::name... };
21 : int selected = -1;
22 :
23 :
24 : public:
25 : template<int I = 0>
26 : AMREX_FORCE_INLINE
27 : double cp_mol(double T, Set::Patch<const Set::Scalar>& X, int i, int j, int k) const
28 : {
29 : if constexpr (I < sizeof...(OBJ))
30 : {
31 463376096 : if (selected == I)
32 463376096 : return std::get<I>(obj).cp_mol(T,X,i,j,k);
33 : else
34 0 : return cp_mol<I+1>(T,X,i,j,k);
35 : }
36 : else {
37 0 : Util::Abort(INFO, selected);
38 0 : return NAN;
39 : }
40 : }
41 :
42 :
43 : template<int I = 0>
44 : AMREX_FORCE_INLINE
45 : double enthalpy_mol(double T, Set::Patch<const Set::Scalar>& X, int i, int j, int k) const
46 : {
47 : if constexpr (I < sizeof...(OBJ))
48 : {
49 0 : if (selected == I)
50 0 : return std::get<I>(obj).enthalpy_mol(T,X,i,j,k);
51 : else
52 0 : return enthalpy_mol<I+1>(T,X,i,j,k);
53 : }
54 : else {
55 0 : Util::Abort(INFO, selected);
56 0 : return NAN;
57 : }
58 : }
59 :
60 : template<int I = 0>
61 : AMREX_FORCE_INLINE
62 : double entropy_mol(double T, Set::Patch<const Set::Scalar>& X, int i, int j, int k) const
63 : {
64 : if constexpr (I < sizeof...(OBJ))
65 : {
66 0 : if (selected == I)
67 0 : return std::get<I>(obj).entropy_mol(T,X,i,j,k);
68 : else
69 0 : return entropy_mol<I+1>(T,X,i,j,k);
70 : }
71 : else {
72 0 : Util::Abort(INFO, selected);
73 0 : return NAN;
74 : }
75 : }
76 :
77 24 : ~Thermo() = default;
78 : }; // class Thermo
79 :
80 : } // namespace Thermo
81 : } // namespace Gas
82 : } // namespace Model
83 :
84 : #endif
|