8#include <compile_time_options.h>
10#include <ryujin/interface/hyperbolic_system.h>
21#include <deal.II/base/memory_space.h>
22#include <deal.II/base/parameter_acceptor.h>
23#include <deal.II/base/tensor.h>
33 typename MemorySpace = dealii::MemorySpace::Host>
34 class HyperbolicSystemView;
96 typename Number = double,
97 typename MemorySpace = dealii::MemorySpace::Host>
109 typename MemorySpace = dealii::MemorySpace::Host>
123 template <
typename MemorySpace = dealii::MemorySpace::Host,
125 typename ScalarNumber>
129 const bool skip_constrained_dofs =
true)
const;
141 void update_parameters();
145 template <
int,
typename,
typename>
173 template <
int dim,
typename Number,
typename MemorySpace>
178 std::is_same_v<MemorySpace, dealii::MemorySpace::Host> ||
179 std::is_same_v<MemorySpace, dealii::MemorySpace::Default>,
180 "Unexpected memory space");
200 using state_type = dealii::Tensor<1, problem_dimension, Number>;
206 dealii::Tensor<1, problem_dimension, dealii::Tensor<1, dim, Number>>;
232 std::array<Number, n_initial_precomputed_values>;
234 template <
int n_comp>
263 hyperbolic_system.parameters_.template view<MemorySpace>())
362 static DEAL_II_HOST_DEVICE dealii::Tensor<1, dim, Number>
438 DEAL_II_HOST_DEVICE Number
467 template <
int component>
470 const dealii::Tensor<1, dim, Number> &normal)
const;
478 template <
int component>
482 const dealii::Tensor<1, dim, Number> &normal)
const;
502 template <
typename Lambda>
506 const dealii::Tensor<1, dim, Number> &normal,
507 const Lambda &get_dirichlet_data)
const;
550 const unsigned int i,
557 const unsigned int *js,
568 const dealii::Tensor<1, dim, Number> &c_ij)
const;
577 const dealii::Tensor<1, dim, Number> &c_ij)
const =
delete;
590 const unsigned int i,
596 const unsigned int *js,
616 template <
typename ST>
632 template <
typename ST>
655 template <
typename Lambda>
657 const state_type &state,
const Lambda &lambda)
const;
680 "Compressible Euler equations (polytropic gas EOS, optimized)",
682 {
"rho",
"m_1",
"m_2",
"E"},
683 {
"rho",
"m_1",
"m_2",
"m_3",
"E"}}},
685 {
"rho",
"v_1",
"v_2",
"p"},
686 {
"rho",
"v_1",
"v_2",
"v_3",
"p"}}},
687 {{{
"s",
"eta_h"}, {
"s",
"eta_h"}, {
"s",
"eta_h"}}},
690 , parameters_(
"euler_hyperbolic_system_parameters",
694 auto ¶meters = *parameters_.view();
696 parameters.gamma = 7. / 5.;
697 add_parameter(
"gamma", parameters.gamma,
"The ratio of specific heats");
699 parameters.reference_density = 1.;
700 add_parameter(
"reference density",
701 parameters.reference_density,
702 "Problem specific density reference");
704 parameters.vacuum_state_relaxation_small = 1.e2;
705 add_parameter(
"vacuum state relaxation small",
706 parameters.vacuum_state_relaxation_small,
707 "Problem specific vacuum relaxation parameter");
709 parameters.vacuum_state_relaxation_large = 1.e4;
710 add_parameter(
"vacuum state relaxation large",
711 parameters.vacuum_state_relaxation_large,
712 "Problem specific vacuum relaxation parameter");
714 ParameterAcceptor::parse_parameters_call_back.connect(
715 [
this] { update_parameters(); });
721 inline void HyperbolicSystem::update_parameters()
723 auto ¶meters = *parameters_.view();
729 const auto gamma = parameters.gamma;
730 parameters.gamma_inverse = 1. / gamma;
731 parameters.gamma_plus_one_inverse = 1. / (gamma + 1.);
732 parameters.gamma_minus_one_inverse = 1. / (gamma - 1.);
733 parameters.gamma_minus_one_over_gamma_plus_one =
734 (gamma - 1.) / (gamma + 1.);
738 template <
typename MemorySpace,
int dim,
typename ScalarNumber>
742 const bool skip_constrained_dofs)
const
749 const auto sparsity_simd_view =
754 std::as_const(state_vector)
755 .U.template view<ScalarView::problem_dimension, MemorySpace>();
756 const auto precomputed_view =
758 .template view<ScalarView::n_precomputed_values, MemorySpace>();
760 const auto hyperbolic_system_views =
761 make_select_view<dim, ScalarNumber, MemorySpace>(*
this);
763 const auto body = [=](
auto sentinel,
unsigned int i) {
764 using T =
decltype(sentinel);
768 const unsigned int row_length = sparsity_simd_view.row_length(i);
769 if (skip_constrained_dofs && row_length == 1)
772 const auto view = hyperbolic_system_views.template view<T>();
774 const auto U_i = U_view.template read_tensor<T>(i);
775 const precomputed_type prec_i{
view.specific_entropy(U_i),
776 view.harten_entropy(U_i)};
777 precomputed_view.template write_tensor<T>(prec_i, i);
780 loop<MemorySpace, ScalarNumber>(
781 "hyperbolic_kernel_01b", body, 0, n_internal, n_owned);
785 template <
int dim,
typename Number,
typename MemorySpace>
786 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
793 template <
int dim,
typename Number,
typename MemorySpace>
794 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
796 const Number &rho)
const
798 constexpr ScalarNumber eps = std::numeric_limits<ScalarNumber>::epsilon();
799 const Number rho_cutoff_large =
800 reference_density() * vacuum_state_relaxation_large() * eps;
802 return ryujin::compare_and_apply_mask<dealii::SIMDComparison::less_than>(
803 std::abs(rho), rho_cutoff_large, Number(0.), rho);
807 template <
int dim,
typename Number,
typename MemorySpace>
808 DEAL_II_HOST_DEVICE_ALWAYS_INLINE dealii::Tensor<1, dim, Number>
812 dealii::Tensor<1, dim, Number> result;
813 for (
unsigned int i = 0; i < dim; ++i)
814 result[i] = U[1 + i];
819 template <
int dim,
typename Number,
typename MemorySpace>
820 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
828 template <
int dim,
typename Number,
typename MemorySpace>
829 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
836 const Number rho_inverse =
ScalarNumber(1.) / density(U);
837 const auto m = momentum(U);
838 const Number E = total_energy(U);
839 return E -
ScalarNumber(0.5) * m.norm_square() * rho_inverse;
843 template <
int dim,
typename Number,
typename MemorySpace>
844 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
855 const Number rho_inverse =
ScalarNumber(1.) / density(U);
856 const auto u = momentum(U) * rho_inverse;
861 for (
unsigned int i = 0; i < dim; ++i) {
862 result[1 + i] = -u[i];
870 template <
int dim,
typename Number,
typename MemorySpace>
871 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
876 return (gamma() -
ScalarNumber(1.)) * internal_energy(U);
880 template <
int dim,
typename Number,
typename MemorySpace>
881 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
886 const Number rho_inverse =
ScalarNumber(1.) / density(U);
887 const Number p = pressure(U);
888 return std::sqrt(gamma() * p * rho_inverse);
892 template <
int dim,
typename Number,
typename MemorySpace>
893 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
899 return internal_energy(U) *
ryujin::pow(rho_inverse, gamma());
903 template <
int dim,
typename Number,
typename MemorySpace>
904 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
910 const Number rho = density(U);
911 const auto m = momentum(U);
912 const Number E = total_energy(U);
914 const Number rho_rho_e = rho * E -
ScalarNumber(0.5) * m.norm_square();
915 return ryujin::pow(rho_rho_e, gamma_plus_one_inverse());
919 template <
int dim,
typename Number,
typename MemorySpace>
920 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
935 const Number rho = density(U);
936 const auto m = momentum(U);
937 const Number E = total_energy(U);
939 const Number rho_rho_e = rho * E -
ScalarNumber(0.5) * m.norm_square();
942 gamma_plus_one_inverse() *
943 ryujin::pow(rho_rho_e, -gamma() * gamma_plus_one_inverse());
947 result[0] = factor * E;
948 for (
unsigned int i = 0; i < dim; ++i)
949 result[1 + i] = -factor * m[i];
950 result[dim + 1] = factor * rho;
956 template <
int dim,
typename Number,
typename MemorySpace>
957 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
962 const auto p = pressure(U);
967 template <
int dim,
typename Number,
typename MemorySpace>
968 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
984 const Number rho = density(U);
986 const auto u = momentum(U) * rho_inverse;
987 const auto p = pressure(U);
989 const auto factor = (gamma() -
ScalarNumber(1.0)) * gamma_inverse() *
994 result[0] = factor *
ScalarNumber(0.5) * u.norm_square();
995 result[dim + 1] = factor;
996 for (
unsigned int i = 0; i < dim; ++i) {
997 result[1 + i] = -factor * u[i];
1004 template <
int dim,
typename Number,
typename MemorySpace>
1005 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
bool
1009 const auto rho_new = density(U);
1010 const auto e_new = internal_energy(U);
1011 const auto s_new = specific_entropy(U);
1013 constexpr auto gt = dealii::SIMDComparison::greater_than;
1016 ryujin::compare_and_apply_mask<gt>(rho_new, T(0.), T(0.), T(-1.)) +
1017 ryujin::compare_and_apply_mask<gt>(e_new, T(0.), T(0.), T(-1.)) +
1018 ryujin::compare_and_apply_mask<gt>(s_new, T(0.), T(0.), T(-1.));
1021 if (!(test == Number(0.))) {
1022 std::cout << std::fixed << std::setprecision(16);
1023 std::cout <<
"Bounds violation: Negative state [rho, e, s] detected!\n";
1024 std::cout <<
"\t\trho: " << rho_new <<
"\n";
1025 std::cout <<
"\t\tint: " << e_new <<
"\n";
1026 std::cout <<
"\t\tent: " << s_new <<
"\n" << std::endl;
1030 return (test == Number(0.));
1034 template <
int dim,
typename Number,
typename MemorySpace>
1035 template <
int component>
1036 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1038 const state_type &U,
const dealii::Tensor<1, dim, Number> &normal)
const
1039 -> std::array<state_type, 2>
1041 static_assert(component == 1 || component == problem_dimension,
1042 "Only first and last eigenvectors implemented");
1044 const auto rho = density(U);
1045 const auto m = momentum(U);
1046 const auto v = m / rho;
1047 const auto a = speed_of_sound(U);
1048 const auto gamma = this->gamma();
1053 const auto e_k = 0.5 * v.norm_square();
1055 switch (component) {
1057 b[0] = (gamma - 1.) * e_k + a * v * normal;
1058 for (
unsigned int i = 0; i < dim; ++i)
1059 b[1 + i] = (1. - gamma) * v[i] - a * normal[i];
1060 b[dim + 1] = gamma - 1.;
1064 for (
unsigned int i = 0; i < dim; ++i)
1065 c[1 + i] = v[i] - a * normal[i];
1066 c[dim + 1] = a * a / (gamma - 1) + e_k - a * (v * normal);
1070 case problem_dimension:
1071 b[0] = (gamma - 1.) * e_k - a * v * normal;
1072 for (
unsigned int i = 0; i < dim; ++i)
1073 b[1 + i] = (1. - gamma) * v[i] + a * normal[i];
1074 b[dim + 1] = gamma - 1.;
1078 for (
unsigned int i = 0; i < dim; ++i)
1079 c[1 + i] = v[i] + a * normal[i];
1080 c[dim + 1] = a * a / (gamma - 1) + e_k + a * (v * normal);
1085 __builtin_unreachable();
1089 template <
int dim,
typename Number,
typename MemorySpace>
1090 template <
int component>
1091 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1096 const dealii::Tensor<1, dim, Number> &normal)
const ->
state_type
1098 static_assert(component == 1 || component == 2,
1099 "component has to be 1 or 2");
1101 const auto m = momentum(U);
1102 const auto rho = density(U);
1103 const auto a = speed_of_sound(U);
1104 const auto vn = m * normal / rho;
1106 const auto m_bar = momentum(U_bar);
1107 const auto rho_bar = density(U_bar);
1108 const auto a_bar = speed_of_sound(U_bar);
1109 const auto vn_bar = m_bar * normal / rho_bar;
1113 const auto R_1 = component == 1
1119 const auto R_2 = component == 2
1123 const auto p = pressure(U);
1126 const auto vperp = m / rho - vn * normal;
1128 const auto vn_new = 0.5 * (R_1 + R_2);
1130 auto rho_new = 1. / (gamma() * s) *
1131 ryujin::fixed_power<2>(
ScalarNumber((gamma() - 1.) / 4.) *
1133 rho_new =
ryujin::pow(rho_new, 1. / (gamma() - 1.));
1135 const auto p_new = s * std::pow(rho_new, gamma());
1139 for (
unsigned int d = 0; d < dim; ++d) {
1140 U_new[1 + d] = rho_new * (vn_new * normal + vperp)[d];
1143 0.5 * rho_new * (vn_new * vn_new + vperp.norm_square());
1149 template <
int dim,
typename Number,
typename MemorySpace>
1150 template <
typename Lambda>
1151 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1153 dealii::types::boundary_id
id,
1155 const dealii::Tensor<1, dim, Number> &normal,
1156 const Lambda &get_dirichlet_data)
const ->
state_type
1161 result = get_dirichlet_data();
1168 const auto m_dirichlet = momentum(get_dirichlet_data());
1169 const auto rho = density(result);
1170 const auto m = momentum(result);
1172 for (
unsigned int k = 0; k < dim; ++k)
1173 result[k + 1] = m_dirichlet[k];
1175 Number(0.5) / rho * (m_dirichlet.norm_square() - m.norm_square());
1182 const auto U_dirichlet = get_dirichlet_data();
1183 const auto rho_dirichlet = density(U_dirichlet);
1184 const auto v_dirichlet = momentum(U_dirichlet) / rho_dirichlet;
1185 const auto rho = density(result);
1186 const auto v = momentum(result) / rho;
1188 for (
unsigned int k = 0; k < dim; ++k)
1189 result[k + 1] = rho * v_dirichlet[k];
1191 Number(0.5) * rho * (v_dirichlet.norm_square() - v.norm_square());
1194 auto m = momentum(U);
1195 m -= 1. * (m * normal) * normal;
1196 for (
unsigned int k = 0; k < dim; ++k)
1197 result[k + 1] = m[k];
1200 for (
unsigned int k = 0; k < dim; ++k)
1201 result[k + 1] = Number(0.);
1216 const auto m = momentum(U);
1217 const auto rho = density(U);
1218 const auto a = speed_of_sound(U);
1219 const auto vn = m * normal / rho;
1223 result = get_dirichlet_data();
1227 if (vn >= -a && vn <= 0.) {
1228 const auto U_dirichlet = get_dirichlet_data();
1229 result = prescribe_riemann_characteristic<2>(U_dirichlet, U, normal);
1233 if (vn > 0. && vn <= a) {
1234 const auto U_dirichlet = get_dirichlet_data();
1235 result = prescribe_riemann_characteristic<1>(U, U_dirichlet, normal);
1241 Assert(
false, dealii::ExcNotImplemented());
1248 template <
int dim,
typename Number,
typename MemorySpace>
1249 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1253 const auto rho_inverse =
ScalarNumber(1.) / density(U);
1254 const auto m = momentum(U);
1255 const auto p = pressure(U);
1256 const auto E = total_energy(U);
1261 for (
unsigned int i = 0; i < dim; ++i) {
1262 result[1 + i] = m * (m[i] * rho_inverse);
1263 result[1 + i][i] += p;
1265 result[dim + 1] = m * (rho_inverse * (E + p));
1271 template <
int dim,
typename Number,
typename MemorySpace>
1272 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1276 const unsigned int ,
1283 template <
int dim,
typename Number,
typename MemorySpace>
1284 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1288 const unsigned int * ,
1295 template <
int dim,
typename Number,
typename MemorySpace>
1296 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1300 const dealii::Tensor<1, dim, Number> &c_ij)
const ->
state_type
1306 template <
int dim,
typename Number,
typename MemorySpace>
1307 template <
typename ST>
1308 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1312 using T =
typename ST::value_type;
1313 static_assert(std::is_same_v<Number, T>,
"template mismatch");
1315 constexpr auto dim2 = ST::dimension - 2;
1316 static_assert(dim >= dim2,
1317 "the space dimension of the argument state must not be "
1318 "larger than the one of the target state");
1321 result[0] = state[0];
1322 result[dim + 1] = state[dim2 + 1];
1323 for (
unsigned int i = 1; i < dim2 + 1; ++i)
1324 result[i] = state[i];
1330 template <
int dim,
typename Number,
typename MemorySpace>
1331 template <
typename ST>
1332 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1336 const auto primitive_state = expand_state(initial_state);
1337 return from_primitive_state(primitive_state);
1341 template <
int dim,
typename Number,
typename MemorySpace>
1342 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1346 const auto &rho = primitive_state[0];
1348 const auto u = momentum(primitive_state);
1349 const auto &p = primitive_state[dim + 1];
1351 auto state = primitive_state;
1353 for (
unsigned int i = 1; i < dim + 1; ++i)
1357 p / (
ScalarNumber(gamma() - 1.)) + Number(0.5) * rho * u * u;
1363 template <
int dim,
typename Number,
typename MemorySpace>
1364 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1368 const auto &rho = state[0];
1369 const auto rho_inverse = Number(1.) / rho;
1370 const auto p = pressure(state);
1372 auto primitive_state = state;
1374 for (
unsigned int i = 1; i < dim + 1; ++i)
1375 primitive_state[i] *= rho_inverse;
1377 primitive_state[dim + 1] = p;
1379 return primitive_state;
1383 template <
int dim,
typename Number,
typename MemorySpace>
1384 template <
typename Lambda>
1385 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1389 auto result = state;
1390 const auto M = lambda(momentum(state));
1391 for (
unsigned int d = 0; d < dim; ++d)
1392 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
const auto & n_locally_owned() const
const auto & sparsity_pattern_simd() const
const auto & n_locally_internal() const
@ implicit_transfers_host_resident
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)
DEAL_II_HOST_DEVICE T pow(const T x, const T b)
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