Prado EFO PVA
prado_spec.py
Go to the documentation of this file.
1 # -*- coding: utf-8 -*-
2 """
3 Created on Fri May 15 13:48:33 2020
4 
5 @author: cd
6 """
7 
8 import numpy as np
9 import pandas as pd
10 from efo.rule import RuleBase
11 
12 
13 class OcwdSeepage(RuleBase):
14  def __init__(self, name, time, seepPolys, cumSeepStrat, constants):
15  # Call super class constructor
16  super().__init__(name, time)
17  self.seepPolysseepPolys = seepPolys
18  self.cumSeepStratcumSeepStrat = cumSeepStrat
19  self.qSeepqSeep = np.zeros(self.T.nSteps)
20  self.cumSeepcumSeep = np.zeros(self.T.nSteps)
21  self.constantsconstants = constants
22 
23  def calc_seepage(self, stor):
24  idxPoly = min(self.cumSeepStratcumSeepStrat.size-2,
25  np.argwhere(self.cumSeepStratcumSeepStrat <= self.cumSeepcumSeep[max(0,self.T.step-1)])[-1])
26  qSeepCur = max(0, self.seepPolysseepPolys[idxPoly,0].item()*stor**3 +
27  self.seepPolysseepPolys[idxPoly,1].item()*stor**2 +
28  self.seepPolysseepPolys[idxPoly,2].item()*stor + self.seepPolysseepPolys[idxPoly,3].item())
29  self.qSeepqSeep[self.T.step] = qSeepCur
30  if self.T.curDT.month == 10 and self.T.curDT.day == 1:
31  self.cumSeepcumSeep[self.T.step] = qSeepCur*self.constantsconstants.cfs2af
32  else:
33  self.cumSeepcumSeep[self.T.step] = self.cumSeepcumSeep[max(0,self.T.step-1)] + qSeepCur*self.constantsconstants.cfs2af
34  return qSeepCur
35 
36 
37 def calc_vireo_impacts(*, hypso, T, df, scenarios):
38  returnDf = pd.DataFrame()
39  for j, curScen in enumerate(scenarios):
40  storPrdo = df.xs(curScen)['stor_prado']
41  curDateTime = df.xs(curScen).index
42  years = np.unique(curDateTime.year)
43  elevChngMeters = np.empty(years.size)
44  idxName = np.full(years.size, scenarios[j])
45  for i, curYr in enumerate(years):
46  iCurVirioPer = ((curDateTime.year == curYr) & (curDateTime.month == 3) & (curDateTime.day >= 21))\
47  | ((curDateTime.year == curYr) & (curDateTime.month == 4))
48  rowsCurVirioPer = np.ix_(iCurVirioPer)[0]
49  rowMaxStor = rowsCurVirioPer[0] + np.argmax(storPrdo[iCurVirioPer], axis=0)
50  storMax = storPrdo[rowMaxStor]
51  elevMax = hypso.stor2elev(storMax)
52  rowsBeforMaxStor = rowsCurVirioPer[rowsCurVirioPer < rowMaxStor]
53  storMin = np.min(storPrdo[rowsBeforMaxStor]) if rowsBeforMaxStor.size>0 else storMax
54  elevMin = hypso.stor2elev(storMin)
55  elevChngMeters[i] = (elevMax - elevMin)*0.3048
56  dfIndices = [idxName, years]
57  dfMultiIdx = pd.MultiIndex.from_arrays(dfIndices, names=('name_scenario', 'water_year'))
58  curDf = pd.DataFrame({'elev_chng_meters': elevChngMeters},
59  columns = ['elev_chng_meters'], index=dfMultiIdx)
60  returnDf = returnDf.append(curDf)
61  return returnDf
62 
63 
64 def calc_vireo_impacts2(*, hypso, T, df, scenarios):
65  returnDf = pd.DataFrame()
66  for j, curScen in enumerate(scenarios):
67  curDf = df.xs(curScen)
68  storPrdo = curDf['stor_prado']
69  curDateTime = df.xs(curScen).index
70  years = np.unique(curDateTime.year)
71  for i, curYr in enumerate(years):
72  iCurVireoPer = ((curDateTime.year == curYr) & (curDateTime.month == 3) & (curDateTime.day >= 21))\
73  | ((curDateTime.year == curYr) & (curDateTime.month == 4))
74  elevCurPer = hypso.stor2elev(storPrdo[iCurVireoPer])
75  elevDiff = elevCurPer - elevCurPer[0]
76  elevDiffMeters = elevDiff*0.3048
77  dfIndices = [np.full(elevDiffMeters.size-1, scenarios[j]), curDf.index[iCurVireoPer][1:]]
78  dfMultiIdx = pd.MultiIndex.from_arrays(dfIndices, names=('name_scenario', 'date_time'))
79  appDf = pd.DataFrame({'elev_chng_meters': elevDiffMeters[1:]},
80  columns = ['elev_chng_meters'], index=dfMultiIdx)
81  returnDf = returnDf.append(appDf)
82  return returnDf
83 
84 
85 def calc_vol_not_perc(*, T, df, scenarios):
86  vDate = T.get_vdate()
87  years = np.unique(vDate[:, 0])
88  returnDf = pd.DataFrame()
89  volNotPerc = np.empty(years.size)
90  for j, curScen in enumerate(scenarios):
91  idxName = np.full(years.size, scenarios[j])
92  curDf = df.xs(curScen)
93  for i, curYr in enumerate(years):
94  iCurWY = (curDf.index.year == curYr-1) & (curDf.index.month >= 10) | \
95  (curDf.index.year == curYr) & (curDf.index.month <= 9)
96  qDiff = curDf.loc[iCurWY]['q_sar_ocwd'].to_numpy() - curDf.loc[iCurWY]['div_ocwd'].to_numpy()
97  qNotPerc = np.amax(np.vstack((np.zeros(qDiff.size), qDiff)), axis=0)
98  volNotPerc[i] = np.sum(qNotPerc*1.983471)
99  dfIndices = [idxName, years]
100  dfMultiIdx = pd.MultiIndex.from_arrays(dfIndices, names=('name_scenario', 'water_year'))
101  curDf = pd.DataFrame({'vol_not_percolated': volNotPerc},
102  columns = ['vol_not_percolated'], index=dfMultiIdx)
103  returnDf = returnDf.append(curDf)
104  return returnDf
105 
106 
def calc_seepage(self, stor)
Definition: prado_spec.py:23
def __init__(self, name, time, seepPolys, cumSeepStrat, constants)
Definition: prado_spec.py:14
def calc_vireo_impacts(*hypso, T, df, scenarios)
Definition: prado_spec.py:37
def calc_vireo_impacts2(*hypso, T, df, scenarios)
Definition: prado_spec.py:64
def calc_vol_not_perc(*T, df, scenarios)
Definition: prado_spec.py:85