Note
This page was generated from a jupyter notebook.
Using the ChiFinder Component¶
The ChiFinder
component creates a map of the \(\chi\) drainage network index from a digital elevation model. The \(\chi\) index, described by Perron and Royden (2013), is a function of drainage area, \(A\), and elevation, \(\eta\):
\begin{equation} \chi = \int\limits_{x_b}^{x} \left(\frac{A_0}{A(x)}\right)^\theta dx \end{equation}
where \(x_b\) is the location of the outlet of a watershed of interest, \(x\) is a position on a channel somewhere upstream, \(A_0\) is a drainage area scale, and \(\theta\) is the concavity index parameter, often taken to be \(\approx\) 0.5.
This tutorial shows briefly how to use the ChiFinder
on natural or synthetic data.
Imports and inline docs¶
First, import what we’ll need.
[ ]:
import numpy as np
from landlab import RasterModelGrid
from landlab.components import ChiFinder, FlowAccumulator
from landlab.io import esri_ascii
The docstring describes the component and provides some simple examples.
[ ]:
print(ChiFinder.__doc__)
Example¶
In this example, we read in a small digital elevation model (DEM) from NASADEM for an area on the Colorado high plains (USA) that includes a portion of an escarpment along the west side of a drainage known as West Bijou Creek (see Rengers & Tucker, 2014).
The DEM file is in ESRI Ascii format, but is in a geographic projection, with horizontal units of decimal degrees. To calculate slope gradients properly, we’ll first read the DEM into a Landlab grid object that has this geographic projec. Then we’ll create a second grid with 30 m cell spacing (approximately equal to the NASADEM’s resolution), and copy the elevation field from the geographic DEM. This isn’t a proper projection of course, but it will do for purposes of this example.
[ ]:
# read the DEM
with open("west_bijou_escarpment_snippet.asc") as fp:
grid_info, data = esri_ascii.lazy_load(fp, name="topographic__elevation", at="node")
grid = RasterModelGrid(grid_info.shape, xy_spacing=30.0)
grid.add_field("topographic__elevation", data, at="node")
[ ]:
grid.imshow(data, colorbar_label="Elevation (m)")
The ChiFinder
needs to have drainage areas pre-calculated. We’ll do that with the FlowAccumulator
component. We’ll have the component do D8 flow routing (each DEM cell drains to whichever of its 8 neighbors lies in the steepest downslope direction), and fill pits (depressions in the DEM that would otherwise block the flow) using the LakeMapperBarnes
component. The latter two arguments below tell the lake mapper to update the flow directions and drainage areas after filling the pits.
[ ]:
fa = FlowAccumulator(
grid,
flow_director="FlowDirectorD8", # use D8 routing
depression_finder="LakeMapperBarnes", # pit filler
method="D8", # pit filler use D8 too
redirect_flow_steepest_descent=True, # re-calculate flow dirs
reaccumulate_flow=True, # re-calculate drainagea area
)
fa.run_one_step() # run the flow accumulator
grid.imshow(
np.log10(grid.at_node["drainage_area"] + 1.0), # log10 helps show drainage
cmap="Blues",
colorbar_label="Log10(drainage area (m2))",
)
Now run the ChiFinder
and display the map of \(\chi\) values.
[ ]:
cf = ChiFinder(
grid,
reference_concavity=0.5,
min_drainage_area=1.0,
clobber=True,
)
cf.calculate_chi()
grid.imshow(
grid.at_node["channel__chi_index"], cmap="viridis", colorbar_label="Chi index"
)
References¶
Perron, J., Royden, L. (2012). An integral approach to bedrock river profile analysis Earth Surface Processes and Landforms 38(6), 570-576. https://dx.doi.org/10.1002/esp.3302
Rengers, F. K., & Tucker, G. E. (2014). Analysis and modeling of gully headcut dynamics, North American high plains. Journal of Geophysical Research: Earth Surface, 119(5), 983-1003. https://doi.org/10.1002/2013JF002962