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)) >>> soilTh = mg.add_zeros("soil__depth", at="node") >>> z = mg.add_zeros("topographic__elevation", at="node") >>> BRz = mg.add_zeros("bedrock__elevation", at="node") >>> expweath = ExponentialWeatherer(mg) >>> DDdiff = DepthDependentDiffuser(mg) >>> expweath.calc_soil_prod_rate() >>> np.allclose(mg.at_node['soil_production__rate'][mg.core_nodes], 1.) True >>> DDdiff.run_one_step(2.) >>> np.allclose(mg.at_node['topographic__elevation'][mg.core_nodes], 0.) True >>> np.allclose(mg.at_node['bedrock__elevation'][mg.core_nodes], -2.) True >>> np.allclose(mg.at_node['soil__depth'][mg.core_nodes], 2.) True
Now with a slope:
>>> mg = RasterModelGrid((3, 5)) >>> soilTh = mg.add_zeros("soil__depth", at="node") >>> z = mg.add_zeros("topographic__elevation", at="node") >>> BRz = mg.add_zeros("bedrock__elevation", at="node") >>> z += mg.node_x.copy() >>> BRz += mg.node_x/2. >>> 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.) >>> 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)) >>> soilTh = mg.add_zeros("soil__depth", at="node") >>> z = mg.add_zeros("topographic__elevation", at="node") >>> BRz = mg.add_zeros("bedrock__elevation", at="node") >>> 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
Additional References
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: