2.0.0b10
catchment modelling framework
Loading...
Searching...
No Matches
Surface runoff

next...

Surface runoff

Surface water storage

Cells can own a distinct storage for surface water, and usually this storage should exist. However, water that does not infiltrate directly might be routed to an outlet (model boundary), a river (see later part of the tutorial) or to the surface water of another cell.

The surface water of a cell has the class SurfaceWater, and can either be created directly withe the cell:

cell = project.NewCell(x=0,y=0,z=0,area=1000,with_surfacewater=True)

or afterwards, if the cell has not been created with surface water

cell = project.NewCell(x=0,y=0,z=0,area=1000)
cell.surfacewater_as_storage()

To route the water to the target, one can use conceptual connections like the WaterbalanceFlux, if you want to ensure the surfacewater to be empty at all time, the generic PowerLawConnection for or the KinematicSurfaceRunoff for a more "physical" approach. This type of connection is deemed to be the "normal" case and the SurfaceWater exposes some properties to be used by that connection.

Using a diffusive wave, where sinks can fill up and water flows over the topographic gradient, is not numerically challenging. There are solutions in cmf but they are beyond the scope of this tutorial. See the demo file darcy_plain and parkinglot for examples.

Kinematic surface runoff

Surface runoff in cmf is usually modelled using the kinematic wave approximation of the St. Vernant equation for sheet flow using Manning friction loss:

\[ [q|= d\ w\ d^{2/3} \frac{\sqrt{\tan \beta}}{n} 86400 \frac{sec}{day} \]

]

where: - \(q\) is the surface flow in \(\frac{m^3}{day}\) - \(d\) is the "active" water depth in \(m\) - \(w\) is the width of the sheet flow - \(\tan \beta\) is the topographic slope - \(n\) is the Manning roughness

The "active" water depth is the average water depth where runoff starts. The idea behind a passive and an active water depth is, that prior to runof subscale sinks need to be filled up in form of puddles. Only when the puddles are filled, the runoff starts. The SurfaceWater storage has a property puddledepth to characterize the average water depth needed to fill up the puddles. If runoff starts, when 20% of the surface is covered by (on average) 1cm deep puddles, the puddledepth is \(0.01m \cdot 0.2 = 0.002m\). The property nManning of the SurfaceWater is also used.

Example: A simple over flow routing to a boundary condition

import cmf
from numpy import transpose
from pylab import plot,show,subplot
# Create cell with 1000m2 and surface water storage
c = p.NewCell(0,0,1,1000,True)
# Set puddle depth to 2mm
c.surfacewater.puddledepth = 0.002
# Add a thick layer, low conductivity. Use Green-Ampt-Infiltration
c.add_layer(0.1, cmf.VanGenuchtenMualem(Ksat=0.1))
c.install_connection(cmf.GreenAmptInfiltration)
# Create outlet, 10 m from cell center, 1m below cell
outlet = p.NewOutlet('outlet',10,0,0)
# Create connection, distance is calculated from position
con = cmf.KinematicSurfaceRunoff(c.surfacewater,outlet,flowwidth=10)
# set rainfall, a good shower to get surface runoff for sure (100mm/day)
c.set_rainfall(100.)
# Create a solver
solver = cmf.CVodeKrylov(p,1e-8)
# Calculate results
Vsoil, Vsurf, qsurf,qinf = transpose([(c.layers[0].volume, c.surfacewater.volume, outlet(t), c.layers[0](t))
for t in solver.run(cmf.Time(1,1,2012),cmf.Time(2,1,2012),cmf.min)])
# Present results
ax1=subplot(211)
plot(Vsurf,label='Surface')
plot(Vsoil,label='Soil')
ylabel('Water content in mm')
legend(loc=0)
subplot(212,sharex=ax1)
plot(qsurf,label='Surface')
plot(qinf,label='Soil')
ylabel('Flux in mm/day')
xlabel('Time in minutes')
legend(loc=0)
The study area, holding all cells, outlets and streams.
Definition project.h:53