Manning's Equation for Open Channel Flow in QUAL2K

QUAL2K computes the velocity, depth, and cross-sectional area of each reach using either Manning's equation or power-law rating curves, as described in the EPA QUAL2K technical documentation. Manning's equation is the default and most commonly used method for natural streams with known geometry. The computed hydraulic parameters feed directly into the reaeration coefficient and flow routing calculations.

Manning's Equation

Manning's equation relates the flow discharge QQ (m³/s) to the channel geometry and roughness:

Q=1nAR2/3S1/2Q = \frac{1}{n} \cdot A \cdot R^{2/3} \cdot S^{1/2}

Where:

  • nn — Manning's roughness coefficient (dimensionless)
  • AA — cross-sectional area of flow (m²)
  • R=A/PR = A / P — hydraulic radius (m)
  • PP — wetted perimeter (m)
  • SS — channel bed slope (m/m)

Trapezoidal Cross-Section Geometry

QUAL2K models the channel as a trapezoidal cross-section with a flat bottom of width BB and two (potentially different) side slopes ss1ss_1 and ss2ss_2:

For a given depth of flow yy:

A=By+ssˉy2A = B \cdot y + \bar{ss} \cdot y^2

where ssˉ=(ss1+ss2)/2\bar{ss} = (ss_1 + ss_2) / 2 is the average side slope.

P=B+y(1+ss12+1+ss22)P = B + y \left( \sqrt{1 + ss_1^2} + \sqrt{1 + ss_2^2} \right)

Newton-Raphson Depth Solver

Given a known discharge QQ, the depth yy must be found iteratively. QUAL2K uses the Newton-Raphson method to solve:

f(y)=1nA(y)R(y)2/3S1/2Q=0f(y) = \frac{1}{n} \cdot A(y) \cdot R(y)^{2/3} \cdot S^{1/2} - Q = 0

The derivative is:

f(y)=S1/2n[53TR2/323R5/3dPdy]f'(y) = \frac{S^{1/2}}{n} \left[ \frac{5}{3} T \cdot R^{2/3} - \frac{2}{3} R^{5/3} \cdot \frac{dP}{dy} \right]

where T=B+(ss1+ss2)yT = B + (ss_1 + ss_2) \cdot y is the top width and dP/dy=1+ss12+1+ss22dP/dy = \sqrt{1 + ss_1^2} + \sqrt{1 + ss_2^2}.

The iteration starts at y0=0.5y_0 = 0.5 m and converges in 5–10 iterations for typical channels. The update rule is:

yk+1=ykf(yk)f(yk)y_{k+1} = y_k - \frac{f(y_k)}{f'(y_k)}

Derived Quantities

Once the depth yy is known, the remaining hydraulic parameters follow directly:

U=QA(velocity, m/s)U = \frac{Q}{A} \quad \text{(velocity, m/s)}ttravel=ALQ86,400(travel time, days)t_{travel} = \frac{A \cdot L}{Q \cdot 86{,}400} \quad \text{(travel time, days)}

where LL is the reach length in meters.

Rating Curve Alternative

When rating curve coefficients are provided, QUAL2K uses power-law relationships instead of Manning's equation:

U=α1Qβ1U = \alpha_1 \cdot Q^{\beta_1}H=α2Qβ2H = \alpha_2 \cdot Q^{\beta_2}

The cross-sectional area is then A=Q/UA = Q / U and the width is B=A/HB = A / H. This method is used when field-measured rating curves are available.

Typical Manning's n Values

Manning's roughness coefficients for natural streams

Channel Typen (minimum)n (typical)n (maximum)
Clean, straight, full stage0.0250.0300.033
Clean, winding, some pools0.0330.0400.045
Sluggish, weedy, deep pools0.0500.0700.080
Very weedy, heavy brush0.0750.1000.150
Mountain streams, cobbles0.0300.0500.070
Mountain streams, boulders0.0400.0700.100
Floodplain, pasture0.0250.0350.050
Floodplain, heavy timber0.1000.1200.160

Python Implementation

pythonhydraulics.py — Newton-Raphson depth solver
def calculate_hydraulics(reach, geo_method):
    q_s = reach.get('q', 0)  # Flow in m³/s
    n = reach.get('nm', 0.03)
    s = reach.get('s', 0.0001)
    bb = reach.get('BB', 1.0)
    ss1 = reach.get('SS1', 0.0)
    ss2 = reach.get('SS2', 0.0)
    ss_avg = (ss1 + ss2) / 2.0

    # Newton-Raphson iteration for depth y
    y = 0.5  # initial guess (meters)
    for _ in range(30):
        area = bb * y + ss_avg * (y ** 2)
        perim = bb + y * (sqrt(1 + ss1**2) + sqrt(1 + ss2**2))
        radius = area / perim
        f = (1/n) * area * radius**(2/3) * s**0.5 - q_s
        top_width = bb + (ss1 + ss2) * y
        df_dy = (1/n) * s**0.5 * (
            (5/3) * top_width * radius**(2/3) -
            (2/3) * radius**(5/3) * (sqrt(1+ss1**2) + sqrt(1+ss2**2))
        )
        dy = f / df_dy
        y = y - dy
        if abs(dy) < 1e-7:
            break