18#ifndef DUMUX_SHALLOWWATER_BOUNDARYFLUXES_HH
19#define DUMUX_SHALLOWWATER_BOUNDARYFLUXES_HH
40template<
class Scalar,
class GlobalPosition>
42 const Scalar velocityXInside,
43 const Scalar velocityYInside,
44 const GlobalPosition& nxy)
46 const auto uNormalIn = nxy[0]*velocityXInside + nxy[1]*velocityYInside;
47 return {{waterDepthInside,
48 velocityXInside - 2.0*uNormalIn*nxy[0],
49 velocityYInside - 2.0*uNormalIn*nxy[1]}};
65template<
class Scalar,
class GlobalPosition>
67 const Scalar speedBoundary,
68 const GlobalPosition& nxy)
70 return {{waterDepthBoundary, -speedBoundary*nxy[0], -speedBoundary*nxy[1]}};
92template<
class Scalar,
class GlobalPosition>
94 const Scalar velocityXInside,
95 const Scalar velocityYInside,
97 const GlobalPosition& nxy)
99 using std::sqrt;
using std::cbrt;
using std::max;
101 const auto uNormalIn = nxy[0]*velocityXInside + nxy[1]*velocityYInside;
102 if (uNormalIn <= 0.0)
103 return wallBoundary(waterDepthInside, velocityXInside, velocityYInside, nxy);
105 const auto froude = uNormalIn/sqrt(gravity*max(waterDepthInside, Scalar(1e-12)));
107 return {{waterDepthInside, velocityXInside, velocityYInside}};
109 const auto normalDischarge = waterDepthInside*uNormalIn;
110 const auto criticalDepth = cbrt(normalDischarge*normalDischarge/gravity);
111 const auto uNormalOut = sqrt(gravity*criticalDepth);
112 const auto uTangentialIn = -nxy[1]*velocityXInside + nxy[0]*velocityYInside;
113 return {{criticalDepth,
114 nxy[0]*uNormalOut - nxy[1]*uTangentialIn,
115 nxy[1]*uNormalOut + nxy[0]*uTangentialIn}};
130template<
class Scalar,
class GlobalPosition>
132 const Scalar waterDepthInside,
133 const Scalar velocityXInside,
134 const Scalar velocityYInside,
135 const Scalar gravity,
136 const GlobalPosition& nxy)
138 std::array<Scalar, 3> cellStateOutside;
139 cellStateOutside[0] = waterDepthBoundary;
141 const auto uNormalIn = nxy[0] * velocityXInside + nxy[1] * velocityYInside;
142 const auto uTangentialIn = -nxy[1] * velocityXInside + nxy[0] * velocityYInside;
143 const auto uNormalOut = uNormalIn + 2.0 * sqrt(gravity * waterDepthInside) - 2.0 * sqrt(gravity * cellStateOutside[0]);
145 cellStateOutside[1] = (nxy[0] * uNormalOut - nxy[1] * uTangentialIn);
146 cellStateOutside[2] = (nxy[1] * uNormalOut + nxy[0] * uTangentialIn);
148 return cellStateOutside;
163template<
class Scalar,
class GlobalPosition>
165 const Scalar waterDepthInside,
166 const Scalar velocityXInside,
167 const Scalar velocityYInside,
168 const Scalar gravity,
169 const GlobalPosition& nxy)
176 auto cellStateOutside =
wallBoundary(waterDepthInside, velocityXInside, velocityYInside, nxy);
178 if (abs(dischargeBoundary) > 1.0e-9)
180 const auto uboundIn = nxy[0]*velocityXInside + nxy[1]*velocityYInside;
181 const auto alphal = uboundIn + 2.0*sqrt(gravity * waterDepthInside);
184 constexpr Scalar tol_hstar = 1.0E-12;
185 constexpr Scalar ink_hstar = 1.0E-9;
186 constexpr int maxstep_hstar = 30;
189 for (
int i = 0; i < maxstep_hstar; ++i)
191 Scalar f_hstar = alphal - dischargeBoundary/hstar - 2 * sqrt(gravity * hstar);
192 Scalar df_hstar = (f_hstar -(alphal - dischargeBoundary/(hstar + ink_hstar) - 2 * sqrt(gravity * (hstar+ink_hstar))))/ink_hstar;
193 Scalar dx_hstar = -f_hstar/df_hstar;
194 hstar = max(hstar - dx_hstar,0.001);
196 if (dx_hstar*dx_hstar < tol_hstar)
200 const auto qinner = (nxy[0] * waterDepthInside * velocityYInside) - (nxy[1] * waterDepthInside * velocityXInside);
201 cellStateOutside[0] = hstar;
202 cellStateOutside[1] = (nxy[0] * dischargeBoundary - nxy[1] * qinner)/hstar;
203 cellStateOutside[2] = (nxy[1] * dischargeBoundary + nxy[0] * qinner)/hstar;
206 return cellStateOutside;
218template<
class PrimaryVariables,
class Scalar,
class GlobalPosition>
220 const Scalar turbulentViscosity,
221 const PrimaryVariables& state,
222 const GlobalPosition& cellCenterToBoundaryFaceCenter,
227 if (abs(alphaWall) <= 1.0e-9)
230 const auto waterDepth = state[0];
233 if (waterDepth <= 0.001)
236 const auto xVelocity = state[1];
237 const auto yVelocity = state[2];
238 const auto distance = cellCenterToBoundaryFaceCenter.two_norm();
243 const auto gradU = -alphaWall * xVelocity/
distance;
244 const auto gradV = -alphaWall * yVelocity/
distance;
252 -turbulentViscosity*waterDepth*gradU*direction,
253 -turbulentViscosity*waterDepth*gradV*direction
265template<
class PrimaryVariables,
class Scalar,
class GlobalPosition>
267 const PrimaryVariables& state,
268 const GlobalPosition& cellCenterToBoundaryFaceCenter,
273 if (abs(ksWall) <= 1.0e-9)
277 const Scalar xVelocity = state[1];
278 const Scalar yVelocity = state[2];
279 const Scalar velocityMagnitude = hypot(xVelocity, yVelocity);
280 const Scalar
distance = cellCenterToBoundaryFaceCenter.two_norm();
281 const Scalar y0w = ksWall/30.0;
282 constexpr Scalar kappa2 = 0.41*0.41;
285 using std::log;
using std::max;
286 const auto logYPlus = log(
distance/y0w+1.0);
287 const auto fac = kappa2*velocityMagnitude / max(1.0e-3,logYPlus*logYPlus);
293 const auto tauWx = direction*fac*xVelocity;
294 const auto tauWy = direction*fac*yVelocity;
297 const auto waterDepth = state[0];
298 return {0.0, waterDepth*tauWx, waterDepth*tauWy};
static ctype distance(const Dune::FieldVector< ctype, dimWorld > &a, const Dune::FieldVector< ctype, dimWorld > &b)
Compute the shortest distance between two points.
Definition distance.hh:282
Vector unitNormal(const Vector &v)
Create a vector normal to the given one (v is expected to be non-zero).
Definition normal.hh:58
Definition exactriemann.hh:19
std::array< Scalar, 3 > criticalDepthOutflowBoundary(const Scalar waterDepthInside, const Scalar velocityXInside, const Scalar velocityYInside, const Scalar gravity, const GlobalPosition &nxy)
Compute the outer cell state for a free overfall (open outflow).
Definition boundaryfluxes.hh:93
std::array< Scalar, 3 > fixedDischargeBoundary(const Scalar dischargeBoundary, const Scalar waterDepthInside, const Scalar velocityXInside, const Scalar velocityYInside, const Scalar gravity, const GlobalPosition &nxy)
Compute the outer cell state for a fixed discharge boundary.
Definition boundaryfluxes.hh:164
std::array< Scalar, 3 > nikuradseWallBoundary(const Scalar ksWall, const PrimaryVariables &state, const GlobalPosition &cellCenterToBoundaryFaceCenter, const GlobalPosition &unitNormal)
Compute the viscosity/diffusive flux at a rough wall boundary using Nikuradse formulation.
Definition boundaryfluxes.hh:266
std::array< Scalar, 3 > inflowBoundary(const Scalar waterDepthBoundary, const Scalar speedBoundary, const GlobalPosition &nxy)
Compute the outer cell state for an inflow with prescribed depth and speed.
Definition boundaryfluxes.hh:66
std::array< Scalar, 3 > noslipWallBoundary(const Scalar alphaWall, const Scalar turbulentViscosity, const PrimaryVariables &state, const GlobalPosition &cellCenterToBoundaryFaceCenter, const GlobalPosition &unitNormal)
Compute the viscosity/diffusive flux at a rough wall boundary using no-slip formulation.
Definition boundaryfluxes.hh:219
std::array< Scalar, 3 > wallBoundary(const Scalar waterDepthInside, const Scalar velocityXInside, const Scalar velocityYInside, const GlobalPosition &nxy)
Compute the outer cell state for a slip wall.
Definition boundaryfluxes.hh:41
std::array< Scalar, 3 > fixedWaterDepthBoundary(const Scalar waterDepthBoundary, const Scalar waterDepthInside, const Scalar velocityXInside, const Scalar velocityYInside, const Scalar gravity, const GlobalPosition &nxy)
Compute the outer cell state for fixed water depth boundary.
Definition boundaryfluxes.hh:131