Alamo
EOS.H
Go to the documentation of this file.
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
11namespace Model {
12namespace Gas {
13namespace EOS {
14
15template<typename... OBJ>
16class EOS {
17private:
18 friend IO::ParmParse;
19 std::tuple<OBJ...> obj;
20 static constexpr const char* names[] = { OBJ::name... };
21 int selected = -1;
22
23public:
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 if (selected == I)
34 return std::get<I>(obj).ComputeT(gas,density,momentumx,momentumy,E,Tguess,X,i,j,k,rtol);
35 else
36 return ComputeT<GAS, I+1>(gas,density,momentumx,momentumy,E,Tguess,X,i,j,k,rtol);
37 }
38 else {
40 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 if (selected == I)
54 return std::get<I>(obj).ComputeT(pressure, density, R);
55 else
56 return ComputeT<I+1>(pressure, density, R);
57 }
58 else {
60 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 if (selected == I)
75 return std::get<I>(obj).ComputeP(density, T, R);
76 else
77 return ComputeP<I+1>(density, T, R);
78 }
79 else {
81 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 if (selected == I)
94 return std::get<I>(obj).ComputeE(density, momentumx, momentumy, T, R, gamma);
95 else
96 return ComputeE<I+1>(density, momentumx, momentumy, T, R, gamma);
97 }
98 else {
100 return NAN;
101 }
102 }
103}; // class EOS
104} // namespace EOS
105} // namespace Gas
106} // namespace Model
107
108#endif
#define X(name)
#define INFO
Definition Util.H:24
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE double ComputeP(double density, double T, double R) const
Definition EOS.H:69
static constexpr const char * names[]
Definition EOS.H:20
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE double ComputeT(double pressure, double density, double R) const
Definition EOS.H:48
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE double ComputeT(const GAS &gas, double density, double momentumx, double momentumy, double E, double Tguess, Set::Patch< const Set::Scalar > &X, int i, int j, int k, double rtol) const
Definition EOS.H:28
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE double ComputeE(double density, double momentumx, double momentumy, double T, double R, double gamma) const
Definition EOS.H:88
std::tuple< OBJ... > obj
Definition EOS.H:19
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
Definition Base.H:21
void Abort(const char *msg)
Definition Util.cpp:268