Prado EFO PVA
rule_flood.py
Go to the documentation of this file.
1 # -*- coding: utf-8 -*-
2 """
3 Created on Fri May 8 05:59:04 2020
4 
5 @author: cd
6 """
7 
8 
9 import abc
10 import numpy as np
11 from efo.rule import RuleBase
12 from efo.lookup import LkupTblAnn
13 from efo.time import TimeBase
14 
15 # TODO: Need to figure out how to subclass the Rule super class or just use
16 # the Rule class for typing as just an abstract class that is not sub-classed
17 # just need to make sure all rules have a calc_release method
18 class RuleFloodBase(RuleBase):
19  def __init__(self, name, time, constants):
20  self.constantsconstants = constants
21  super().__init__(name, time)
22 
23  @classmethod
24  def __subclasshook__(cls,C):
25  if cls is RuleFloodBase:
26  attrs = set(dir(C))
27  if set(cls.__abstractmethods__) <= attrs:
28  return True
29  return NotImplemented
30 
31 
33  def __init__(self, name, time, constants, hypso, monDayHr, guideCurve, *,
34  typ='interp', timeUnit=None, isElev=True):
35  # Call super class constructor
36  super().__init__(name, time, constants)
37  # Class properties
38  if isElev is True:
39  # Convert elev to storage
40  guideCurve = np.interp(guideCurve, hypso.elev, hypso.stor)
41  # Build lookup table
42  self.set_guide_curveset_guide_curve(name, time, monDayHr, guideCurve,
43  typ=typ, timeUnit=timeUnit)
44  self.tsGuideCurvetsGuideCurve = np.empty(self.T.nSteps)
45 
46  def set_guide_curve(self, name, time, monDayHr, guideCurve, *,
47  typ='interp', timeUnit=None):
48  # TODO: If timeUnitOvrd == 'Y' then set the guide curve to a single value
49  # TODO: Use error handling to check values passed
50  self.guideCurveTblguideCurveTbl = LkupTblAnn(name+'_guideCurve', time, monDayHr, guideCurve,
51  typ=typ, timeUnit=timeUnit)
52 
53  def calc_release(self, rlsProposed, rlsUnCtrl, stor, rlsPrev=None, qIn=None):
54  rlsProposed = super().calc_release(
55  rlsProposed, rlsPrev=rlsPrev, rlsUnCtrl=rlsUnCtrl, stor=stor, qIn=qIn)
56  # Initialize flood release to zero
57  self.release[self.T.step] = 0.
58  # Check if storage exceeds guide curve
59  self.tsGuideCurvetsGuideCurve[self.T.step] = self.guideCurveTblguideCurveTbl.get_val(self.T.curDT)
60  if stor > self.tsGuideCurvetsGuideCurve[self.T.step]:
61  self.release[self.T.step] = (
62  stor - self.tsGuideCurvetsGuideCurve[self.T.step])*self.constantsconstants.af2cfs
63  return max(self.release[self.T.step], rlsProposed)
64 
65 
def __subclasshook__(cls, C)
Definition: rule_flood.py:24
def __init__(self, name, time, constants)
Definition: rule_flood.py:19
def set_guide_curve(self, name, time, monDayHr, guideCurve, *typ='interp', timeUnit=None)
Definition: rule_flood.py:47
def calc_release(self, rlsProposed, rlsUnCtrl, stor, rlsPrev=None, qIn=None)
Definition: rule_flood.py:53
def __init__(self, name, time, constants, hypso, monDayHr, guideCurve, *typ='interp', timeUnit=None, isElev=True)
Definition: rule_flood.py:34