本文整理汇总了Python中landlab.components.flow_routing.route_flow_dn.FlowRouter类的典型用法代码示例。如果您正苦于以下问题:Python FlowRouter类的具体用法?Python FlowRouter怎么用?Python FlowRouter使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了FlowRouter类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: test_degenerate_drainage
def test_degenerate_drainage():
"""
This "hourglass" configuration should be one of the hardest to correctly
re-route.
"""
mg = RasterModelGrid(9,5)
z_init = mg.node_x.copy()*0.0001 + 1.
lake_pits = np.array([7, 11, 12, 13, 17, 27, 31, 32, 33, 37])
z_init[lake_pits] = -1.
z_init[22] = 0. # the common spill pt for both lakes
z_init[21] = 0.1 # an adverse bump in the spillway
z_init[20] = -0.2 # the spillway
z = mg.add_field('node', 'topographic__elevation', z_init)
fr = FlowRouter(mg)
lf = DepressionFinderAndRouter(mg)
fr.route_flow()
lf.map_depressions()
correct_A = np.array([ 0., 0., 0., 0., 0.,
0., 1., 1., 1., 0.,
0., 4., 1., 3., 0.,
0., 1., 10., 1., 0.,
21., 21., 1., 1., 0.,
0., 1., 9., 1., 0.,
0., 4., 1., 3., 0.,
0., 1., 1., 1., 0.,
0., 0., 0., 0., 0.])
thelake = np.concatenate((lake_pits, [22])).sort()
assert_array_almost_equal(mg.at_node['drainage_area'], correct_A)
示例2: test_three_pits
def test_three_pits():
"""
A test to ensure the component correctly handles cases where there are
multiple pits.
"""
mg = RasterModelGrid(10,10,1.)
z = mg.add_field('node', 'topographic__elevation', mg.node_x.copy())
# a sloping plane
#np.random.seed(seed=0)
#z += np.random.rand(100)/10000.
# punch some holes
z[33] = 1.
z[43] = 1.
z[37] = 4.
z[74:76] = 1.
fr = FlowRouter(mg)
lf = DepressionFinderAndRouter(mg)
fr.route_flow()
lf.map_depressions()
flow_sinks_target = np.zeros(100, dtype=bool)
flow_sinks_target[mg.boundary_nodes] = True
# no internal sinks now:
assert_array_equal(mg.at_node['flow_sinks'], flow_sinks_target)
# test conservation of mass:
assert_almost_equal(mg.at_node['drainage_area'
].reshape((10,10))[1:-1,1].sum(), 8.**2)
# ^all the core nodes
# test the actual flow field:
nA = np.array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
8., 8., 7., 6., 5., 4., 3., 2., 1., 0.,
2., 2., 1., 1., 2., 1., 1., 1., 1., 0.,
26., 26., 25., 15., 11., 10., 9., 8., 1., 0.,
2., 2., 1., 9., 2., 1., 1., 1., 1., 0.,
2., 2., 1., 1., 5., 4., 3., 2., 1., 0.,
2., 2., 1., 1., 1., 1., 3., 2., 1., 0.,
20., 20., 19., 18., 17., 12., 3., 2., 1., 0.,
2., 2., 1., 1., 1., 1., 3., 2., 1., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
assert_array_equal(mg.at_node['drainage_area'], nA)
#test a couple more properties:
lc = np.empty(100, dtype=int)
lc.fill(XX)
lc[33] = 33
lc[43] = 33
lc[37] = 37
lc[74:76] = 74
assert_array_equal(lf.lake_map, lc)
assert_array_equal(lf.lake_codes, [33, 37, 74])
assert_equal(lf.number_of_lakes, 3)
assert_array_almost_equal(lf.lake_areas, [2., 1., 2.])
assert_array_almost_equal(lf.lake_volumes, [2., 2., 4.])
示例3: test_internal_closed
def test_internal_closed():
"""
Test closed nodes in the core of the grid.
"""
fr = FlowRouter(mg)
fr.route_flow()
assert_array_almost_equal(A_target, mg.at_node['drainage_area'])
assert_array_equal(frcvr_target, mg.at_node['flow_receiver'])
assert_array_equal(links2rcvr_target, mg.at_node['links_to_flow_receiver'])
assert_array_almost_equal(A_target, mg.at_node['water__volume_flux'])
assert_array_almost_equal(steepest_target,
mg.at_node['topographic__steepest_slope'])
示例4: test_accumulate_D8
def test_accumulate_D8():
"""
Test accumulation works for D8 in a simple scenario
"""
fr = FlowRouter(mg)
fr.route_flow()
assert_array_equal(A_target, mg.at_node['drainage_area'])
assert_array_equal(frcvr_target, mg.at_node['flow_receiver'])
assert_array_equal(upids_target, mg.at_node['upstream_node_order'])
assert_array_equal(links2rcvr_target, mg.at_node['links_to_flow_receiver'])
assert_array_equal(A_target, mg.at_node['water__volume_flux'])
assert_array_equal(steepest_target,
mg.at_node['topographic__steepest_slope'])
示例5: test_irreg_topo
def test_irreg_topo():
"""
Tests D4 routing on a toy irregular topo.
"""
fr = FlowRouter(mg)
fr.route_flow(method='D4')
assert_array_equal(A_target_D4, mg.at_node['drainage_area'])
assert_array_equal(frcvr_target_D4, mg.at_node['flow_receiver'])
assert_array_equal(upids_target_D4, mg.at_node['upstream_node_order'])
assert_array_equal(links2rcvr_target_D4,
mg.at_node['links_to_flow_receiver'])
assert_array_almost_equal(steepest_target_D4,
mg.at_node['topographic__steepest_slope'])
示例6: test_variable_Qin
def test_variable_Qin():
"""
Tests a variable Qin field.
"""
Qin_local = np.zeros(25, dtype=float)
Qin_local[13] = 2.
mg.add_field('node', 'water__volume_flux_in',
Qin_local, units='m**3/s')
fr = FlowRouter(mg)
fr.route_flow()
Qout_local = np.zeros_like(Qin_local)
Qout_local[10:14] = 200.
assert_array_equal(Qout_local, mg.at_node['water__volume_flux'])
assert_array_equal(A_target, mg.at_node['drainage_area'])
示例7: initialize
def initialize(self, input_stream=None):
"""
The BMI-style initialize method takes an optional input_stream
parameter, which may be either a ModelParameterDictionary object or
an input stream from which a ModelParameterDictionary can read values.
"""
# Create a ModelParameterDictionary for the inputs
if input_stream is None:
inputs = None
elif type(input_stream) == ModelParameterDictionary:
inputs = input_stream
else:
inputs = ModelParameterDictionary(input_stream)
# Make sure the grid includes elevation data. This means either:
# 1. The grid has a node field called 'topographic__elevation', or
# 2. The input file has an item called 'ELEVATION_FIELD_NAME' *and*
# a field by this name exists in the grid.
try:
self._elev = self._grid.at_node['topographic__elevation']
except FieldError:
try:
self.topo_field_name = inputs.read_string('ELEVATION_' +
'FIELD_NAME')
except AttributeError:
print('Error: Because your grid does not have a node field')
print('called "topographic__elevation", you need to pass the')
print('name of a text input file or ModelParameterDictionary,')
print('and this file or dictionary needs to include the name')
print('of another field in your grid that contains your')
print('elevation data.')
raise AttributeError
except MissingKeyError:
print('Error: Because your grid does not have a node field')
print('called "topographic__elevation", your input file (or')
print('ModelParameterDictionary) must include an entry with')
print('the key "ELEVATION_FIELD_NAME", which gives the name')
print('of a field in your grid that contains your elevation')
print('data.')
raise MissingKeyError('ELEVATION_FIELD_NAME')
try:
self._elev = self._grid.at_node[self.topo_field_name]
except AttributeError:
print('Your grid does not seem to have a node field called',
self.topo_field_name)
else:
self.topo_field_name = 'topographic__elevation'
# create the only new output field:
self.sed_fill_depth = self._grid.add_zeros('node',
'sediment_fill__depth')
self._lf = DepressionFinderAndRouter(self._grid, routing=self._routing)
self._fr = FlowRouter(self._grid)
示例8: conditions
mg.create_node_array_zeros('topographic_elevation')
z = mg.create_node_array_zeros() + leftmost_elev
z += initial_slope*np.amax(mg.node_y) - initial_slope*mg.node_y
#put these values plus roughness into that field
mg['node'][ 'topographic_elevation'] = z + np.random.rand(len(z))/100000.
#set up grid's boundary conditions (bottom, left, top, right is inactive)
mg.set_inactive_boundaries(False, True, False, True)
mg.set_fixed_value_boundaries_at_grid_edges(True, False, True, False, value_of='topographic_elevation')
print 'fixed vals in grid: ', mg.fixed_value_node_properties['values']
# Display a message
print 'Running ...'
#instantiate the components:
fr = FlowRouter(mg)
sde = SedDepEroder(mg, input_file)
vid = VideoPlotter(mg, data_centering='node')
time_on = time()
#perform the loops:
for i in xrange(nt):
#print 'loop ', i
mg.at_node['topographic_elevation'][mg.core_nodes] += uplift_per_step
mg = fr.route_flow(grid=mg)
#mg.calculate_gradient_across_cell_faces(mg.at_node['topographic_elevation'])
#neighbor_slopes = mg.calculate_gradient_along_node_links(mg.at_node['topographic_elevation'])
#mean_slope = np.mean(np.fabs(neighbor_slopes),axis=1)
#max_slope = np.max(np.fabs(neighbor_slopes),axis=1)
#mg,_,capacity_out = tl.erode(mg,dt,slopes_at_nodes='steepest_slope')
#mg,_,capacity_out = tl.erode(mg,dt,slopes_at_nodes=max_slope)
示例9: SinkFiller
#.........这里部分代码省略.........
self._elev = self._grid.at_node['topographic__elevation']
except FieldError:
try:
self.topo_field_name = inputs.read_string('ELEVATION_' +
'FIELD_NAME')
except AttributeError:
print('Error: Because your grid does not have a node field')
print('called "topographic__elevation", you need to pass the')
print('name of a text input file or ModelParameterDictionary,')
print('and this file or dictionary needs to include the name')
print('of another field in your grid that contains your')
print('elevation data.')
raise AttributeError
except MissingKeyError:
print('Error: Because your grid does not have a node field')
print('called "topographic__elevation", your input file (or')
print('ModelParameterDictionary) must include an entry with')
print('the key "ELEVATION_FIELD_NAME", which gives the name')
print('of a field in your grid that contains your elevation')
print('data.')
raise MissingKeyError('ELEVATION_FIELD_NAME')
try:
self._elev = self._grid.at_node[self.topo_field_name]
except AttributeError:
print('Your grid does not seem to have a node field called',
self.topo_field_name)
else:
self.topo_field_name = 'topographic__elevation'
# create the only new output field:
self.sed_fill_depth = self._grid.add_zeros('node',
'sediment_fill__depth')
self._lf = DepressionFinderAndRouter(self._grid, routing=self._routing)
self._fr = FlowRouter(self._grid)
def fill_pits(self, apply_slope=None):
"""
This is the main method. Call it to fill depressions in a starting
topography.
Parameters
----------
apply_slope : bool
Whether to leave the filled surface flat (default), or apply a
gradient downwards through all lake nodes towards the outlet.
A test is performed to ensure applying this slope will not alter
the drainage structure at the edge of the filled region (i.e.,
that we are not accidentally reversing the flow direction far
from the outlet.)
Return fields
-------------
'topographic__elevation' : the updated elevations
'sediment_fill__depth' : the depth of sediment added at each node
"""
self.original_elev = self._elev.copy()
# We need this, as we'll have to do ALL this again if we manage
# to jack the elevs too high in one of the "subsidiary" lakes.
# We're going to implement the lake_mapper component to do the heavy
# lifting here, then delete its fields. This means we first need to
# test if these fields already exist, in which case, we should *not*
# delete them!
existing_fields = {}
spurious_fields = set()
set_of_outputs = self._lf.output_var_names | self._fr.output_var_names
try:
示例10: RasterModelGrid
mg = RasterModelGrid(nrows, ncols, dx)
#create the fields in the grid
mg.create_node_array_zeros('topographic__elevation')
z = mg.create_node_array_zeros() + init_elev
mg['node'][ 'topographic__elevation'] = z + numpy.random.rand(len(z))/1000.
#make some K values in a field to test
mg.at_node['K_values'] = 0.1+numpy.random.rand(nrows*ncols)/10.
print( 'Running ...' )
time_on = time.time()
#instantiate the components:
fr = FlowRouter(mg)
sp = StreamPowerEroder(mg, './drive_sp_params.txt')
#load the Fastscape module too, to allow direct comparison
fsp = Fsc(mg, './drive_sp_params.txt')
#perform the loop:
elapsed_time = 0. #total time in simulation
while elapsed_time < time_to_run:
print(elapsed_time)
if elapsed_time+dt>time_to_run:
print("Short step!")
dt = time_to_run - elapsed_time
mg = fr.route_flow()
#print 'Area: ', numpy.max(mg.at_node['drainage_area'])
#mg = fsp.erode(mg)
mg,_,_ = sp.erode(mg, dt, node_drainage_areas='drainage_area', slopes_at_nodes='topographic__steepest_slope', K_if_used='K_values')
示例11: RasterModelGrid
grid = RasterModelGrid(4, 5, 1.0)
grid.set_inactive_boundaries(True, False, True, True)
z = grid.add_zeros('node', 'Land_Surface__Elevation')
z[6] = 4.5
z[7] = 3.
z[8] = 1.
z[11] = 4.
z[12] = 2.8
z[13] = 2.
# Get array of interior (active) node IDs
interior_nodes = grid.get_active_cell_node_ids()
# Route flow
flow_router = FlowRouter(grid)
grid = flow_router.route_flow()
for i in range(grid.number_of_nodes):
print(i, grid.node_x[i], grid.node_y[i], z[i], grid.node_status[i], \
r[i], a[i], q[i], ss[i], rl[i])
# Let's take a look for debugging
#print 'node receiver flow_link'
#for i in interior_nodes:
# print i, r[i], rl[i]
# Calculate lengths of flow links
flow_link_length = ones(size(z))
flow_link_length[interior_nodes] = grid.link_length[rl[interior_nodes]] #DEJH suspects a node ordering bug here - rl is not in ID order, but interior_nodes is
print('fll:', flow_link_length)
示例12: flow_across_grid
#.........这里部分代码省略.........
#interior_nodes are the nodes on which you will be calculating flow
self.interior_nodes = grid.get_active_cell_node_ids()
if total_t==None:
total_t = self.rain_duration
if rainrate==None:
rainrate = self.rainfall_rate
if rainduration==None:
rainduration = total_t
elapsed_time = 0
#below is for calculating water surface slope at interior nodes
w_slope=np.zeros(self.interior_nodes.size)
t = [] #time array for plotting
t.append(0.) #initialize array
self.dqds= grid.zeros(centering='node')
while elapsed_time < total_t:
# Calculate time-step size for this iteration (Bates et al., eq 14)
dtmax = self.alpha*grid.dx/np.sqrt(self.g*np.amax(self.h))
# Take the smaller of delt or calculated time-step
dt = min(dtmax, total_t)
# Calculate the effective flow depth at active links. Bates et al. 2010
# recommend using the difference between the highest water-surface
# and the highest bed elevation between each pair of cells.
zmax = grid.max_of_link_end_node_values(z) #array of length of active links
w = self.h+z # water-surface height, array of length num nodes
wmax = grid.max_of_link_end_node_values(w) #array of length of active links
hflow = wmax - zmax #array of length of active links
# Calculate water-surface slopes: across links, but water heights are
#defined at nodes.
water_surface_slope = grid.calculate_gradients_at_active_links(w)
# Calculate the unit discharges (Bates et al., eq 11)
self.q = (self.q-g*hflow*dtmax*water_surface_slope)/ \
(1.+g*hflow*dtmax*0.06*0.06*abs(self.q)/(hflow**ten_thirds))
#NOTES:
# q is calculated at links
# water_surface_slope is at links
# hflow is at links, but w is at nodes
# Calculate water-flux divergence at nodes
self.dqds = grid.calculate_flux_divergence_at_nodes(self.q,self.dqds)
# Calculate rate of change of water depth
self.dhdt = rainrate-self.dqds
# Second time-step limiter (experimental): make sure you don't allow
# water-depth to go negative
if np.amin(self.dhdt) < 0.:
shallowing_locations = np.where(self.dhdt<0.)
time_to_drain = -self.h[shallowing_locations]/self.dhdt[shallowing_locations]
dtmax2 = self.alpha*np.amin(time_to_drain)
dt = np.min([dtmax, dtmax2, total_t])
# Update the water-depth field
self.h[self.interior_nodes] = self.h[self.interior_nodes] + self.dhdt[self.interior_nodes]*dt
# Let's calculate shear stress at the nodes.
# First get water height at the nodes.
# Then calculate the maximum gradient in water surface elevations (S).
# Then you can calculate shear stress! (rho g h S)
# h (water depth) is at nodes
w = self.h+z # water-surface height, array of length num nodes
#Below if is for limiting shear stress calculations to only times when
#q surpasses a threshold (in this case q should be in m^3/sec)
#Note that this threshold is HARDWIRED below (on right of >)
#self.slopes_at_node, garbage = grid.calculate_steepest_descent_on_nodes(w, water_surface_slope)
fr=FlowRouter(grid)
r, a, q, ss, s, d = fr.route_flow(w)
self.slopes_at_node = ss
if self.q.any()*grid.dx> 0.2:
self.tau = self.rho*self.g*self.slopes_at_node*self.h
#for i in range(24899):
# #w_slope[i],garbage=grid.calculate_gradient_across_cell_faces(grid, w, self.interior_nodes) #grid.calculate_max_gradient_across_node_d4(w,self.interior_nodes[i])
# self.tau[self.interior_nodes[i]]=self.rho*self.g*self.slopes_at_node[self.interior_nodes[i]]*self.h[self.interior_nodes[i]]
# #self.tau[i] = tau[i]
self.tau[np.where(self.tau<0)] = 0
#self.tau[interior_nodes] = self.tau[interior_nodes] + self.dtds[interior_nodes]*dt
#tau[np.where(tau<0)] = 0
# Update model run time
elapsed_time += dt
print "elapsed time", elapsed_time
示例13: RasterModelGrid
mg = RasterModelGrid(nrows, ncols, dx)
# create the fields in the grid
mg.create_node_array_zeros('topographic__elevation')
z = np.array([5., 5., 0., 5., 5.,
5., 2., 1., 2., 5.,
5., 3., 2., 3., 5.,
5., 4., 4., 4., 5.,
5., 5., 5., 5., 5.])
mg['node']['topographic__elevation'] = z
print('Running ...')
# instantiate the components:
fr = FlowRouter(mg)
sp = StreamPowerEroder(mg, './drive_sp_params_discharge.txt')
# load the Fastscape module too, to allow direct comparison
fsp = Fsc(mg, './drive_sp_params_discharge.txt')
# perform the loop (once!)
for i in xrange(1):
fr.route_flow(method='D8')
my_Q = mg.at_node['water__volume_flux']*1.
sp.erode(mg, dt, node_drainage_areas='drainage_area',
slopes_at_nodes='topographic__steepest_slope',
Q_if_used=my_Q)
# no uplift
# print the stream power that was calculated:
print('stream power values:')
示例14: print
#create the fields in the grid
mg.create_node_array_zeros('topographic__elevation')
z = mg.create_node_array_zeros() + init_elev
mg['node'][ 'topographic__elevation'] = z + numpy.random.rand(len(z))/1000.
mg.add_zeros('node', 'water__volume_flux_in')
#make some K values in a field to test
#mg.at_node['K_values'] = 0.1+numpy.random.rand(nrows*ncols)/10.
mg.at_node['K_values'] = numpy.empty(nrows*ncols, dtype=float)
#mg.at_node['K_values'].fill(0.1+numpy.random.rand()/10.)
mg.at_node['K_values'].fill(0.001)
print( 'Running ...' )
#instantiate the components:
fr = FlowRouter(mg)
sp = StreamPowerEroder(mg, input_file_string)
#fsp = Fsc(mg, input_file_string)
precip = PrecipitationDistribution(input_file=input_file_string)
#load the Fastscape module too, to allow direct comparison
fsp = Fsc(mg, input_file_string)
try:
#raise NameError
mg = copy.deepcopy(mg_mature)
except NameError:
print('building a new grid...')
out_interval = 50000.
last_trunc = time_to_run #we use this to trigger taking an output plot
#run to a steady state:
示例15: VoronoiDelaunayGrid
from landlab import VoronoiDelaunayGrid # , RasterModelGrid
from landlab.components.flow_routing.route_flow_dn import FlowRouter
from landlab.components.stream_power.stream_power import StreamPowerEroder
from landlab.plot.imshow import imshow_node_grid
import numpy as np
from matplotlib.pyplot import figure, show
nnodes = 10000
x, y = np.random.rand(nnodes), np.random.rand(nnodes)
mg = VoronoiDelaunayGrid(x,y)
#mg = RasterModelGrid(4,5)
z = mg.add_field('node', 'topographic__elevation', np.random.rand(nnodes)/10000., copy=False)
fr = FlowRouter(mg)
spe = StreamPowerEroder(mg, 'drive_sp_params_voronoi.txt')
for i in xrange(100):
z[mg.core_nodes] += 0.01
fr.route_flow()
spe.erode(mg, 1.)
imshow_node_grid(mg, 'topographic__elevation')
show()