This vignette documents the mathematical derivations for gradually-varied and unsteady flow analysis with `rivr`

. All derivations are based on Chaudry (2007). In Section 1, important definitions related to channel geometry are discussed. In Section 2, basic concepts of open-channel flow are discussed and one-dimensional shallow-water equations are derived. In Section 3, gradually-varied flow is derived and the standard-step method is discussed. In Section 4, the kinematic and dynamic wave models for simulating unsteady flow are derived along with the three discretization methods available in `rivr`

. Finally, Section 5 discusses the Method of Characteristics and its application to boundary conditions of unsteady flow simulations.

A channel is *prismatic* if it has the same slope and cross-section throughout its entire length. The `rivr`

package currently supports prismatic trapezoidal channels of arbitrary bottom width \(B\) and side slope \(SS = H:V\). Given a flow depth \(y\), the flow area is then \[
A = By + SSy^2
\] Another important definition is the wetted perimeter \(P\), which for a trapezoidal cross-section is \[
P = B + 2y\sqrt{1 + SS^2}
\] The hydraulic radius is the ratio of the cross-sectional flow area to the wetted perimeter, i.e. \[
R = \frac{A}{P}
\] The hydraulic depth \(D\) is defined as the ratio of the cross-sectional flow area to the top width \(T\), where \[
T = \frac{dA}{dy}
\] which for a trapezoidal cross-section yields \[
T = B + 2ySS
\] and \[
D = \frac{A}{T} = \frac{By + SSy^2}{B + 2ySS}
\] Finally, the term \(\bar{y}\) is related to hydrostatic pressure and is defined as the distance from the water surface to the centroid of the cross-sectional flow area, i.e. \[
\bar{y} = \frac{2B + T}{3(B + T)} y
\]

The definitions described above are fundamental properties related to one-dimensional open-channel flow. These relations (and their derivatives) are used extensively in the following sections to derive important flow relations and appear repeatedly in numerical solution schemes.

The flow depth of a channel in an equilibrium state is called the *normal depth*, i.e. the flow depth at which gravitational forces (bed slope) are balanced by friction forces (bed roughness). The `rivr`

package expresses the normal depth via the semi-empirical Manning’s equation \[
Q = \frac{C_m}{n} AR^{2/3}S_0^{1 / 2}
\] where \(Q\) is the channel flow, \(S_0\) is the channel slope, \(A\) is the cross-sectional flow area, \(R\) is the hydraulic depth and \(C_m\) is a conversion factor based on the unit system used (1.49 in US customary units and 1.0 in SI units). The expression is often rewritten as \[
Q = KS_0^{1 / 2}
\] Where \(K\) is the *channel conveyance*. The normal depth \(y_n\) factors into the expressions of both \(A\) and \(R\) (i.e. \(K\)) and the above equation cannot be rearranged to solved explicitly for the normal depth; an implicit (iterative) solution is needed. The univariate Netwon-Raphson method is often used to provide efficient and precise solutions for \(y_n\). Generally, the Newton-Raphson method is defined as \[
x = x^* - \frac{f(x^*)}{\frac{df}{dx}\bigg|_{x^*}}
\] where \(x\) is the updated guess for the parameter for which a solution is sought, \(x^*\) is the prior guess for the parameter value, \(f(x)\) is a zero-valued function of the parameter and \(\frac{df}{dx}\) is the derivative of said function. To apply the Newton-Raphson method here, Manning’s equation is rewritten as \[
f(y_n) = AR^{2/3} - \frac{nQ}{C_m S_0^{1 / 2}} = 0
\] and its derivative is \[
\frac{df}{dy_n} = \frac{5}{3}T R^{2/3} - \frac{2}{3}R^{5/3}\frac{dP}{dy_n}
\] where \(\frac{dP}{dy_n} = 2\sqrt{1 + SS^2}\). A related concept is the *critical depth*, the flow depth which minimizes the specific energy of the flow. The specific energy is the sum of flow depth and velocity head, i.e. \[
E = y + \frac{u^2}{2g} = \frac{1}{2g}\left(\frac{Q}{A}\right)^2
\] where \(u\) is the uniform flow velocity. The critical depth is then the flow depth that satisfies \[
\frac{dE}{dy} = 0 = 1 - \frac{Q^2}{gA^3}\frac{dA}{dy} = \frac{Q^2 T}{gA^3}
\] For a trapezoidal channel it can be mathematically proved that only one critical depth exists for a given flow rate. The critical depth can be solved using the Newton-Raphson method with \(f(y_c) = \frac{dE}{dy} = 0\) and \[
\frac{df}{dy_c} = \frac{3}{2}\left(AT\right)^{1 / 2} - \frac{1}{2}\left(\frac{A}{T}\right)^{3/2}\frac{dT}{dy_c}
\] where \(\frac{dT}{dy_c} = 2SS\) for a trapezoidal channel. The critical depth is also the depth at which the *Froude number* of the flow is unity; the Froude number is a dimensionless measure of bulk flow characteristics that represents the relative importance of inertial forces and gravitational forces and is defined as \[
Fr = \frac{Q}{A\sqrt{gD}}
\]

