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