landlab.components.lateral_erosion package#

Submodules#

landlab.components.lateral_erosion.lateral_erosion module#

Grid-based simulation of lateral erosion by channels in a drainage network.

ALangston

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

Bases: Component

Laterally erode neighbor node through fluvial erosion.

Landlab component that finds a neighbor node to laterally erode and calculates lateral erosion. See the publication:

Langston, A.L., Tucker, G.T.: Developing and exploring a theory for the lateral erosion of bedrock channels for use in landscape evolution models. Earth Surface Dynamics, 6, 1-27, https://doi.org/10.5194/esurf-6-1-2018

Examples

>>> import numpy as np
>>> from landlab import RasterModelGrid
>>> from landlab.components import FlowAccumulator, LateralEroder
>>> np.random.seed(2010)

Define grid and initial topography

  • 5x4 grid with baselevel in the lower left corner

  • All other boundary nodes closed

  • Initial topography is plane tilted up to the upper right with noise

>>> mg = RasterModelGrid((5, 4), xy_spacing=10.0)
>>> mg.set_status_at_node_on_edges(
...     right=mg.BC_NODE_IS_CLOSED,
...     top=mg.BC_NODE_IS_CLOSED,
...     left=mg.BC_NODE_IS_CLOSED,
...     bottom=mg.BC_NODE_IS_CLOSED,
... )
>>> mg.status_at_node[1] = mg.BC_NODE_IS_FIXED_VALUE
>>> rand_noise = np.array(
...     [
...         [0.00436992, 0.03225985, 0.03107455, 0.00461312],
...         [0.03771756, 0.02491226, 0.09613959, 0.07792969],
...         [0.08707156, 0.03080568, 0.01242658, 0.08827382],
...         [0.04475065, 0.07391732, 0.08221057, 0.02909259],
...         [0.03499337, 0.09423741, 0.01883171, 0.09967794],
...     ]
... ).flatten()
>>> mg.at_node["topographic__elevation"] = (
...     mg.node_y / 10.0 + mg.node_x / 10.0 + rand_noise
... )
>>> U = 0.001
>>> dt = 100

Instantiate flow accumulation and lateral eroder and run each for one step

>>> fa = FlowAccumulator(
...     mg,
...     surface="topographic__elevation",
...     flow_director="FlowDirectorD8",
...     runoff_rate=None,
...     depression_finder=None,
... )
>>> latero = LateralEroder(mg, latero_mech="UC", Kv=0.001, Kl_ratio=1.5)

Run one step of flow accumulation and lateral erosion to get the dzlat array needed for the next part of the test.

>>> fa.run_one_step()
>>> mg, dzlat = latero.run_one_step(dt)

Evolve the landscape until the first occurence of lateral erosion. Save arrays volume of lateral erosion and topographic elevation before and after the first occurence of lateral erosion

>>> while min(dzlat) == 0.0:
...     oldlatvol = mg.at_node["volume__lateral_erosion"].copy()
...     oldelev = mg.at_node["topographic__elevation"].copy()
...     fa.run_one_step()
...     mg, dzlat = latero.run_one_step(dt)
...     newlatvol = mg.at_node["volume__lateral_erosion"]
...     newelev = mg.at_node["topographic__elevation"]
...     mg.at_node["topographic__elevation"][mg.core_nodes] += U * dt
...

Before lateral erosion occurs, volume__lateral_erosion has values at nodes 6 and 10.

>>> np.around(oldlatvol, decimals=0)
array([  0.,   0.,   0.,   0.,
         0.,   0.,  79.,   0.,
         0.,   0.,  24.,   0.,
         0.,   0.,   0.,   0.,
         0.,   0.,   0.,   0.])

After lateral erosion occurs at node 6, volume__lateral_erosion is reset to 0

>>> np.around(newlatvol, decimals=0)
array([  0.,   0.,   0.,   0.,
         0.,   0.,   0.,   0.,
         0.,   0.,  24.,   0.,
         0.,   0.,   0.,   0.,
         0.,   0.,   0.,   0.])

After lateral erosion at node 6, elevation at node 6 is reduced by -1.41 (the elevation change stored in dzlat[6]). It is also provided as the at-node grid field lateral_erosion__depth_increment.

>>> np.around(oldelev, decimals=2)
array([ 0.  ,  1.03,  2.03,  3.  ,
        1.04,  1.77,  2.45,  4.08,
        2.09,  2.65,  3.18,  5.09,
        3.04,  3.65,  4.07,  6.03,
        4.03,  5.09,  6.02,  7.1 ])
>>> np.around(newelev, decimals=2)
array([ 0.  ,  1.03,  2.03,  3.  ,
        1.04,  1.77,  1.03,  4.08,
        2.09,  2.65,  3.18,  5.09,
        3.04,  3.65,  4.07,  6.03,
        4.03,  5.09,  6.02,  7.1 ])
