Mark Breunig
The Unit Hydrograph WATR 789
The Unit Hydrograph
Mark Breunig
WATR 789, Advanced Hydrology
Devolution and convolution are important procedures associated with the unit hydrograph. Devolution is the process of generating a unit hydrograph from an observed storm water response, while convolution involves using a unit hydrograph to predict a storm response.
The unit hydrograph method relies on several assumptions. It assumes 1 inch of spatially and temporally uniform excess precipitation over a given duration.
Problem 9.39 (McCuen)
Figure 1. Inflection point identification using a semi-log plot (A) and baseflow-direct discharge separation using the constant slope method (B). (USGS Site 07152500, April 9-11, 2008 event).
Figure 2. Direct discharge storm response. (USGS Site 07152500 April 9-11, 2008 event).
Figure 3. Unit Hydrograph derived by dividing the observed direct discharge (Figure 2) by the depth of runoff (also known as the rainfall excess) = 0.016 in.
Figure 4. Unit Hydrograph derived by using the following devolution method.
(i=ordinate number, n=total number of precipitation observations, U=unit hydrograph ordinate (cfs), P = precipitation (inches), and Q=observed direct discharge). See Appendix A for details.
Figure 5. Unit Hydrograph (Figure 4 method), observed discharge, and direct discharge.
Table 1. Summary of parameters relating to unit hydrograph.
I have included Table 1 in order to trouble shoot the potential source of error associated with Figure 3. The values of this UH were so large, the observed discharge and direct discharge were not distinguishable on the same graph. Due to this, the method used in Figure 4 was used to for comparison purposes in Figure 5. The VBA code found in Appendix A was used to calculate the ordinates displayed in Figure 4. Although inferior to other more advanced programs available, it has potential to be more powerful and flexible upon further revision and enhancement.
Appendix A – Visual Basic for Application code used in Excel
Sub Devolution()
'Declare variables
Dim Qcount As Integer
Dim Pcount As Integer
Dim Qrange As Range
Dim Prange As Range
'InputBox - Define Qdirectheader
Set Qdirectheader = Application.InputBox _
(prompt:="Please input the location of the Qdirect Header", Type:=8)
'go to the Qdirectheader
Qdirectheader.Activate
'select the Qrange
ActiveCell.Offset(1, 0).Range("A1").Select
Range(Selection, Selection.End(xlDown)).Select
'set the Qrange
Qcount = Selection.Count
Set Qrange = Selection
'InputBox - Define Precipheader
Set Precipheader = Application.InputBox _
(prompt:="Please input the location of the Precip Header", Type:=8)
Precipheader.Activate
'select the Precipheader
ActiveCell.Offset(1, 0).Range("A1").Select
Range(Selection, Selection.End(xlDown)).Select
'set the Prange
Pcount = Selection.Count
Set Prange = Selection
'Get Pn values (needs to be more flexible)
Precipheader.Activate
ActiveCell.Offset(1, 0).Range("A1").Select
Set P1 = ActiveCell
ActiveCell.Offset(1, 0).Range("A1").Select
Set P2 = ActiveCell
ActiveCell.Offset(1, 0).Range("A1").Select
Set P3 = ActiveCell
ActiveCell.Offset(1, 0).Range("A1").Select
Set P4 = ActiveCell
ActiveCell.Offset(1, 0).Range("A1").Select
Set P5 = ActiveCell
'MsgBox P1 & " " & P2 & " " & P3 & " " & P4 & " " & P5
'InputBox - Define UH Q output location
Set UHordinateheader = Application.InputBox _
(prompt:="Where do you want the output values?", Type:=8)
UHordinateheader.Activate
ActiveCell.FormulaR1C1 = "UH Q"
ActiveCell.Font.Bold = True
'Start the Routine (perhaps there is a more elegant method?)
For Counter = 1 To Qcount
If Counter = 1 Then
Ui = Qdirectheader.Offset(Counter, 0) / P1
UHordinateheader.Offset(Counter, 0).FormulaR1C1 = Ui
P2 = 0
P3 = 0
P4 = 0
P5 = 0
ElseIf Counter = 2 Then
P3 = 0
P4 = 0
P5 = 0
Ui = (Qdirectheader.Offset(Counter, 0) - _
(P2 * UHordinateheader.Offset(Counter - 1, 0))) / P1
UHordinateheader.Offset(Counter, 0).FormulaR1C1 = Ui
ElseIf Counter = 3 Then
P4 = 0
P5 = 0
Ui = (Qdirectheader.Offset(Counter, 0) - _
(P3 * UHordinateheader.Offset(Counter - 2, 0)) - _
(P2 * UHordinateheader.Offset(Counter - 1, 0))) / P1
UHordinateheader.Offset(Counter, 0).FormulaR1C1 = Ui
ElseIf Counter = 4 Then
P5 = 0
Ui = (Qdirectheader.Offset(Counter, 0) - _
(P4 * UHordinateheader.Offset(Counter - 3, 0)) - _
(P3 * UHordinateheader.Offset(Counter - 2, 0)) - _
(P2 * UHordinateheader.Offset(Counter - 1, 0))) / P1
UHordinateheader.Offset(Counter, 0).FormulaR1C1 = Ui
ElseIf Counter >= 5 Then
Ui = ((Qdirectheader.Offset(Counter, 0) - _
(P5 * UHordinateheader.Offset(Counter - Pcount + 1, 0)) - _
(P4 * UHordinateheader.Offset(Counter - Pcount + 2, 0)) - _
(P3 * UHordinateheader.Offset(Counter - Pcount + 3, 0)) - _
(P2 * UHordinateheader.Offset(Counter - Pcount + 4, 0)))) / P1
UHordinateheader.Offset(Counter, 0).FormulaR1C1 = Ui
End If
Next
End Sub
3