10#include <ryujin/base/compile_time_options.h>
21#include <deal.II/base/memory_space.h>
22#include <deal.II/base/parameter_acceptor.h>
23#include <deal.II/base/tensor.h>
29 namespace ShallowWater
33 typename MemorySpace = dealii::MemorySpace::Host>
34 class HyperbolicSystemView;
72 typename Number = double,
73 typename MemorySpace = dealii::MemorySpace::Host>
85 typename MemorySpace = dealii::MemorySpace::Host>
99 template <
typename MemorySpace = dealii::MemorySpace::Host,
101 typename ScalarNumber>
105 const bool skip_constrained_dofs =
true)
const;
115 template <
int,
typename,
typename>
143 template <
int dim,
typename Number,
typename MemorySpace>
148 std::is_same_v<MemorySpace, dealii::MemorySpace::Host> ||
149 std::is_same_v<MemorySpace, dealii::MemorySpace::Default>,
150 "Unexpected memory space");
170 using state_type = dealii::Tensor<1, problem_dimension, Number>;
176 dealii::Tensor<1, problem_dimension, dealii::Tensor<1, dim, Number>>;
183 std::tuple<state_type, Number, 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;
438 const dealii::Tensor<1, dim, Number> &V,
439 const Number &Z_left,
440 const Number &Z_right)
const;
447 DEAL_II_HOST_DEVICE std::array<state_type, 2>
475 const unsigned int i,
482 const unsigned int *js,
494 const dealii::Tensor<1, dim, Number> &c_ij)
const;
510 const dealii::Tensor<1, dim, Number> &c_ij)
const;
520 const dealii::Tensor<1, dim, Number> &c_ij,
521 const Number &d_ij)
const;
536 DEAL_II_HOST_DEVICE Number
546 const Number &h_star,
547 const Number &factor,
552 const unsigned int i,
558 const unsigned int *js,
578 template <
typename ST>
592 template <
typename ST>
614 template <
typename Lambda>
640 "Shallow water equations",
641 {{{
"h",
"m"}, {
"h",
"m_1",
"m_2"}, {
"h",
"m_1",
"m_2",
"m_3"}}},
642 {{{
"h",
"v"}, {
"h",
"v_1",
"v_2"}, {
"h",
"v_1",
"v_2",
"v_3"}}},
643 {{{
"eta_m",
"h_star",
"friction_factor"},
644 {
"eta_m",
"h_star",
"friction_factor"},
645 {
"eta_m",
"h_star",
"friction_factor"}}},
646 {{{
"bathymetry"}, {
"bathymetry"}, {
"bathymetry"}}},
648 , parameters_(
"shallow_water_hyperbolic_system_parameters",
652 auto ¶meters = *parameters_.view();
654 parameters.gravity = 9.81;
656 "gravity", parameters.gravity,
"Gravitational constant [m/s^2]");
658 parameters.manning_friction_coefficient = 0.;
659 add_parameter(
"manning friction coefficient",
660 parameters.manning_friction_coefficient,
661 "Roughness coefficient for friction source");
663 parameters.reference_water_depth = 1.;
664 add_parameter(
"reference water depth",
665 parameters.reference_water_depth,
666 "Problem specific water depth reference");
668 parameters.dry_state_relaxation_small = 1.e2;
669 add_parameter(
"dry state relaxation small",
670 parameters.dry_state_relaxation_small,
671 "Problem specific dry-state relaxation parameter");
673 parameters.dry_state_relaxation_large = 1.e4;
674 add_parameter(
"dry state relaxation large",
675 parameters.dry_state_relaxation_large,
676 "Problem specific dry-state relaxation parameter");
679 ParameterAcceptor::parse_parameters_call_back.connect(
680 [
this] { parameters_.view(); });
684 template <
typename MemorySpace,
int dim,
typename ScalarNumber>
688 const bool skip_constrained_dofs)
const
690 const unsigned int n_internal = offline_data.n_locally_internal();
691 const unsigned int n_owned = offline_data.n_locally_owned();
695 const auto sparsity_simd_view =
696 offline_data.sparsity_pattern_simd().template view<MemorySpace>();
699 std::as_const(state_vector)
701 .template view<ScalarView::problem_dimension, MemorySpace>();
702 const auto precomputed_view =
704 .template view<ScalarView::n_precomputed_values, MemorySpace>();
706 const auto hyperbolic_system_views =
707 make_select_view<dim, ScalarNumber, MemorySpace>(*
this);
709 const auto body = [=](
auto sentinel,
unsigned int i) {
710 using T =
decltype(sentinel);
714 const unsigned int row_length = sparsity_simd_view.row_length(i);
715 if (skip_constrained_dofs && row_length == 1)
718 const auto view = hyperbolic_system_views.template view<T>();
720 const auto U_i = U_view.template read_tensor<T>(i);
721 const auto eta_m =
view.mathematical_entropy(U_i);
722 const auto h_sharp =
view.water_depth_sharp(U_i);
723 const auto h_star =
ryujin::pow(h_sharp, ScalarNumber(4. / 3.));
724 const auto factor =
view.manning_friction_factor(U_i);
726 const precomputed_type prec_i{eta_m, h_star, factor};
727 precomputed_view.template write_tensor<T>(prec_i, i);
730 loop<MemorySpace, ScalarNumber>(
731 "hyperbolic_kernel_01b", body, 0, n_internal, n_owned);
735 template <
int dim,
typename Number,
typename MemorySpace>
736 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
744 template <
int dim,
typename Number,
typename MemorySpace>
745 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
749 constexpr ScalarNumber eps = std::numeric_limits<ScalarNumber>::epsilon();
751 const Number h_cutoff_mollified =
752 reference_water_depth() * dry_state_relaxation_large() * Number(eps);
754 const Number h = water_depth(U);
756 const Number h_max = std::max(h, h_cutoff_mollified);
757 const Number denom = h * h + h_max * h_max;
762 template <
int dim,
typename Number,
typename MemorySpace>
763 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
767 constexpr ScalarNumber eps = std::numeric_limits<ScalarNumber>::epsilon();
769 const Number h_cutoff_small =
770 reference_water_depth() * dry_state_relaxation_small() * Number(eps);
772 const Number h = water_depth(U);
773 const Number h_max = std::max(h, h_cutoff_small);
778 template <
int dim,
typename Number,
typename MemorySpace>
779 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
787 template <
int dim,
typename Number,
typename MemorySpace>
788 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
790 const Number &h)
const
793 constexpr ScalarNumber eps = std::numeric_limits<ScalarNumber>::epsilon();
795 const Number h_cutoff_large =
796 reference_water_depth() * dry_state_relaxation_large() * Number(eps);
798 return ryujin::compare_and_apply_mask<dealii::SIMDComparison::less_than>(
799 std::abs(h), h_cutoff_large, Number(0.), h);
803 template <
int dim,
typename Number,
typename MemorySpace>
804 DEAL_II_HOST_DEVICE_ALWAYS_INLINE dealii::Tensor<1, dim, Number>
808 dealii::Tensor<1, dim, Number> result;
810 for (
unsigned int i = 0; i < dim; ++i)
811 result[i] = U[1 + i];
816 template <
int dim,
typename Number,
typename MemorySpace>
817 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
821 const auto h = water_depth(U);
822 const auto vel = momentum(U) * inverse_water_depth_sharp(U);
829 template <
int dim,
typename Number,
typename MemorySpace>
830 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
834 const Number h_sqd = U[0] * U[0];
841 template <
int dim,
typename Number,
typename MemorySpace>
842 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
847 return std::sqrt(gravity() * U[0]);
851 template <
int dim,
typename Number,
typename MemorySpace>
852 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
856 const auto p = pressure(U);
857 const auto k_e = kinetic_energy(U);
862 template <
int dim,
typename Number,
typename MemorySpace>
863 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
880 const Number &h = U[0];
881 const auto vel = momentum(U) * inverse_water_depth_sharp(U);
884 result[0] = gravity() * h -
ScalarNumber(0.5) * vel.norm_square();
887 for (
unsigned int i = 0; i < dim; ++i) {
888 result[1 + i] = vel[i];
895 template <
int dim,
typename Number,
typename MemorySpace>
896 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
bool
900 const auto h = filter_dry_water_depth(water_depth(U));
902 constexpr auto gte = dealii::SIMDComparison::greater_than_or_equal;
903 const auto test = ryujin::compare_and_apply_mask<gte>(
904 h, Number(0.), Number(0.), Number(-1.));
907 if (!(test == Number(0.))) {
908 std::cout << std::fixed << std::setprecision(16);
909 std::cout <<
"Bounds violation: Negative state [h] detected!\n";
910 std::cout <<
"\t\th: " << h <<
"\n" << std::endl;
915 return (test == Number(0.));
919 template <
int dim,
typename Number,
typename MemorySpace>
920 template <
int component>
921 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
926 const dealii::Tensor<1, dim, Number> &normal)
const ->
state_type
929 static_assert(component == 1 || component == 2,
930 "component has to be 1 or 2");
934 const auto m = momentum(U);
935 const auto a = speed_of_sound(U);
936 const auto vn = m * normal * inverse_water_depth_sharp(U);
938 const auto m_bar = momentum(U_bar);
939 const auto a_bar = speed_of_sound(U_bar);
940 const auto vn_bar = m_bar * normal * inverse_water_depth_sharp(U_bar);
944 const auto R_1 = component == 1 ? vn_bar -
ScalarNumber(2.) * a_bar
949 const auto R_2 = component == 2 ? vn_bar +
ScalarNumber(2.) * a_bar
952 const auto vperp = m * inverse_water_depth_sharp(U) - vn * normal;
957 ryujin::fixed_power<2>((R_2 - R_1) /
ScalarNumber(4.)) / gravity();
961 for (
unsigned int d = 0; d < dim; ++d) {
962 U_new[1 + d] = h_new * (vn_new * normal + vperp)[d];
969 template <
int dim,
typename Number,
typename MemorySpace>
970 template <
typename Lambda>
971 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
973 const dealii::types::boundary_id
id,
975 const dealii::Tensor<1, dim, Number> &normal,
976 const Lambda &get_dirichlet_data)
const ->
state_type
981 result = get_dirichlet_data();
985 auto m_dirichlet = momentum(get_dirichlet_data());
986 for (
unsigned int k = 0; k < dim; ++k)
987 result[k + 1] = m_dirichlet[k];
991 const auto U_dirichlet = get_dirichlet_data();
992 const auto h_inv_sharp_dirichlet =
993 inverse_water_depth_sharp(U_dirichlet);
994 const auto v_dirichlet = momentum(U_dirichlet) * h_inv_sharp_dirichlet;
995 const auto h = water_depth_sharp(result);
996 for (
unsigned int k = 0; k < dim; ++k)
997 result[k + 1] = h * v_dirichlet[k];
1000 auto m = momentum(U);
1001 m -= 1. * (m * normal) * normal;
1002 for (
unsigned int k = 0; k < dim; ++k)
1003 result[k + 1] = m[k];
1006 for (
unsigned int k = 0; k < dim; ++k)
1007 result[k + 1] = Number(0.);
1022 const auto m = momentum(U);
1023 const auto h_inverse = inverse_water_depth_sharp(U);
1024 const auto a = speed_of_sound(U);
1025 const auto vn = m * normal * h_inverse;
1029 result = get_dirichlet_data();
1033 if (vn >= -a && vn <= 0.) {
1034 const auto U_dirichlet = get_dirichlet_data();
1035 result = prescribe_riemann_characteristic<2>(U_dirichlet, U, normal);
1039 if (vn > 0. && vn <= a) {
1040 const auto U_dirichlet = get_dirichlet_data();
1041 result = prescribe_riemann_characteristic<1>(U, U_dirichlet, normal);
1047 Assert(
false, dealii::ExcNotImplemented());
1054 template <
int dim,
typename Number,
typename MemorySpace>
1055 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1059 const auto h_inverse = inverse_water_depth_sharp(U);
1060 const auto m = momentum(U);
1061 const auto p = pressure(U);
1065 result[0] = (m * h_inverse) * U[0];
1066 for (
unsigned int i = 0; i < dim; ++i) {
1067 result[1 + i] = (m * h_inverse) * m[i];
1068 result[1 + i][i] += p;
1074 template <
int dim,
typename Number,
typename MemorySpace>
1075 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1079 const auto h_inverse = inverse_water_depth_sharp(U);
1080 const auto m = momentum(U);
1084 result[0] = (m * h_inverse) * U[0];
1085 for (
unsigned int i = 0; i < dim; ++i) {
1086 result[1 + i] = (m * h_inverse) * m[i];
1092 template <
int dim,
typename Number,
typename MemorySpace>
1093 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1096 const dealii::Tensor<1, dim, Number> &V,
1097 const Number &Z_left,
1100 const Number Z_max = std::max(Z_left, Z_right);
1101 const Number h = water_depth(U);
1102 const Number H_star = std::max(Number(0.), h + Z_left - Z_max);
1106 for (
unsigned int d = 0; d < dim; ++d)
1107 result[1 + d] = H_star * V[d];
1112 template <
int dim,
typename Number,
typename MemorySpace>
1113 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1118 const auto &[U_i, Z_i, V_i] = flux_i;
1119 const auto &[U_j, Z_j, V_j] = flux_j;
1121 const auto U_star_ij = star_state(U_i, V_i, Z_i, Z_j);
1122 const auto U_star_ji = star_state(U_j, V_j, Z_j, Z_i);
1124 return {U_star_ij, U_star_ji};
1128 template <
int dim,
typename Number,
typename MemorySpace>
1129 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1133 const unsigned int i,
1136 const auto Z_i = piv.template read_tensor<Number>(i)[0];
1137 const auto V_i = momentum(U_i) * inverse_water_depth_mollified(U_i);
1138 return {U_i, Z_i, V_i};
1142 template <
int dim,
typename Number,
typename MemorySpace>
1143 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1147 const unsigned int *js,
1150 const auto Z_j = piv.template read_tensor<Number>(js)[0];
1151 const auto V_j = momentum(U_j) * inverse_water_depth_mollified(U_j);
1152 return {U_j, Z_j, V_j};
1156 template <
int dim,
typename Number,
typename MemorySpace>
1157 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1161 const dealii::Tensor<1, dim, Number> &c_ij)
const ->
state_type
1163 const auto &[U_i, Z_i, V_i] = flux_i;
1164 const auto &[U_j, Z_j, V_j] = flux_j;
1165 const auto &[U_star_ij, U_star_ji] = equilibrated_states(flux_i, flux_j);
1167 const auto H_i = water_depth(U_i);
1168 const auto H_star_ij = water_depth(U_star_ij);
1169 const auto H_star_ji = water_depth(U_star_ji);
1171 const auto V_i_c_ij = V_i * c_ij;
1172 const auto V_j_c_ij = V_j * c_ij;
1174 state_type result = -(U_star_ij * V_i_c_ij + U_star_ji * V_j_c_ij);
1177 (
ScalarNumber(0.5) * (H_star_ji * H_star_ji - H_star_ij * H_star_ij) +
1181 for (
unsigned int d = 0; d < dim; ++d)
1182 result[1 + d] -= factor * c_ij[d];
1188 template <
int dim,
typename Number,
typename MemorySpace>
1189 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1193 const dealii::Tensor<1, dim, Number> &c_ij)
const ->
state_type
1195 const auto &[U_i, Z_i, V_i] = flux_i;
1196 const auto &[U_j, Z_j, V_j] = flux_j;
1198 const auto H_i = water_depth(U_i);
1199 const auto H_j = water_depth(U_j);
1201 state_type result = -(U_i * (V_i * c_ij) + U_j * (V_j * c_ij));
1203 const auto factor = gravity() * H_i * (H_j + Z_j - Z_i);
1204 for (
unsigned int d = 0; d < dim; ++d)
1205 result[1 + d] -= factor * c_ij[d];
1211 template <
int dim,
typename Number,
typename MemorySpace>
1212 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1216 const dealii::Tensor<1, dim, Number> &c_ij,
1219 const auto &[U_i, Z_i, V_i] = flux_i;
1220 const auto &[U_j, Z_j, V_j] = flux_j;
1221 const auto U_star_ij = star_state(U_i, V_i, Z_i, Z_j);
1223 const auto factor =
ScalarNumber(2.) * (d_ij + V_i * c_ij);
1225 return -factor * (U_star_ij - U_i);
1229 template <
int dim,
typename Number,
typename MemorySpace>
1230 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1234 const auto g = gravity();
1235 const auto n = manning_friction_coefficient();
1238 (momentum(U) * inverse_water_depth_mollified(U)).norm();
1243 template <
int dim,
typename Number,
typename MemorySpace>
1244 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1247 const Number &h_star,
1248 const Number &factor,
1253 const auto m = momentum(U);
1255 const auto denominator = h_star + std::max(h_star, tau * factor);
1256 const auto denominator_inverse =
ScalarNumber(1.) / denominator;
1258 for (
unsigned int d = 0; d < dim; ++d)
1259 result[d + 1] = -factor * denominator_inverse * m[d];
1265 template <
int dim,
typename Number,
typename MemorySpace>
1266 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1269 const unsigned int i,
1273 const auto &[eta_m, h_star, factor] =
1274 pv.template read_tensor<Number, precomputed_type>(i);
1276 return manning_friction(U_i, h_star, factor, tau);
1280 template <
int dim,
typename Number,
typename MemorySpace>
1281 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1284 const unsigned int *js,
1288 const auto &[eta_m, h_star, factor] =
1289 pv.template read_tensor<Number, precomputed_type>(js);
1291 return manning_friction(U_j, h_star, factor, tau);
1295 template <
int dim,
typename Number,
typename MemorySpace>
1296 template <
typename ST>
1297 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1301 using T =
typename ST::value_type;
1302 static_assert(std::is_same_v<Number, T>,
"template mismatch");
1304 constexpr auto dim2 = ST::dimension - 1;
1305 static_assert(dim >= dim2,
1306 "the space dimension of the argument state must not be "
1307 "larger than the one of the target state");
1310 result[0] =
state[0];
1311 for (
unsigned int i = 1; i < dim2 + 1; ++i)
1312 result[i] =
state[i];
1317 template <
int dim,
typename Number,
typename MemorySpace>
1318 template <
typename ST>
1319 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1323 const auto primitive_state = expand_state(initial_state);
1324 return from_primitive_state(primitive_state);
1328 template <
int dim,
typename Number,
typename MemorySpace>
1329 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1333 const auto &h = primitive_state[0];
1335 auto state = primitive_state;
1337 for (
unsigned int i = 1; i < dim + 1; ++i)
1344 template <
int dim,
typename Number,
typename MemorySpace>
1345 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1349 const auto h_inverse = inverse_water_depth_sharp(
state);
1351 auto primitive_state =
state;
1353 for (
unsigned int i = 1; i < dim + 1; ++i)
1354 primitive_state[i] *= h_inverse;
1356 return primitive_state;
1360 template <
int dim,
typename Number,
typename MemorySpace>
1361 template <
typename Lambda>
1362 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
auto
1366 auto result =
state;
1367 auto M = lambda(momentum(
state));
1368 for (
unsigned int d = 0; d < dim; ++d)
1369 result[1 + d] = M[d];
dealii::Tensor< 1, problem_dimension, Number > state_type
typename get_value_type< Number >::type ScalarNumber
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
dealii::Tensor< 1, problem_dimension, Number > state_type
DEAL_II_HOST_DEVICE state_type star_state(const state_type &U, const dealii::Tensor< 1, dim, Number > &V, const Number &Z_left, const Number &Z_right) const
DEAL_II_HOST_DEVICE state_type manning_friction(const state_type &U, const Number &h_star, const Number &factor, const ScalarNumber tau) const
DEAL_II_HOST_DEVICE Number kinetic_energy(const state_type &U) const
DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber dry_state_relaxation_large() const
std::tuple< state_type, Number, dealii::Tensor< 1, dim, Number > > flux_contribution_type
DEAL_II_HOST_DEVICE state_type apply_galilei_transform(const state_type &state, const Lambda &lambda) const
DEAL_II_HOST_DEVICE Number manning_friction_factor(const state_type &U) const
DEAL_II_HOST_DEVICE flux_type g(const state_type &U) const
static constexpr bool have_source_terms
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 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