Prado EFO PVA
reach.py
Go to the documentation of this file.
1 # -*- coding: utf-8 -*-
2 """
3 Created on Sat May 9 23:06:00 2020
4 
5 @author: cd
6 """
7 
8 import abc
9 import numpy as np
10 from efo.time import TimeBase
11 
12 
13 class ReachBase(metaclass=abc.ABCMeta):
14  # TODO: May not need constants
15  def __init__(self, name, time, junctionUs):
16  self.namename = name
17  # TODO: Should use error handling instead
18  self.junctionUsjunctionUs = junctionUs
19  if issubclass(type(time), TimeBase):
20  self.TT = time
21  self.qOutqOut = np.empty(time.nSteps)
22  super().__init__()
23 
24  @abc.abstractmethod
25  def calc_qout(self):
26  pass
27 
28  @classmethod
29  def __subclasshook__(cls, C):
30  if cls is ReachBase:
31  attrs = set(dir(C))
32  if set(cls.__abstractmethods__) <= attrs:
33  return True
34  return NotImplemented
35 
36 
38  def __init__(self, name, time, junctionUs, lagTime):
39  # Call super class constructor
40  # TODO: Error check to make sure that all are Junctions
41  super().__init__(name, time, junctionUs)
42  self.lagTimelagTime = lagTime
43 
44  def calc_qout(self, *, tsOffset=0):
45  # qOut = self.junctionUs.qOut[
46  # min(self.T.nSteps-1, max(0, self.T.step - self.lagTime + tsOffset))]
47  qOut = self.junctionUsjunctionUs.get_qout(tsOffset = tsOffset - self.lagTimelagTime)
48  self.qOutqOut[min(self.TT.end, self.TT.step + tsOffset)] = qOut
49  return qOut
50 
51 
52 # TODO: This needs to be completed for downstream control
53 # class ReachLagK(ReachBase):
54 # def __init__(self, name, time, junctionUs, lag, K):
55 # # Call super class constructor
56 # # TODO: Error check to make sure that all are Junctions
57 # super().__init__(name, time, junctionUs)
58 # self.lag = lag
59 # self.K = K
60 
61 # def set_init_cond(self, qOutPrev, qInLagPrev):
62 # self.qOutPrev = qOutPrev
63 # self.qInLagPrev = qInLagPrev
64 
65 # def get_lagged_qin(self, nDateCur, qInLagCur):
66 # qLag = 0.;
67 # for i in range(qInLagCurv.shape[0])-1:
68 # if (qInLagCurv[i,1] - nDateCur < 0 & qInLagCurv[i+1,1] - nDateCur > 0) or \
69 # (qInLagCurv[i,1] - nDateCur > 0 & qInLagCurv[i+1,1] - nDateCur < 0):
70 # qLag = qLag + qInLagCurv[i,2] + \
71 # (qInLagCurv[i+1,2]-qInLagCurv[i,2])/(qInLagCurv[i+1,1]-qInLagCurv[i,1])*\
72 # (nDateCur-qInLagCurv[i,1])
73 # elif qInLagCurv[i,1] == nDateCur:
74 # qLag = qLag + qInLagCurv[i,2]
75 # if qLag == 0.:
76 # qLag = qInLagCurv[1,2]
77 # elif qLag < 0.:
78 # rowCurLag = find(qInLagCurv[:,1] <= nDateCur,1,'last')
79 # qLag = qInLagCurv(rowCurLag,2)
80 
81 # def calc_qout(self, *, tsOffset=0):
82 # qIn = self.junctionUs.get_qout(tsOffset = tsOffset)
83 # lag = interp1(self.lagK.(lagKName)[:,1], self.lagK.(lagKName)[:,2], qIn,'linear')/24
84 # if np.isnan(lag):
85 # rowLagTbl = find(self.lagK.(lagKName)[:,1] <= qIn,1,'last')
86 # lag = self.lagK.(lagKName)[rowLagTbl,2]/24
87 # nDateCur = datenum(vToday)
88 # tsLag = nDateCur + lag
89 # qInLagCur = [self.qInLagPrev{3,junctionNum}; [tsLag qIn]]
90 # qInLag1 = self.get_lagged_qin(nDateCur-self.constants.dT,qInLagCur)
91 # qInLag2 = self.get_lagged_qin(nDateCur,qInLagCur)
92 # K1 = interp1(self.lagK.(lagKName)[:,1],self.lagK.(lagKName)[:,3],qInLag1,'pchip')
93 # K2 = interp1(self.lagK.(lagKName)[:,1],self.lagK.(lagKName)[:,3],qInLag2,'pchip')
94 # K = mean([K1;K2])
95 # if np.isnan(K):
96 # rowLagTbl = find(self.lagK.(lagKName)[:,1] <= qIn,1,'last')
97 # K = self.lagK.(lagKName)[rowLagTbl,3]
98 # if K < 0.01:
99 # qOut = qIn
100 # else:
101 # try
102 # qOut = (qInLag1 + qInLag2)*(1/(2*K+1)) + \
103 # ((2*K-1)/(2*K+1))*self.qOutPrev(ts,junctionNum)
104 # catch
105 # ts
106 # if qOut < 0.:
107 # qOut = mean([qInLag1;qInLag2])
108 # self.qOutPrev(ts+1,junctionNum) = qOut
109 # iGrtrCurTs = \
110 # qInLagCur(:,1) >= nDateCur-self.constants.dT
111 # self.qInLagPrev{1,junctionNum} = self.qInLagPrev{2,junctionNum}
112 # self.qInLagPrev{2,junctionNum} = self.qInLagPrev{3,junctionNum}
113 # self.qInLagPrev{3,junctionNum} = qInLagCur(iGrtrCurTs,:)
114 # return qOut
def __subclasshook__(cls, C)
Definition: reach.py:29
def calc_qout(self)
Definition: reach.py:25
def __init__(self, name, time, junctionUs)
Definition: reach.py:15
def calc_qout(self, *tsOffset=0)
Definition: reach.py:44
def __init__(self, name, time, junctionUs, lagTime)
Definition: reach.py:38