Theseus
Compressible flow solver
Loading...
Searching...
No Matches
GasModel.hpp
Go to the documentation of this file.
1// Copyright (c) 2025-2026 Board of Trustees of the University of Illinois
2//
3// This file is part of Theseus.
4//
5// SPDX-License-Identifier: BSD-3-Clause
6#pragma once
7
8#include "Physics.hpp"
9#include "GasState.hpp"
10#include "EOS.hpp"
11#include "Transport.hpp"
12
13namespace Theseus
14{
15
16 // ============================================================================
17 // GasModel: Encapsulate EOS/Transport
18 // ============================================================================
19 template <typename EOSImpl, typename TransportImpl>
20 struct GasModel
21 {
22
25 EOSImpl eos;
26 TransportImpl transport;
27
28 MFEM_HOST_DEVICE GasModel() = default;
29
30 MFEM_HOST_DEVICE
31 GasModel(const PhysicsConstants &phys_in, const StateLayout &L_in,
32 const EOSImpl &eos_in, const TransportImpl &tr_in)
33 : phys(phys_in), L(L_in), eos(eos_in), transport(tr_in)
34 { };
35
36 MFEM_HOST_DEVICE
37 GasModel(const PhysicsConstants &phys_in, const StateLayout &L_in)
38 : phys(phys_in), L(L_in)
39 { };
40
41 template<typename HostDataT>
44 return retVal;
45 }
46
47 // Utilities and constants etc
48 MFEM_HOST_DEVICE
49 inline int num_equations() const
50 { return L.nequations(); };
51
52 MFEM_HOST_DEVICE
53 inline int dim() const
54 { return L.dim; };
55
56 // State Access
57 template<typename StateView>
58 MFEM_HOST_DEVICE
59 inline mfem::real_t velocity(const StateView &S, int d) const
60 { return S.velocity(L,d);};
61
62 template<typename StateView>
63 MFEM_HOST_DEVICE
64 inline mfem::real_t momentum(const StateView &S, int d) const
65 { return S.momentum(L,d);};
66
67 template<typename StateView>
68 MFEM_HOST_DEVICE
69 inline mfem::real_t density(const StateView &S) const
70 {
71 return eos.density(phys, L, S);
72 };
73
74 template<typename StateView>
75 MFEM_HOST_DEVICE
76 inline mfem::real_t mass(const StateView &S) const
77 {
78 return eos.density(phys, L, S);
79 };
80
81 template<typename StateView>
82 MFEM_HOST_DEVICE
83 inline mfem::real_t scalar(const StateView &S, int s) const
84 {
85 return S.scalar(L, s);
86 };
87
88 template<typename StateView>
89 MFEM_HOST_DEVICE
90 inline mfem::real_t energy(const StateView &S) const
91 {
92 return S.energy(L);
93 };
94
95 // --- Thermodynamics ------------------------------------------------------
96 template<typename StateView>
97 MFEM_HOST_DEVICE
98 inline mfem::real_t pressure(const StateView &S) const
99 {
100 return eos.pressure(phys, L, S);
101 }
102
103 template<typename StateView>
104 MFEM_HOST_DEVICE
105 inline mfem::real_t gamma(const StateView &S) const
106 {
107 return eos.gamma(phys, L, S);
108 }
109
110 template<typename StateView>
111 MFEM_HOST_DEVICE
112 inline mfem::real_t cp(const StateView &S) const
113 {
114 return eos.cp(phys, L, S);
115 }
116
117 template<typename StateView>
118 MFEM_HOST_DEVICE
119 inline mfem::real_t R_gas(const StateView &S) const
120 {
121 return eos.R_gas(phys, L, S);
122 }
123
124 template<typename StateView>
125 MFEM_HOST_DEVICE
126 inline mfem::real_t temperature(const StateView &S) const
127 {
128 return eos.temperature(phys, L, S);
129 }
130
131 template<typename StateView>
132 MFEM_HOST_DEVICE
133 inline mfem::real_t sound_speed(const StateView &S) const
134 {
135 return eos.sound_speed(phys, L, S);
136 }
137
138 template<typename StateView>
139 MFEM_HOST_DEVICE
140 inline mfem::real_t kinetic_energy_density(const StateView &S) const
141 {
142 return eos.kinetic_energy_density(phys, L, S);
143 }
144
145 template<typename StateView>
146 MFEM_HOST_DEVICE
147 inline mfem::real_t internal_energy_from_pressure(const StateView &S, mfem::real_t pressure) const
148 {
149 // rho*e = rho*E - 0.5*rho*|u|^2
150 return eos.internal_energy_from_pressure(phys, L, S, pressure);
151 }
152
153 template<typename StateView>
154 MFEM_HOST_DEVICE
155 inline mfem::real_t specific_internal_energy(const StateView &S) const
156 {
157 return eos.specific_internal_energy(phys, L, S);
158 }
159
160 template<typename StateView>
161 MFEM_HOST_DEVICE
162 inline void grad_temperature(const StateView &S,
163 const mfem::real_t *grad_r, const mfem::real_t *grad_p,
164 mfem::real_t *grad_t) const
165 {
166 return eos.grad_temperature(phys, L, S, grad_r, grad_p, grad_t);
167 }
168
169 template<typename StateView>
170 MFEM_HOST_DEVICE
171 inline mfem::real_t entropy(const StateView &S)
172 {
173 return eos.entropy(phys, L, S);
174 }
175
176 template<typename InStateView, typename OutStateView>
177 MFEM_HOST_DEVICE
178 inline void entropy_state(const InStateView &S, OutStateView &E) const
179 {
180 return eos.entropy_state(phys, L, S, E);
181 }
182
183 template<typename InStateView, typename OutStateView>
184 MFEM_HOST_DEVICE
185 inline void grad_entropy_to_grad_prim(const InStateView &S, const InStateView &dS,
186 OutStateView &dPrim) const
187 {
188 return eos.grad_entropy_to_grad_prim(phys, L, S, dS, dPrim);
189 }
190
191 template<typename InStateView, typename OutStateView>
192 MFEM_HOST_DEVICE
193 inline void entropy_to_conserved(const InStateView &Se, OutStateView &Sc) const
194 {
195 return eos.entropy_to_conserved(phys, L, Se, Sc);
196 }
197
198 template<typename InStateView, typename OutStateView>
199 MFEM_HOST_DEVICE
200 inline void primitive_to_conserved(const InStateView &Sp, OutStateView &Sc) const
201 {
202 return eos.entropy_to_conserved(phys, L, Sp, Sc);
203 }
204
205 // --- Transport -----------------------------------------------------------
206
207 template<typename StateView>
208 MFEM_HOST_DEVICE
209 inline mfem::real_t viscosity(const StateView &S) const
210 {
211 return transport.viscosity(phys, L, eos, S);
212 }
213
214 template<typename StateView>
215 MFEM_HOST_DEVICE
216 inline mfem::real_t bulk_viscosity(const StateView &S) const
217 {
218 return transport.bulk_viscosity(phys, L, eos, S);
219 }
220
221 template<typename StateView>
222 MFEM_HOST_DEVICE
223 inline mfem::real_t thermal_conductivity(const StateView &S) const
224 {
225 return transport.thermal_conductivity(phys, L, eos, S);
226 }
227 };
228
230
231 // Bridge class interface - helps external callers
232 // (e.g. Simulation driver) access essential GasModel
233 // functions.
235 {
236 public:
237 virtual ~GasModelInterface() = default;
238 virtual mfem::real_t density(const Theseus::DofStateView &S) const {
239 MFEM_ABORT("GasModelInterface::density called on base class.");
240 }
241 virtual mfem::real_t velocity(const Theseus::DofStateView &S,
242 int d) const{
243 MFEM_ABORT("GasModelInterface::velocity called on base class.");
244 }
245 virtual mfem::real_t pressure(const Theseus::DofStateView &S) const {
246 MFEM_ABORT("GasModelInterface::pressure called on base class.");
247 }
248 virtual mfem::real_t temperature(const Theseus::DofStateView &S) const {
249 MFEM_ABORT("GasModelInterface::temperature called on base class.");
250 }
251 virtual const Theseus::StateLayout& layout() const {
252 MFEM_ABORT("GasModelInterface::layout called on base class.");
253 }
254 virtual const Theseus::PhysicsConstants& phys() const {
255 MFEM_ABORT("GasModelInterface::density called on base class.");
256 }
257 };
258
259 // Templated wrapper for GasModelInterface
260 template <typename GasT>
262 {
263 public:
264 explicit GasModelInterfaceT(std::shared_ptr<const GasT> gas_)
265 : gas(std::move(gas_))
266 {}
267
268 mfem::real_t density(const Theseus::DofStateView &S) const override
269 {
270 return gas->density(S);
271 }
272
273 mfem::real_t velocity(const Theseus::DofStateView &S, int d) const override
274 {
275 return gas->velocity(S, d);
276 }
277
278 mfem::real_t pressure(const Theseus::DofStateView &S) const override
279 {
280 return gas->pressure(S);
281 }
282
283 mfem::real_t temperature(const Theseus::DofStateView &S) const override
284 {
285 return gas->temperature(S);
286 }
287
288 const Theseus::StateLayout& layout() const override
289 {
290 return gas->L;
291 }
292
293 const Theseus::PhysicsConstants& phys() const override
294 {
295 return gas->phys;
296 }
297
298 private:
299 std::shared_ptr<const GasT> gas;
300 };
301
302} // namespace Theseus
Definition GasModel.hpp:262
mfem::real_t density(const Theseus::DofStateView &S) const override
Definition GasModel.hpp:268
mfem::real_t velocity(const Theseus::DofStateView &S, int d) const override
Definition GasModel.hpp:273
const Theseus::StateLayout & layout() const override
Definition GasModel.hpp:288
const Theseus::PhysicsConstants & phys() const override
Definition GasModel.hpp:293
mfem::real_t temperature(const Theseus::DofStateView &S) const override
Definition GasModel.hpp:283
mfem::real_t pressure(const Theseus::DofStateView &S) const override
Definition GasModel.hpp:278
GasModelInterfaceT(std::shared_ptr< const GasT > gas_)
Definition GasModel.hpp:264
Definition GasModel.hpp:235
virtual ~GasModelInterface()=default
virtual mfem::real_t density(const Theseus::DofStateView &S) const
Definition GasModel.hpp:238
virtual const Theseus::PhysicsConstants & phys() const
Definition GasModel.hpp:254
virtual mfem::real_t velocity(const Theseus::DofStateView &S, int d) const
Definition GasModel.hpp:241
virtual mfem::real_t pressure(const Theseus::DofStateView &S) const
Definition GasModel.hpp:245
virtual const Theseus::StateLayout & layout() const
Definition GasModel.hpp:251
virtual mfem::real_t temperature(const Theseus::DofStateView &S) const
Definition GasModel.hpp:248
Definition AxisymmetricGeometry.hpp:15
Definition json.hpp:5363
Definition GasState.hpp:520
Definition GasModel.hpp:21
MFEM_HOST_DEVICE mfem::real_t sound_speed(const StateView &S) const
Definition GasModel.hpp:133
MFEM_HOST_DEVICE mfem::real_t thermal_conductivity(const StateView &S) const
Definition GasModel.hpp:223
TransportImpl transport
Definition GasModel.hpp:26
MFEM_HOST_DEVICE mfem::real_t specific_internal_energy(const StateView &S) const
Definition GasModel.hpp:155
MFEM_HOST_DEVICE int dim() const
Definition GasModel.hpp:53
MFEM_HOST_DEVICE mfem::real_t mass(const StateView &S) const
Definition GasModel.hpp:76
MFEM_HOST_DEVICE mfem::real_t R_gas(const StateView &S) const
Definition GasModel.hpp:119
MFEM_HOST_DEVICE GasModel(const PhysicsConstants &phys_in, const StateLayout &L_in, const EOSImpl &eos_in, const TransportImpl &tr_in)
Definition GasModel.hpp:31
MFEM_HOST_DEVICE int num_equations() const
Definition GasModel.hpp:49
MFEM_HOST_DEVICE void grad_entropy_to_grad_prim(const InStateView &S, const InStateView &dS, OutStateView &dPrim) const
Definition GasModel.hpp:185
MFEM_HOST_DEVICE mfem::real_t energy(const StateView &S) const
Definition GasModel.hpp:90
MFEM_HOST_DEVICE mfem::real_t pressure(const StateView &S) const
Definition GasModel.hpp:98
MFEM_HOST_DEVICE void entropy_state(const InStateView &S, OutStateView &E) const
Definition GasModel.hpp:178
MFEM_HOST_DEVICE mfem::real_t scalar(const StateView &S, int s) const
Definition GasModel.hpp:83
MFEM_HOST_DEVICE mfem::real_t momentum(const StateView &S, int d) const
Definition GasModel.hpp:64
EOSImpl eos
Definition GasModel.hpp:25
MFEM_HOST_DEVICE mfem::real_t viscosity(const StateView &S) const
Definition GasModel.hpp:209
MFEM_HOST_DEVICE mfem::real_t internal_energy_from_pressure(const StateView &S, mfem::real_t pressure) const
Definition GasModel.hpp:147
MFEM_HOST_DEVICE mfem::real_t kinetic_energy_density(const StateView &S) const
Definition GasModel.hpp:140
GasModel< EOSImpl, TransportImpl > to_device(HostDataT &host_data)
Definition GasModel.hpp:42
MFEM_HOST_DEVICE mfem::real_t density(const StateView &S) const
Definition GasModel.hpp:69
MFEM_HOST_DEVICE mfem::real_t velocity(const StateView &S, int d) const
Definition GasModel.hpp:59
MFEM_HOST_DEVICE void primitive_to_conserved(const InStateView &Sp, OutStateView &Sc) const
Definition GasModel.hpp:200
MFEM_HOST_DEVICE mfem::real_t entropy(const StateView &S)
Definition GasModel.hpp:171
MFEM_HOST_DEVICE mfem::real_t temperature(const StateView &S) const
Definition GasModel.hpp:126
MFEM_HOST_DEVICE GasModel(const PhysicsConstants &phys_in, const StateLayout &L_in)
Definition GasModel.hpp:37
MFEM_HOST_DEVICE mfem::real_t gamma(const StateView &S) const
Definition GasModel.hpp:105
MFEM_HOST_DEVICE void entropy_to_conserved(const InStateView &Se, OutStateView &Sc) const
Definition GasModel.hpp:193
MFEM_HOST_DEVICE mfem::real_t bulk_viscosity(const StateView &S) const
Definition GasModel.hpp:216
StateLayout L
Definition GasModel.hpp:24
MFEM_HOST_DEVICE mfem::real_t cp(const StateView &S) const
Definition GasModel.hpp:112
MFEM_HOST_DEVICE void grad_temperature(const StateView &S, const mfem::real_t *grad_r, const mfem::real_t *grad_p, mfem::real_t *grad_t) const
Definition GasModel.hpp:162
PhysicsConstants phys
Definition GasModel.hpp:23
MFEM_HOST_DEVICE GasModel()=default
Definition Physics.hpp:14
Definition GasState.hpp:37
MFEM_HOST_DEVICE int nequations() const
Definition GasState.hpp:91
int dim
Definition GasState.hpp:38