Flows are referred to as *subcritical* if the flow depth is greater than the critical depth (\(Fr < 1\)) and *supercritical* if the flow depth is less than the critical depth (\(Fr > 1\)). Flows can transition gradually from subcritical to supercritical conditions; when the rate of variation of flow depth is small with respect to the longitudinal distance over which the change occurs, the river state is referred to as *gradually-varied flow*. In contrast, the transition from supercritical to subcritical conditions occur abruptly in the form of a hydraulic jump and is an example of *rapidly-varied flow*. Both gradually-varied and rapidly-varied flows can be either steady (flow is constant through time) or unsteady (flow rate varies with respect to time). The `rivr`

package provides solutions for steady gradually-varied and unsteady flow problems.

The *standard-step method* can be used to solve the steady gradually-varied flow profile when the channel flow and geometry are known. Additionally, the flow depth \(y\) must be known at a specified channel cross-section; this cross-section is referred to as the *control section* and the flow depth associated with the channel flow rate \(Q\) at the control section is \(y_1\). The total head \(H_1\) at the control section is the sum of the elevation head, flow depth head, and velocity head, i.e. \[
H_1 = y_1 + z_1 + \frac{1}{2g}\left(\frac{Q}{A_1}\right)^2 = z_1 + E_1
\] where \(z_1\) is the elevation of the control section bottom relative to some datum and \(A_1\) is the cross-sectional flow area at the control section. From conservation of energy, it follows that the total head \(H_2\) at some downstream cross-section, referred to as the *target section*, is \[
H_2 = H_1 - h_f
\] where \(h_f\) is the head loss. While the head loss term generally combines both friction loss and form drag, the latter component is neglected by `rivr`

