Skip to content

Commit 4c87ef0

Browse files
committed
Merge branch 'features/wind_farms_and_clusters' into dev
2 parents a3d3f2c + 6092be0 commit 4c87ef0

File tree

1 file changed

+25
-13
lines changed

1 file changed

+25
-13
lines changed

windpowerlib/turbine_cluster_modelchain.py

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
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
1211
import 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

Comments
 (0)