8#include <ryujin/base/compile_time_options.h>
19#include <deal.II/base/memory_space.h>
20#include <deal.II/base/parameter_acceptor.h>
21#include <deal.II/base/tensor.h>
31 typename MemorySpace = dealii::MemorySpace::Host>
32 class HyperbolicSystemView;
94 typename Number = double,
95 typename MemorySpace = dealii::MemorySpace::Host>
107 typename MemorySpace = dealii::MemorySpace::Host>
121 template <
typename MemorySpace = dealii::MemorySpace::Host,
123 typename ScalarNumber>
127 const bool skip_constrained_dofs =
true)
const;
139 void update_parameters();
143 template <
int,
typename,
typename>
171 template <
int dim,
typename Number,
typename MemorySpace>
176 std::is_same_v<MemorySpace, dealii::MemorySpace::Host> ||
177 std::is_same_v<MemorySpace, dealii::MemorySpace::Default>,
178 "Unexpected memory space");
198 using state_type = dealii::Tensor<1, problem_dimension, Number>;
204 dealii::Tensor<1, problem_dimension, dealii::Tensor<1, dim, Number>>;
230 std::array<Number, n_initial_precomputed_values>;
232 template <
int n_comp>
261 hyperbolic_system.parameters_.template view<MemorySpace>())
360 static DEAL_II_HOST_DEVICE dealii::Tensor<1, dim, Number>
436 DEAL_II_HOST_DEVICE Number
465 template <
int component>
468 const dealii::Tensor<1, dim, Number> &normal)
const;
476 template <
int component>
480 const dealii::Tensor<1, dim, Number> &normal)
const;
500 template <
typename Lambda>
504 const dealii::Tensor<1, dim, Number> &normal,
505 const Lambda &get_dirichlet_data)
const;
548 const unsigned int i,
555 const unsigned int *js,
566 const dealii::Tensor<1, dim, Number> &c_ij)
const;
575 const dealii::Tensor<1, dim, Number> &c_ij)
const =
delete;
588 const unsigned int i,
594 const unsigned int *js,
614 template <
typename ST>
630 template <
typename ST>
653 template <
typename Lambda>
678 "Compressible Euler equations (polytropic gas EOS, optimized)",
680 {
"rho",
"m_1",
"m_2",
"E"},
681 {
"rho",
"m_1",
"m_2",
"m_3",
"E"}}},
683 {
"rho",
"v_1",
"v_2",
"p"},
684 {
"rho",
"v_1",
"v_2",
"v_3",
"p"}}},
685 {{{
"s",
"eta_h"}, {
"s",
"eta_h"}, {
"s",
"eta_h"}}},
688 , parameters_(
"euler_hyperbolic_system_parameters",
692 auto ¶meters = *parameters_.view();
694 parameters.gamma = 7. / 5.;
695 add_parameter(
"gamma", parameters.gamma,
"The ratio of specific heats");
697 parameters.reference_density = 1.;
698 add_parameter(
"reference density",
699 parameters.reference_density,
700 "Problem specific density reference");
702 parameters.vacuum_state_relaxation_small = 1.e2;
703 add_parameter(
"vacuum state relaxation small",
704 parameters.vacuum_state_relaxation_small,
705 "Problem specific vacuum relaxation parameter");
707 parameters.vacuum_state_relaxation_large = 1.e4;
708 add_parameter(
"vacuum state relaxation large",
709 parameters.vacuum_state_relaxation_large,
710 "Problem specific vacuum relaxation parameter");
712 ParameterAcceptor::parse_parameters_call_back.connect(
713 [
this] { update_parameters(); });
719 inline void HyperbolicSystem::update_parameters()
721 auto ¶meters = *parameters_.view();
727 const auto gamma = parameters.gamma;
728 parameters.gamma_inverse = 1. / gamma;
729 parameters.gamma_plus_one_inverse = 1. / (gamma + 1.);
730 parameters.gamma_minus_one_inverse = 1. / (gamma - 1.);
731 parameters.gamma_minus_one_over_gamma_plus_one =
732 (gamma - 1.) / (gamma + 1.);
736 template <
typename MemorySpace,
int dim,
typename ScalarNumber>
740 const bool skip_constrained_dofs)
const
742 const unsigned int n_internal = offline_data.n_locally_internal();
743 const unsigned int n_owned = offline_data.n_locally_owned();
747 const auto sparsity_simd_view =
748 offline_data.sparsity_pattern_simd().template view<MemorySpace>();
752 std::as_const(state_vector)
754 .template view<ScalarView::problem_dimension, MemorySpace>();
755 const auto precomputed_view =
757 .template view<ScalarView::n_precomputed_values, MemorySpace>();
759 const auto hyperbolic_system_views =
760 make_select_view<dim, ScalarNumber, MemorySpace>(*
this);
762 const auto body = [=](
auto sentinel,
unsigned int i) {
763 using T =
decltype(sentinel);
767 const unsigned int row_length = sparsity_simd_view.row_length(i);
768 if (skip_constrained_dofs && row_length == 1)
771 const auto view = hyperbolic_system_views.template view<T>();
773 const auto U_i = U_view.template read_tensor<T>(i);
774 const precomputed_type prec_i{
view.specific_entropy(U_i),
775 view.harten_entropy(U_i)};
776 precomputed_view.template write_tensor<T>(prec_i, i);
779 loop<MemorySpace, ScalarNumber>(
780 "hyperbolic_kernel_01b", body, 0, n_internal, n_owned);
784 template <
int dim,
typename Number,
typename MemorySpace>
785 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
792 template <
int dim,
typename Number,
typename MemorySpace>
793 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
795 const Number &rho)
const
797 constexpr ScalarNumber eps = std::numeric_limits<ScalarNumber>::epsilon();
798 const Number rho_cutoff_large =
799 reference_density() * vacuum_state_relaxation_large() * eps;
801 return ryujin::compare_and_apply_mask<dealii::SIMDComparison::less_than>(
802 std::abs(rho), rho_cutoff_large, Number(0.), rho);
806 template <
int dim,
typename Number,
typename MemorySpace>
807 DEAL_II_HOST_DEVICE_ALWAYS_INLINE dealii::Tensor<1, dim, Number>
811 dealii::Tensor<1, dim, Number> result;
812 for (
unsigned int i = 0; i < dim; ++i)
813 result[i] = U[1 + i];
818 template <
int dim,
typename Number,
typename MemorySpace>
819 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
827 template <
int dim,
typename Number,
typename MemorySpace>
828 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
835 const Number rho_inverse =
ScalarNumber(1.) / density(U);
836 const auto m = momentum(U);
837 const Number E = total_energy(U);
838 return E -
ScalarNumber(0.5) * m.norm_square() * rho_inverse;
842 template <
int dim,
typename Number,
typename MemorySpace>
843 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
854 const Number rho_inverse =
ScalarNumber(1.) / density(U);
855 const auto u = momentum(U) * rho_inverse;
860 for (
unsigned int i = 0; i < dim; ++i) {
861 result[1 + i] = -u[i];
869 template <
int dim,
typename Number,
typename MemorySpace>
870 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
875 return (gamma() -
ScalarNumber(1.)) * internal_energy(U);
879 template <
int dim,
typename Number,
typename MemorySpace>
880 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
885 const Number rho_inverse =
ScalarNumber(1.) / density(U);
886 const Number p = pressure(U);
887 return std::sqrt(gamma() * p * rho_inverse);
891 template <
int dim,
typename Number,
typename MemorySpace>
892 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
898 return internal_energy(U) *
ryujin::pow(rho_inverse, gamma());
902 template <
int dim,
typename Number,
typename MemorySpace>
903 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
909 const Number rho = density(U);
910 const auto m = momentum(U);
911 const Number E = total_energy(U);
913 const Number rho_rho_e = rho * E -
ScalarNumber(0.5) * m.norm_square();
914 return ryujin::pow(rho_rho_e, gamma_plus_one_inverse());
918 template <
int dim,
typename Number,
typename MemorySpace>
919 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
934 const Number rho = density(U);
935 const auto m = momentum(U);
936 const Number E = total_energy(U);
938 const Number rho_rho_e = rho * E -
ScalarNumber(0.5) * m.norm_square();
941 gamma_plus_one_inverse() *
942 ryujin::pow(rho_rho_e, -gamma() * gamma_plus_one_inverse());
946 result[0] = factor * E;
947 for (
unsigned int i = 0; i < dim; ++i)
948 result[1 + i] = -factor * m[i];
949 result[dim + 1] = factor * rho;
955 template <
int dim,
typename Number,
typename MemorySpace>
956 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
961 const auto p = pressure(U);
966 template <
int dim,
typename Number,
typename MemorySpace>
967 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
983 const Number rho = density(U);
985 const auto u = momentum(U) * rho_inverse;
986 const auto p = pressure(U);
988 const auto factor = (gamma() -
ScalarNumber(1.0)) * gamma_inverse() *
993 result[0] = factor *
ScalarNumber(0.5) * u.norm_square();
994 result[dim + 1] = factor;
995 for (
unsigned int i = 0; i < dim; ++i) {
996 result[1 + i] = -factor * u[i];
1003 template <
int dim,
typename Number,
typename MemorySpace>
1004 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
bool
1008 const auto rho_new = density(U);
1009 const auto e_new = internal_energy(U);
1010 const auto s_new = specific_entropy(U);
1012 constexpr auto gt = dealii::SIMDComparison::greater_than;
1015 ryujin::compare_and_apply_mask<gt>(rho_new, T(0.), T(0.), T(-1.)) +
1016 ryujin::compare_and_apply_mask<gt>(e_new, T(0.), T(0.), T(-1.)) +
1017 ryujin::compare_and_apply_mask<gt>(s_new, T(0.), T(0.), T(-1.));
1020 if (!(test == Number(0.))) {
1021 std::cout << std::fixed << std::setprecision(16);
1022 std::cout <<
"Bounds violation: Negative state [rho, e, s] detected!\n";
1023 std::cout <<
"\t\trho: " << rho_new <<
"\n";
1024 std::cout <<
"\t\tint: " << e_new <<
"\n";
1025 std::cout <<
"\t\tent: " << s_new <<
"\n" << std::endl;
1029 return (test == Number(0.));
1033 template <
int dim,
typename Number,
typename MemorySpace>
1034 template <
int component>
1035 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1037 const state_type &U,
const dealii::Tensor<1, dim, Number> &normal)
const
1038 -> std::array<state_type, 2>
1040 static_assert(component == 1 || component == problem_dimension,
1041 "Only first and last eigenvectors implemented");
1043 const auto rho = density(U);
1044 const auto m = momentum(U);
1045 const auto v = m / rho;
1046 const auto a = speed_of_sound(U);
1047 const auto gamma = this->gamma();
1052 const auto e_k = 0.5 * v.norm_square();
1054 switch (component) {
1056 b[0] = (gamma - 1.) * e_k + a * v * normal;
1057 for (
unsigned int i = 0; i < dim; ++i)
1058 b[1 + i] = (1. - gamma) * v[i] - a * normal[i];
1059 b[dim + 1] = gamma - 1.;
1063 for (
unsigned int i = 0; i < dim; ++i)
1064 c[1 + i] = v[i] - a * normal[i];
1065 c[dim + 1] = a * a / (gamma - 1) + e_k - a * (v * normal);
1069 case problem_dimension:
1070 b[0] = (gamma - 1.) * e_k - a * v * normal;
1071 for (
unsigned int i = 0; i < dim; ++i)
1072 b[1 + i] = (1. - gamma) * v[i] + a * normal[i];
1073 b[dim + 1] = gamma - 1.;
1077 for (
unsigned int i = 0; i < dim; ++i)
1078 c[1 + i] = v[i] + a * normal[i];
1079 c[dim + 1] = a * a / (gamma - 1) + e_k + a * (v * normal);
1084 __builtin_unreachable();
1088 template <
int dim,
typename Number,
typename MemorySpace>
1089 template <
int component>
1090 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1095 const dealii::Tensor<1, dim, Number> &normal)
const ->
state_type
1097 static_assert(component == 1 || component == 2,
1098 "component has to be 1 or 2");
1100 const auto m = momentum(U);
1101 const auto rho = density(U);
1102 const auto a = speed_of_sound(U);
1103 const auto vn = m * normal / rho;
1105 const auto m_bar = momentum(U_bar);
1106 const auto rho_bar = density(U_bar);
1107 const auto a_bar = speed_of_sound(U_bar);
1108 const auto vn_bar = m_bar * normal / rho_bar;
1112 const auto R_1 = component == 1
1118 const auto R_2 = component == 2
1122 const auto p = pressure(U);
1125 const auto vperp = m / rho - vn * normal;
1127 const auto vn_new = 0.5 * (R_1 + R_2);
1129 auto rho_new = 1. / (gamma() * s) *
1130 ryujin::fixed_power<2>(
ScalarNumber((gamma() - 1.) / 4.) *
1132 rho_new =
ryujin::pow(rho_new, 1. / (gamma() - 1.));
1134 const auto p_new = s * std::pow(rho_new, gamma());
1138 for (
unsigned int d = 0; d < dim; ++d) {
1139 U_new[1 + d] = rho_new * (vn_new * normal + vperp)[d];
1142 0.5 * rho_new * (vn_new * vn_new + vperp.norm_square());
1148 template <
int dim,
typename Number,
typename MemorySpace>
1149 template <
typename Lambda>
1150 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1152 dealii::types::boundary_id
id,
1154 const dealii::Tensor<1, dim, Number> &normal,
1155 const Lambda &get_dirichlet_data)
const ->
state_type
1160 result = get_dirichlet_data();
1167 const auto m_dirichlet = momentum(get_dirichlet_data());
1168 const auto rho = density(result);
1169 const auto m = momentum(result);
1171 for (
unsigned int k = 0; k < dim; ++k)
1172 result[k + 1] = m_dirichlet[k];
1174 Number(0.5) / rho * (m_dirichlet.norm_square() - m.norm_square());
1181 const auto U_dirichlet = get_dirichlet_data();
1182 const auto rho_dirichlet = density(U_dirichlet);
1183 const auto v_dirichlet = momentum(U_dirichlet) / rho_dirichlet;
1184 const auto rho = density(result);
1185 const auto v = momentum(result) / rho;
1187 for (
unsigned int k = 0; k < dim; ++k)
1188 result[k + 1] = rho * v_dirichlet[k];
1190 Number(0.5) * rho * (v_dirichlet.norm_square() - v.norm_square());
1193 auto m = momentum(U);
1194 m -= 1. * (m * normal) * normal;
1195 for (
unsigned int k = 0; k < dim; ++k)
1196 result[k + 1] = m[k];
1199 for (
unsigned int k = 0; k < dim; ++k)
1200 result[k + 1] = Number(0.);
1215 const auto m = momentum(U);
1216 const auto rho = density(U);
1217 const auto a = speed_of_sound(U);
1218 const auto vn = m * normal / rho;
1222 result = get_dirichlet_data();
1226 if (vn >= -a && vn <= 0.) {
1227 const auto U_dirichlet = get_dirichlet_data();
1228 result = prescribe_riemann_characteristic<2>(U_dirichlet, U, normal);
1232 if (vn > 0. && vn <= a) {
1233 const auto U_dirichlet = get_dirichlet_data();
1234 result = prescribe_riemann_characteristic<1>(U, U_dirichlet, normal);
1240 Assert(
false, dealii::ExcNotImplemented());
1247 template <
int dim,
typename Number,
typename MemorySpace>
1248 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1252 const auto rho_inverse =
ScalarNumber(1.) / density(U);
1253 const auto m = momentum(U);
1254 const auto p = pressure(U);
1255 const auto E = total_energy(U);
1260 for (
unsigned int i = 0; i < dim; ++i) {
1261 result[1 + i] = m * (m[i] * rho_inverse);
1262 result[1 + i][i] += p;
1264 result[dim + 1] = m * (rho_inverse * (E + p));
1270 template <
int dim,
typename Number,
typename MemorySpace>
1271 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1275 const unsigned int ,
1282 template <
int dim,
typename Number,
typename MemorySpace>
1283 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1287 const unsigned int * ,
1294 template <
int dim,
typename Number,
typename MemorySpace>
1295 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1299 const dealii::Tensor<1, dim, Number> &c_ij)
const ->
state_type
1305 template <
int dim,
typename Number,
typename MemorySpace>
1306 template <
typename ST>
1307 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1311 using T =
typename ST::value_type;
1312 static_assert(std::is_same_v<Number, T>,
"template mismatch");
1314 constexpr auto dim2 = ST::dimension - 2;
1315 static_assert(dim >= dim2,
1316 "the space dimension of the argument state must not be "
1317 "larger than the one of the target state");
1320 result[0] =
state[0];
1321 result[dim + 1] =
state[dim2 + 1];
1322 for (
unsigned int i = 1; i < dim2 + 1; ++i)
1323 result[i] =
state[i];
1329 template <
int dim,
typename Number,
typename MemorySpace>
1330 template <
typename ST>
1331 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1335 const auto primitive_state = expand_state(initial_state);
1336 return from_primitive_state(primitive_state);
1340 template <
int dim,
typename Number,
typename MemorySpace>
1341 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1345 const auto &rho = primitive_state[0];
1347 const auto u = momentum(primitive_state);
1348 const auto &p = primitive_state[dim + 1];
1350 auto state = primitive_state;
1352 for (
unsigned int i = 1; i < dim + 1; ++i)
1356 p / (
ScalarNumber(gamma() - 1.)) + Number(0.5) * rho * u * u;
1362 template <
int dim,
typename Number,
typename MemorySpace>
1363 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1367 const auto &rho =
state[0];
1368 const auto rho_inverse = Number(1.) / rho;
1369 const auto p = pressure(
state);
1371 auto primitive_state =
state;
1373 for (
unsigned int i = 1; i < dim + 1; ++i)
1374 primitive_state[i] *= rho_inverse;
1376 primitive_state[dim + 1] = p;
1378 return primitive_state;
1382 template <
int dim,
typename Number,
typename MemorySpace>
1383 template <
typename Lambda>
1384 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1388 auto result =
state;
1389 const auto M = lambda(momentum(
state));
1390 for (
unsigned int d = 0; d < dim; ++d)
1391 result[1 + d] = M[d];
static constexpr bool have_covolume_constant
DEAL_II_HOST_DEVICE state_type mathematical_entropy_derivative(const state_type &U) const
DEAL_II_HOST_DEVICE Number filter_vacuum_density(const Number &rho) const
DEAL_II_HOST_DEVICE state_type apply_galilei_transform(const state_type &state, const Lambda &lambda) const
DEAL_II_HOST_DEVICE Number pressure(const state_type &U) const
DEAL_II_HOST_DEVICE state_type from_primitive_state(const state_type &primitive_state) const
DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber gamma_minus_one_inverse() const
static constexpr bool have_gamma
DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber reference_density() const
DEAL_II_HOST_DEVICE state_type prescribe_riemann_characteristic(const state_type &U, const state_type &U_bar, const dealii::Tensor< 1, dim, Number > &normal) const
DEAL_II_HOST_DEVICE state_type from_initial_state(const ST &initial_state) const
DEAL_II_HOST_DEVICE_ALWAYS_INLINE state_type apply_boundary_conditions(const dealii::types::boundary_id id, const state_type &U, const dealii::Tensor< 1, dim, Number > &normal, const Lambda &get_dirichlet_data) const
DEAL_II_HOST_DEVICE state_type flux_divergence(const flux_contribution_type &flux_i, const flux_contribution_type &flux_j, const dealii::Tensor< 1, dim, Number > &c_ij) const
DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber vacuum_state_relaxation_large() const
DEAL_II_HOST_DEVICE std::array< state_type, 2 > linearized_eigenvector(const state_type &U, const dealii::Tensor< 1, dim, Number > &normal) const
DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber gamma_minus_one_over_gamma_plus_one() const
static constexpr bool have_source_terms
dealii::Tensor< 1, problem_dimension, Number > state_type
DEAL_II_HOST_DEVICE Number mathematical_entropy(const state_type &U) const
DEAL_II_HOST_DEVICE bool is_admissible(const state_type &U) const
DEAL_II_HOST_DEVICE state_type nodal_source(const PrecomputedVectorView &pv, const unsigned int i, const state_type &U_i, const ScalarNumber tau) const =delete
DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber gamma_inverse() const
std::array< Number, n_precomputed_values > precomputed_type
DEAL_II_HOST_DEVICE flux_contribution_type flux_contribution(const PrecomputedVectorView &pv, const InitialPrecomputedVectorView &ipv, const unsigned int i, const state_type &U_i) const
static DEAL_II_HOST_DEVICE dealii::Tensor< 1, dim, Number > momentum(const state_type &U)
DEAL_II_HOST_DEVICE state_type harten_entropy_derivative(const state_type &U) const
HyperbolicSystemView(const HyperbolicSystem &hyperbolic_system)
static DEAL_II_HOST_DEVICE Number density(const state_type &U)
DEAL_II_HOST_DEVICE flux_type f(const state_type &U) const
static constexpr unsigned int problem_dimension
DEAL_II_HOST_DEVICE state_type nodal_source(const PrecomputedVectorView &pv, const unsigned int *js, const state_type &U_j, const ScalarNumber tau) const =delete
DEAL_II_HOST_DEVICE Number speed_of_sound(const state_type &U) const
DEAL_II_HOST_DEVICE state_type expand_state(const ST &state) const
static DEAL_II_HOST_DEVICE Number internal_energy(const state_type &U)
static constexpr unsigned int n_precomputed_values
static constexpr bool have_high_order_flux
static DEAL_II_HOST_DEVICE state_type internal_energy_derivative(const state_type &U)
flux_type flux_contribution_type
typename get_value_type< Number >::type ScalarNumber
dealii::Tensor< 1, problem_dimension, dealii::Tensor< 1, dim, Number > > flux_type
DEAL_II_HOST_DEVICE state_type high_order_flux_divergence(const flux_contribution_type &flux_i, const flux_contribution_type &flux_j, const dealii::Tensor< 1, dim, Number > &c_ij) const =delete
std::array< Number, n_initial_precomputed_values > initial_precomputed_type
DEAL_II_HOST_DEVICE state_type to_primitive_state(const state_type &state) const
DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber gamma() const
static constexpr bool have_energy_equation
DEAL_II_HOST_DEVICE Number harten_entropy(const state_type &U) const
static DEAL_II_HOST_DEVICE Number total_energy(const state_type &U)
DEAL_II_HOST_DEVICE Number specific_entropy(const state_type &U) const
static constexpr unsigned int n_initial_precomputed_values
DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber vacuum_state_relaxation_small() const
DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber gamma_plus_one_inverse() const
HyperbolicSystem(const std::string &subsection="/HyperbolicSystem")
void fill_precomputed_values(const OfflineData< dim, ScalarNumber > &offline_data, StateVector< ScalarNumber > &state_vector, const bool skip_constrained_dofs=true) const
@ implicit_transfers_host_resident
DEAL_II_HOST_DEVICE T pow(const T x, const T b)
DEAL_II_HOST_DEVICE_ALWAYS_INLINE dealii::Tensor< 1, problem_dim, T > contract(const FT &flux_ij, const TT &c_ij)
DEAL_II_HOST_DEVICE_ALWAYS_INLINE FT add(const FT &flux_left_ij, const FT &flux_right_ij)
double gamma_plus_one_inverse
double vacuum_state_relaxation_large
double vacuum_state_relaxation_small
double gamma_minus_one_inverse
double gamma_minus_one_over_gamma_plus_one
MultiComponentVector< Number > precomputed