Adding class meta-data attributes.
[PyCIM.git] / schemata / CIM14 / IEC61970 / Generation / Production / Reservoir.py
blob28b8790d3ebb6d5533ce2e34115633214c4c9f7e
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.
21 """
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
44 """
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:
115 x._Reservoir = None
116 for y in value:
117 y._Reservoir = self
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:
139 x._Reservoir = None
140 for y in value:
141 y._Reservoir = self
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:
178 x._Reservoir = None
179 for y in value:
180 y._Reservoir = self
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
203 for y in value:
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
243 for y in value:
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)