. The friction component is expressed as the average friction slope between the control and target sections: \[
h_f = \frac{{S_f}_1 + {S_f}_2}{2} \left(x_2 - x_1\right)
\] where \(x_2 - x_1\) is the longitudinal distance between the control and target section. Note that the sign of \(h_f\) therefore depends on whether the control section is upstream (\(x_1 < x_2\)) or downstream (\(x_1 > x_2\)) of the target section. Substituting these terms into the governing equation and rearranging yields \[
y_2 + z_2 + \frac{1}{2g}\left(\frac{Q}{A_2}\right)^2 + \frac{{S_f}_1 + {S_f}_2}{2} \left(x_2 - x_1\right) = y_1 + z_1 + \frac{1}{2g}\left(\frac{Q}{A_1}\right)^2
\] Note that all terms on the right-hand side of the equation are known, while \(A_2\) and \({S_f}_2\) on the left-hand side of the equation are functions of \(y_2\). Transposing all terms to the left-hand side yields a zero-value function of \(y_2\): \[
f(y_2) = 0 = y_2 + z_2 + \frac{1}{2g}\left(\frac{Q}{A_2}\right)^2 + \frac{{S_f}_1 + {S_f}_2}{2} \left(x_2 - x_1\right) - y_1 - z_1 - \frac{1}{2g}\left(\frac{Q}{A_1}\right)^2
\] This function is suitable for solving using the Newton-Raphson method discussed previously, i.e. \[
y_2 = y_2^* - \frac{f(y_2^*)}{\frac{df}{dy}\bigg|_{y_2^*}}
\] where \[
\frac{df}{dy_2} = 1 - \frac{Q^2}{gA_2^3}\frac{dA_2}{dy_2} + \frac{1}{2}\left(x_2 - x_1\right) \frac{d{S_f}_2}{dy_2}
\] and \[
\frac{d{S_f}_2}{dy} = -2\left(\frac{{S_f}_2}{A} \frac{dA}{dy} + \frac{2}{3} \frac{{S_f}_2}{R} \frac{dR}{dy} \right)
\] Once the flow depth at the target section is found, the target section becomes the new control section and the flow depth at the next target section is computed, with the algorithm “stepping” up or down the channel to a specified distance from the initial control section. The standard-step method is accessed via the function `compute_profile`

.

Unsteady flow problems are generally characterized using the Shallow Water Equations, with the one-dimensional form expressed as \[
\frac{\partial A}{\partial t} + \frac{\partial Q}{\partial x} = 0
\] \[
\frac{\partial Q}{\partial t} + \frac{\partial}{\partial x} \left(Qu + g\bar{y}A\right) - gA\left(S_0 - S_f\right) = 0
\] where the first equation expresses mass conservation and the second expresses momentum conservation. Without further simplification, these equations are often referred to as the Dynamic Wave Model (DWM). The Kinematic Wave Model (KWM) refers to a simplification of the momentum equation by assuming \(S_0 = S_f\), i.e. the momentum equation is instead expressed through the relation \[
A = \left( \frac{nQP^{2/3}}{C_m S_0^{1 / 2}} \right)^{3/5}
\] Both the KWM and DWM can be solved using numerical discretization methods such as finite-difference schemes. Finite-difference schemes discretize a continuous model domain into a series of *nodes* separated by an incremental distance \(\Delta x\). The model time domain is similarly discretized into a series of time steps separated by an incremental time \(\Delta t\). A finite-difference scheme is called *explicit* if the value of the variable being solved for on time step \(k + 1\) depends explicitly on the value of the variable at the previous time step \(k\). Explicit methods are advantageous because they are easier to program and implement, but are disadvantageous because they are subject to stability constraints. The stability constraint is defined by the Courant number \[
C = \frac{\Delta t}{\Delta x} u
\] which represents the ratio of the flow velocity to the rate of propagation of information through the model domain. The numerical solution is unstable if \(C > 1\).

The `rivr`

package provides an interface to one finite-difference numerical scheme for the KWM and two finite-difference schemes for the DWM. In addition, the DWM interface supports boundary condition solutions using the Method of Characteristics (MOC). These schemes are accessed via the function `route_wave`

and their derivations are discussed below.

The KWM finite-difference scheme implemented in `rivr`

requires a constant time step and spatial resolution, a known upstream boundary condition (flow) for the full simulation time, and an initial condition (flow) at every node. The initial water depth, flow area, and flow velocity are calculated from the channel geometry relations, with the initial water depth assumed to be the normal depth. At the initiation of a new time step \(k + 1\), the flow at the upstream boundary node \(i = 1\) is assigned from the user-supplied boundary condition. The flow depth at the upstream boundary is calculated as the normal depth for that flow, i.e. \[
y_1^{k+1} = y_n\left(Q_1^{k+1}\right)
\] where the superscripts denote the timestep. The flow at a downstream node \(i\) is computed as \[
Q_i^{k+1} = Q^{k+1}_{i - 1} - \frac{\Delta x}{\Delta t}\left( A_{i-1}^{k+1} - A_{i-1}^{k}\right)
\] where the subscripts denote the node. The flow depth at node \(i\) is calculated using a Newton-Raphson formulation where \[
f(y_i^{k+1}) = 0 = A_i^{k+1} - \left(\frac{nQ_i^{k+1}}{C_m S_0^{1 / 2}}\right)^{3/5} \left(P_i^{k+1}\right)^{2/5}
\]

