3 Created on Wed Apr 29 22:04:46 2020
11 from efo.general
import Constants
12 from efo.time
import TimeBase
13 from efo.hypso
import HypsoBase
14 from efo.outlet
import OutletRatedElev
15 from efo.rule_compliance
import RuleComplianceBase
27 if issubclass(type(time), TimeBase):
29 self.
qOutqOut = np.full(self.
TT.nSteps, np.nan)
31 self.
qInTotqInTot = np.full(self.
TT.nSteps, np.nan)
35 self.
qInqIn.append(qIn)
39 for qInCur
in self.
qInqIn:
40 qTot += qInCur.get_qin(tsOffset)
41 self.
qInTotqInTot[self.
TT.step] = qTot
45 return self.
qOutqOut[min(self.
TT.end, max(0, self.
TT.step + tsOffset))].item()
49 qOut = max(0., self.
_get_qin_get_qin())
51 self.
qOutqOut[self.
TT.step] = qOut
54 def set_qout(self, qOutSpecified, *, tsOffset=0):
55 self.
qOutqOut[min(self.
TT.end, self.
TT.step + tsOffset)] = qOutSpecified
59 if cls
is JunctionBase:
61 if set(cls.__abstractmethods__) <= attrs:
69 super().
__init__(name, time, qIn=qIn)
77 ruleMinQ=None, ruleMaxQ=None, ruleDiversion=[]):
88 if ruleDiversion: self.
qDivqDiv = np.full(self.
TT.nSteps, np.nan)
103 rule.release[self.
TT.step] = qDiv
107 def calc_delta(self, *, ruleType=RuleComplianceBase.MAX, tsOffset=0):
108 if ruleType == RuleComplianceBase.MAX
and self.
ruleMaxQruleMaxQ:
109 targetQ = self.
ruleMaxQruleMaxQ.get_qcomp(tsOffset=tsOffset)
110 elif ruleType == RuleComplianceBase.MIN
and self.
ruleMinQruleMinQ:
111 targetQ = self.
ruleMinQruleMinQ.get_qcomp(tsOffset=tsOffset)
115 qInInit = self.
_get_qin_get_qin(tsOffset=tsOffset)
118 qDiv += curRule.get_qcomp(qIn=qInInit, tsOffset=tsOffset)
119 qInNet = qInInit - qDiv
120 self.
qOutqOut[min(self.
TT.end, self.
TT.step + tsOffset)] = max(0., qInNet)
121 return qInNet - targetQ
if ruleType == RuleComplianceBase.MAX
else targetQ - qInNet
128 qMin = self.
ruleMinQruleMinQ.get_qcomp(qIn=qInTot)
if self.
ruleMinQruleMinQ
is not None else 0.
129 qDivMax = qInTot - qMin
132 curDiv = curRule.calc_release(rlsProposed=max(0., qDivMax-qDiv), qIn=qInTot)
133 qOut, curDiv = self.
_calc_q_calc_q(qOut, curDiv, curRule)
136 self.
qDivqDiv[self.
TT.step] = qDiv
138 self.
continuitycontinuity[self.
TT.step] = qOut + qDiv - qInTot
139 self.
qOutqOut[self.
TT.step] = qOut
147 def __init__(self, name, time, qIn, storInit, constants,
148 *,hypso=None, ruleStack=[], evapObj=None, seepageObj=None,
149 outletCtrl=None, outletUnctrl=None, ruleEmgc=None, storMax=None):
160 if issubclass(type(constants), Constants):
162 if issubclass(type(hypso), HypsoBase):
165 self.
storstor = np.full(self.
TT.nSteps, np.nan)
166 self.
storstor[0] = storInit
175 outletCtrl = OutletRatedElev(name, self.
TT, self.
hypsohypso, elev, qOutlet)
180 outletUnCtrl = OutletRatedElev(name, self.
TT, self.
hypsohypso, elev, qOutlet)
187 self.
rlsCtrlrlsCtrl = np.full(self.
TT.nSteps, np.nan)
189 self.
rlsMinrlsMin = np.full(self.
TT.nSteps, np.nan)
190 self.
rlsMaxrlsMax = np.full(self.
TT.nSteps, np.nan)
195 if outletUnctrl: self.
rlsUnCtrlrlsUnCtrl = np.full(self.
TT.nSteps, np.nan)
200 if evapObj: self.
lossEvaplossEvap = np.full(self.
TT.nSteps, np.nan)
205 if seepageObj: self.
lossSeeplossSeep = np.full(self.
TT.nSteps, np.nan)
212 self.
storstor[0] = storInit
216 if type(ruleStack) == list:
220 if type(rule) == list:
228 def calc_delta(self, *, ruleType=RuleComplianceBase.MAX, tsOffset=0):
233 storPrev = self.
storstor[max(0,self.
TT.step-1)].item()
234 qInNet = self.
_get_qin_get_qin(tsOffset=tsOffset)
235 lossEvap, storCur, qInNet = self.
_calc_evap_calc_evap(storPrev, qInNet)
236 lossSeep, storCur, qInNet = self.
_calc_seepage_calc_seepage(storPrev, qInNet)
237 qDiv, storCur, qInNet = self.
_calc_diversions_calc_diversions(storPrev, qInNet)
238 return -max(0.,self.
storMaxstorMax - storCur)*self.
constantsconstants.af2cfs
243 stor = storPrev - qOut*self.
constantsconstants.cfs2af + qInNet*self.
constantsconstants.cfs2af
245 qOut += stor*self.
constantsconstants.af2cfs
246 if qOut < 0.: qOut = 0.
253 stor, lossEvap = self.
_calc_storage_calc_storage(stor, qIn, lossEvap)
257 return lossEvap, stor, qIn
262 stor, lossSeep = self.
_calc_storage_calc_storage(stor, qIn, lossSeep)
266 return lossSeep, stor, qIn
272 curDiv = curRule.calc_release(rlsProposed=qIn+stor*self.
constantsconstants.af2cfs,
273 rlsPrev=curRule.release[max(0, self.
TT.step-1)].item(),
276 storCur, curDiv, qIn = self.
_calc_storage_calc_storage(stor, qIn, curDiv)
279 return qDiv, stor, qIn
283 qInNet = qInInit = super().
_get_qin()
284 storPrev = self.
storstor[max(0, self.
TT.step-1)].item()
287 lossEvap, storCur, qInNet = self.
_calc_evap_calc_evap(storPrev, qInNet)
290 lossSeep, storCur, qInNet = self.
_calc_seepage_calc_seepage(storPrev, qInNet)
293 qDiv, storCur, qInNet = self.
_calc_diversions_calc_diversions(storPrev, qInNet)
298 rlsEmgc = self.
ruleEmgcruleEmgc.calc_release(
299 0., stor=storPrev, rlsUnCtrl=rlsUnCtrl, qIn=qInNet)
if self.
ruleEmgcruleEmgc
is not None else 0.
300 qOutTotCur += rlsEmgc
301 storCur, qOutTotCur = self.
_calc_storage_calc_storage(storPrev, qInNet, qOutTotCur)
305 qOutTotStart = qOutTotCur
309 rlsEmgc+rlsUnCtrl, storPrev, storCur, qInNet)
310 storCur, qOutTotCur = self.
_calc_storage_calc_storage(storPrev, qInNet, qOutTotStart + rlsStack)
311 rlsStack = qOutTotCur - qOutTotStart
312 rlsUnCtrlPrev = rlsUnCtrl
314 qOutTotCur += rlsUnCtrl
315 storCur, qOutTotCur = self.
_calc_storage_calc_storage(storPrev, qInNet, qOutTotCur)
317 if abs(rlsUnCtrl - rlsUnCtrlPrev) < 1e-10:
321 qOutTotCur += rlsUnCtrl
322 storCur, qOutTotCur = self.
_calc_storage_calc_storage(storPrev, qInNet, qOutTotCur)
326 self.
qOutqOut[self.
TT.step] = qOutTotCur
328 (storCur-self.
storstor[max(self.
TT.step-1, 0)])*self.
constantsconstants.af2cfs + \
329 qOutTotCur - qInInit + lossEvap + lossSeep + qDiv
330 self.
storstor[self.
TT.step] = max(0.,storCur)
345 rlsStack = curRule.calc_release(rlsStack,
348 stor=storPrev, qIn=qIn)
349 if hasattr(curRule,
'ruleType'):
350 if curRule.ruleType == RuleComplianceBase.MIN:
351 if curRule.qCompCur > rlsMin: rlsMin = curRule.qCompCur
352 elif curRule.ruleType == RuleComplianceBase.MAX:
353 if curRule.qCompCur < rlsMax: rlsMax = curRule.qCompCur
354 storCur, rlsAdj = self.
_calc_storage_calc_storage(storPrev, qIn, rlsUnCtrl+rlsStack)
355 rlsStack = rlsAdj - rlsUnCtrl
356 if storCur == 0.: rlsMax = rlsStack
358 self.
rlsMinrlsMin[self.
TT.step] = rlsMin
359 self.
rlsMaxrlsMax[self.
TT.step] = rlsMax
def set_qout(self, qOutSpecified, *tsOffset=0)
def get_qout(self, *tsOffset=0)
def __init__(self, name, time, qIn=[])
def __subclasshook__(cls, C)
def _get_qin(self, *tsOffset=0)
def append_qin(self, qIn)
def _calc_q(self, qIn, qDiv, rule)
def set_rule_minq(self, ruleMinQ)
def set_rule_maxq(self, ruleMaxQ)
def __init__(self, name, time, qIn, ruleMinQ=None, ruleMaxQ=None, ruleDiversion=[])
def calc_delta(self, *ruleType=RuleComplianceBase.MAX, tsOffset=0)
def __init__(self, name, time, qIn=[])
def set_unctrl_outlet(self, outletUnctrl)
def _calc_evap(self, stor, qIn)
def __init__(self, name, time, qIn, storInit, constants, *hypso=None, ruleStack=[], evapObj=None, seepageObj=None, outletCtrl=None, outletUnctrl=None, ruleEmgc=None, storMax=None)
def set_seepage(self, seepageObj)
def append_rule(self, rule)
def set_ctrl_outlet(self, outletCtrl)
def calc_delta(self, *ruleType=RuleComplianceBase.MAX, tsOffset=0)
def _calc_seepage(self, stor, qIn)
def create_unctrl_outlet(self, name, elev, qOutlet)
def set_stor_init(self, storInit)
def create_ctrl_outlet(self, name, elev, qOutlet)
def _calc_storage(self, storPrev, qInNet, qOut)
def set_ruleStack(self, ruleStack)
def calc_release_ctrl(self, rlsPrev, rlsUnCtrl, storPrev, storCur, qIn)
def set_rule_emgc(self, ruleEmgc)
def set_evap(self, evapObj)
def _calc_diversions(self, stor, qIn)