Skip to content

Commit a3cec32

Browse files
committed
wind farm power curve
1 parent 6948d5f commit a3cec32

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed

windpowerlib/turbine_cluster_modelchain.py

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,106 @@ def __init__(self, wind_object, wake_losses_method='wind_efficiency_curve',
9696
"cluster but `wind_object` is an object of the " +
9797
"class WindFarm.")
9898

99+
def wind_farm_power_curve(self, wind_farm, **kwargs):
100+
r"""
101+
Caluclates the power curve of a wind farm.
102+
Depending on the parameters of the class the power curves are smoothed
103+
and/or density corrected before or after the summation and/or a wind
104+
farm efficiency is applied after the summation. TODO: check entry
105+
Parameters
106+
----------
107+
wind_farm : WindFarm
108+
A :class:`~.wind_farm.WindFarm` object representing the wind farm.
109+
Other Parameters
110+
----------------
111+
roughness_length : Float, optional.
112+
Roughness length.
113+
turbulence_intensity : Float, optional.
114+
Turbulence intensity.
115+
Returns
116+
-------
117+
summarized_power_curve_df : pd.DataFrame
118+
Calculated power curve of the wind farm.
119+
"""
120+
# Initialize data frame for power curve values
121+
df = pd.DataFrame()
122+
for turbine_type_dict in wind_farm.wind_turbine_fleet:
123+
# Check if all needed parameters are available
124+
if self.smoothing:
125+
if (self.standard_deviation_method ==
126+
'turbulence_intensity' and
127+
'turbulence_intensity' not in kwargs):
128+
if 'roughness_length' in kwargs:
129+
# Calculate turbulence intensity and write to kwargs
130+
turbulence_intensity = (
131+
tools.estimate_turbulence_intensity(
132+
turbine_type_dict[
133+
'wind_turbine'].hub_height,
134+
kwargs['roughness_length']))
135+
kwargs[
136+
'turbulence_intensity'] = turbulence_intensity
137+
else:
138+
raise ValueError(
139+
"`roughness_length` must be defined for using " +
140+
"'turbulence_intensity' as " +
141+
"`standard_deviation_method` if " +
142+
"`turbulence_intensity` is not given")
143+
if self.wake_losses_method is not None:
144+
if wind_farm.efficiency is None:
145+
raise KeyError(
146+
"wind_farm_efficiency is needed if " +
147+
"`wake_losses_method´ is '{0}', but ".format(
148+
self.wake_losses_method) +
149+
" `wind_farm_efficiency` of {0} is {1}.".format(
150+
self.wind_object.object_name,
151+
self.wind_object.efficiency))
152+
# Get original power curve
153+
power_curve = pd.DataFrame(
154+
turbine_type_dict['wind_turbine'].power_curve)
155+
# Editions to power curve before the summation
156+
if (self.smoothing and
157+
self.smoothing_order == 'turbine_power_curves'):
158+
power_curve = power_curves.smooth_power_curve(
159+
power_curve['wind_speed'], power_curve['power'],
160+
standard_deviation_method=self.standard_deviation_method,
161+
**kwargs)
162+
# Add power curves of all turbines of same type to data frame after
163+
# renaming columns
164+
power_curve.columns = ['wind_speed', turbine_type_dict[
165+
'wind_turbine'].object_name]
166+
df = pd.concat(
167+
[df, pd.DataFrame( # TODO: merge without renaming
168+
power_curve.set_index(['wind_speed']) *
169+
turbine_type_dict['number_of_turbines'])], axis=1)
170+
# Rename back TODO: copy()
171+
power_curve.columns = ['wind_speed', 'power']
172+
# Sum up power curves of all turbine types
173+
summarized_power_curve = pd.DataFrame(
174+
sum(df[item].interpolate(method='index') for item in list(df)))
175+
summarized_power_curve.columns = ['power']
176+
# Return wind speed (index) to a column of the data frame
177+
summarized_power_curve_df = pd.DataFrame(
178+
data=[list(summarized_power_curve.index),
179+
list(
180+
summarized_power_curve['power'].values)]).transpose()
181+
summarized_power_curve_df.columns = ['wind_speed', 'power']
182+
# Editions to power curve after the summation
183+
if (self.smoothing and
184+
self.smoothing_order == 'wind_farm_power_curves'):
185+
summarized_power_curve_df = power_curves.smooth_power_curve(
186+
summarized_power_curve_df['wind_speed'],
187+
summarized_power_curve_df['power'],
188+
standard_deviation_method=self.standard_deviation_method,
189+
**kwargs)
190+
if (self.wake_losses_method == 'constant_efficiency' or
191+
self.wake_losses_method == 'wind_efficiency_curve'):
192+
summarized_power_curve_df = (
193+
power_curves.wake_losses_to_power_curve(
194+
summarized_power_curve_df['wind_speed'].values,
195+
summarized_power_curve_df['power'].values,
196+
wake_losses_method=self.wake_losses_method,
197+
wind_farm_efficiency=self.wind_object.efficiency))
198+
return summarized_power_curve_df
99199
def turbine_cluster_power_curve(self, **kwargs):
100200
r"""
101201
Caluclates the power curve of a wind turbine cluster.

0 commit comments

Comments
 (0)