10#include <compile_time_options.h>
12#include <ryujin/interface/hyperbolic_system.h>
23#include <deal.II/base/memory_space.h>
24#include <deal.II/base/parameter_acceptor.h>
25#include <deal.II/base/tensor.h>
31 namespace ShallowWater
35 typename MemorySpace = dealii::MemorySpace::Host>
36 class HyperbolicSystemView;
74 typename Number = double,
75 typename MemorySpace = dealii::MemorySpace::Host>
87 typename MemorySpace = dealii::MemorySpace::Host>
101 template <
typename MemorySpace = dealii::MemorySpace::Host,
103 typename ScalarNumber>
107 const bool skip_constrained_dofs =
true)
const;
117 template <
int,
typename,
typename>
145 template <
int dim,
typename Number,
typename MemorySpace>
150 std::is_same_v<MemorySpace, dealii::MemorySpace::Host> ||
151 std::is_same_v<MemorySpace, dealii::MemorySpace::Default>,
152 "Unexpected memory space");
172 using state_type = dealii::Tensor<1, problem_dimension, Number>;
178 dealii::Tensor<1, problem_dimension, dealii::Tensor<1, dim, Number>>;
204 std::array<Number, n_initial_precomputed_values>;
206 template <
int n_comp>
235 hyperbolic_system.parameters_.template view<MemorySpace>())
292 DEAL_II_HOST_DEVICE Number
309 DEAL_II_HOST_DEVICE Number
324 static DEAL_II_HOST_DEVICE dealii::Tensor<1, dim, Number>
358 DEAL_II_HOST_DEVICE Number
386 template <
int component>
390 const dealii::Tensor<1, dim, Number> &normal)
const;
395 template <
typename Lambda>
399 const dealii::Tensor<1, dim, Number> &normal,
400 const Lambda &get_dirichlet_data)
const;
436 const Number &Z_left,
437 const Number &Z_right)
const;
444 DEAL_II_HOST_DEVICE std::array<state_type, 2>
472 const unsigned int i,
479 const unsigned int *js,
491 const dealii::Tensor<1, dim, Number> &c_ij)
const;
507 const dealii::Tensor<1, dim, Number> &c_ij)
const;
517 const dealii::Tensor<1, dim, Number> &c_ij,
518 const Number &d_ij)
const;
536 const Number &h_star,
541 const unsigned int i,
547 const unsigned int *js,
567 template <
typename ST>
581 template <
typename ST>
603 template <
typename Lambda>
605 const state_type &state,
const Lambda &lambda)
const;
629 "Shallow water equations",
630 {{{
"h",
"m"}, {
"h",
"m_1",
"m_2"}, {
"h",
"m_1",
"m_2",
"m_3"}}},
631 {{{
"h",
"v"}, {
"h",
"v_1",
"v_2"}, {
"h",
"v_1",
"v_2",
"v_3"}}},
632 {{{
"eta_m",
"h_star"}, {
"eta_m",
"h_star"}, {
"eta_m",
"h_star"}}},
633 {{{
"bathymetry"}, {
"bathymetry"}, {
"bathymetry"}}},
635 , parameters_(
"shallow_water_hyperbolic_system_parameters",
639 auto ¶meters = *parameters_.view();
641 parameters.gravity = 9.81;
643 "gravity", parameters.gravity,
"Gravitational constant [m/s^2]");
645 parameters.manning_friction_coefficient = 0.;
646 add_parameter(
"manning friction coefficient",
647 parameters.manning_friction_coefficient,
648 "Roughness coefficient for friction source");
650 parameters.reference_water_depth = 1.;
651 add_parameter(
"reference water depth",
652 parameters.reference_water_depth,
653 "Problem specific water depth reference");
655 parameters.dry_state_relaxation_small = 1.e2;
656 add_parameter(
"dry state relaxation small",
657 parameters.dry_state_relaxation_small,
658 "Problem specific dry-state relaxation parameter");
660 parameters.dry_state_relaxation_large = 1.e4;
661 add_parameter(
"dry state relaxation large",
662 parameters.dry_state_relaxation_large,
663 "Problem specific dry-state relaxation parameter");
666 ParameterAcceptor::parse_parameters_call_back.connect(
667 [
this] { parameters_.view(); });
671 template <
typename MemorySpace,
int dim,
typename ScalarNumber>
675 const bool skip_constrained_dofs)
const
682 const auto sparsity_simd_view =
686 std::as_const(state_vector)
687 .U.template view<ScalarView::problem_dimension, MemorySpace>();
688 const auto precomputed_view =
690 .template view<ScalarView::n_precomputed_values, MemorySpace>();
692 const auto hyperbolic_system_views =
693 make_select_view<dim, ScalarNumber, MemorySpace>(*
this);
695 const auto body = [=](
auto sentinel,
unsigned int i) {
696 using T =
decltype(sentinel);
700 const unsigned int row_length = sparsity_simd_view.row_length(i);
701 if (skip_constrained_dofs && row_length == 1)
704 const auto view = hyperbolic_system_views.template view<T>();
706 const auto U_i = U_view.template read_tensor<T>(i);
707 const auto eta_m =
view.mathematical_entropy(U_i);
708 const auto h_sharp =
view.water_depth_sharp(U_i);
709 const auto h_star =
ryujin::pow(h_sharp, ScalarNumber(4. / 3.));
711 const precomputed_type prec_i{eta_m, h_star};
712 precomputed_view.template write_tensor<T>(prec_i, i);
715 loop<MemorySpace, ScalarNumber>(
716 "hyperbolic_kernel_01b", body, 0, n_internal, n_owned);
720 template <
int dim,
typename Number,
typename MemorySpace>
721 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
729 template <
int dim,
typename Number,
typename MemorySpace>
730 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
734 constexpr ScalarNumber eps = std::numeric_limits<ScalarNumber>::epsilon();
736 const Number h_cutoff_mollified =
737 reference_water_depth() * dry_state_relaxation_large() * Number(eps);
739 const Number h = water_depth(U);
741 const Number h_max = std::max(h, h_cutoff_mollified);
742 const Number denom = h * h + h_max * h_max;
747 template <
int dim,
typename Number,
typename MemorySpace>
748 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
752 constexpr ScalarNumber eps = std::numeric_limits<ScalarNumber>::epsilon();
754 const Number h_cutoff_small =
755 reference_water_depth() * dry_state_relaxation_small() * Number(eps);
757 const Number h = water_depth(U);
758 const Number h_max = std::max(h, h_cutoff_small);
763 template <
int dim,
typename Number,
typename MemorySpace>
764 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
772 template <
int dim,
typename Number,
typename MemorySpace>
773 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
775 const Number &h)
const
778 constexpr ScalarNumber eps = std::numeric_limits<ScalarNumber>::epsilon();
780 const Number h_cutoff_large =
781 reference_water_depth() * dry_state_relaxation_large() * Number(eps);
783 return ryujin::compare_and_apply_mask<dealii::SIMDComparison::less_than>(
784 std::abs(h), h_cutoff_large, Number(0.), h);
788 template <
int dim,
typename Number,
typename MemorySpace>
789 DEAL_II_HOST_DEVICE_ALWAYS_INLINE dealii::Tensor<1, dim, Number>
793 dealii::Tensor<1, dim, Number> result;
795 for (
unsigned int i = 0; i < dim; ++i)
796 result[i] = U[1 + i];
801 template <
int dim,
typename Number,
typename MemorySpace>
802 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
806 const auto h = water_depth(U);
807 const auto vel = momentum(U) * inverse_water_depth_sharp(U);
814 template <
int dim,
typename Number,
typename MemorySpace>
815 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
819 const Number h_sqd = U[0] * U[0];
826 template <
int dim,
typename Number,
typename MemorySpace>
827 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
832 return std::sqrt(gravity() * U[0]);
836 template <
int dim,
typename Number,
typename MemorySpace>
837 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
841 const auto p = pressure(U);
842 const auto k_e = kinetic_energy(U);
847 template <
int dim,
typename Number,
typename MemorySpace>
848 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
865 const Number &h = U[0];
866 const auto vel = momentum(U) * inverse_water_depth_sharp(U);
869 result[0] = gravity() * h -
ScalarNumber(0.5) * vel.norm_square();
872 for (
unsigned int i = 0; i < dim; ++i) {
873 result[1 + i] = vel[i];
880 template <
int dim,
typename Number,
typename MemorySpace>
881 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
bool
885 const auto h = filter_dry_water_depth(water_depth(U));
887 constexpr auto gte = dealii::SIMDComparison::greater_than_or_equal;
888 const auto test = ryujin::compare_and_apply_mask<gte>(
889 h, Number(0.), Number(0.), Number(-1.));
892 if (!(test == Number(0.))) {
893 std::cout << std::fixed << std::setprecision(16);
894 std::cout <<
"Bounds violation: Negative state [h] detected!\n";
895 std::cout <<
"\t\th: " << h <<
"\n" << std::endl;
900 return (test == Number(0.));
904 template <
int dim,
typename Number,
typename MemorySpace>
905 template <
int component>
906 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
911 const dealii::Tensor<1, dim, Number> &normal)
const ->
state_type
914 static_assert(component == 1 || component == 2,
915 "component has to be 1 or 2");
919 const auto m = momentum(U);
920 const auto a = speed_of_sound(U);
921 const auto vn = m * normal * inverse_water_depth_sharp(U);
923 const auto m_bar = momentum(U_bar);
924 const auto a_bar = speed_of_sound(U_bar);
925 const auto vn_bar = m_bar * normal * inverse_water_depth_sharp(U_bar);
929 const auto R_1 = component == 1 ? vn_bar -
ScalarNumber(2.) * a_bar
934 const auto R_2 = component == 2 ? vn_bar +
ScalarNumber(2.) * a_bar
937 const auto vperp = m * inverse_water_depth_sharp(U) - vn * normal;
942 ryujin::fixed_power<2>((R_2 - R_1) /
ScalarNumber(4.)) / gravity();
946 for (
unsigned int d = 0; d < dim; ++d) {
947 U_new[1 + d] = h_new * (vn_new * normal + vperp)[d];
954 template <
int dim,
typename Number,
typename MemorySpace>
955 template <
typename Lambda>
956 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
958 const dealii::types::boundary_id
id,
960 const dealii::Tensor<1, dim, Number> &normal,
961 const Lambda &get_dirichlet_data)
const ->
state_type
966 result = get_dirichlet_data();
970 auto m_dirichlet = momentum(get_dirichlet_data());
971 for (
unsigned int k = 0; k < dim; ++k)
972 result[k + 1] = m_dirichlet[k];
976 const auto U_dirichlet = get_dirichlet_data();
977 const auto h_inv_sharp_dirichlet =
978 inverse_water_depth_sharp(U_dirichlet);
979 const auto v_dirichlet = momentum(U_dirichlet) * h_inv_sharp_dirichlet;
980 const auto h = water_depth_sharp(result);
981 for (
unsigned int k = 0; k < dim; ++k)
982 result[k + 1] = h * v_dirichlet[k];
985 auto m = momentum(U);
986 m -= 1. * (m * normal) * normal;
987 for (
unsigned int k = 0; k < dim; ++k)
988 result[k + 1] = m[k];
991 for (
unsigned int k = 0; k < dim; ++k)
992 result[k + 1] = Number(0.);
1007 const auto m = momentum(U);
1008 const auto h_inverse = inverse_water_depth_sharp(U);
1009 const auto a = speed_of_sound(U);
1010 const auto vn = m * normal * h_inverse;
1014 result = get_dirichlet_data();
1018 if (vn >= -a && vn <= 0.) {
1019 const auto U_dirichlet = get_dirichlet_data();
1020 result = prescribe_riemann_characteristic<2>(U_dirichlet, U, normal);
1024 if (vn > 0. && vn <= a) {
1025 const auto U_dirichlet = get_dirichlet_data();
1026 result = prescribe_riemann_characteristic<1>(U, U_dirichlet, normal);
1032 Assert(
false, dealii::ExcNotImplemented());
1039 template <
int dim,
typename Number,
typename MemorySpace>
1040 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1044 const auto h_inverse = inverse_water_depth_sharp(U);
1045 const auto m = momentum(U);
1046 const auto p = pressure(U);
1050 result[0] = (m * h_inverse) * U[0];
1051 for (
unsigned int i = 0; i < dim; ++i) {
1052 result[1 + i] = (m * h_inverse) * m[i];
1053 result[1 + i][i] += p;
1059 template <
int dim,
typename Number,
typename MemorySpace>
1060 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1064 const auto h_inverse = inverse_water_depth_sharp(U);
1065 const auto m = momentum(U);
1069 result[0] = (m * h_inverse) * U[0];
1070 for (
unsigned int i = 0; i < dim; ++i) {
1071 result[1 + i] = (m * h_inverse) * m[i];
1077 template <
int dim,
typename Number,
typename MemorySpace>
1078 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1080 const state_type &U,
const Number &Z_left,
const Number &Z_right)
const
1083 const Number Z_max = std::max(Z_left, Z_right);
1084 const Number h = water_depth(U);
1085 const Number H_star = std::max(Number(0.), h + Z_left - Z_max);
1087 return U * H_star * inverse_water_depth_mollified(U);
1091 template <
int dim,
typename Number,
typename MemorySpace>
1092 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1097 const auto &[U_i, Z_i] = flux_i;
1098 const auto &[U_j, Z_j] = flux_j;
1100 const auto U_star_ij = star_state(U_i, Z_i, Z_j);
1101 const auto U_star_ji = star_state(U_j, Z_j, Z_i);
1103 return {U_star_ij, U_star_ji};
1107 template <
int dim,
typename Number,
typename MemorySpace>
1108 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1112 const unsigned int i,
1115 const auto Z_i = piv.template read_tensor<Number>(i)[0];
1120 template <
int dim,
typename Number,
typename MemorySpace>
1121 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1125 const unsigned int *js,
1128 const auto Z_j = piv.template read_tensor<Number>(js)[0];
1133 template <
int dim,
typename Number,
typename MemorySpace>
1134 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1138 const dealii::Tensor<1, dim, Number> &c_ij)
const ->
state_type
1140 const auto &[U_i, Z_i] = flux_i;
1141 const auto &[U_star_ij, U_star_ji] = equilibrated_states(flux_i, flux_j);
1143 const auto H_i = water_depth(U_i);
1144 const auto H_star_ij = water_depth(U_star_ij);
1145 const auto H_star_ji = water_depth(U_star_ji);
1147 const auto g_i = g(U_star_ij);
1148 const auto g_j = g(U_star_ji);
1150 auto result = -
add(g_i, g_j);
1153 (
ScalarNumber(0.5) * (H_star_ji * H_star_ji - H_star_ij * H_star_ij) +
1157 for (
unsigned int i = 0; i < dim; ++i) {
1158 result[1 + i][i] -= factor;
1165 template <
int dim,
typename Number,
typename MemorySpace>
1166 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1170 const dealii::Tensor<1, dim, Number> &c_ij)
const ->
state_type
1172 const auto &[U_i, Z_i] = flux_i;
1173 const auto &[U_j, Z_j] = flux_j;
1175 const auto H_i = water_depth(U_i);
1176 const auto H_j = water_depth(U_j);
1178 const auto g_i = g(U_i);
1179 const auto g_j = g(U_j);
1181 auto result = -
add(g_i, g_j);
1183 const auto factor = gravity() * H_i * (H_j + Z_j - Z_i);
1184 for (
unsigned int i = 0; i < dim; ++i) {
1185 result[1 + i][i] -= factor;
1192 template <
int dim,
typename Number,
typename MemorySpace>
1193 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1197 const dealii::Tensor<1, dim, Number> &c_ij,
1200 const auto &[U_i, Z_i] = flux_i;
1201 const auto &[U_j, Z_j] = flux_j;
1202 const auto U_star_ij = star_state(U_i, Z_i, Z_j);
1204 const auto h_inverse = inverse_water_depth_sharp(U_i);
1205 const auto m = momentum(U_i);
1206 const auto factor =
ScalarNumber(2.) * (d_ij + h_inverse * (m * c_ij));
1208 return -factor * (U_star_ij - U_i);
1212 template <
int dim,
typename Number,
typename MemorySpace>
1213 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1220 const auto g = gravity();
1221 const auto n = manning_friction_coefficient();
1223 const auto h_inverse = inverse_water_depth_mollified(U);
1225 const auto m = momentum(U);
1226 const auto v_norm = (m * h_inverse).norm();
1227 const auto factor =
ScalarNumber(2.) * g * n * n * v_norm;
1229 const auto denominator = h_star + std::max(h_star, tau * factor);
1230 const auto denominator_inverse =
ScalarNumber(1.) / denominator;
1232 for (
unsigned int d = 0; d < dim; ++d)
1233 result[d + 1] = -factor * denominator_inverse * m[d];
1239 template <
int dim,
typename Number,
typename MemorySpace>
1240 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1243 const unsigned int i,
1247 const auto &[eta_m, h_star] =
1248 pv.template read_tensor<Number, precomputed_type>(i);
1250 return manning_friction(U_i, h_star, tau);
1254 template <
int dim,
typename Number,
typename MemorySpace>
1255 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1258 const unsigned int *js,
1262 const auto &[eta_m, h_star] =
1263 pv.template read_tensor<Number, precomputed_type>(js);
1265 return manning_friction(U_j, h_star, tau);
1269 template <
int dim,
typename Number,
typename MemorySpace>
1270 template <
typename ST>
1271 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1275 using T =
typename ST::value_type;
1276 static_assert(std::is_same_v<Number, T>,
"template mismatch");
1278 constexpr auto dim2 = ST::dimension - 1;
1279 static_assert(dim >= dim2,
1280 "the space dimension of the argument state must not be "
1281 "larger than the one of the target state");
1284 result[0] = state[0];
1285 for (
unsigned int i = 1; i < dim2 + 1; ++i)
1286 result[i] = state[i];
1291 template <
int dim,
typename Number,
typename MemorySpace>
1292 template <
typename ST>
1293 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1297 const auto primitive_state = expand_state(initial_state);
1298 return from_primitive_state(primitive_state);
1302 template <
int dim,
typename Number,
typename MemorySpace>
1303 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1307 const auto &h = primitive_state[0];
1309 auto state = primitive_state;
1311 for (
unsigned int i = 1; i < dim + 1; ++i)
1318 template <
int dim,
typename Number,
typename MemorySpace>
1319 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1323 const auto h_inverse = inverse_water_depth_sharp(state);
1325 auto primitive_state = state;
1327 for (
unsigned int i = 1; i < dim + 1; ++i)
1328 primitive_state[i] *= h_inverse;
1330 return primitive_state;
1334 template <
int dim,
typename Number,
typename MemorySpace>
1335 template <
typename Lambda>
1336 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1340 auto result = state;
1341 auto M = lambda(momentum(state));
1342 for (
unsigned int d = 0; d < dim; ++d)
1343 result[1 + d] = M[d];
dealii::Tensor< 1, problem_dimension, Number > state_type
typename get_value_type< Number >::type ScalarNumber
const auto & n_locally_owned() const
const auto & sparsity_pattern_simd() const
const auto & n_locally_internal() const
static constexpr unsigned int problem_dimension
DEAL_II_HOST_DEVICE state_type to_primitive_state(const state_type &state) const
DEAL_II_HOST_DEVICE Number filter_dry_water_depth(const Number &h) 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 Number pressure(const state_type &U) const
typename get_value_type< Number >::type ScalarNumber
DEAL_II_HOST_DEVICE Number inverse_water_depth_mollified(const state_type &U) const
std::tuple< state_type, Number > flux_contribution_type
dealii::Tensor< 1, problem_dimension, Number > state_type
DEAL_II_HOST_DEVICE Number kinetic_energy(const state_type &U) const
DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber dry_state_relaxation_large() const
DEAL_II_HOST_DEVICE state_type apply_galilei_transform(const state_type &state, const Lambda &lambda) const
DEAL_II_HOST_DEVICE state_type star_state(const state_type &U, const Number &Z_left, const Number &Z_right) const
DEAL_II_HOST_DEVICE flux_type g(const state_type &U) const
static constexpr bool have_source_terms
DEAL_II_HOST_DEVICE state_type manning_friction(const state_type &U, const Number &h_star, const ScalarNumber tau) 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 mathematical_entropy_derivative(const state_type &U) const
DEAL_II_HOST_DEVICE flux_contribution_type flux_contribution(const PrecomputedVectorView &pv, const InitialPrecomputedVectorView &piv, const unsigned int i, const state_type &U_i) 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 Number mathematical_entropy(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
DEAL_II_HOST_DEVICE std::array< state_type, 2 > equilibrated_states(const flux_contribution_type &, const flux_contribution_type &) const
static DEAL_II_HOST_DEVICE dealii::Tensor< 1, dim, Number > momentum(const state_type &U)
DEAL_II_HOST_DEVICE Number water_depth_sharp(const state_type &U) const
dealii::Tensor< 1, problem_dimension, dealii::Tensor< 1, dim, Number > > flux_type
static constexpr bool have_high_order_flux
DEAL_II_HOST_DEVICE state_type from_primitive_state(const state_type &primitive_state) const
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
DEAL_II_HOST_DEVICE state_type affine_shift(const flux_contribution_type &flux_i, const flux_contribution_type &flux_j, const dealii::Tensor< 1, dim, Number > &c_ij, const Number &d_ij) const
DEAL_II_HOST_DEVICE Number inverse_water_depth_sharp(const state_type &U) const
DEAL_II_HOST_DEVICE bool is_admissible(const state_type &U) const
DEAL_II_HOST_DEVICE Number speed_of_sound(const state_type &U) const
static constexpr unsigned int n_initial_precomputed_values
std::array< Number, n_initial_precomputed_values > initial_precomputed_type
DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber gravity() const
DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber dry_state_relaxation_small() const
DEAL_II_HOST_DEVICE flux_type f(const state_type &U) const
std::array< Number, n_precomputed_values > precomputed_type
DEAL_II_HOST_DEVICE state_type from_initial_state(const ST &initial_state) const
DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber manning_friction_coefficient() const
HyperbolicSystemView(const HyperbolicSystem &hyperbolic_system)
static constexpr unsigned int n_precomputed_values
DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber reference_water_depth() const
DEAL_II_HOST_DEVICE state_type expand_state(const ST &state) const
static DEAL_II_HOST_DEVICE Number water_depth(const state_type &U)
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_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)
DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number positive_part(const Number number)
double dry_state_relaxation_large
double reference_water_depth
double dry_state_relaxation_small
double manning_friction_coefficient
MultiComponentVector< Number > precomputed