Line data Source code
1 : #ifndef MODEL_GAS_EOS_H_
2 : #define MODEL_GAS_EOS_H_
3 :
4 : #include <vector>
5 : #include <memory>
6 : #include <cmath>
7 :
8 : #include "Set/Set.H"
9 : #include "IO/ParmParse.H"
10 :
11 : namespace Model {
12 : namespace Gas {
13 : namespace EOS {
14 :
15 : template<typename... OBJ>
16 : class EOS {
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 : public:
24 : // Temperature, K
25 : template<typename GAS, int I = 0>
26 : AMREX_FORCE_INLINE
27 : AMREX_GPU_HOST_DEVICE
28 : double ComputeT(const GAS &gas, double density, double momentumx, double momentumy, double E, double Tguess,
29 : Set::Patch<const Set::Scalar>& X, int i, int j, int k, double rtol) const
30 : {
31 : if constexpr (I < sizeof...(OBJ))
32 : {
33 125784200 : if (selected == I)
34 251568400 : return std::get<I>(obj).ComputeT(gas,density,momentumx,momentumy,E,Tguess,X,i,j,k,rtol);
35 : else
36 0 : return ComputeT<GAS, I+1>(gas,density,momentumx,momentumy,E,Tguess,X,i,j,k,rtol);
37 : }
38 : else {
39 0 : Util::Abort(INFO, selected);
40 0 : return NAN;
41 : }
42 : }
43 :
44 : // Temperature, K
45 : template<int I = 0>
46 : AMREX_FORCE_INLINE
47 : AMREX_GPU_HOST_DEVICE
48 : double ComputeT(double pressure, double density,
49 : double R) const
50 : {
51 : if constexpr (I < sizeof...(OBJ))
52 : {
53 22248 : if (selected == I)
54 44496 : return std::get<I>(obj).ComputeT(pressure, density, R);
55 : else
56 0 : return ComputeT<I+1>(pressure, density, R);
57 : }
58 : else {
59 0 : Util::Abort(INFO, selected);
60 0 : return NAN;
61 : }
62 : }
63 :
64 :
65 : // Pressure, Pa
66 : template<int I = 0>
67 : AMREX_FORCE_INLINE
68 : AMREX_GPU_HOST_DEVICE
69 : double ComputeP(double density, double T, double R) const
70 : // Energy, J/m^3
71 : {
72 : if constexpr (I < sizeof...(OBJ))
73 : {
74 125784200 : if (selected == I)
75 251568400 : return std::get<I>(obj).ComputeP(density, T, R);
76 : else
77 0 : return ComputeP<I+1>(density, T, R);
78 : }
79 : else {
80 0 : Util::Abort(INFO, selected);
81 0 : return NAN;
82 : }
83 : }
84 :
85 : template<int I = 0>
86 : AMREX_FORCE_INLINE
87 : AMREX_GPU_HOST_DEVICE
88 : double ComputeE(double density, double momentumx, double momentumy, double T,
89 : double R, double gamma) const
90 : {
91 : if constexpr (I < sizeof...(OBJ))
92 : {
93 22248 : if (selected == I)
94 44496 : return std::get<I>(obj).ComputeE(density, momentumx, momentumy, T, R, gamma);
95 : else
96 0 : return ComputeE<I+1>(density, momentumx, momentumy, T, R, gamma);
97 : }
98 : else {
99 0 : Util::Abort(INFO, selected);
100 0 : return NAN;
101 : }
102 : }
103 : }; // class EOS
104 : } // namespace EOS
105 : } // namespace Gas
106 : } // namespace Model
107 :
108 : #endif
|