Prado EFO PVA
rule_emergency.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 LkupTblElev
13 from efo.time import TimeBase
14 
15 
16 class RuleEmgcBase(RuleBase):
17  def __init__(self, name, time):
18  super().__init__(name, time)
19 
20  @classmethod
21  def __subclasshook__(cls,C):
22  if cls is RuleEmgcBase:
23  attrs = set(dir(C))
24  if set(cls.__abstractmethods__) <= attrs:
25  return True
26  return NotImplemented
27 
28 
30  def __init__(self, name, time, constants):
31  # Call super class constructor
32  super().__init__(name, time)
33  # Class properties
34  self.constantsconstants = constants
35  self.rlsEmgcSchedrlsEmgcSched = []
36 
37  def set_emergency_table(self, name, hypso, elev, rlsEmgcVals):
38  # TODO: Use error handling to check values passed
39  self.rlsEmgcSchedrlsEmgcSched = LkupTblElev(name, hypso, elev, rlsEmgcVals)
40 
41  def calc_release(self, rlsProposed, *, stor, rlsUnCtrl, rlsPrev=None, qIn=None):
42  rlsProposed = super().calc_release(
43  rlsProposed, rlsPrev=rlsPrev, rlsUnCtrl=rlsUnCtrl, stor=stor, qIn=qIn)
44  if stor > self.rlsEmgcSchedrlsEmgcSched.minIdx:
45  rlsEmgc = self.rlsEmgcSchedrlsEmgcSched.get_val(stor)
46  # Calculate storage after spill and emergency releases
47  stor = stor - (rlsUnCtrl + rlsEmgc)*self.constantsconstants.cfs2af
48  # If storage is below the emergency pool then adjust emergency release
49  if rlsUnCtrl > 0 and rlsEmgc > 0 and stor < self.rlsEmgcSchedrlsEmgcSched.minIdx:
50  rlsEmgc = rlsEmgc + (stor - self.rlsEmgcSchedrlsEmgcSched.minIdx)*self.constantsconstants.af2cfs
51  if rlsEmgc < 0:
52  rlsEmgc = 0
53  else:
54  rlsEmgc = 0
55  self.release[self.T.step] = rlsEmgc
56  return max(rlsEmgc, rlsProposed)
57 
58 
def __init__(self, name, time)
def calc_release(self, rlsProposed, *stor, rlsUnCtrl, rlsPrev=None, qIn=None)
def __init__(self, name, time, constants)
def set_emergency_table(self, name, hypso, elev, rlsEmgcVals)