Skip to content

Commit 1b4d057

Browse files
committed
Move get_timeseries and expand_timeseries_names to utilties
1 parent db1f2e2 commit 1b4d057

File tree

3 files changed

+107
-135
lines changed

3 files changed

+107
-135
lines changed

HSP2/main.py

Lines changed: 1 addition & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from collections import defaultdict
1212
from datetime import datetime as dt
1313
import os
14-
from HSP2.utilities import transform, versions, get_timeseries
14+
from HSP2.utilities import transform, versions, get_timeseries, expand_timeseries_names
1515
from HSP2.configuration import activities, noop, expand_masslinks
1616

1717
from typing import List
@@ -257,53 +257,6 @@ def get_uci(store):
257257
for i in range(int(start), int(stop)): ddgener[module][f'G{i:03d}'] = row[2]
258258
return opseq, ddlinks, ddmasslinks, ddext_sources, ddgener, uci, siminfo
259259

260-
261-
def get_timeseries(store, ext_sourcesdd, siminfo):
262-
''' makes timeseries for the current timestep and trucated to the sim interval'''
263-
# explicit creation of Numba dictionary with signatures
264-
ts = Dict.empty(key_type=types.unicode_type, value_type=types.float64[:])
265-
for row in ext_sourcesdd:
266-
if row.SVOL == '*':
267-
path = f'TIMESERIES/{row.SVOLNO}'
268-
if path in store:
269-
temp1 = store[path]
270-
else:
271-
print('Get Timeseries ERROR for', path)
272-
continue
273-
else:
274-
temp1 = read_hdf(row.SVOL, path)
275-
276-
if row.MFACTOR != 1.0:
277-
temp1 *= row.MFACTOR
278-
t = transform(temp1, row.TMEMN, row.TRAN, siminfo)
279-
280-
# in some cases the subscript is irrelevant, like '1' or '1 1', and we can leave it off.
281-
# there are other cases where it is needed to distinguish, such as ISED and '1' or '1 1'.
282-
tname = f'{row.TMEMN}{row.TMEMSB}'
283-
if row.TMEMN in {'GATMP', 'PREC', 'DTMPG', 'WINMOV', 'DSOLAR', 'SOLRAD', 'CLOUD', 'PETINP', 'IRRINP', 'POTEV', 'DEWTMP', 'WIND',
284-
'IVOL', 'IHEAT'}:
285-
tname = f'{row.TMEMN}'
286-
elif row.TMEMN == 'ISED':
287-
if row.TMEMSB == '1 1' or row.TMEMSB == '1' or row.TMEMSB == '':
288-
tname = 'ISED1'
289-
else:
290-
tname = 'ISED' + row.TMEMSB[0]
291-
elif row.TMEMN in {'ICON', 'IDQAL', 'ISQAL'}:
292-
tmemsb1 = '1'
293-
tmemsb2 = '1'
294-
if len(row.TMEMSB) > 0:
295-
tmemsb1 = row.TMEMSB[0]
296-
if len(row.TMEMSB) > 2:
297-
tmemsb2 = row.TMEMSB[-1]
298-
sname, tname = expand_timeseries_names('', '', '', row.TMEMN, tmemsb1, tmemsb2)
299-
300-
if tname in ts:
301-
ts[tname] += t
302-
else:
303-
ts[tname] = t
304-
return ts
305-
306-
307260
def save_timeseries(store, ts, savedict, siminfo, saveall, operation, segment, activity, jupyterlab=True):
308261
# save computed timeseries (at computation DELT)
309262
save = {k for k,v in savedict.items() if v or saveall}
@@ -457,91 +410,6 @@ def get_flows(store, ts, flags, uci, segment, ddlinks, ddmasslinks, steps, msg):
457410
print('ERROR in FLOWS for', path)
458411
return
459412

