# DepthDependentDiffuser: depth dependent diffusion after Johnstone and Hilley (2014)#

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

Bases: Component

This component implements a depth and slope dependent linear diffusion rule in the style of Johnstone and Hilley (2014).

Hillslope sediment flux uses depth dependent component inspired by Johnstone and Hilley (2014). The flux $$q_s$$ is given as:

$q_s = - D S H^* (1.0 - exp( - H / H^*)$

where $$D$$ is is the diffusivity, $$S$$ is the slope (defined as negative downward), $$H$$ is the soil depth on links, and $$H^*$$ is the soil transport decay depth.

This component will ignore soil thickness located at non-core nodes.

Examples

>>> import numpy as np
>>> from landlab import RasterModelGrid
>>> from landlab.components import ExponentialWeatherer
>>> from landlab.components import DepthDependentDiffuser
>>> mg = RasterModelGrid((5, 5))
>>> expweath = ExponentialWeatherer(mg)
>>> DDdiff = DepthDependentDiffuser(mg)
>>> expweath.calc_soil_prod_rate()
>>> np.allclose(mg.at_node["soil_production__rate"][mg.core_nodes], 1.0)
True
>>> DDdiff.run_one_step(2.0)
>>> np.allclose(mg.at_node["topographic__elevation"][mg.core_nodes], 0.0)
True
>>> np.allclose(mg.at_node["bedrock__elevation"][mg.core_nodes], -2.0)
True
>>> np.allclose(mg.at_node["soil__depth"][mg.core_nodes], 2.0)
True


Now with a slope:

>>> mg = RasterModelGrid((3, 5))
>>> z += mg.node_x.copy()
>>> BRz += mg.node_x / 2.0
>>> soilTh[:] = z - BRz
>>> expweath = ExponentialWeatherer(mg)
>>> DDdiff = DepthDependentDiffuser(mg)
>>> expweath.calc_soil_prod_rate()
>>> np.allclose(
...     mg.at_node["soil_production__rate"][mg.core_nodes],
...     np.array([0.60653066, 0.36787944, 0.22313016]),
... )
True
>>> DDdiff.run_one_step(2.0)
>>> np.allclose(
...     mg.at_node["topographic__elevation"][mg.core_nodes],
...     np.array([1.47730244, 2.28949856, 3.17558975]),
... )
True
>>> np.allclose(
...     mg.at_node["bedrock__elevation"][mg.core_nodes],
...     np.array([-0.71306132, 0.26424112, 1.05373968]),
... )
True
>>> np.allclose(mg.at_node["soil__depth"], z - BRz)
True


Now, we’ll test that changing the transport decay depth behaves as expected.

>>> mg = RasterModelGrid((3, 5))
>>> z += mg.node_x.copy() ** 0.5
>>> BRz = z.copy() - 1.0
>>> soilTh[:] = z - BRz
>>> expweath = ExponentialWeatherer(mg)
>>> DDdiff = DepthDependentDiffuser(mg, soil_transport_decay_depth=0.1)
>>> DDdiff.run_one_step(1)
>>> soil_decay_depth_point1 = mg.at_node["topographic__elevation"][mg.core_nodes]
>>> z[:] = 0
>>> z += mg.node_x.copy() ** 0.5
>>> BRz = z.copy() - 1.0
>>> soilTh[:] = z - BRz
>>> DDdiff = DepthDependentDiffuser(mg, soil_transport_decay_depth=1.0)
>>> DDdiff.run_one_step(1)
>>> soil_decay_depth_1 = mg.at_node["topographic__elevation"][mg.core_nodes]
>>> np.greater(soil_decay_depth_1[1], soil_decay_depth_point1[1])
False


References

Required Software Citation(s) Specific to this Component

Barnhart, K., Glade, R., Shobe, C., Tucker, G. (2019). Terrainbento 1.0: a Python package for multi-model analysis in long-term drainage basin evolution. Geoscientific Model Development 12(4), 1267–1297. https://dx.doi.org/10.5194/gmd-12-1267-2019

Johnstone, S., Hilley, G. (2015). Lithologic control on the form of soil-mantled hillslopes Geology 43(1), 83-86. https://doi.org/10.1130/G36052.1

Parameters:
• grid (ModelGrid) – Landlab ModelGrid object

• linear_diffusivity (float) – Hillslope diffusivity, m**2/yr

• soil_transport_decay_depth (float) – Characteristic transport soil depth, m

__init__(grid, linear_diffusivity=1.0, soil_transport_decay_depth=1.0)[source]#
Parameters:
• grid (ModelGrid) – Landlab ModelGrid object

• linear_diffusivity (float) – Hillslope diffusivity, m**2/yr

• soil_transport_decay_depth (float) – Characteristic transport soil depth, m

run_one_step(dt)[source]#
Parameters:

dt (float (time)) – The imposed timestep.

soilflux(dt)[source]#

Calculate soil flux for a time period ‘dt’.

Parameters:

dt (float (time)) – The imposed timestep.