>>> np.around(dzlat, decimals=2)
array([ 0.  ,  0.  ,  0.  ,  0.  ,
        0.  ,  0.  , -1.41,  0.  ,
        0.  ,  0.  ,  0.  ,  0.  ,
        0.  ,  0.  ,  0.  ,  0.  ,
        0.  ,  0.  ,  0.  ,  0. ])

References

Required Software Citation(s) Specific to this Component

Langston, A., Tucker, G. (2018). Developing and exploring a theory for the lateral erosion of bedrock channels for use in landscape evolution models. Earth Surface Dynamics 6(1), 1–27. https://dx.doi.org/10.5194/esurf-6-1-2018

Additional References

None Listed

Parameters:
  • grid (ModelGrid) – A Landlab square cell raster grid object

  • latero_mech (string, optional (defaults to UC)) – Lateral erosion algorithm, choices are “UC” for undercutting-slump model and “TB” for total block erosion

  • alph (float, optional (defaults to 0.8)) – Parameter describing potential for deposition, dimensionless

  • Kv (float, node array, or field name) – Bedrock erodibility in vertical direction, 1/years

  • Kl_ratio (float, optional (defaults to 1.0)) – Ratio of lateral to vertical bedrock erodibility, dimensionless

  • solver (string) –

    Solver options:
    1. ’basic’ (default): explicit forward-time extrapolation. Simple but will become unstable if time step is too large or if bedrock erodibility is vry high.

    2. ’adaptive’: subdivides global time step as needed to prevent slopes from reversing.

  • inlet_node (integer, optional) – Node location of inlet (source of water and sediment)

  • inlet_area (float, optional) – Drainage area at inlet node, must be specified if inlet node is “on”, m^2

  • qsinlet (float, optional) – Sediment flux supplied at inlet, optional. m3/year

  • flow_accumulator (Instantiated Landlab FlowAccumulator, optional) – When solver is set to “adaptive”, then a valid Landlab FlowAccumulator must be passed. It will be run within sub-timesteps in order to update the flow directions and drainage area.

__init__(grid, latero_mech='UC', alph=0.8, Kv=0.001, Kl_ratio=1.0, solver='basic', inlet_on=False, inlet_node=None, inlet_area=None, qsinlet=0.0, flow_accumulator=None)[source]#
Parameters:
  • grid (ModelGrid) – A Landlab square cell raster grid object

  • latero_mech (string, optional (defaults to UC)) – Lateral erosion algorithm, choices are “UC” for undercutting-slump model and “TB” for total block erosion

  • alph (float, optional (defaults to 0.8)) – Parameter describing potential for deposition, dimensionless

  • Kv (float, node array, or field name) – Bedrock erodibility in vertical direction, 1/years

  • Kl_ratio (float, optional (defaults to 1.0)) – Ratio of lateral to vertical bedrock erodibility, dimensionless

  • solver (string) –

    Solver options:
    1. ’basic’ (default): explicit forward-time extrapolation. Simple but will become unstable if time step is too large or if bedrock erodibility is vry high.

    2. ’adaptive’: subdivides global time step as needed to prevent slopes from reversing.

  • inlet_node (integer, optional) – Node location of inlet (source of water and sediment)

  • inlet_area (float, optional) – Drainage area at inlet node, must be specified if inlet node is “on”, m^2

  • qsinlet (float, optional) – Sediment flux supplied at inlet, optional. m3/year

  • flow_accumulator (Instantiated Landlab FlowAccumulator, optional) – When solver is set to “adaptive”, then a valid Landlab FlowAccumulator must be passed. It will be run within sub-timesteps in order to update the flow directions and drainage area.

run_one_step_adaptive(dt=1.0)[source]#

Run time step with adaptive time stepping to prevent slope flattening.

run_one_step_basic(dt=1.0)[source]#

Calculate vertical and lateral erosion for a time period ‘dt’.

Parameters:

dt (float) – Model timestep [T]

landlab.components.lateral_erosion.node_finder module#

angle_finder(grid, dn, cn, rn)[source]#

Find the interior angle between two vectors on a grid.

Parameters:
  • grid (ModelGrid) – A landlab grid.

  • dn (int or array of int) – Node or nodes at the end of the first vector.

  • cn (int or array of int) – Node or nodes at the vertex between vectors.

  • rn (int or array of int) – Node or nodes at the end of the second vector.

Returns:

Angle between vectors (in radians).

Return type:

float or array of float

Examples