460-
def expand_timeseries_names(smemn, smemsb1, smemsb2, tmemn, tmemsb1, tmemsb2):
461-
#special cases to expand timeseries names to resolve with output names in hdf5 file
462-
if tmemn == 'ICON':
463-
if tmemsb1 == '':
464-
tmemn = 'CONS1_ICON'
465-
else:
466-
tmemn = 'CONS' + tmemsb1 + '_ICON'
467-
if smemn == 'OCON':
468-
if smemsb2 == '':
469-
smemn = 'CONS1_OCON' + smemsb1
470-
else:
471-
smemn = 'CONS' + smemsb2 + '_OCON' + smemsb1
472-
if smemn == 'ROCON':
473-
if smemsb1 == '':
474-
smemn = 'CONS1_ROCON'
475-
else:
476-
smemn = 'CONS' + smemsb1 + '_ROCON'
477-
478-
# GQUAL:
479-
if tmemn == 'IDQAL':
480-
if tmemsb1 == '':
481-
tmemn = 'GQUAL1_IDQAL'
482-
else:
483-
tmemn = 'GQUAL' + tmemsb1 + '_IDQAL'
484-
if tmemn == 'ISQAL1' or tmemn == 'ISQAL2' or tmemn == 'ISQAL3':
485-
if tmemsb2 == '':
486-
tmemn = 'GQUAL1_' + tmemn
487-
else:
488-
tmemn = 'GQUAL' + tmemsb2 + '_' + tmemn
489-
if tmemn == 'ISQAL':
490-
if tmemsb2 == '':
491-
tmemn = 'GQUAL1_' + 'ISQAL' + tmemsb1
492-
else:
493-
tmemn = 'GQUAL' + tmemsb2 + '_' + 'ISQAL' + tmemsb1
494-
if smemn == 'ODQAL':
495-
smemn = 'GQUAL' + smemsb1 + '_ODQAL' + smemsb2 # smemsb2 is exit number
496-
if smemn == 'OSQAL':
497-
smemn = 'GQUAL' + smemsb1 + '_OSQAL' + smemsb2 # smemsb2 is ssc plus exit number
498-
if smemn == 'RODQAL':
499-
smemn = 'GQUAL' + smemsb1 + '_RODQAL'
500-
if smemn == 'ROSQAL':
501-
smemn = 'GQUAL' + smemsb2 + '_ROSQAL' + smemsb1 # smemsb1 is ssc
502-
503-
# OXRX:
504-
if smemn == 'OXCF1':
505-
smemn = 'OXCF1' + smemsb1
506-
507-
if smemn == 'OXCF2':
508-
smemn = 'OXCF2' + smemsb1 + ' ' + smemsb2 # smemsb1 is exit #
509-
510-
if tmemn == 'OXIF':
511-
tmemn = 'OXIF' + tmemsb1
512-
513-
# NUTRX - dissolved species:
514-
if smemn == 'NUCF1': # total outflow
515-
smemn = 'NUCF1' + smemsb1
516-
517-
if smemn == 'NUCF9': # exit-specific outflow
518-
smemn = 'NUCF9' + smemsb1 + ' ' + smemsb2 # smemsb1 is exit #
519-
520-
if tmemn == 'NUIF1':
521-
tmemn = 'NUIF1' + tmemsb1
522-
523-
# NUTRX - particulate species:
524-
if smemn == 'NUCF2': # total outflow
525-
smemn = 'NUCF2' + smemsb1 + ' ' + smemsb2 # smemsb1 is sediment class
526-
527-
if smemn == 'OSNH4' or smemn == 'OSPO4': # exit-specific outflow
528-
smemn = smemn + smemsb1 + ' ' + smemsb2 # smemsb1 is exit #, smemsb2 is sed class
529-
530-
if tmemn == 'NUIF2':
531-
tmemn = 'NUIF2' + tmemsb1 + ' ' + tmemsb2
532-
533-
# PLANK:
534-
if smemn == 'PKCF1': # total outflow
535-
smemn = 'PKCF1' + smemsb1 # smemsb1 is species index
536-
537-
if smemn == 'PKCF2': # exit-specific outflow
538-
smemn = 'PKCF2' + smemsb1 + ' ' + smemsb2 # smemsb1 is exit #, smemsb2 is species index
539-
540-
if tmemn == 'PKIF':
541-
tmemn = 'PKIF' + tmemsb1 # smemsb1 is species index
542-
543-
return smemn, tmemn
544-
545413
def get_gener_timeseries(ts: Dict, gener_instances: Dict, ddlinks: List) -> Dict:
546414
"""
547415
Uses links tables to load necessary TimeSeries from Gener class instances to TS dictionary

HSP2/utilities.py

Lines changed: 105 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ def versions(import_list=[]):
222222
return pandas.DataFrame(data, index=names, columns=['version'])
223223

224224
def get_timeseries(store, ext_sourcesdd, siminfo):
225-
""" makes timeseries for the current timestep and trucated to the sim interval"""
225+
''' makes timeseries for the current timestep and trucated to the sim interval'''
226226
# explicit creation of Numba dictionary with signatures
227227
ts = Dict.empty(key_type=types.unicode_type, value_type=types.float64[:])
228228
for row in ext_sourcesdd:
@@ -240,9 +240,113 @@ def get_timeseries(store, ext_sourcesdd, siminfo):
240240
temp1 *= row.MFACTOR
241241
t = transform(temp1, row.TMEMN, row.TRAN, siminfo)
242242

243+
# in some cases the subscript is irrelevant, like '1' or '1 1', and we can leave it off.
244+
# there are other cases where it is needed to distinguish, such as ISED and '1' or '1 1'.
243245
tname = f'{row.TMEMN}{row.TMEMSB}'
246+
if row.TMEMN in {'GATMP', 'PREC', 'DTMPG', 'WINMOV', 'DSOLAR', 'SOLRAD', 'CLOUD', 'PETINP', 'IRRINP', 'POTEV', 'DEWTMP', 'WIND',
247+
'IVOL', 'IHEAT'}:
248+
tname = f'{row.TMEMN}'
249+
elif row.TMEMN == 'ISED':
250+
if row.TMEMSB == '1 1' or row.TMEMSB == '1' or row.TMEMSB == '':
251+
tname = 'ISED1'
252+
else:
253+
tname = 'ISED' + row.TMEMSB[0]
254+
elif row.TMEMN in {'ICON', 'IDQAL', 'ISQAL'}:
255+
tmemsb1 = '1'
256+
tmemsb2 = '1'
257+
if len(row.TMEMSB) > 0:
258+
tmemsb1 = row.TMEMSB[0]
259+
if len(row.TMEMSB) > 2:
260+
tmemsb2 = row.TMEMSB[-1]
261+
sname, tname = expand_timeseries_names('', '', '', row.TMEMN, tmemsb1, tmemsb2)
262+
244263
if tname in ts:
245264
ts[tname] += t
246265
else:
247266
ts[tname] = t
248267
return ts
268+
269+
def expand_timeseries_names(smemn, smemsb0, smemsb2, tmemn, tmemsb1, tmemsb2):
270+
#special cases to expand timeseries names to resolve with output names in hdf4 file
271+
if tmemn == 'ICON':
272+
if tmemsb0 == '':
273+
tmemn = 'CONS0_ICON'
274+
else:
275+
tmemn = 'CONS' + tmemsb0 + '_ICON'
276+
if smemn == 'OCON':
277+
if smemsb1 == '':
278+
smemn = 'CONS0_OCON' + smemsb1
279+
else:
280+
smemn = 'CONS' + smemsb1 + '_OCON' + smemsb1
281+
if smemn == 'ROCON':
282+
if smemsb0 == '':
283+
smemn = 'CONS0_ROCON'
284+
else:
285+
smemn = 'CONS' + smemsb0 + '_ROCON'
286+
287+
# GQUAL:
288+
if tmemn == 'IDQAL':
289+
if tmemsb0 == '':
290+
tmemn = 'GQUAL0_IDQAL'
291+
else:
292+
tmemn = 'GQUAL' + tmemsb0 + '_IDQAL'
293+
if tmemn == 'ISQAL0' or tmemn == 'ISQAL2' or tmemn == 'ISQAL3':
294+
if tmemsb1 == '':
295+
tmemn = 'GQUAL0_' + tmemn
296+
else:
297+
tmemn = 'GQUAL' + tmemsb1 + '_' + tmemn
298+
if tmemn == 'ISQAL':
299+
if tmemsb1 == '':
300+
tmemn = 'GQUAL0_' + 'ISQAL' + tmemsb1
301+
else:
302+
tmemn = 'GQUAL' + tmemsb1 + '_' + 'ISQAL' + tmemsb1
303+
if smemn == 'ODQAL':
304+
smemn = 'GQUAL' + smemsb0 + '_ODQAL' + smemsb2 # smemsb2 is exit number
305+
if smemn == 'OSQAL':
306+
smemn = 'GQUAL' + smemsb0 + '_OSQAL' + smemsb2 # smemsb2 is ssc plus exit number
307+
if smemn == 'RODQAL':
308+
smemn = 'GQUAL' + smemsb0 + '_RODQAL'
309+
if smemn == 'ROSQAL':
310+
smemn = 'GQUAL' + smemsb1 + '_ROSQAL' + smemsb1 # smemsb1 is ssc
311+
312+
# OXRX:
313+
if smemn == 'OXCF0':
314+
smemn = 'OXCF0' + smemsb1
315+
316+
if smemn == 'OXCF1':
317+
smemn = 'OXCF1' + smemsb1 + ' ' + smemsb2 # smemsb1 is exit #
318+
319+
if tmemn == 'OXIF':
320+
tmemn = 'OXIF' + tmemsb0
321+
322+
# NUTRX - dissolved species:
323+
if smemn == 'NUCF0': # total outflow
324+
smemn = 'NUCF0' + smemsb1
325+
326+
if smemn == 'NUCF8': # exit-specific outflow
327+
smemn = 'NUCF8' + smemsb1 + ' ' + smemsb2 # smemsb1 is exit #
328+
329+
if tmemn == 'NUIF0':
330+
tmemn = 'NUIF0' + tmemsb1
331+
332+
# NUTRX - particulate species:
333+
if smemn == 'NUCF1': # total outflow
334+
smemn = 'NUCF1' + smemsb1 + ' ' + smemsb2 # smemsb1 is sediment class
335+
336+
if smemn == 'OSNH3' or smemn == 'OSPO4': # exit-specific outflow
337+
smemn = smemn + smemsb0 + ' ' + smemsb2 # smemsb1 is exit #, smemsb2 is sed class
338+
339+
if tmemn == 'NUIF1':
340+
tmemn = 'NUIF1' + tmemsb1 + ' ' + tmemsb2
341+
342+
# PLANK:
343+
if smemn == 'PKCF0': # total outflow
344+
smemn = 'PKCF0' + smemsb1 # smemsb1 is species index
345+
346+
if smemn == 'PKCF1': # exit-specific outflow
347+
smemn = 'PKCF1' + smemsb1 + ' ' + smemsb2 # smemsb1 is exit #, smemsb2 is species index
348+
349+
if tmemn == 'PKIF':
350+
tmemn = 'PKIF' + tmemsb0 # smemsb1 is species index
351+
352+
return smemn, tmemn

HSP2tools/graph.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66

77
from pandas import DataFrame, read_hdf
8-
from networkx import DiGraph, Graph, topological_sort, connected_components
8+
#from networkx import DiGraph, Graph, topological_sort, connected_components
99

1010

1111
def graph_from_HDF5(hdfname):

0 commit comments

Comments
 (0)