Fluid Mechanics & Hydraulics
Open channel flow, pipe networks, and hydrology.
Fluid Mechanics & Hydraulics
Fluid mechanics and hydraulics form the scientific foundation for water resources engineering. Understanding fluid behavior is essential for designing water supply systems, storm drainage, irrigation networks, and hydraulic structures like dams and spillways.
Fluid Properties
Density and Specific Weight
Density (): Mass per unit volume
For water at 20°C: kg/m
Specific Weight (): Weight per unit volume
For water: kN/m
Viscosity
Dynamic Viscosity (): Resistance to shear
For water at 20°C: Pa·s
Kinematic Viscosity ():
For water at 20°C: m/s
Compressibility
Bulk Modulus ():
For water: GPa (nearly incompressible)
Fluid Statics
Pressure Variation with Depth
For incompressible fluid:
Pressure on Submerged Surfaces
Hydrostatic Force on Plane Surface:
Where is the depth to the centroid of the surface.
Center of Pressure:
Where is the moment of inertia about the centroidal axis.
Buoyancy
Archimedes' Principle:
Fluid Dynamics Fundamentals
Continuity Equation
For steady flow:
Mass flow rate:
Bernoulli's Equation
For steady, incompressible, frictionless flow:
Or in terms of head:
Where:
- = pressure head
- = velocity head
- = elevation head
Energy Equation
With head losses:
Where is the total head loss.
Momentum Equation
Pipe Flow
Reynolds Number
Flow regimes:
- Laminar:
- Transitional:
- Turbulent:
Head Losses
Major Losses (Friction):
Darcy-Weisbach equation:
Where is the Darcy friction factor.
For laminar flow:
For turbulent flow, use Moody diagram or Colebrook-White equation:
Minor Losses:
| Fitting | K |
|---|---|
| Entrance (sharp) | 0.5 |
| Entrance (rounded) | 0.04 |
| Exit | 1.0 |
| 90° elbow | 0.3-0.9 |
| Gate valve (open) | 0.2 |
| Check valve | 2.5 |
Hazen-Williams Equation
Empirical formula for water pipes:
Or for head loss:
Where is the Hazen-Williams coefficient (120-150 for new pipes).
Pipe Networks
Hardy Cross Method: For each loop:
Conservation laws:
- Continuity at nodes:
- Energy around loops:
Open Channel Flow
Channel Geometry
Hydraulic Radius:
Where = flow area, = wetted perimeter.
For rectangular channel:
For wide channel ():
Manning's Equation
Where:
- = Manning's roughness coefficient
- = channel slope
| Channel Type | n |
|---|---|
| Concrete (finished) | 0.012-0.014 |
| Concrete (unfinished) | 0.014-0.017 |
| Earth (clean) | 0.022-0.025 |
| Earth (with vegetation) | 0.030-0.035 |
| Natural streams | 0.030-0.070 |
Specific Energy
Critical Flow
At critical depth:
For rectangular channel:
Flow Classification
| Condition | Froude Number | Flow Type |
|---|---|---|
| Subcritical | Tranquil, deep, slow | |
| Critical | Transition | |
| Supercritical | Rapid, shallow, fast |
Hydraulic Jump
For rectangular channel:
Energy loss:
Hydrology Basics
Rational Method
Peak discharge for small watersheds:
Where:
- = peak discharge (m/s or cfs)
- = runoff coefficient
- = rainfall intensity for time =
- = drainage area
| Land Use | C |
|---|---|
| Pavement | 0.85-0.95 |
| Roofs | 0.75-0.95 |
| Lawns | 0.10-0.35 |
| Parks | 0.10-0.25 |
| Industrial | 0.50-0.90 |
Time of Concentration
Kirpich formula:
Where = length in meters, = slope, = minutes.
Intensity-Duration-Frequency (IDF)
Constants , , depend on location and return period.
Unit Hydrograph
Synthetic unit hydrograph peak:
Where:
- = peak discharge (m/s)
- = watershed area (km)
- = time to peak (hours)
Real-World Application: Storm Drainage Design
Designing a storm sewer system for an urban area.
Drainage Analysis Example
import math
# Watershed and design parameters
drainage_params = {
'area': 2.5, # hectares
'runoff_coeff': 0.75, # weighted average
'time_of_conc': 15, # minutes
'return_period': 10, # years
'pipe_slope': 0.005, # m/m
'manning_n': 0.013, # concrete pipe
}
# IDF curve parameters (example: i = a / (t + b)^c)
idf_params = {
'a': 2800,
'b': 10,
'c': 0.8
}
# Calculate rainfall intensity
tc = drainage_params['time_of_conc']
i = idf_params['a'] / (tc + idf_params['b'])**idf_params['c'] # mm/hr
# Convert to m/s
i_ms = i / (1000 * 3600)
# Calculate peak discharge using rational method
C = drainage_params['runoff_coeff']
A = drainage_params['area'] * 10000 # convert to m^2
Q = C * i_ms * A # m^3/s
print(f"Storm Drainage Design")
print(f"=" * 40)
print(f"\nWatershed Data:")
print(f" Area: {drainage_params['area']} hectares")
print(f" Runoff coefficient: {C}")
print(f" Time of concentration: {tc} minutes")
print(f"\nRainfall Analysis:")
print(f" Return period: {drainage_params['return_period']} years")
print(f" Intensity: {i:.1f} mm/hr")
print(f"\nPeak Discharge:")
print(f" Q = {Q:.3f} m^3/s = {Q*1000:.1f} L/s")
# Design pipe size using Manning's equation
# Q = (1/n) * A * R^(2/3) * S^(1/2)
# For circular pipe flowing full: A = pi*D^2/4, R = D/4
n = drainage_params['manning_n']
S = drainage_params['pipe_slope']
# Solve for diameter: D = (Q * n * 4^(5/3) / (pi * S^0.5))^(3/8) * (4/pi)^...
# Simplified: D = 1.33 * (n * Q / S^0.5)^(3/8)
D_calculated = 1.548 * (n * Q / S**0.5)**0.375 # meters
# Round up to standard size
standard_sizes = [0.300, 0.375, 0.450, 0.525, 0.600, 0.750, 0.900, 1.050, 1.200]
D_selected = min([d for d in standard_sizes if d >= D_calculated])
print(f"\nPipe Design:")
print(f" Calculated diameter: {D_calculated*1000:.0f} mm")
print(f" Selected diameter: {D_selected*1000:.0f} mm")
# Verify capacity
A_pipe = math.pi * D_selected**2 / 4
R_pipe = D_selected / 4
Q_capacity = (1/n) * A_pipe * R_pipe**(2/3) * S**0.5
print(f" Pipe capacity: {Q_capacity:.3f} m^3/s")
print(f" Utilization: {Q/Q_capacity*100:.1f}%")
# Calculate flow velocity
V = Q_capacity / A_pipe
print(f" Flow velocity: {V:.2f} m/s")
if 0.6 <= V <= 3.0:
print(f" Velocity: OK (self-cleaning and non-erosive)")
elif V < 0.6:
print(f" WARNING: Low velocity - sediment may deposit")
else:
print(f" WARNING: High velocity - erosion risk")
Your Challenge: Open Channel Design
Design a trapezoidal channel to carry a specified discharge.
Goal: Determine the optimal channel dimensions for minimum excavation (most efficient section).
Problem Setup
import math
# Channel requirements
channel_config = {
'discharge': 15.0, # m^3/s
'slope': 0.0015, # m/m
'manning_n': 0.025, # earthen channel
'side_slope': 2, # horizontal:vertical (2:1)
'freeboard': 0.5, # meters
}
# For most efficient trapezoidal section:
# R = y/2 (hydraulic radius = half the depth)
# b = 2y(sqrt(1+m^2) - m) where m = side slope
Q = channel_config['discharge']
n = channel_config['manning_n']
S = channel_config['slope']
m = channel_config['side_slope']
# Using Manning's equation and best hydraulic section relationships
# Q = (1/n) * A * R^(2/3) * S^(1/2)
# For best section: R = y/2, A = y^2(sqrt(1+m^2) + m)
# Solve for depth
# This requires iteration or closed-form solution for specific case
def calculate_channel_flow(y, b, m, n, S):
"""Calculate discharge for trapezoidal channel"""
A = (b + m * y) * y
P = b + 2 * y * math.sqrt(1 + m**2)
R = A / P
V = (1/n) * R**(2/3) * S**0.5
Q = A * V
return Q, V, A, P, R
# Iterate to find depth for best section
# Best section: b = 2y(sqrt(1+m^2) - m)
for y in [x * 0.1 for x in range(5, 50)]:
b_best = 2 * y * (math.sqrt(1 + m**2) - m)
Q_calc, V, A, P, R = calculate_channel_flow(y, b_best, m, n, S)
if Q_calc >= Q:
y_normal = y
b_normal = b_best
break
# Final dimensions
y_design = y_normal
b_design = b_normal
Q_actual, V_actual, A_actual, P_actual, R_actual = calculate_channel_flow(
y_design, b_design, m, n, S
)
# Add freeboard
y_total = y_design + channel_config['freeboard']
top_width = b_design + 2 * m * y_total
print(f"Trapezoidal Channel Design")
print(f"=" * 40)
print(f"\nDesign Requirements:")
print(f" Discharge: {Q} m^3/s")
print(f" Slope: {S}")
print(f" Manning's n: {n}")
print(f" Side slope: {m}:1 (H:V)")
print(f"\nOptimal Dimensions (Best Hydraulic Section):")
print(f" Bottom width: {b_design:.2f} m")
print(f" Normal depth: {y_design:.2f} m")
print(f" Total depth (with freeboard): {y_total:.2f} m")
print(f" Top width: {top_width:.2f} m")
print(f"\nHydraulic Properties:")
print(f" Flow area: {A_actual:.2f} m^2")
print(f" Wetted perimeter: {P_actual:.2f} m")
print(f" Hydraulic radius: {R_actual:.3f} m")
print(f" Velocity: {V_actual:.2f} m/s")
# Check Froude number
Fr = V_actual / math.sqrt(9.81 * y_design)
print(f" Froude number: {Fr:.3f} ({'Subcritical' if Fr < 1 else 'Supercritical'})")
# Cross-sectional area for excavation
excavation_area = (b_design + m * y_total) * y_total
print(f"\nExcavation:")
print(f" Cross-section area: {excavation_area:.2f} m^2 per meter length")
How would you modify the design if the channel must handle a range of flows while maintaining self-cleaning velocity?
ELI10 Explanation
Simple analogy for better understanding
Self-Examination
How does the Bernoulli equation relate pressure, velocity, and elevation in fluid flow?
What is the difference between laminar and turbulent flow, and how does Reynolds number characterize them?
How do you analyze flow in open channels using Manning's equation and the specific energy concept?
What methods are used to design pipe networks and calculate head losses?
How does the rational method estimate peak runoff for storm drainage design?