>>> import numpy as np
>>> from landlab import RasterModelGrid
>>> from landlab.components.lateral_erosion.node_finder import angle_finder
>>> grid = RasterModelGrid((3, 4))
>>> np.rad2deg(angle_finder(grid, 8, 5, 0))
90.0
>>> np.rad2deg(angle_finder(grid, (8, 9, 10, 6), 5, 6))
array([ 135.,   90.,   45.,    0.])
forty_five_node(donor, i, receiver, neighbors, diag_neigh)[source]#
ninety_node(donor, i, receiver, link_list, neighbors, diag_neigh)[source]#
node_finder(grid, i, flowdirs, drain_area)[source]#

Find lateral neighbor node of the primary node for straight, 45 degree, and 90 degree channel segments.

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

  • i (int) – node ID of primary node

  • flowdirs (array) – Flow direction array

  • drain_area (array) – drainage area array

Returns:

  • lat_node (int) – node ID of lateral node

  • radcurv_angle (float) – inverse radius of curvature of channel at lateral node

straight_node(donor, i, receiver, neighbors, diag_neigh)[source]#

Module contents#

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

Bases: Component

Laterally erode neighbor node through fluvial erosion.

Landlab component that finds a neighbor node to laterally erode and calculates lateral erosion. See the publication:

Langston, A.L., Tucker, G.T.: Developing and exploring a theory for the lateral erosion of bedrock channels for use in landscape evolution models. Earth Surface Dynamics, 6, 1-27, https://doi.org/10.5194/esurf-6-1-2018

Examples

>>> import numpy as np
>>> from landlab import RasterModelGrid
>>> from landlab.components import FlowAccumulator, LateralEroder
>>> np.random.seed(2010)

Define grid and initial topography

  • 5x4 grid with baselevel in the lower left corner

  • All other boundary nodes closed

  • Initial topography is plane tilted up to the upper right with noise

>>> mg = RasterModelGrid((5, 4), xy_spacing=10.0)
>>> mg.set_status_at_node_on_edges(
...     right=mg.BC_NODE_IS_CLOSED,
...     top=mg.BC_NODE_IS_CLOSED,
...     left=mg.BC_NODE_IS_CLOSED,
...     bottom=mg.BC_NODE_IS_CLOSED,
... )
>>> mg.status_at_node[1] = mg.BC_NODE_IS_FIXED_VALUE
>>> rand_noise = np.array(
...     [
...         [0.00436992, 0.03225985, 0.03107455, 0.00461312],
...         [0.03771756, 0.02491226, 0.09613959, 0.07792969],
...         [0.08707156, 0.03080568, 0.01242658, 0.08827382],
...         [0.04475065, 0.07391732, 0.08221057, 0.02909259],
...         [0.03499337, 0.09423741, 0.01883171, 0.09967794],
...     ]
... ).flatten()
>>> mg.at_node["topographic__elevation"] = (
...     mg.node_y / 10.0 + mg.node_x / 10.0 + rand_noise
... )
>>> U = 0.001
>>> dt = 100

Instantiate flow accumulation and lateral eroder and run each for one step

>>> fa = FlowAccumulator(
...     mg,
...     surface="topographic__elevation",
...     flow_director="FlowDirectorD8",
...     runoff_rate=None,
...     depression_finder=None,
... )
>>> latero = LateralEroder(mg, latero_mech="UC", Kv=0.001, Kl_ratio=1.5)

Run one step of flow accumulation and lateral erosion to get the dzlat array needed for the next part of the test.

>>> fa.run_one_step()
>>> mg, dzlat = latero.run_one_step(dt)

Evolve the landscape until the first occurence of lateral erosion. Save arrays volume of lateral erosion and topographic elevation before and after the first occurence of lateral erosion

>>> while min(dzlat) == 0.0:
...     oldlatvol = mg.at_node["volume__lateral_erosion"].copy()
...     oldelev = mg.at_node["topographic__elevation"].copy()
...     fa.run_one_step()
...     mg, dzlat = latero.run_one_step(dt)
...     newlatvol = mg.at_node["volume__lateral_erosion"]
...     newelev = mg.at_node["topographic__elevation"]
...     mg.at_node["topographic__elevation"][mg.core_nodes] += U * dt
...

Before lateral erosion occurs, volume__lateral_erosion has values at nodes 6 and 10.

>>> np.around(oldlatvol, decimals=0)
array([  0.,   0.,   0.,   0.,
         0.,   0.,  79.,   0.,
         0.,   0.,  24.,   0.,
         0.,   0.,   0.,   0.,
         0.,   0.,   0.,   0.])

After lateral erosion occurs at node 6, volume__lateral_erosion is reset to 0

>>> np.around(newlatvol, decimals=0)
array([  0.,   0.,   0.,   0.,
         0.,   0.,   0.,   0.,
         0.,   0.,  24.,   0.,
         0.,   0.,   0.,   0.,
         0.,   0.,   0.,   0.])

