Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
fa1 = FlowAccumulator(mg1, flow_director="Steepest")
fa1.run_one_step()
mg2 = RasterModelGrid((10, 10), xy_spacing=(1, 1))
mg2.add_field(
"topographic__elevation", mg2.node_x ** 2 + mg2.node_y ** 2, at="node"
)
fa2 = FlowAccumulator(mg2, flow_director=FlowDirectorSteepest)
fa2.run_one_step()
mg3 = RasterModelGrid((10, 10), xy_spacing=(1, 1))
mg3.add_field(
"topographic__elevation", mg3.node_x ** 2 + mg3.node_y ** 2, at="node"
)
fd = FlowDirectorSteepest(mg3)
fa3 = FlowAccumulator(mg3, flow_director=fd)
fa3.run_one_step()
for loc in ["node", "link", "grid"]:
for key in mg0[loc].keys():
if loc == "grid":
assert_array_equal(mg0[loc][key][0], mg1[loc][key][0])
assert_array_equal(mg1[loc][key][0], mg2[loc][key][0])
assert_array_equal(mg2[loc][key][0], mg3[loc][key][0])
else:
assert_array_equal(mg0[loc][key], mg1[loc][key])
assert_array_equal(mg1[loc][key], mg2[loc][key])
assert_array_equal(mg2[loc][key], mg3[loc][key])
def test_director_adding_methods_are_equivalent_D8():
"""Check that different methods to specifying the director are the same."""
mg0 = RasterModelGrid((10, 10), xy_spacing=(1, 1))
mg0.add_field(
"topographic__elevation", mg0.node_x ** 2 + mg0.node_y ** 2, at="node"
)
fa0 = FlowAccumulator(mg0, flow_director="D8")
fa0.run_one_step()
mg1 = RasterModelGrid((10, 10), xy_spacing=(1, 1))
mg1.add_field(
"topographic__elevation", mg1.node_x ** 2 + mg1.node_y ** 2, at="node"
)
fa1 = FlowAccumulator(mg1, flow_director="FlowDirectorD8")
fa1.run_one_step()
mg2 = RasterModelGrid((10, 10), xy_spacing=(1, 1))
mg2.add_field(
"topographic__elevation", mg2.node_x ** 2 + mg2.node_y ** 2, at="node"
)
fa2 = FlowAccumulator(mg2, flow_director=FlowDirectorD8)
fa2.run_one_step()
assert sorted(list(mg.at_node.keys())) == [
"drainage_area",
"flow__data_structure_delta",
"flow__link_to_receiver_node",
"flow__receiver_node",
"flow__sink_flag",
"flow__upstream_node_order",
"surface_water__discharge",
"topographic__elevation",
"topographic__steepest_slope",
"water__unit_flux_in",
]
mg2 = RasterModelGrid((10, 10), xy_spacing=(1, 1))
mg2.add_field("topographic__elevation", mg2.node_x + mg2.node_y, at="node")
fa2 = FlowAccumulator(mg2, flow_director="MFD")
fa2.run_one_step()
assert sorted(list(mg2.at_node.keys())) == [
"drainage_area",
"flow__data_structure_delta",
"flow__link_to_receiver_node",
"flow__receiver_node",
"flow__receiver_proportions",
"flow__sink_flag",
"flow__upstream_node_order",
"surface_water__discharge",
"topographic__elevation",
"topographic__steepest_slope",
"water__unit_flux_in",
]
def test_director_adding_methods_are_equivalent_MFD():
"""Check that different methods to specifying the director are the same."""
mg0 = RasterModelGrid((10, 10), xy_spacing=(1, 1))
mg0.add_field(
"topographic__elevation", mg0.node_x ** 2 + mg0.node_y ** 2, at="node"
)
fa0 = FlowAccumulator(mg0, flow_director="MFD")
fa0.run_one_step()
mg1 = RasterModelGrid((10, 10), xy_spacing=(1, 1))
mg1.add_field(
"topographic__elevation", mg1.node_x ** 2 + mg1.node_y ** 2, at="node"
)
fa1 = FlowAccumulator(mg1, flow_director="FlowDirectorMFD")
fa1.run_one_step()
mg2 = RasterModelGrid((10, 10), xy_spacing=(1, 1))
mg2.add_field(
"topographic__elevation", mg2.node_x ** 2 + mg2.node_y ** 2, at="node"
)
fa2 = FlowAccumulator(mg2, flow_director=FlowDirectorMFD)
fa2.run_one_step()
mg3 = RasterModelGrid((10, 10), xy_spacing=(1, 1))
mg3.add_field(
"topographic__elevation", mg3.node_x ** 2 + mg3.node_y ** 2, at="node"
)
fd = FlowDirectorMFD(mg3)
fa3 = FlowAccumulator(mg3, flow_director=fd)
fa3.run_one_step()
def test_fields():
"""Check to make sure the right fields have been created.
Check that the sizes are also correct.
"""
mg = RasterModelGrid((10, 10), xy_spacing=(1, 1))
mg.add_field("topographic__elevation", mg.node_x + mg.node_y, at="node")
fa = FlowAccumulator(mg)
fa.run_one_step()
assert sorted(list(mg.at_node.keys())) == [
"drainage_area",
"flow__data_structure_delta",
"flow__link_to_receiver_node",
"flow__receiver_node",
"flow__sink_flag",
"flow__upstream_node_order",
"surface_water__discharge",
"topographic__elevation",
"topographic__steepest_slope",
"water__unit_flux_in",
]
mg2 = RasterModelGrid((10, 10), xy_spacing=(1, 1))
def test_specifying_routing_method_wrong():
"""Test specifying incorrect method for routing compatability with DepressionFinderAndRouter."""
mg = RasterModelGrid((10, 10), xy_spacing=(1, 1))
mg.add_field("topographic__elevation", mg.node_x + mg.node_y, at="node")
with pytest.raises(ValueError):
FlowAccumulator(
mg, flow_director="D4", depression_finder="DepressionFinderAndRouter"
)
df = DepressionFinderAndRouter(mg)
with pytest.raises(ValueError):
FlowAccumulator(mg, flow_director="D4", depression_finder=df)
def test_extra_kwargs():
mg = RasterModelGrid((5, 5), xy_spacing=(1, 1))
mg.add_field("topographic__elevation", mg.node_x + mg.node_y, at="node")
_ = FlowDirectorSteepest(mg)
with pytest.raises(ValueError):
FlowAccumulator(mg, spam="eggs")
def test_depression_finder_as_bad_string():
mg = RasterModelGrid((5, 5), xy_spacing=(1, 1))
mg.add_field("topographic__elevation", mg.node_x + mg.node_y, at="node")
with pytest.raises(ValueError):
FlowAccumulator(mg, flow_director="D8", depression_finder="spam")
def test_director_adding_methods_are_equivalent_Steepest():
"""Check that different methods to specifying the director are the same."""
mg0 = RasterModelGrid((10, 10), xy_spacing=(1, 1))
mg0.add_field(
"topographic__elevation", mg0.node_x ** 2 + mg0.node_y ** 2, at="node"
)
fa0 = FlowAccumulator(mg0, flow_director="D4")
fa0.run_one_step()
mg1 = RasterModelGrid((10, 10), xy_spacing=(1, 1))
mg1.add_field(
"topographic__elevation", mg1.node_x ** 2 + mg1.node_y ** 2, at="node"
)
fa1 = FlowAccumulator(mg1, flow_director="Steepest")
fa1.run_one_step()
mg2 = RasterModelGrid((10, 10), xy_spacing=(1, 1))
mg2.add_field(
"topographic__elevation", mg2.node_x ** 2 + mg2.node_y ** 2, at="node"
)
fa2 = FlowAccumulator(mg2, flow_director=FlowDirectorSteepest)
fa2.run_one_step()
mg3 = RasterModelGrid((10, 10), xy_spacing=(1, 1))
mg3.add_field(
"topographic__elevation", mg3.node_x ** 2 + mg3.node_y ** 2, at="node"
)
fd = FlowDirectorSteepest(mg3)
fa3 = FlowAccumulator(mg3, flow_director=fd)
fa3.run_one_step()
DEJH, late 2018
"""
import sys
from landlab.components.flow_accum import (
FlowAccumulator,
flow_accum_bw,
flow_accum_to_n,
)
if sys.version_info[0] >= 3:
from inspect import signature
class LossyFlowAccumulator(FlowAccumulator):
"""Component to calculate drainage area and accumulate flow, while
permitting dynamic loss or gain of flow downstream.
This component is closely related to the FlowAccumulator, in that
this is accomplished by first finding flow directions by a user-specified
method and then calculating the drainage area and discharge. However,
this component additionally requires the passing of a function that
describes how discharge is lost or gained downstream,
f(Qw, nodeID, linkID, grid). See the Examples below to see how this works
in practice.
Optionally, spatially variable runoff can be set either by the model grid
field 'water__unit_flux_in' or the input variable *runoff_rate**.
Optionally a depression finding component can be specified and flow