and \[
\frac{df}{dy_i^{k+1}} = \frac{dA}{dy}\bigg|_{y_i^{k+1}} - \frac{2}{5}\frac{dP}{dy}\bigg|_{y_i^{k+1}} \left( \frac{nQ_i^{k+1}}{C_m S_0^{1 / 2} P_i^{k+1}} \right)^{3/5}
\] Once the flow depth is known, the remaining geometry relations can be computed and the algorithm moves to the next downstream node. The algorithm advances to the next time step once all nodes are computed.

The set of equations describing the DWM are more complex than the KWM, and therefore requires more sophisticated numerical solution methods. The Lax diffusive scheme is similar to the scheme used for the KWM in terms of the model domain discretization and initialization, but requires additional computations at each node to obtain the solution.

For an internal (non-boundary) node \(i\) on time step \(k + 1\), flow values are computed through a two step process. First, averages of \(A\), \(Q\), and the inertial term \(S = gA\left(S_f - S_0\right)\) are computed for the node, i.e. \[ A_i^* = \frac{1}{2}\left(A^k_{i+1} + A^k_{i - 1} \right) \] \[ Q^*_i = \frac{1}{2}\left(Q^k_{i+1} + Q^k_{i - 1} \right) \] \[ S_i^* = \frac{1}{2}\left(S^k_{i+1} + S^k_{i - 1}\right) = \frac{gA}{2}\left({S_f}^k_{i + 1} + {S_f}^k_{i - 1} - 2S_0\right) \] The values for node \(i\) on time step \(k + 1\) are then calculated as \[ A_i^{k + 1} = A_i^* - \frac{\Delta t}{2\Delta x}\left(Q^k_{i+1} - Q^k_{i-1}\right) \] \[ Q_i^{k + 1} = Q_i^* - \frac{\Delta t}{2\Delta x}\left(F^k_{i+1} - F^k_{i-1}\right) - S_i^*\Delta t \] where \(F = Qu + g\bar{y}A\). To compute the flow depth \(y_i^{k+1}\) from the new area \(A_i^{k+1}\), the Newton-Raphson method is again applied where \[ f(y_i^{k+1}) = 0 = A\left(y_i^{k+1}\right) - A_i^{k+1} \] and \[ \frac{df}{dy_i^{k+1}} = \frac{dA}{dy} \bigg|_{y_i^{k+1}} \] It is clear from the derivation that unlike the KWM solution, both the upstream and the downstream boundary conditions must be known at each time step. The MOC described later provides a method for predicting, rather than imposing, the downstream boundary condition.

