Line data Source code
1 : #ifndef SOLVER_LOCAL_RIEMANN_HLLE_H
2 : #define SOLVER_LOCAL_RIEMANN_HLLE_H
3 :
4 : #include "IO/ParmParse.H"
5 : #include "Solver/Local/Riemann/Riemann.H"
6 :
7 : /// A bunch of solvers
8 : namespace Solver
9 : {
10 : /// Local solvers
11 : namespace Local
12 : {
13 :
14 : namespace Riemann
15 : {
16 :
17 : class HLLE : public Riemann
18 : {
19 : public:
20 :
21 :
22 : static constexpr const char* name = "hlle";
23 1 : HLLE (IO::ParmParse &pp, std::string name)
24 1 : {pp_queryclass(name,*this);}
25 : HLLE (IO::ParmParse &pp)
26 : {pp_queryclass(*this);}
27 : HLLE ()
28 : {
29 : IO::ParmParse pp;
30 : pp_queryclass(*this);
31 : }
32 :
33 : int lowmach = 0;
34 : Set::Scalar cutoff = NAN;
35 :
36 1 : static void Parse(HLLE & value, IO::ParmParse & pp)
37 : {
38 : // toggle to apply a low mach correction approximation
39 2 : pp.query_default("lowmach",value.lowmach,false);
40 : // cutoff value if using the low mach approximation
41 2 : pp.query_default("cutoff",value.cutoff,0.1);
42 1 : }
43 :
44 8192000 : virtual Flux Solve(State lo, State hi, Model::Gas::Gas& gas, Set::Patch<const Set::Scalar>& X, int i, int j, int k, int side, Set::Scalar small) override
45 : {
46 : // Grab and label the input states
47 8192000 : Set::Scalar rho_L = lo.rho , rho_R = hi.rho;
48 8192000 : Set::Scalar Mn_L = lo.M_normal , Mn_R = hi.M_normal ;
49 : //Set::Scalar Mt_L = lo.M_tangent , Mt_R = hi.M_tangent ;
50 8192000 : Set::Scalar E_L = lo.E , E_R = hi.E ;
51 :
52 : // Ensure no negative densities
53 8192000 : rho_L = std::max(small,rho_L);
54 8192000 : rho_R = std::max(small,rho_R);
55 :
56 :
57 : // Calculate primitives
58 8192000 : Set::Scalar u_L = Mn_L/(rho_L+small), u_R = Mn_R/(rho_R+small);
59 8192000 : Set::Scalar v_L = Mn_L/(rho_L+small), v_R = Mn_R/(rho_R+small);
60 :
61 8192000 : Set::Scalar T_L=0, T_R=0, p_L=0, p_R=0, gamma_L=0, gamma_R=0;
62 8192000 : switch (side) {
63 2048000 : case 0: // xlo
64 2048000 : T_L = gas.ComputeT(rho_L, lo.M_normal, lo.M_tangent, E_L, 500.0, X, i-1, j ,k);
65 2048000 : p_L = gas.ComputeP(rho_L, T_L, X, i-1, j, k);
66 2048000 : gamma_L = gas.gamma(T_L, X, i-1, j, k);
67 2048000 : T_R = gas.ComputeT(rho_R, hi.M_normal, hi.M_tangent, E_R, 500.0, X, i, j ,k);
68 2048000 : p_R = gas.ComputeP(rho_R, T_R, X, i, j, k);
69 2048000 : gamma_R = gas.gamma(T_R, X, i, j, k);
70 2048000 : break;
71 2048000 : case 1: // xhi
72 2048000 : T_L = gas.ComputeT(rho_L, lo.M_normal, lo.M_tangent, E_L, 500.0, X, i, j ,k);
73 2048000 : p_L = gas.ComputeP(rho_L, T_L, X, i, j, k);
74 2048000 : gamma_L = gas.gamma(T_L, X, i, j, k);
75 2048000 : T_R = gas.ComputeT(rho_R, hi.M_normal, hi.M_tangent, E_R, 500.0, X, i+1, j ,k);
76 2048000 : p_R = gas.ComputeP(rho_R, T_R, X, i+1, j, k);
77 2048000 : gamma_R = gas.gamma(T_R, X, i+1, j, k);
78 2048000 : break;
79 2048000 : case 2: // ylo
80 2048000 : T_L = gas.ComputeT(rho_L, lo.M_normal, lo.M_tangent, E_L, 500.0, X, i, j-1 ,k);
81 2048000 : p_L = gas.ComputeP(rho_L, T_L, X, i, j-1, k);
82 2048000 : gamma_L = gas.gamma(T_L, X, i, j-1, k);
83 2048000 : T_R = gas.ComputeT(rho_R, hi.M_normal, hi.M_tangent, E_R, 500.0, X, i, j ,k);
84 2048000 : p_R = gas.ComputeP(rho_R, T_R, X, i, j, k);
85 2048000 : gamma_R = gas.gamma(T_R, X, i, j, k);
86 2048000 : break;
87 2048000 : case 3: // yhi
88 2048000 : T_L = gas.ComputeT(rho_L, lo.M_normal, lo.M_tangent, E_L, 500.0, X, i, j ,k);
89 2048000 : p_L = gas.ComputeP(rho_L, T_L, X, i, j, k);
90 2048000 : gamma_L = gas.gamma(T_L, X, i, j, k);
91 2048000 : T_R = gas.ComputeT(rho_R, hi.M_normal, hi.M_tangent, E_R, 500.0, X, i, j+1 ,k);
92 2048000 : p_R = gas.ComputeP(rho_R, T_R, X, i, j+1, k);
93 2048000 : gamma_R = gas.gamma(T_R, X, i, j+1, k);
94 2048000 : break;
95 0 : case 4: // zlo
96 0 : T_L = gas.ComputeT(rho_L, lo.M_normal, lo.M_tangent, E_L, 500.0, X, i, j ,k-1);
97 0 : p_L = gas.ComputeP(rho_L, T_L, X, i, j, k-1);
98 0 : gamma_L = gas.gamma(T_L, X, i, j, k-1);
99 0 : T_R = gas.ComputeT(rho_R, hi.M_normal, hi.M_tangent, E_R, 500.0, X, i, j ,k);
100 0 : p_R = gas.ComputeP(rho_R, T_R, X, i, j, k);
101 0 : gamma_R = gas.gamma(T_R, X, i, j, k);
102 0 : break;
103 0 : case 5: // zhi
104 0 : T_L = gas.ComputeT(rho_L, lo.M_normal, lo.M_tangent, E_L, 500.0, X, i, j ,k);
105 0 : p_L = gas.ComputeP(rho_L, T_L, X, i, j, k);
106 0 : gamma_L = gas.gamma(T_L, X, i, j, k);
107 0 : T_R = gas.ComputeT(rho_R, hi.M_normal, hi.M_tangent, E_R, 500.0, X, i, j ,k+1);
108 0 : p_R = gas.ComputeP(rho_R, T_R, X, i, j, k+1);
109 0 : gamma_R = gas.gamma(T_R, X, i, j, k+1);
110 0 : break;
111 0 : default:
112 0 : Util::Abort(INFO, "Unknown side in Riemann solver, ",side);
113 : }
114 :
115 8192000 : Set::Scalar c_L = std::sqrt(gamma_L * p_L / (rho_L + small));
116 8192000 : Set::Scalar c_R = std::sqrt(gamma_R * p_R / (rho_R + small));
117 :
118 : // Max wave speeds
119 8192000 : Set::Scalar S_L = std::min(u_L-c_L, u_R - c_R);
120 8192000 : Set::Scalar S_R = std::max(u_L+c_L, u_R + c_R);
121 :
122 :
123 8192000 : if (lowmach)
124 : {
125 0 : Set::Scalar u_RL = 0.5 * (u_L + u_R);
126 0 : Set::Scalar a_RL = 0.5 * (c_L + c_R);
127 0 : Set::Scalar Mach = std::abs(u_RL) / (a_RL + small);
128 0 : Set::Scalar psi = std::max(Mach, cutoff); // Mach cutoff
129 0 : S_L *= psi;
130 0 : S_R *= psi;
131 : }
132 :
133 : Flux F_L (
134 : lo.M_normal,
135 8192000 : lo.M_normal * u_L + p_L,
136 8192000 : lo.M_tangent * u_L,
137 8192000 : u_L * (lo.E + p_L)
138 8192000 : );
139 : Flux F_R (
140 : hi.M_normal,
141 8192000 : hi.M_normal * u_R + p_R,
142 8192000 : hi.M_tangent * u_R,
143 8192000 : u_R * (hi.E + p_R)
144 8192000 : );
145 :
146 8192000 : if (S_L >= 0.0)
147 : {
148 287544 : return F_L;
149 : }
150 7904456 : else if (S_R <= 0.0)
151 : {
152 0 : return F_R;
153 : }
154 : else
155 : {
156 7904456 : State dState = hi - lo;
157 7904456 : Set::Scalar dS = S_R - S_L;
158 7904456 : return (S_R*F_L - S_L*F_R + S_L*S_R*Flux(dState)) / dS;
159 : }
160 : }
161 : };
162 : }
163 : }
164 : }
165 :
166 : #endif
|