1 # Copyright (C) 2010 Richard Lincoln
3 # This library is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU Lesser General Public
5 # License as published by the Free Software Foundation; either
6 # version 2.1 of the License, or (at your option) any later version.
8 # This library is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 # Lesser General Public License for more details.
13 # You should have received a copy of the GNU Lesser General Public
14 # License along with this library; if not, write to the Free Software
15 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA, USA
17 from CIM14
.IEC61970
.Core
.PowerSystemResource
import PowerSystemResource
19 class Reservoir(PowerSystemResource
):
20 """A water storage facility within a hydro system, including: ponds, lakes, lagoons, and rivers. The storage is usually behind some type of dam.
23 def __init__(self
, spillWayGateType
="", fullSupplyLevel
=0.0, spillTravelDelay
=0.0, spillwayCrestLength
=0.0, grossCapacity
=0.0, riverOutletWorks
='', spillwayCapacity
=0.0, spillwayCrestLevel
=0.0, normalMinOperateLevel
=0.0, energyStorageRating
=0.0, activeStorageCapacity
=0.0, LevelVsVolumeCurves
=None, InflowForecasts
=None, TargetLevelSchedule
=None, HydroPowerPlants
=None, UpstreamFromHydroPowerPlants
=None, SpillsFromReservoir
=None, SpillsIntoReservoirs
=None, *args
, **kw_args
):
24 """Initialises a new 'Reservoir' instance.
26 @param spillWayGateType: Type of spillway gate, including parameters
27 @param fullSupplyLevel: Full supply level, above which water will spill. This can be the spillway crest level or the top of closed gates.
28 @param spillTravelDelay: The spillway water travel delay to the next downstream reservoir
29 @param spillwayCrestLength: The length of the spillway crest
30 @param grossCapacity: Total capacity of reservoir
31 @param riverOutletWorks: River outlet works for riparian right releases or other purposes
32 @param spillwayCapacity: The flow capacity of the spillway in cubic meters per second
33 @param spillwayCrestLevel: Spillway crest level above which water will spill
34 @param normalMinOperateLevel: Normal minimum operating level below which the penstocks will draw air
35 @param energyStorageRating: The reservoir's energy storage rating in energy for given head conditions
36 @param activeStorageCapacity: Storage volume between the full supply level and the normal minimum operating level
37 @param LevelVsVolumeCurves: A reservoir may have a level versus volume relationship.
38 @param InflowForecasts: A reservoir may have a 'natural' inflow forecast.
39 @param TargetLevelSchedule: A reservoir may have a water level target schedule.
40 @param HydroPowerPlants: Generators discharge water to or pumps are supplied water from a downstream reservoir
41 @param UpstreamFromHydroPowerPlants: Generators are supplied water from or pumps discharge water to an upstream reservoir
42 @param SpillsFromReservoir: A reservoir may spill into a downstream reservoir
43 @param SpillsIntoReservoirs: A reservoir may spill into a downstream reservoir
45 #: Type of spillway gate, including parameters
46 self
.spillWayGateType
= spillWayGateType
48 #: Full supply level, above which water will spill. This can be the spillway crest level or the top of closed gates.
49 self
.fullSupplyLevel
= fullSupplyLevel
51 #: The spillway water travel delay to the next downstream reservoir
52 self
.spillTravelDelay
= spillTravelDelay
54 #: The length of the spillway crest
55 self
.spillwayCrestLength
= spillwayCrestLength
57 #: Total capacity of reservoir
58 self
.grossCapacity
= grossCapacity
60 #: River outlet works for riparian right releases or other purposes
61 self
.riverOutletWorks
= riverOutletWorks
63 #: The flow capacity of the spillway in cubic meters per second
64 self
.spillwayCapacity
= spillwayCapacity
66 #: Spillway crest level above which water will spill
67 self
.spillwayCrestLevel
= spillwayCrestLevel
69 #: Normal minimum operating level below which the penstocks will draw air
70 self
.normalMinOperateLevel
= normalMinOperateLevel
72 #: The reservoir's energy storage rating in energy for given head conditions
73 self
.energyStorageRating
= energyStorageRating
75 #: Storage volume between the full supply level and the normal minimum operating level
76 self
.activeStorageCapacity
= activeStorageCapacity
78 self
._LevelVsVolumeCurves
= []
79 self
.LevelVsVolumeCurves
= [] if LevelVsVolumeCurves
is None else LevelVsVolumeCurves
81 self
._InflowForecasts
= []
82 self
.InflowForecasts
= [] if InflowForecasts
is None else InflowForecasts
84 self
._TargetLevelSchedule
= None
85 self
.TargetLevelSchedule
= TargetLevelSchedule
87 self
._HydroPowerPlants
= []
88 self
.HydroPowerPlants
= [] if HydroPowerPlants
is None else HydroPowerPlants
90 self
._UpstreamFromHydroPowerPlants
= []
91 self
.UpstreamFromHydroPowerPlants
= [] if UpstreamFromHydroPowerPlants
is None else UpstreamFromHydroPowerPlants
93 self
._SpillsFromReservoir
= None
94 self
.SpillsFromReservoir
= SpillsFromReservoir
96 self
._SpillsIntoReservoirs
= []
97 self
.SpillsIntoReservoirs
= [] if SpillsIntoReservoirs
is None else SpillsIntoReservoirs
99 super(Reservoir
, self
).__init
__(*args
, **kw_args
)
101 _attrs
= ["spillWayGateType", "fullSupplyLevel", "spillTravelDelay", "spillwayCrestLength", "grossCapacity", "riverOutletWorks", "spillwayCapacity", "spillwayCrestLevel", "normalMinOperateLevel", "energyStorageRating", "activeStorageCapacity"]
102 _attr_types
= {"spillWayGateType": str, "fullSupplyLevel": float, "spillTravelDelay": float, "spillwayCrestLength": float, "grossCapacity": float, "riverOutletWorks": str, "spillwayCapacity": float, "spillwayCrestLevel": float, "normalMinOperateLevel": float, "energyStorageRating": float, "activeStorageCapacity": float}
103 _defaults
= {"spillWayGateType": "", "fullSupplyLevel": 0.0, "spillTravelDelay": 0.0, "spillwayCrestLength": 0.0, "grossCapacity": 0.0, "riverOutletWorks": '', "spillwayCapacity": 0.0, "spillwayCrestLevel": 0.0, "normalMinOperateLevel": 0.0, "energyStorageRating": 0.0, "activeStorageCapacity": 0.0}
104 _enums
= {"spillWayGateType": "SpillwayGateType"}
105 _refs
= ["LevelVsVolumeCurves", "InflowForecasts", "TargetLevelSchedule", "HydroPowerPlants", "UpstreamFromHydroPowerPlants", "SpillsFromReservoir", "SpillsIntoReservoirs"]
106 _many_refs
= ["LevelVsVolumeCurves", "InflowForecasts", "HydroPowerPlants", "UpstreamFromHydroPowerPlants", "SpillsIntoReservoirs"]
108 def getLevelVsVolumeCurves(self
):
109 """A reservoir may have a level versus volume relationship.
111 return self
._LevelVsVolumeCurves
113 def setLevelVsVolumeCurves(self
, value
):
114 for x
in self
._LevelVsVolumeCurves
:
118 self
._LevelVsVolumeCurves
= value
120 LevelVsVolumeCurves
= property(getLevelVsVolumeCurves
, setLevelVsVolumeCurves
)
122 def addLevelVsVolumeCurves(self
, *LevelVsVolumeCurves
):
123 for obj
in LevelVsVolumeCurves
:
124 obj
._Reservoir
= self
125 self
._LevelVsVolumeCurves
.append(obj
)
127 def removeLevelVsVolumeCurves(self
, *LevelVsVolumeCurves
):
128 for obj
in LevelVsVolumeCurves
:
129 obj
._Reservoir
= None
130 self
._LevelVsVolumeCurves
.remove(obj
)
132 def getInflowForecasts(self
):
133 """A reservoir may have a 'natural' inflow forecast.
135 return self
._InflowForecasts
137 def setInflowForecasts(self
, value
):
138 for x
in self
._InflowForecasts
:
142 self
._InflowForecasts
= value
144 InflowForecasts
= property(getInflowForecasts
, setInflowForecasts
)
146 def addInflowForecasts(self
, *InflowForecasts
):
147 for obj
in InflowForecasts
:
148 obj
._Reservoir
= self
149 self
._InflowForecasts
.append(obj
)
151 def removeInflowForecasts(self
, *InflowForecasts
):
152 for obj
in InflowForecasts
:
153 obj
._Reservoir
= None
154 self
._InflowForecasts
.remove(obj
)
156 def getTargetLevelSchedule(self
):
157 """A reservoir may have a water level target schedule.
159 return self
._TargetLevelSchedule
161 def setTargetLevelSchedule(self
, value
):
162 if self
._TargetLevelSchedule
is not None:
163 self
._TargetLevelSchedule
._Reservoir
= None
165 self
._TargetLevelSchedule
= value
166 if self
._TargetLevelSchedule
is not None:
167 self
._TargetLevelSchedule
._Reservoir
= self
169 TargetLevelSchedule
= property(getTargetLevelSchedule
, setTargetLevelSchedule
)
171 def getHydroPowerPlants(self
):
172 """Generators discharge water to or pumps are supplied water from a downstream reservoir
174 return self
._HydroPowerPlants
176 def setHydroPowerPlants(self
, value
):
177 for x
in self
._HydroPowerPlants
:
181 self
._HydroPowerPlants
= value
183 HydroPowerPlants
= property(getHydroPowerPlants
, setHydroPowerPlants
)
185 def addHydroPowerPlants(self
, *HydroPowerPlants
):
186 for obj
in HydroPowerPlants
:
187 obj
._Reservoir
= self
188 self
._HydroPowerPlants
.append(obj
)
190 def removeHydroPowerPlants(self
, *HydroPowerPlants
):
191 for obj
in HydroPowerPlants
:
192 obj
._Reservoir
= None
193 self
._HydroPowerPlants
.remove(obj
)
195 def getUpstreamFromHydroPowerPlants(self
):
196 """Generators are supplied water from or pumps discharge water to an upstream reservoir
198 return self
._UpstreamFromHydroPowerPlants
200 def setUpstreamFromHydroPowerPlants(self
, value
):
201 for x
in self
._UpstreamFromHydroPowerPlants
:
202 x
._GenSourcePumpDischargeReservoir
= None
204 y
._GenSourcePumpDischargeReservoir
= self
205 self
._UpstreamFromHydroPowerPlants
= value
207 UpstreamFromHydroPowerPlants
= property(getUpstreamFromHydroPowerPlants
, setUpstreamFromHydroPowerPlants
)
209 def addUpstreamFromHydroPowerPlants(self
, *UpstreamFromHydroPowerPlants
):
210 for obj
in UpstreamFromHydroPowerPlants
:
211 obj
._GenSourcePumpDischargeReservoir
= self
212 self
._UpstreamFromHydroPowerPlants
.append(obj
)
214 def removeUpstreamFromHydroPowerPlants(self
, *UpstreamFromHydroPowerPlants
):
215 for obj
in UpstreamFromHydroPowerPlants
:
216 obj
._GenSourcePumpDischargeReservoir
= None
217 self
._UpstreamFromHydroPowerPlants
.remove(obj
)
219 def getSpillsFromReservoir(self
):
220 """A reservoir may spill into a downstream reservoir
222 return self
._SpillsFromReservoir
224 def setSpillsFromReservoir(self
, value
):
225 if self
._SpillsFromReservoir
is not None:
226 filtered
= [x
for x
in self
.SpillsFromReservoir
.SpillsIntoReservoirs
if x
!= self
]
227 self
._SpillsFromReservoir
._SpillsIntoReservoirs
= filtered
229 self
._SpillsFromReservoir
= value
230 if self
._SpillsFromReservoir
is not None:
231 self
._SpillsFromReservoir
._SpillsIntoReservoirs
.append(self
)
233 SpillsFromReservoir
= property(getSpillsFromReservoir
, setSpillsFromReservoir
)
235 def getSpillsIntoReservoirs(self
):
236 """A reservoir may spill into a downstream reservoir
238 return self
._SpillsIntoReservoirs
240 def setSpillsIntoReservoirs(self
, value
):
241 for x
in self
._SpillsIntoReservoirs
:
242 x
._SpillsFromReservoir
= None
244 y
._SpillsFromReservoir
= self
245 self
._SpillsIntoReservoirs
= value
247 SpillsIntoReservoirs
= property(getSpillsIntoReservoirs
, setSpillsIntoReservoirs
)
249 def addSpillsIntoReservoirs(self
, *SpillsIntoReservoirs
):
250 for obj
in SpillsIntoReservoirs
:
251 obj
._SpillsFromReservoir
= self
252 self
._SpillsIntoReservoirs
.append(obj
)
254 def removeSpillsIntoReservoirs(self
, *SpillsIntoReservoirs
):
255 for obj
in SpillsIntoReservoirs
:
256 obj
._SpillsFromReservoir
= None
257 self
._SpillsIntoReservoirs
.remove(obj
)