77__copyright__ = "Copyright oemof developer group"
88__license__ = "GPLv3"
99
10- from . import (modelchain , power_output , tools , wind_farm ,
11- power_curve , wind_turbine_cluster )
10+ from . import modelchain , tools , wind_farm , power_curve , wind_turbine_cluster
1211import pandas as pd
1312
1413
@@ -87,13 +86,13 @@ class TurbineClusterModelChain(object):
8786 Default: 'wind_farm_power_curves'.
8887
8988 """
90- def __init__ (self , wind_object , density_correction = False , #TODO: parameter cluster_or_farm boolean ?
89+ def __init__ (self , wind_object , density_correction = False ,
9190 wake_losses_method = 'constant_efficiency' , smoothing = True ,
9291 block_width = 0.5 ,
9392 standard_deviation_method = 'turbulence_intensity' ,
9493 density_correction_order = 'wind_farm_power_curves' ,
9594 smoothing_order = 'wind_farm_power_curves' ):
96- # TODO Fehler abfangen (falls cluster aber wind farm)
95+
9796 self .wind_object = wind_object
9897 self .density_correction = density_correction
9998 self .wake_losses_method = wake_losses_method
@@ -105,7 +104,16 @@ def __init__(self, wind_object, density_correction=False, #TODO: parameter clus
105104
106105 self .power_output = None
107106
108- # TODO: if a wind turbine of wind farm does not have power curve but cp curve:
107+ if (isinstance (self .wind_object , wind_farm .WindFarm ) and
108+ self .density_correction_order == 'cluster_power_curve' or
109+ self .smoothing_order == 'cluster_power_curve' ):
110+ raise ValueError ("`density_correction_order` and " +
111+ "`smoothing_order` can only be " +
112+ "'cluster_power_curve' if you calculate a " +
113+ "cluster but `wind_object` is an object of the " +
114+ "class WindFarm." )
115+
116+ # TODO: if a wind turbine of wind farm does not have a power curve but a cp curve:
109117 # calculate power curve from cp curve
110118
111119 def wind_farm_power_curve (self , wind_farm , ** kwargs ):
@@ -134,8 +142,9 @@ def wind_farm_power_curve(self, wind_farm, **kwargs):
134142 for turbine_type_dict in wind_farm .wind_turbine_fleet :
135143 # Check if all needed parameters are available
136144 if self .smoothing :
137- if (self .standard_deviation_method == 'turbulence_intensity'
138- and 'turbulence_intensity' not in kwargs ):
145+ if (self .standard_deviation_method ==
146+ 'turbulence_intensity' and
147+ 'turbulence_intensity' not in kwargs ):
139148 if 'roughness_length' in kwargs :
140149 # Calculate turbulence intensity and write to kwargs
141150 turbulence_intensity = (
@@ -149,7 +158,7 @@ def wind_farm_power_curve(self, wind_farm, **kwargs):
149158 "'turbulence_intensity' as " +
150159 "`standard_deviation_method`" )
151160 if self . density_correction :
152- pass # TODO: any restrictions? density needed
161+ pass # TODO: restrictions ( density needed)
153162 if self .wake_losses_method is not None :
154163 if self .wind_object .efficiency is None : # TODO if not...
155164 raise KeyError (
@@ -174,7 +183,7 @@ def wind_farm_power_curve(self, wind_farm, **kwargs):
174183 # renaming columns
175184 power_curve .columns = ['wind_speed' , turbine_type_dict [
176185 'wind_turbine' ].object_name ]
177- df = pd .concat ([df , pd .DataFrame (
186+ df = pd .concat ([df , pd .DataFrame ( # TODO: merge without renaming
178187 power_curve .set_index (['wind_speed' ]) *
179188 turbine_type_dict ['number_of_turbines' ])], axis = 1 )
180189 # Rename back TODO: copy()
@@ -218,7 +227,7 @@ def turbine_cluster_power_curve(self, **kwargs):
218227 curves.
219228
220229 Other Parameters
221- ---------------- # TODO: check entry
230+ ----------------
222231 roughness_length : Float, optional.
223232 Roughness length.
224233 turbulence_intensity : Float, optional.
@@ -246,9 +255,8 @@ def turbine_cluster_power_curve(self, **kwargs):
246255 data = [list (summarized_power_curve .index ),
247256 list (summarized_power_curve ['power' ].values )]).transpose ()
248257 summarized_power_curve_df .columns = ['wind_speed' , 'power' ]
249- if (self .density_correction and
250- self .density_correction_order == 'cluster_power_curve' ):
251- pass # TODO: add density correction
258+ # Edition to power curve. Note: density correction is done in the
259+ # function run_model()
252260 if (self .smoothing and
253261 self .smoothing_order == 'cluster_power_curve' ):
254262 summarized_power_curve_df = power_curve .smooth_power_curve (
@@ -395,6 +403,10 @@ def run_model(self, weather_df, **kwargs):
395403 self .assign_power_curve (** kwargs )
396404 # Get modelchain parameters
397405 modelchain_data = self .get_modelchain_data (** kwargs )
406+ # Density correction to cluster power curve # TODO test
407+ if (self .density_correction and
408+ self .density_correction_order == 'cluster_power_curve' ):
409+ modelchain_data ['density_correction' ] = True
398410 # Run modelchain
399411 mc = modelchain .ModelChain (
400412 self .wind_object , ** modelchain_data ).run_model (weather_df )
0 commit comments