13. Small Area Rainfall-Runoff¶
Course Website
Readings¶
Videos¶
Outline¶
Rational Method Background
Time of Concentration
Modified Rational Method Background
Modified Rational Method Hydrograph Generator
Rational Method¶
The rational method is probably applied the most often by hydraulic and drainage engineers to estimate design discharges for small drainage areas. These design discharges are used to size a variety of drainage structures for small undeveloped and developed watersheds throughout the United States.
The rational method (Kuichling 1889) is expressed as,
\(Q_p = m_0 C_{std} iA \)
where
\(Q_p\) is peak discharge at some point where flow is concentrated (an inlet to a storm sewer, a culvert, an outlet from a small watershed, … )
\(m_0\) is a dimensional conversion factor (\(\frac{1}{360} = 0.00278\) in SI units; \(1.008\) in English units).
\(C_{std}\) is a rational runoff coefficient (dimensionless) determined by the land-use characteristics in the watershed,
\(A\) is drainage area (hectares or acres), and
i is average intensity of rainfall (\(mm/h\) or \(in/h\)) of a specified frequency (probability) for a duration equal to a characteristic time, \(T_c\), of the drainage area.
In the U.S., the customary units for the rational method are cubic feet per second (cfs) for \(Q\), inches per hour (in/hr) for \(i\), and acres for \(A\). To be dimensionally consistent, a conversion factor of 1.0083 should be included to convert acre-inches per hour into cubic feet per second; however, this factor is generally neglected.
In this document, \(C_{std}\) is the standard rational runoff coefficient that relates the ratio of input volume rate \(iA\) to the output volume rate \(Q_p\).
For development of the rational method, it is assumed that:
The discharge concentrates/collects at the point of interest
The rainfall is uniform over the drainage area,
The peak rate of runoff can be reflected by the rainfall intensity averaged over a time period equal to the characteristic time3 of the drainage area,
The relative frequency (probability) of runoff is the same as the relative frequency (probability) of the rainfall used in the equation4,
The above formula implies that the peak discharge occurs when the entire area is contributing flow to the drainage outlet, that is, the peak flow will occur at the characteristic time Tc after the start of uniform rainfall. A uniform rainfall of a longer duration than Tc will not produce a greater peak flow but will only lengthen the discharge period, and
All runoff generation processes are incorporated into the runoff coefficient.
The conceptual runoff generation mechanism is illustrated in the Figure below for a continuous rainfall where discharge at the point of interest (watershed outlet) increases until an equilibrium value is reached where the excess rainfall rate and the discharge per unit area become equal. This figure in particular illustrates the fifth assumption, that is that rainfall over a period longer than \(T_c\) has no effect on the discharge in the rational method model.
For small urban drainage designs, such as storm drains, the rational method is the common method for peak flow estimation in the United States (McPherson, 1969) despite criticism for over-simplified assumptions. The widespread use of the rational method can be explained by its simplicity, entrenchment in practice, extensive coverage in the literature, and lack of comparable simple-to-use alternatives (Haan and others, 1994).
The applicable area (over which the method can be applied) is generally restricted to less than one square mile (e.g. FHWA (1980)), and in urban jurisdictions to areas to less than 20 acres (Poertner, 1974), yet the idea of a runoff coefficient could certainly be extended to large basins
Note
In this context these coefficients are not the same as the rational runoff coefficient, hence the use of the jargon “rational runoff coefficient”).
From inspection of the equation, it is evident that \(C\) is an expression of proportionality between rainfall intensity and peak discharge (flow rate). The theoretical range of values for \(C\) is between 0 and 1. The typical whole watershed \(C\) values (that is, \(C\) values representing the integrated effects of various surfaces in the watershed and other watershed properties) are listed for different general land-use conditions in various design manuals and textbooks.
An on-line \(Q_p\) calculator has links to one such table.
The Texas Hydraulic Design Manual contains a useful discussion on appliciability and use of the Rational Method in drainage design.
Time of Concentration¶
The time of concentration is the crucial element of the Rational Equation (notably actually absent in an explicit sense from the equation).
The value of \(T_C\) is important in rational method for estimating rainfall intensity.
It is also used in many other hydrologic models to quantify the watershed response time.
Time of concentration \(T_C\) is the time required for an entire watershed to contribute to runoff at the point of interest for hydraulic design. It is calculated as the time for runoff to flow from the most hydraulically remote point of the drainage area to the point under investigation.
Travel time and \(T_C\) are functions of length and velocity for a particular watercourse.
A long but steep flow path with a high velocity may actually have a shorter travel time than a short but relatively flat flow path.
There may be multiple paths to consider in determining the longest travel time.
The designer must identify the flow path along which the longest travel time is likely to occur.
Various Methods to Estimate \(T_C\) include:
CMM pp. 500-501 has several formulas.
HDS-2 pp. 2-21 to 2-31 has formulas and examples.
LS pp. 196-198 has several formulas.
Some simple useful methods are examined in
The tools referenced in the above document are located below:
NRCS Upland (uses the graph pg 720 of Gupta). NRCS-Upland.xls; NRCS-Upland.xlsx
Kerby-Kirpich Kerby-Kirpich.xls;Kerby-Kirpich.xlsx
NRCS Velocity TXDOT-TIME-OF-CONCENTRATION-NRCS.xlsx
Modified Rational Method¶
The rational method is used to estimate peak discharges for sizing drainage structures, such as storm drains and culverts. The modified rational method (MRM) is an extension of the rational method to produce simple runoff hydrographs. The MRM is often called the rational hydrograph method. Application of the MRM produces a runoff hydrograph and runoff volume in contrast to application of the rational method, which produces only a peak design discharge (Qp).
The hydrograph developed from application of the MRM is a special case of the unit hydrograph method and is sometimes termed the modified rational unit hydrograph (MRUH); as a unit hydrograph, the MRUH can be applied to nonuniform rainfall distributions. Furthermore, the MRUH can be used on watersheds with drainage areas in excess of the typical limit for application of the rational method. Application of the MRUH method involves two steps: (1) determination of rainfall loss using rational method concept, that is, use of the runoff coefficient, and (2) determination of the MRUH using drainage area (A) and time of concentration (Tc) as input parameters, in addition to applying the procedure of unit hydrograph convolution.
Tc and runoff coefficients, C, can be estimated by a variety of methods.
Modified Rational Method Hydrograph Generator¶
This script performs discrete convolution to generate a direct runoff hydrograph from a hyetograph for a drainage area using the modified rational method unit-hydrograph approach (cite).
The direct runoff hydrograph is computed using a convolution integral:
where
\(p(t)\) is the excess rainfall hyetograph
\(u(t)\) is the drainage area response kernel (a unit hydrograph)
\(Q(t)\) is the direct runoff hydrograph
The response kernel for the modified rational method is
where
\(A\) is the contributing drainage area
\(T_c\) is the time of concentration
The excess rainfall hyetograph is obtained from the precipitation input signal as
where
\(C\) is the rational equation runoff coefficient
\(P(t)\) is a rainfall hyetograph (design storm)
The example script below illustrates the calculations for an NRCS Type 2 design storm, the other design storms are included and a simple change in storm type in the interp1d(minutes, type2, kind='linear')
function call (i.e. change type2 to another type in the program). Alternatively the analyst could supply any hyetograph they choose, but would have to fuss a bit with the array lengths.
The script has several prototype functions:
Convolve
is the discrete convolution integrator
kernel
is the \(u(t)\) kernel function above
ModRat
is the function that actually computes the time-shifted response kernel, scales inputs and outputs to produce dimensional outputs
After these prototype functions is a block that generates an input excess rainfall hyetograph. The next block is the input block, the actual function call to ModRat
, some mass balance summary calculations.
Finally the plotting section prepares graphical output, reports the inputs, summary values in the chart title, and then charts the input hyetograph (an excess hyetograph, losses are already removed), and the direct runoff hydrograph.
###### INPUT BLOCK ############################################
PT = 6.96 # Total storm depth in inches #####INPUT VALUE
area= 181 # Drainage area in acres #####INPUT VALUE
C = 0.65 # Runoff coefficient #####INPUT VALUE
Tc = 66.0 # Time of concentration in minutes #####INPUT VALUE
hyetType = 'type2' #####INPUT VALUE
# Design storm options are: 'type1','type1A','type2','type3','user'
# need to manually insert user hyetograph in the Hydrograph Engine section
###############################################################
# Convolution Engine
#############################################
def Convolve(duration, excitation, kernel):
response = [0 for i in range(duration)] # populate response vector with zeros
# response = direct runoff hydrograph (unscaled)
# excitation = input rate in length per time
# kernel = unit response
for i in range(duration):
for j in range(i,duration-1):
response[j]=excitation[i]*kernel[(j-i)+1]+response[j]
return(response)
#############################################
# Kernel Engine
#############################################
def kernel(time,area,tc):
# area = drainage area (in acres)
# tc = time of concentration (in minutes)
if time > tc:
kernel=0.0
else:
kernel=area/tc
return(kernel)
##############################################
# Modified Rational Convolution
#############################################
def ModRat(area,runoff_coefficient,precipitation,time,Tc):
excess=[0 for i in range(len(precipitation))]
flow=[0 for i in range(len(precipitation))]
# Generate Excess Rainfall
for i in range(len(precipitation)):
excess[i]=runoff_coefficient*precipitation[i]
# Generate Unitgraph for Rational Method
# unitgraph<-(sapply(time,kernel,area,Tc))/sum(sapply(time,kernel,area,Tc));
unitgraph=[0 for i in range(len(precipitation))] # start with zeroes
accumulator=0.0
for i in range(len(precipitation)):
unitgraph[i] = kernel(time[i],area,Tc)
accumulator=accumulator+unitgraph[i]
# now rescale each by the accumulator
for i in range(len(precipitation)):
unitgraph[i] = unitgraph[i]/accumulator
# Apply discrete convolution
flow=Convolve(len(excess),excess,unitgraph)
flow = [area*(i) for i in flow]
return(flow)
###############################################
# Hyetograph Engine
###############################################
# SCS Type Curves
hour = [0,2,4,6,7,8,8.5,9,9.5,9.75,10,10.5,11,11.5,11.75,12,12.5,13.0,13.6,14,16,20,24,48]
minutes = [i*60 for i in hour]
type1 = [0,0.035,0.076,0.125,0.156,0.194,0.219,0.254,0.303,0.362,0.515,0.583,0.624,0.654,0.669,0.682,0.706,0.727,0.748,0.767,0.83,0.926,1,1]
type1A = [0,0.05,0.116,0.206,0.268,0.425,0.48,0.52,0.55,0.564,0.577,0.601,0.624,0.645,0.655,0.664,0.683,0.701,0.719,0.736,0.8,0.906,1,1]
type2 = [0,0.022,0.048,0.08,0.098,0.12,0.133,0.147,0.163,0.172,0.181,0.204,0.235,0.283,0.357,0.663,0.735,0.772,0.799,0.82,0.88,0.952,1,1]
type3 = [0,0.02,0.043,0.072,0.089,0.115,0.13,0.148,0.167,0.178,0.189,0.216,0.25,0.298,0.339,0.5,0.702,0.751,0.785,0.811,0.886,0.957,1,1]
usertime = [0,7, 8, 9,9.3333, 10, 24, 48]
userdepth = [0,0,0.4285,0.8571, 1.0,1.0,1.0,1.0]
from scipy.interpolate import interp1d
if hyetType == 'type1':
f = interp1d(minutes, type1, kind='linear') #Design storm options are: 'type1','type1A','type2','type3'
elif hyetType == 'type1A':
f = interp1d(minutes, type1A, kind='linear') #Design storm options are: 'type1','type1A','type2','type3'
elif hyetType == 'type2':
f = interp1d(minutes, type2, kind='linear') #Design storm options are: 'type1','type1A','type2','type3'
elif hyetType == 'type3':
f = interp1d(minutes, type3, kind='linear') #Design storm options are: 'type1','type1A','type2','type3'
elif hyetType == 'user':
minutes = [i*60 for i in usertime]
f = interp1d(minutes, userdepth, kind='linear') #Design storm options are: 'type1','type1A','type2','type3'
#
t24 = [float(i) for i in range(2881)] # time in minutes
d24 = f(t24) # cumulative proportional depths - difference to get rates
d24 =[PT*i for i in d24] # scale to total depth
r24 = [0 for i in range(len(d24))] # create destination
r24[0] = d24[0]
for i in range(1, len(d24)):
r24[i] = d24[i] - d24[i-1] # this will be inches/minute
r24[i]=r24[i]*60 # inches per hour
#############################################
# Build direct runoff hydrograph
#############################################
result = ModRat(area,C,r24,t24,Tc)
## Compute summary values
peakQ = max(result)
## Mass balances
totalQ = sum(result)*60/43560 # area under red curve == volume of discharge
totalR = C*d24[-1]*(1/12)*area
#adjust = totalR/totalQ
#totalQ=totalQ*adjust
massE = (totalR-totalQ)/totalR
#############################################
# Graphics engine
#############################################
xlow = -0
xhigh = 2880
import matplotlib.pyplot as plt # the python plotting library
# Plot script adapted from
plottitle ='Direct Runoff Hydrograph by Modified Rational Method Discrete Convolution\n \n'
if hyetType == 'type1':
plottitle = plottitle + 'Hyetograph Type: ' + 'SCS Type 1 Design Storm\n'
elif hyetType == 'type1A':
plottitle = plottitle + 'Hyetograph Type: ' + 'SCS Type 1A Design Storm\n'
elif hyetType == 'type2':
plottitle = plottitle + 'Hyetograph Type: ' + 'SCS Type 2 Design Storm\n'
elif hyetType == 'type3':
plottitle = plottitle + 'Hyetograph Type: ' + 'SCS Type 3 Design Storm\n'
elif hyetType == 'user':
plottitle = plottitle + 'Hyetograph Type: ' + 'User Supplied Design Storm\n'
plottitle = plottitle + 'Hydrograph Type: ' + 'Modified Rational\n'
plottitle = plottitle + 'Contributing Drainage Area: ' + repr(area) + ' acres\n'
plottitle = plottitle + 'Rainfall Storm Depth: ' + repr(round(PT,2)) + ' inches\n'
plottitle = plottitle + 'Runoff Coefficient: ' + repr(C) +'\n'
plottitle = plottitle + 'Time of Concentration: ' + repr(Tc) + ' minutes\n'
plottitle = plottitle + 'Peak Discharge: ' + repr(round(peakQ,1)) + ' cfs\n'
plottitle = plottitle + 'Total Discharge (Area under red curve): ' + repr(round(totalQ,1)) + ' acre-feet\n'
plottitle = plottitle + 'Total Excess Rain (Area under blue curve): ' + repr(round(totalR,1)) + ' acre-feet\n'
plottitle = plottitle + 'Mass Balance Relative Error : ' + repr(round(100*massE,2)) + ' percent\n'
# Create a figure and axis object
fig, ax1 = plt.subplots(figsize = (10,10))
# Create the first plot on the left y-axis
ax1.step(t24, r24, color='blue', label='Intensity')
ax1.set_xlabel('Time (minutes)')
ax1.set_ylabel('Intensity (in/hr)')
# Create a second axis object for the right y-axis
ax2 = ax1.twinx()
# Create the second plot on the right y-axis
ax2.step(t24, result, color='red', label='Discharge')
ax2.set_ylabel('Discharge (cfs)')
# Add legend and show the plot
ax1.legend(loc='upper left')
ax2.legend(loc='upper right')
plt.xlim([xlow,xhigh])
plt.grid(b=True, which='major', axis='y')
plt.title(plottitle)
plt.show()