AreaSlopeTransporter: transport-limited model of transport, erosion, and deposition in a gridded river network#

class AreaSlopeTransporter(*args, **kwds)[source]#

Bases: Component

Model drainage network evolution for a network of transport-limited rivers in which sediment transport rate is calculated as a power-law function of drainage area and local streamwise slope gradient.

AreaSlopeTransporter is designed to operate together with a flow-routing component such as PriorityFloodFlowRouter, so that each grid node has a defined flow direction toward one of its neighbor nodes. Each core node is assumed to contain one outgoing fluvial channel, and (depending on the drainage structure) zero, one, or more incoming channels. These channels are treated as effectively sub-grid-scale features that are embedded in valleys that have a width of one grid cell. The rate of sediment transport out of a given node is calculated as a generic power function of drainage area, local slope, and a user-specified transport coefficient. Similar power-law formulations have been used, for example, by Willgoose et al. (1991a,b,c, and many papers following that use the SIBERIA model) and Howard (1994, in Water Resources Research).

Parameters:
  • grid (ModelGrid) – A Landlab model grid object

  • transport_coefficient (float (default 0.0055)) – Dimensional transport efficiency factor

  • area_exponent (float (default 1.4)) – Exponent on effective total discharge

  • slope_exponent (float (default 2.1)) – Exponent on local streamwise slope gradient

Examples

>>> from landlab import RasterModelGrid
>>> from landlab.components import FlowAccumulator
>>> grid = RasterModelGrid((3, 3), xy_spacing=1000.0)
>>> elev = grid.add_zeros("topographic__elevation", at="node")
>>> grid.status_at_node[grid.perimeter_nodes] = grid.BC_NODE_IS_CLOSED
>>> grid.status_at_node[5] = grid.BC_NODE_IS_FIXED_VALUE
>>> fa = FlowAccumulator(grid)
>>> fa.run_one_step()
>>> transporter = AreaSlopeTransporter(grid)
>>> for _ in range(200):
...     fa.run_one_step()
...     elev[grid.core_nodes] += 1.0
...     transporter.run_one_step(10000.0)
...
>>> int(round(elev[4] * 100))
1068

Initialize AreaSlopeTransporter.

__init__(grid, transport_coefficient=0.0055, area_exponent=1.4, slope_exponent=2.1)[source]#

Initialize AreaSlopeTransporter.

calc_sediment_rate_of_change()[source]#

Update the rate of thickness change of sediment at each core node.

Examples

>>> import numpy as np
>>> from landlab import RasterModelGrid
>>> from landlab.components import FlowAccumulator
>>> grid = RasterModelGrid((3, 4), xy_spacing=100.0)
>>> elev = grid.add_zeros("topographic__elevation", at="node")
>>> elev[:] = 0.01 * grid.x_of_node
>>> grid.status_at_node[grid.perimeter_nodes] = grid.BC_NODE_IS_CLOSED
>>> grid.status_at_node[4] = grid.BC_NODE_IS_FIXED_VALUE
>>> fa = FlowAccumulator(grid)
>>> fa.run_one_step()
>>> transporter = AreaSlopeTransporter(grid)
>>> transporter.calc_sediment_rate_of_change()
>>> np.round(transporter._sediment_outflux[4:7], 3)
array([ 0.   ,  0.365,  0.138])
>>> np.round(transporter._sediment_influx[4:7], 3)
array([ 0.365,  0.138,  0.   ])
>>> np.round(transporter._dzdt[5:7], 8)
array([ -2.26400000e-05,  -1.38200000e-05])
calc_transport_capacity()[source]#

Calculate and return bed-load transport capacity.

Calculation uses power-law approach, and provides volume per time rate.

Examples

>>> from landlab import RasterModelGrid
>>> from landlab.components import FlowAccumulator
>>> grid = RasterModelGrid((3, 3), xy_spacing=100.0)
>>> elev = grid.add_zeros("topographic__elevation", at="node")
>>> elev[3:] = 1.0
>>> fa = FlowAccumulator(grid)
>>> fa.run_one_step()
>>> transporter = AreaSlopeTransporter(grid)
>>> transporter.calc_transport_capacity()
>>> int(transporter._sediment_outflux[4] * 1000)
138
run_one_step(dt)[source]#

Advance solution by time interval dt.

Examples

>>> import numpy as np
>>> from landlab import RasterModelGrid
>>> from landlab.components import FlowAccumulator
>>> grid = RasterModelGrid((3, 4), xy_spacing=100.0)
>>> elev = grid.add_zeros("topographic__elevation", at="node")
>>> elev[:] = 0.01 * grid.x_of_node
>>> grid.status_at_node[grid.perimeter_nodes] = grid.BC_NODE_IS_CLOSED
>>> grid.status_at_node[4] = grid.BC_NODE_IS_FIXED_VALUE
>>> fa = FlowAccumulator(grid)
>>> fa.run_one_step()
>>> transporter = AreaSlopeTransporter(grid)
>>> transporter.run_one_step(10000.0)
>>> np.round(elev[4:7], 4)
array([ 0.    ,  0.7736,  1.8618])