diff --git a/HSP2/GENER.py b/HSP2/GENER.py index aae9db59..62716b2f 100644 --- a/HSP2/GENER.py +++ b/HSP2/GENER.py @@ -27,9 +27,11 @@ def __init__(self, segment: str, copies: Dict, geners: Dict, ddlinks: Dict, ddge if link.SVOL == 'COPY': copy = copies[link.SVOLNO] ts = copy.get_ts(link.SMEMN,link.SMEMSB1) + if link.MFACTOR != 1: ts *= link.MFACTOR elif link.SVOL == 'GENER': gener = geners[link.SVOLNO] ts = gener.get_ts() + if link.MFACTOR != 1: ts *= link.MFACTOR else: raise NotImplementedError(f"Invalid SVOL. GENER module does not currently support reading TimeSeries for '{link.SVOL}'") diff --git a/HSP2/PLANK_Class.py b/HSP2/PLANK_Class.py index 7a0fc1aa..a9bc657f 100644 --- a/HSP2/PLANK_Class.py +++ b/HSP2/PLANK_Class.py @@ -690,7 +690,7 @@ def simulate(self, tw, phval, co2, tss, OXRX, NUTRX, iphyto, izoo, iorn, iorp, i # sestonic algae growth & respiration #----------------------------------------------------------- if self.PHYFG == 1: # simulate phytoplankton, phyrx only called here - (po4,no3,tam,dox,self.orn,self.orp,self.orc,bod,self.phyto,self.limphy,self.co2,self.phycla, + (po4,no3,tam,dox,self.orn,self.orp,self.orc,bod,self.phyto,self.limphy,self.pyco2,self.phycla, dophy,bodphy,tamphy,no3phy,po4phy,phdth,phgro,ornphy,orpphy,orcphy) \ = self.phyrx(self.phylit,tw,self.talgrl,self.talgrh,self.talgrm,self.malgr,self.cmmp, \ self.cmmnp,NUTRX.TAMFG,self.AMRFG,self.NSFG,self.cmmn,self.cmmlt,self.delt60, \ @@ -716,7 +716,7 @@ def simulate(self, tw, phval, co2, tss, OXRX, NUTRX, iphyto, izoo, iorn, iorp, i # zooplankton growth & death: #----------------------------------------------------------- if self.ZOOFG == 1: # simulate zooplankton, zorx only called here - (dox,bod,self.zoo,self.orn,self.orp,self.orc,tam,no3,po4,zeat,zco2,dozoo,bodzoo,nitzoo,po4zoo,zgro,zdth,zorn,zorp,zorc) \ + (dox,bod,self.zoo,self.orn,self.orp,self.orc,tam,no3,po4,zeat,self.zoco2,dozoo,bodzoo,nitzoo,po4zoo,zgro,zdth,zorn,zorp,zorc) \ = self.zorx(self.zfil20,self.tczfil,tw,self.phyto,self.mzoeat,self.zexdel,self.cvpb, \ self.zres20,self.tczres,NUTRX.anaer,self.zomass,NUTRX.TAMFG,self.refr, \ self.ZFOOD,self.zd,self.oxzd,self.cvbn,self.cvbp,self.cvbc,self.cvnrbo,self.cvbo, \ diff --git a/HSP2/RQUAL.py b/HSP2/RQUAL.py index 7fbcd3ab..fee78d9b 100644 --- a/HSP2/RQUAL.py +++ b/HSP2/RQUAL.py @@ -6,7 +6,7 @@ import logging import numpy as np from numpy import where, zeros, array, float64 -from numba import types +from numba import types, njit from numba.typed import Dict from HSP2.utilities import make_numba_dict, initm @@ -27,9 +27,6 @@ def rqual(store, siminfo, uci, uci_oxrx, uci_nutrx, uci_plank, uci_phcarb, ts): ''' Simulate constituents involved in biochemical transformations''' - #ERRMSGS =('') - #errors = zeros(len(ERRMSGS), dtype=np.int32) - # simulation information: delt60 = siminfo['delt'] / 60 # delt60 - simulation time interval in hours simlen = siminfo['steps'] @@ -157,22 +154,42 @@ def rqual(store, siminfo, uci, uci_oxrx, uci_nutrx, uci_plank, uci_phcarb, ts): # initialize & run integerated WQ simulation: #--------------------------------------------------------------------- + (err_oxrx, err_nutrx, err_plank, err_phcarb) \ + = _rqual_run(siminfo_, ui, ui_oxrx, ui_nutrx, ui_plank, ui_phcarb, ts) + + #--------------------------------------------------------------------- + # compile errors & return: + #--------------------------------------------------------------------- + + (errors, ERRMSGS) = _compile_errors(NUTFG, PLKFG, PHFG, err_oxrx, err_nutrx, err_plank, err_phcarb) + + return errors, ERRMSGS + + +@njit(cache=True) +def _rqual_run(siminfo_, ui, ui_oxrx, ui_nutrx, ui_plank, ui_phcarb, ts): + # initialize WQ simulation: RQUAL = RQUAL_Class(siminfo_, ui, ui_oxrx, ui_nutrx, ui_plank, ui_phcarb, ts) # run WQ simulation: RQUAL.simulate(ts) - #--------------------------------------------------------------------- - # compile errors & return: - #--------------------------------------------------------------------- - errlen_oxr = len(RQUAL.OXRX.errors) + # return error data: + #TO-DO! - return PHCARB errors once implemented + errors_PHCARB = zeros(2, dtype=np.int64) + + return RQUAL.OXRX.errors, RQUAL.NUTRX.errors, RQUAL.PLANK.errors, errors_PHCARB + +def _compile_errors(NUTFG, PLKFG, PHFG, err_oxrx, err_nutrx, err_plank, err_phcarb): + + errlen_oxr = len(err_oxrx) errlen_ntr = 0; errlen_plk = 0; errlen_phc = 0 if NUTFG == 1: - errlen_ntr = len(RQUAL.NUTRX.errors) + errlen_ntr = len(err_nutrx) if PLKFG == 1: - errlen_plk += len(RQUAL.PLANK.errors) + errlen_plk += len(err_plank) if PHFG == 1: #errlen_phc += len(RQUAL.PHCARB.errors) pass @@ -185,22 +202,22 @@ def rqual(store, siminfo, uci, uci_oxrx, uci_nutrx, uci_plank, uci_phcarb, ts): ierr = -1 for i in range(errlen_oxr): ierr += 1 - errors[ierr] = RQUAL.OXRX.errors[i] + errors[ierr] = err_oxrx[i] ERRMSGS += (ERRMSGS_oxrx[i],) for i in range(errlen_ntr): ierr += 1 - errors[ierr] = RQUAL.NUTRX.errors[i] + errors[ierr] = err_nutrx[i] ERRMSGS += (ERRMSGS_nutrx[i],) for i in range(errlen_plk): ierr += 1 - errors[ierr] = RQUAL.PLANK.errors[i] + errors[ierr] = err_plank[i] ERRMSGS += (ERRMSGS_plank[i],) for i in range(errlen_phc): ierr += 1 - errors[ierr] = RQUAL.PHCARB.errors[i] + errors[ierr] = err_phcarb[i] ERRMSGS += (ERRMSGS_phcarb[i],) return errors, ERRMSGS diff --git a/HSP2/main.py b/HSP2/main.py index 1b6e0c30..00868c32 100644 --- a/HSP2/main.py +++ b/HSP2/main.py @@ -45,12 +45,16 @@ def main(hdfname, saveall=False, jupyterlab=True): # main processing loop msg(1, f'Simulation Start: {start}, Stop: {stop}') for _, operation, segment, delt in opseq.itertuples(): + msg(2, f'{operation} {segment} DELT(minutes): {delt}') + if operation == 'COPY': copy_instances[segment] = activities[operation](store, siminfo, ddext_sources[(operation,segment)]) elif operation == 'GENER': - gener_instances[segment] = activities[operation](segment, copy_instances, gener_instances, ddlinks, ddgener) + try: + gener_instances[segment] = activities[operation](segment, copy_instances, gener_instances, ddlinks, ddgener) + except NotImplementedError as e: + print(f"GENER '{segment}' encountered unsupported feature during initialization and may not function correctly. Unsupported feature: '{e}'") else: - msg(2, f'{operation} {segment} DELT(minutes): {delt}') siminfo['delt'] = delt siminfo['tindex'] = date_range(start, stop, freq=Minute(delt))[1:] siminfo['steps'] = len(siminfo['tindex']) @@ -239,7 +243,11 @@ def get_uci(store): siminfo['units'] = int(temp['Units']) elif module == 'LINKS': for row in store[path].fillna('').itertuples(): - ddlinks[f'{row.TVOLNO}{row.TOPFST}'].append(row) + if row.TVOLNO != '': + ddlinks[f'{row.TVOLNO}'].append(row) + else: + ddlinks[f'{row.TOPFST}'].append(row) + elif module == 'MASS_LINKS': for row in store[path].replace('na','').itertuples(): ddmasslinks[row.MLNO].append(row) @@ -418,9 +426,8 @@ def get_gener_timeseries(ts: Dict, gener_instances: Dict, ddlinks: List) -> Dict if link.SVOL == 'GENER': gener = gener_instances[link.SVOLNO] series = gener.get_ts() - if link.MFACTOR != 1: - series *= link.MFACTOR - ts[f'{link.TMEMN}{link.TMEMSB1}{link.TMEMSB2}'] = series + ts[f'{link.TMEMN}{link.TMEMSB1} {link.TMEMSB2}'.rstrip()] = series + return ts