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
.Generation
.Production
.GeneratingUnit
import GeneratingUnit
19 class ThermalGeneratingUnit(GeneratingUnit
):
20 """A generating unit whose prime mover could be a steam turbine, combustion turbine, or diesel engine.
23 def __init__(self
, oMCost
=0.0, StartupModel
=None, EmmissionAccounts
=None, CombinedCyclePlant
=None, CogenerationPlant
=None, EmissionCurves
=None, HeatRateCurve
=None, ShutdownCurve
=None, IncrementalHeatRateCurve
=None, FuelAllocationSchedules
=None, FossilFuels
=None, HeatInputCurve
=None, CAESPlant
=None, *args
, **kw_args
):
24 """Initialises a new 'ThermalGeneratingUnit' instance.
26 @param oMCost: Operating and maintenance cost for the thermal unit
27 @param StartupModel: A thermal generating unit may have a startup model
28 @param EmmissionAccounts: A thermal generating unit may have one or more emission allowance accounts
29 @param CombinedCyclePlant: A thermal generating unit may be a member of a combined cycle plant
30 @param CogenerationPlant: A thermal generating unit may be a member of a cogeneration plant
31 @param EmissionCurves: A thermal generating unit may have one or more emission curves
32 @param HeatRateCurve: A thermal generating unit may have a heat rate curve
33 @param ShutdownCurve: A thermal generating unit may have a shutdown curve
34 @param IncrementalHeatRateCurve: A thermal generating unit may have an incremental heat rate curve
35 @param FuelAllocationSchedules: A thermal generating unit may have one or more fuel allocation schedules
36 @param FossilFuels: A thermal generating unit may have one or more fossil fuels
37 @param HeatInputCurve: A thermal generating unit may have a heat input curve
38 @param CAESPlant: A thermal generating unit may be a member of a compressed air energy storage plant
40 #: Operating and maintenance cost for the thermal unit
43 self
._StartupModel
= None
44 self
.StartupModel
= StartupModel
46 self
._EmmissionAccounts
= []
47 self
.EmmissionAccounts
= [] if EmmissionAccounts
is None else EmmissionAccounts
49 self
._CombinedCyclePlant
= None
50 self
.CombinedCyclePlant
= CombinedCyclePlant
52 self
._CogenerationPlant
= None
53 self
.CogenerationPlant
= CogenerationPlant
55 self
._EmissionCurves
= []
56 self
.EmissionCurves
= [] if EmissionCurves
is None else EmissionCurves
58 self
._HeatRateCurve
= None
59 self
.HeatRateCurve
= HeatRateCurve
61 self
._ShutdownCurve
= None
62 self
.ShutdownCurve
= ShutdownCurve
64 self
._IncrementalHeatRateCurve
= None
65 self
.IncrementalHeatRateCurve
= IncrementalHeatRateCurve
67 self
._FuelAllocationSchedules
= []
68 self
.FuelAllocationSchedules
= [] if FuelAllocationSchedules
is None else FuelAllocationSchedules
70 self
._FossilFuels
= []
71 self
.FossilFuels
= [] if FossilFuels
is None else FossilFuels
73 self
._HeatInputCurve
= None
74 self
.HeatInputCurve
= HeatInputCurve
76 self
._CAESPlant
= None
77 self
.CAESPlant
= CAESPlant
79 super(ThermalGeneratingUnit
, self
).__init
__(*args
, **kw_args
)
82 _attr_types
= {"oMCost": float}
83 _defaults
= {"oMCost": 0.0}
85 _refs
= ["StartupModel", "EmmissionAccounts", "CombinedCyclePlant", "CogenerationPlant", "EmissionCurves", "HeatRateCurve", "ShutdownCurve", "IncrementalHeatRateCurve", "FuelAllocationSchedules", "FossilFuels", "HeatInputCurve", "CAESPlant"]
86 _many_refs
= ["EmmissionAccounts", "EmissionCurves", "FuelAllocationSchedules", "FossilFuels"]
88 def getStartupModel(self
):
89 """A thermal generating unit may have a startup model
91 return self
._StartupModel
93 def setStartupModel(self
, value
):
94 if self
._StartupModel
is not None:
95 self
._StartupModel
._ThermalGeneratingUnit
= None
97 self
._StartupModel
= value
98 if self
._StartupModel
is not None:
99 self
._StartupModel
._ThermalGeneratingUnit
= self
101 StartupModel
= property(getStartupModel
, setStartupModel
)
103 def getEmmissionAccounts(self
):
104 """A thermal generating unit may have one or more emission allowance accounts
106 return self
._EmmissionAccounts
108 def setEmmissionAccounts(self
, value
):
109 for x
in self
._EmmissionAccounts
:
110 x
._ThermalGeneratingUnit
= None
112 y
._ThermalGeneratingUnit
= self
113 self
._EmmissionAccounts
= value
115 EmmissionAccounts
= property(getEmmissionAccounts
, setEmmissionAccounts
)
117 def addEmmissionAccounts(self
, *EmmissionAccounts
):
118 for obj
in EmmissionAccounts
:
119 obj
._ThermalGeneratingUnit
= self
120 self
._EmmissionAccounts
.append(obj
)
122 def removeEmmissionAccounts(self
, *EmmissionAccounts
):
123 for obj
in EmmissionAccounts
:
124 obj
._ThermalGeneratingUnit
= None
125 self
._EmmissionAccounts
.remove(obj
)
127 def getCombinedCyclePlant(self
):
128 """A thermal generating unit may be a member of a combined cycle plant
130 return self
._CombinedCyclePlant
132 def setCombinedCyclePlant(self
, value
):
133 if self
._CombinedCyclePlant
is not None:
134 filtered
= [x
for x
in self
.CombinedCyclePlant
.ThermalGeneratingUnits
if x
!= self
]
135 self
._CombinedCyclePlant
._ThermalGeneratingUnits
= filtered
137 self
._CombinedCyclePlant
= value
138 if self
._CombinedCyclePlant
is not None:
139 self
._CombinedCyclePlant
._ThermalGeneratingUnits
.append(self
)
141 CombinedCyclePlant
= property(getCombinedCyclePlant
, setCombinedCyclePlant
)
143 def getCogenerationPlant(self
):
144 """A thermal generating unit may be a member of a cogeneration plant
146 return self
._CogenerationPlant
148 def setCogenerationPlant(self
, value
):
149 if self
._CogenerationPlant
is not None:
150 filtered
= [x
for x
in self
.CogenerationPlant
.ThermalGeneratingUnits
if x
!= self
]
151 self
._CogenerationPlant
._ThermalGeneratingUnits
= filtered
153 self
._CogenerationPlant
= value
154 if self
._CogenerationPlant
is not None:
155 self
._CogenerationPlant
._ThermalGeneratingUnits
.append(self
)
157 CogenerationPlant
= property(getCogenerationPlant
, setCogenerationPlant
)
159 def getEmissionCurves(self
):
160 """A thermal generating unit may have one or more emission curves
162 return self
._EmissionCurves
164 def setEmissionCurves(self
, value
):
165 for x
in self
._EmissionCurves
:
166 x
._ThermalGeneratingUnit
= None
168 y
._ThermalGeneratingUnit
= self
169 self
._EmissionCurves
= value
171 EmissionCurves
= property(getEmissionCurves
, setEmissionCurves
)
173 def addEmissionCurves(self
, *EmissionCurves
):
174 for obj
in EmissionCurves
:
175 obj
._ThermalGeneratingUnit
= self
176 self
._EmissionCurves
.append(obj
)
178 def removeEmissionCurves(self
, *EmissionCurves
):
179 for obj
in EmissionCurves
:
180 obj
._ThermalGeneratingUnit
= None
181 self
._EmissionCurves
.remove(obj
)
183 def getHeatRateCurve(self
):
184 """A thermal generating unit may have a heat rate curve
186 return self
._HeatRateCurve
188 def setHeatRateCurve(self
, value
):
189 if self
._HeatRateCurve
is not None:
190 self
._HeatRateCurve
._ThermalGeneratingUnit
= None
192 self
._HeatRateCurve
= value
193 if self
._HeatRateCurve
is not None:
194 self
._HeatRateCurve
._ThermalGeneratingUnit
= self
196 HeatRateCurve
= property(getHeatRateCurve
, setHeatRateCurve
)
198 def getShutdownCurve(self
):
199 """A thermal generating unit may have a shutdown curve
201 return self
._ShutdownCurve
203 def setShutdownCurve(self
, value
):
204 if self
._ShutdownCurve
is not None:
205 self
._ShutdownCurve
._ThermalGeneratingUnit
= None
207 self
._ShutdownCurve
= value
208 if self
._ShutdownCurve
is not None:
209 self
._ShutdownCurve
._ThermalGeneratingUnit
= self
211 ShutdownCurve
= property(getShutdownCurve
, setShutdownCurve
)
213 def getIncrementalHeatRateCurve(self
):
214 """A thermal generating unit may have an incremental heat rate curve
216 return self
._IncrementalHeatRateCurve
218 def setIncrementalHeatRateCurve(self
, value
):
219 if self
._IncrementalHeatRateCurve
is not None:
220 self
._IncrementalHeatRateCurve
._ThermalGeneratingUnit
= None
222 self
._IncrementalHeatRateCurve
= value
223 if self
._IncrementalHeatRateCurve
is not None:
224 self
._IncrementalHeatRateCurve
._ThermalGeneratingUnit
= self
226 IncrementalHeatRateCurve
= property(getIncrementalHeatRateCurve
, setIncrementalHeatRateCurve
)
228 def getFuelAllocationSchedules(self
):
229 """A thermal generating unit may have one or more fuel allocation schedules
231 return self
._FuelAllocationSchedules
233 def setFuelAllocationSchedules(self
, value
):
234 for x
in self
._FuelAllocationSchedules
:
235 x
._ThermalGeneratingUnit
= None
237 y
._ThermalGeneratingUnit
= self
238 self
._FuelAllocationSchedules
= value
240 FuelAllocationSchedules
= property(getFuelAllocationSchedules
, setFuelAllocationSchedules
)
242 def addFuelAllocationSchedules(self
, *FuelAllocationSchedules
):
243 for obj
in FuelAllocationSchedules
:
244 obj
._ThermalGeneratingUnit
= self
245 self
._FuelAllocationSchedules
.append(obj
)
247 def removeFuelAllocationSchedules(self
, *FuelAllocationSchedules
):
248 for obj
in FuelAllocationSchedules
:
249 obj
._ThermalGeneratingUnit
= None
250 self
._FuelAllocationSchedules
.remove(obj
)
252 def getFossilFuels(self
):
253 """A thermal generating unit may have one or more fossil fuels
255 return self
._FossilFuels
257 def setFossilFuels(self
, value
):
258 for x
in self
._FossilFuels
:
259 x
._ThermalGeneratingUnit
= None
261 y
._ThermalGeneratingUnit
= self
262 self
._FossilFuels
= value
264 FossilFuels
= property(getFossilFuels
, setFossilFuels
)
266 def addFossilFuels(self
, *FossilFuels
):
267 for obj
in FossilFuels
:
268 obj
._ThermalGeneratingUnit
= self
269 self
._FossilFuels
.append(obj
)
271 def removeFossilFuels(self
, *FossilFuels
):
272 for obj
in FossilFuels
:
273 obj
._ThermalGeneratingUnit
= None
274 self
._FossilFuels
.remove(obj
)
276 def getHeatInputCurve(self
):
277 """A thermal generating unit may have a heat input curve
279 return self
._HeatInputCurve
281 def setHeatInputCurve(self
, value
):
282 if self
._HeatInputCurve
is not None:
283 self
._HeatInputCurve
._ThermalGeneratingUnit
= None
285 self
._HeatInputCurve
= value
286 if self
._HeatInputCurve
is not None:
287 self
._HeatInputCurve
._ThermalGeneratingUnit
= self
289 HeatInputCurve
= property(getHeatInputCurve
, setHeatInputCurve
)
291 def getCAESPlant(self
):
292 """A thermal generating unit may be a member of a compressed air energy storage plant
294 return self
._CAESPlant
296 def setCAESPlant(self
, value
):
297 if self
._CAESPlant
is not None:
298 self
._CAESPlant
._ThermalGeneratingUnit
= None
300 self
._CAESPlant
= value
301 if self
._CAESPlant
is not None:
302 self
._CAESPlant
._ThermalGeneratingUnit
= self
304 CAESPlant
= property(getCAESPlant
, setCAESPlant
)