68 const auto view = hyperbolic_system_.template view<dim, Number>();
71 const auto z = compute_bathymetry(point);
72 const auto g = view.gravity();
73 const Number omega = std::sqrt(2. * g * h_0_) / a_;
74 const Number &x = point[0];
77 Number h, v_x, v_y = 0.;
81 if constexpr (dim == 1) {
83 const Number k = view.manning_friction_coefficient();
84 const Number p = std::sqrt(8. * g * h_0_) / a_;
85 const Number s = std::sqrt(p * p - k * k) / 2.;
88 (a_ * a_ * B_ * B_) / (8. * g * g * h_0_) * std::exp(-k * t);
89 term1 *= (1. / 4. * k * k - s * s) * std::cos(2. * s * t) -
90 s * k * sin(2. * s * t);
92 const auto term2 = -(B_ * B_ / (4. * g)) * std::exp(-k * t);
94 auto term3 = -(B_ / g) * std::exp(-1. / 2. * k * t);
95 term3 *= (s * std::cos(s * t) + 1. / 2. * k * std::sin(s * t)) *
96 (point[0] - 1. / 2. * length_);
98 auto htilde = h_0_ - compute_bathymetry(point);
99 htilde += term1 + term2 + term3;
101 h = std::max(htilde, Number(0.));
102 v_x = B_ * std::exp(-1. / 2. * k * t) * std::sin(s * t);
105 }
else if constexpr (dim == 2) {
107 const Number &y = point[1];
109 const Number elevation =
110 eta_ * h_0_ / (a_ * a_) *
111 (2. * x * std::cos(omega * t) + 2. * y * std::sin(omega * t));
113 h = std::max(elevation - z, Number(0.));
114 v_x = -eta_ * omega * std::sin(omega * t);
115 v_y = eta_ * omega * std::cos(omega * t);
120 AssertThrow(
false, dealii::ExcNotImplemented());