Source code for umami.calculations.metric.hypsometric_integral
import numpy as np
from landlab.utils import get_watershed_mask
[docs]def hypsometric_integral(grid, outlet_id):
"""Calculate the hypsometric integral for the model grid.
The hypsometric integral :math:`I` is defined as
.. math::
I = \\frac{\\frac{1}{N} \\sum_{i=0}^{N}
\\left( z - \\min \\left( z\\right) \\right)}
{\\max \\left(z\\right) - \\min \\left( z \\right)}
Where :math:`z` is the set of elevation values, and :math:`N` is the number
of elevation values.
Parameters
----------
grid : Landlab model grid
outlet_id : int
Outlet id of the watershed.
Returns
-------
I : float
The hypsometric integral.
Examples
--------
First an example that only uses the ``hypsometric_integral`` function.
>>> from landlab import RasterModelGrid
>>> from landlab.components import FlowAccumulator
>>> from umami.calculations import hypsometric_integral
>>> grid = RasterModelGrid((10, 10))
>>> z = grid.add_zeros("node", "topographic__elevation")
>>> z += grid.x_of_node + grid.y_of_node
>>> fa = FlowAccumulator(grid)
>>> fa.run_one_step()
>>> hypsometric_integral(grid, 1)
0.5
Next, the same calculations are shown as part of an umami ``Metric``.
>>> from io import StringIO
>>> from umami import Metric
>>> file_like=StringIO('''
... hi:
... _func: hypsometric_integral
... outlet_id: 1
... ''')
>>> metric = Metric(grid)
>>> metric.add_from_file(file_like)
>>> metric.names
['hi']
>>> metric.calculate()
>>> metric.values
[0.5]
"""
# Get just those elevation values that are within the watershed
mask = get_watershed_mask(grid, outlet_id)
vals = grid.at_node["topographic__elevation"][mask]
# Get min and max
min_val = np.amin(vals)
max_val = np.amax(vals)
# Calc and return the hypsometric_integral
return np.mean(vals - min_val) / (max_val - min_val)