1
+ from __future__ import division
2
+
1
3
import warnings
2
- from collections import OrderedDict
3
4
4
5
import pandas
5
6
import networkx as nx
@@ -115,12 +116,12 @@ def solve_node(G, node_name, edge_name_col='id', split_on='-',
115
116
on the `G` graph object to retrieve results.
116
117
'''
117
118
118
- if load_cols is None :
119
- load_cols = []
120
- if tmnt_flags is None :
121
- tmnt_flags = []
122
- if vol_reduced_flags is None :
123
- vol_reduced_flags = []
119
+ node_obj = G . node [ node_name ]
120
+
121
+ load_cols = _to_list ( load_cols )
122
+ tmnt_flags = _to_list ( tmnt_flags )
123
+ vol_reduced_flags = _to_list ( vol_reduced_flags )
124
+
124
125
if bmp_performance_mapping_conc is None :
125
126
bmp_performance_mapping_conc = {}
126
127
@@ -139,7 +140,7 @@ def solve_node(G, node_name, edge_name_col='id', split_on='-',
139
140
140
141
# subcatchments have no volume from in_edges, but they do have a
141
142
# node_vol.
142
- node_vol = G . node [ node_name ] .get (vol_col , 0 )
143
+ node_vol = node_obj .get (vol_col , 0 )
143
144
144
145
edge_vol_in = _sum_edge_attr (
145
146
G , node_name , vol_col , method = 'in_edges' , split_on = split_on )
@@ -164,15 +165,15 @@ def solve_node(G, node_name, edge_name_col='id', split_on='-',
164
165
165
166
if ck_vol_col is not None :
166
167
vol_diff_ck_col = vol_col + "_diff_ck"
167
- ck_vol = G . node [ node_name ] .get (ck_vol_col , node_vol )
168
+ ck_vol = node_obj .get (ck_vol_col , node_vol )
168
169
vol_diff_ck = vol_in - ck_vol
169
- G . node [ node_name ] [vol_diff_ck_col ] = vol_diff_ck
170
+ node_obj [vol_diff_ck_col ] = vol_diff_ck
170
171
171
172
vol_in = node_vol + edge_vol_in
172
173
173
- G . node [ node_name ] [vol_in_col ] = vol_in
174
- G . node [ node_name ] [vol_out_col ] = edge_vol_out
175
- G . node [ node_name ] [vol_gain_col ] = edge_vol_out - edge_vol_in
174
+ node_obj [vol_in_col ] = vol_in
175
+ node_obj [vol_out_col ] = edge_vol_out
176
+ node_obj [vol_gain_col ] = edge_vol_out - edge_vol_in
176
177
# Negative values in this field
177
178
# indicate internal node losses. There should
178
179
# be a load reduction here if there is load in the inflow.
@@ -181,18 +182,18 @@ def solve_node(G, node_name, edge_name_col='id', split_on='-',
181
182
vol_captured = vol_treated + vol_reduced
182
183
183
184
# assign node vol attributes
184
- G . node [ node_name ] [vol_eff_col ] = vol_eff
185
+ node_obj [vol_eff_col ] = vol_eff
185
186
186
- G . node [ node_name ] [vol_red_col ] = vol_reduced
187
- G . node [ node_name ] [pct_vol_red_col ] = 100 * \
187
+ node_obj [vol_red_col ] = vol_reduced
188
+ node_obj [pct_vol_red_col ] = 100 * \
188
189
_safe_divide (vol_reduced , vol_in )
189
190
190
- G . node [ node_name ] [vol_tmnt_col ] = vol_treated
191
- G . node [ node_name ] [pct_vol_tmnt_col ] = 100 * \
191
+ node_obj [vol_tmnt_col ] = vol_treated
192
+ node_obj [pct_vol_tmnt_col ] = 100 * \
192
193
_safe_divide (vol_treated , vol_in )
193
194
194
- G . node [ node_name ] [vol_cap_col ] = vol_captured
195
- G . node [ node_name ] [pct_vol_cap_col ] = 100 * \
195
+ node_obj [vol_cap_col ] = vol_captured
196
+ node_obj [pct_vol_cap_col ] = 100 * \
196
197
_safe_divide (vol_captured , vol_in )
197
198
198
199
#-----solve volume weighted loads-----#
@@ -207,13 +208,14 @@ def solve_node(G, node_name, edge_name_col='id', split_on='-',
207
208
conc_eff_col = load_col + '_conc_eff'
208
209
pct_conc_red_col = load_col + '_conc_pct_reduced'
209
210
210
- # all nodes except subcatchments should return zero here.
211
- node_load = G .node [node_name ].get (load_col , 0 )
211
+ # all nodes except pollutant sources (typically subcatchments)
212
+ # should return zero here.
213
+ node_load = node_obj .get (load_col , 0 )
212
214
213
215
node_load_in = _sum_edge_attr (G , node_name , load_eff_col ,
214
216
method = 'in_edges' , split_on = split_on ) + node_load
215
217
216
- G . node [ node_name ] [load_in_col ] = node_load_in
218
+ node_obj [load_in_col ] = node_load_in
217
219
218
220
if vol_in > 0 and node_load_in > 0 : # skip the math if it's unnecessary
219
221
@@ -261,9 +263,9 @@ def solve_node(G, node_name, edge_name_col='id', split_on='-',
261
263
flag = '_no_tmnt_fxn'
262
264
263
265
if data .get ('_bmp_tmnt_flag' ) is None :
264
- data ['_bmp_tmnt_flag' ] = OrderedDict ()
266
+ data ['_bmp_tmnt_flag' ] = {}
265
267
if data ['_bmp_tmnt_flag' ].get (flag ) is None :
266
- data ['_bmp_tmnt_flag' ].update ({flag :[]})
268
+ data ['_bmp_tmnt_flag' ].update ({flag : []})
267
269
data ['_bmp_tmnt_flag' ][flag ].append (load_col )
268
270
269
271
link_conc_eff = fxn (node_conc_in )
@@ -294,25 +296,25 @@ def solve_node(G, node_name, edge_name_col='id', split_on='-',
294
296
node_conc_eff = 0
295
297
296
298
# assign node load and concentration attributes
297
- G . node [ node_name ] [conc_in_col ] = node_conc_in
298
- G . node [ node_name ] [conc_eff_col ] = node_conc_eff
299
- G . node [ node_name ] [pct_conc_red_col ] = 100 * \
299
+ node_obj [conc_in_col ] = node_conc_in
300
+ node_obj [conc_eff_col ] = node_conc_eff
301
+ node_obj [pct_conc_red_col ] = 100 * \
300
302
_safe_divide ((node_conc_in - node_conc_eff ), node_conc_in )
301
303
302
304
node_load_reduced = node_load_in - node_load_eff
303
305
304
- G . node [ node_name ] [load_eff_col ] = node_load_eff
305
- G . node [ node_name ] [load_red_col ] = node_load_reduced
306
- G . node [ node_name ] [pct_load_red_col ] = 100 * \
306
+ node_obj [load_eff_col ] = node_load_eff
307
+ node_obj [load_red_col ] = node_load_reduced
308
+ node_obj [pct_load_red_col ] = 100 * \
307
309
_safe_divide (node_load_reduced , node_load_in )
308
310
309
311
return
310
312
311
313
312
314
def solve_network (G , edge_name_col = 'id' , split_on = '-' ,
313
- vol_col = 'volume' , ck_vol_col = None , tmnt_flags = None ,
314
- vol_reduced_flags = None , load_cols = None ,
315
- bmp_performance_mapping_conc = None ):
315
+ vol_col = 'volume' , tmnt_flags = [ 'TR' ] ,
316
+ vol_reduced_flags = [ 'INF' ], ck_vol_col = None ,
317
+ load_cols = None , bmp_performance_mapping_conc = None ):
316
318
317
319
validate_swmmnetwork (G )
318
320
@@ -324,17 +326,15 @@ def solve_network(G, edge_name_col='id', split_on='-',
324
326
bmp_performance_mapping_conc = {}
325
327
326
328
for node in nx .topological_sort (G ):
327
- solve_node (
328
- G ,
329
- node ,
330
- edge_name_col = edge_name_col ,
331
- vol_col = vol_col ,
332
- ck_vol_col = ck_vol_col ,
333
- tmnt_flags = tmnt_flags ,
334
- vol_reduced_flags = vol_reduced_flags ,
335
- load_cols = load_cols ,
336
- bmp_performance_mapping_conc = bmp_performance_mapping_conc ,
337
- split_on = split_on ,
338
- )
329
+ solve_node (G , node ,
330
+ edge_name_col = edge_name_col ,
331
+ split_on = split_on ,
332
+ vol_col = vol_col ,
333
+ tmnt_flags = tmnt_flags ,
334
+ vol_reduced_flags = vol_reduced_flags ,
335
+ ck_vol_col = ck_vol_col ,
336
+ load_cols = load_cols ,
337
+ bmp_performance_mapping_conc = bmp_performance_mapping_conc ,
338
+ )
339
339
340
340
return
0 commit comments