The MacCormack scheme is an advanced finite-differencing scheme that provides high accuracy for considerably coarser spatial and temporal resolutions compared to the Lax diffusive scheme. The scheme consists of a backwards-looking predictor step followed by a forward-looking corrector step. The intermediate values calculated in the predictor step are used to develop new intermediate values in the corrector step, and these calculations are averaged to obtain the final value. The predictor step computes the intermediate values at an internal node \(i\) as \[ Q_i^* = Q_i^k - \frac{\Delta t}{\Delta x}\left( F_i - F_{i - 1}\right) - S_i^k \Delta t \] \[ A^*_i = A_i^k - \frac{\Delta t}{\Delta x}\left( Q_i^k - Q_{i-1}^k \right) \] with intermediate values of \(F\) and \(S\) (\(F^*\) and \(S^*\)) computed from these results. On the corrector step, new values for \(Q\) and \(A\) are computed as \[ Q_i^{**} = Q_i^{k} - \frac{\Delta t}{\Delta x}\left( F^*_{i + 1} - F^*_{i} \right) - S_i^* \Delta t \] \[ A_i^{**} = A_i^k - \frac{\Delta t}{\Delta x}\left( Q_{i+1}^* - Q_i^* \right) \] The new values for time step \(k + 1\) are the arithmetic averages of the predictor and corrector step results, i.e. \(Q_i^{k+1} = \frac{1}{2}\left( Q_i^* + Q_i^{**} \right)\) and \(A_i^{k+1} = \frac{1}{2}\left( A_i^* + A_i^{**} \right)\). The remaining terms are then computed from these new values.

The DWM solution schemes provided by `rivr`

require that both the upstream and downstream boundary be known. Because the downstream boundary is not known *a priori* under many circumstances, the requirement would limit the utility of the numerical schemes. The Method of Characteristics (MOC) provides a method for predicting the downstream boundary condition at the beginning of each time step, allowing users to route waves trhough the downstream boundary with minimal loss of information. In addition, the method also allows the user to specify both the upstream and downstream boundary conditions in terms of either flow or depth, and allows specification of sudden cessation of flow, i.e. closure of a sluice gate at the upstream or downstream boundary.

MOC is a well-known concept with application to a wide variety of numerical problems; the general theory is not presented here. It can be shown that the upstream boundary condition (node \(i = 1\)) on time step \(k\) can be defined as \[ u_1^k = \phi_1^0 + \psi_2^0 y_1^k \] where \[ \psi_2^0 = \sqrt{\frac{g}{y_2^0}} \] and \[ \phi_1^0 = u_2^0 - \psi_2^0 + g\left( S_0 - {S_f}_2^0 \right)\Delta t \] As seen from these relations, the flow velocity and depth at the upstream boundary on any time step \(k\) are related to the initial conditions (i.e. \(k = 0\)). The downstream boundary condition (node \(i = N\)) is similarly expressed as \[ u^k_N = \phi_N^0 - \psi_{N-1}^0 y_N^k \] where \[ \psi^0_{N-1} = \sqrt{\frac{g}{y^0_{N-1}}} \] and \[ \phi^0_{N} = u^0_{N-1} + \psi^0_{N-1} y^0_{N-1} + g\left( S_0 - {S_f}^0_{N-1} \right) \Delta t \] Therefore given either a flow or depth on timestep \(k\), the upstream boundary condition can be computed as long as the initial conditions are known. This is a notable improvement over the normal-depth assumption of the upstream boundary condition employed in the KWM. Flow can be routed through the downstream boundary by assuming the gradient in flow or water level between the downstream boundary and the nearest internal node is zero (i.e. \(Q^k_N = Q^k_{N-1}\) or \(y^k_N = y^k_{N-1}\)). This results in “smearing” the solution across the downstream boundary but is often still preferable to direct specification of flow. Specifying the downstream boundary as a constant water depth representing i.e. a lake or reservoir water level may also be appropriate under many circumstances. When flow is specified at e.g. the upstream boundary, flow depth and area are solved simultaneously using a Newton-Raphson scheme where \[ f(y_1^k) = Q_1^k - A_1^k \left(\phi_1^0 + \psi_2^0 y_1^k\right) = 0 \] and \[ \frac{df}{dy_1^k} = -\frac{dA}{dy}\bigg|_{y_1^k} \left( \phi_1^0 + \psi_2^0 A_1^k + y_1^k \right) \] Note that if \(Q_1^k = 0\) the flow depth \(y_1^k\) can be solved for directly, and if depth is supplied then the flow can be solved for directly. The solution method for the downstream boundary is analogous, noting that the sign of the second term in \(f(y^k_{N})\) and the corresponding term in its derivative are reversed.