After lateral erosion at node 6, elevation at node 6 is reduced by -1.41 (the elevation change stored in dzlat[6]). It is also provided as the at-node grid field lateral_erosion__depth_increment.

>>> np.around(oldelev, decimals=2)
array([ 0.  ,  1.03,  2.03,  3.  ,
        1.04,  1.77,  2.45,  4.08,
        2.09,  2.65,  3.18,  5.09,
        3.04,  3.65,  4.07,  6.03,
        4.03,  5.09,  6.02,  7.1 ])
>>> np.around(newelev, decimals=2)
array([ 0.  ,  1.03,  2.03,  3.  ,
        1.04,  1.77,  1.03,  4.08,
        2.09,  2.65,  3.18,  5.09,
        3.04,  3.65,  4.07,  6.03,
        4.03,  5.09,  6.02,  7.1 ])
>>> np.around(dzlat, decimals=2)
array([ 0.  ,  0.  ,  0.  ,  0.  ,
        0.  ,  0.  , -1.41,  0.  ,
        0.  ,  0.  ,  0.  ,  0.  ,
        0.  ,  0.  ,  0.  ,  0.  ,
        0.  ,  0.  ,  0.  ,  0. ])

References

Required Software Citation(s) Specific to this Component

Langston, A., Tucker, G. (2018). Developing and exploring a theory for the lateral erosion of bedrock channels for use in landscape evolution models. Earth Surface Dynamics 6(1), 1–27. https://dx.doi.org/10.5194/esurf-6-1-2018

Additional References

None Listed

Parameters:
  • grid (ModelGrid) – A Landlab square cell raster grid object

  • latero_mech (string, optional (defaults to UC)) – Lateral erosion algorithm, choices are “UC” for undercutting-slump model and “TB” for total block erosion

  • alph (float, optional (defaults to 0.8)) – Parameter describing potential for deposition, dimensionless

  • Kv (float, node array, or field name) – Bedrock erodibility in vertical direction, 1/years

  • Kl_ratio (float, optional (defaults to 1.0)) – Ratio of lateral to vertical bedrock erodibility, dimensionless

  • solver (string) –

    Solver options:
    1. ’basic’ (default): explicit forward-time extrapolation. Simple but will become unstable if time step is too large or if bedrock erodibility is vry high.

    2. ’adaptive’: subdivides global time step as needed to prevent slopes from reversing.

  • inlet_node (integer, optional) – Node location of inlet (source of water and sediment)

  • inlet_area (float, optional) – Drainage area at inlet node, must be specified if inlet node is “on”, m^2

  • qsinlet (float, optional) – Sediment flux supplied at inlet, optional. m3/year

  • flow_accumulator (Instantiated Landlab FlowAccumulator, optional) – When solver is set to “adaptive”, then a valid Landlab FlowAccumulator must be passed. It will be run within sub-timesteps in order to update the flow directions and drainage area.

__init__(grid, latero_mech='UC', alph=0.8, Kv=0.001, Kl_ratio=1.0, solver='basic', inlet_on=False, inlet_node=None, inlet_area=None, qsinlet=0.0, flow_accumulator=None)[source]#
Parameters:
  • grid (ModelGrid) – A Landlab square cell raster grid object

  • latero_mech (string, optional (defaults to UC)) – Lateral erosion algorithm, choices are “UC” for undercutting-slump model and “TB” for total block erosion

  • alph (float, optional (defaults to 0.8)) – Parameter describing potential for deposition, dimensionless

  • Kv (float, node array, or field name) – Bedrock erodibility in vertical direction, 1/years

  • Kl_ratio (float, optional (defaults to 1.0)) – Ratio of lateral to vertical bedrock erodibility, dimensionless

  • solver (string) –

    Solver options:
    1. ’basic’ (default): explicit forward-time extrapolation. Simple but will become unstable if time step is too large or if bedrock erodibility is vry high.

    2. ’adaptive’: subdivides global time step as needed to prevent slopes from reversing.

  • inlet_node (integer, optional) – Node location of inlet (source of water and sediment)

  • inlet_area (float, optional) – Drainage area at inlet node, must be specified if inlet node is “on”, m^2

  • qsinlet (float, optional) – Sediment flux supplied at inlet, optional. m3/year

  • flow_accumulator (Instantiated Landlab FlowAccumulator, optional) – When solver is set to “adaptive”, then a valid Landlab FlowAccumulator must be passed. It will be run within sub-timesteps in order to update the flow directions and drainage area.

run_one_step_adaptive(dt=1.0)[source]#

Run time step with adaptive time stepping to prevent slope flattening.

run_one_step_basic(dt=1.0)[source]#

Calculate vertical and lateral erosion for a time period ‘dt’.

Parameters:

dt (float) – Model timestep [T]