Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions tests/test_wind_farm.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,3 +219,17 @@ def test_aggregation_of_power_curve_with_missing_power_curve(self):
msg = "For an aggregated wind farm power curve each wind"
with pytest.raises(ValueError, match=msg):
windfarm.assign_power_curve()

def test_wind_farm_efficiency_with_missing_efficiency(self):
"""Test WindFarm.assign_power_curve() with missing efficiency while
`wake_losses_model` is 'wind_farm_efficiency'."""
wind_turbine_fleet = [
{
"wind_turbine": WindTurbine(**self.test_turbine),
"number_of_turbines": 3,
}
]
windfarm = WindFarm(wind_turbine_fleet=wind_turbine_fleet)
msg = "If you use `wake_losses_model`"
with pytest.raises(ValueError, match=msg):
windfarm.assign_power_curve()
35 changes: 19 additions & 16 deletions windpowerlib/wind_farm.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,39 +76,39 @@ class WindFarm(object):
>>> from windpowerlib import wind_farm
>>> from windpowerlib import WindTurbine
>>> import pandas as pd
>>> enerconE126={
>>> enerconE126 = {
... 'hub_height': 135,
... 'rotor_diameter': 127,
... 'turbine_type': 'E-126/4200'}
>>> e126=WindTurbine(**enerconE126)
>>> vestasV90={
>>> e126 = WindTurbine(**enerconE126)
>>> vestasV90 = {
... 'hub_height': 90,
... 'turbine_type': 'V90/2000',
... 'nominal_power': 2e6}
>>> v90=WindTurbine(**vestasV90)
>>> v90 = WindTurbine(**vestasV90)
>>> # turbine fleet as DataFrame
>>> wind_turbine_fleet=pd.DataFrame(
>>> wind_turbine_fleet = pd.DataFrame(
... {'wind_turbine': [e126, v90],
... 'number_of_turbines': [6, None],
... 'total_capacity': [None, 3 * 2e6]})
>>> example_farm=wind_farm.WindFarm(wind_turbine_fleet, name='my_farm')
>>> example_farm = wind_farm.WindFarm(wind_turbine_fleet, name='my_farm')
>>> print(example_farm.nominal_power)
31200000.0
>>> # turbine fleet as a list of WindTurbineGroup objects using the
>>> # 'to_group' method.
>>> wind_turbine_fleet=[e126.to_group(6),
>>> wind_turbine_fleet = [e126.to_group(6),
... v90.to_group(total_capacity=3 * 2e6)]
>>> example_farm=wind_farm.WindFarm(wind_turbine_fleet, name='my_farm')
>>> example_farm = wind_farm.WindFarm(wind_turbine_fleet, name='my_farm')
>>> print(example_farm.nominal_power)
31200000.0
>>> # turbine fleet as list of dictionaries (not recommended)
>>> example_farm_data={
>>> example_farm_data = {
... 'name': 'my_farm',
... 'wind_turbine_fleet': [{'wind_turbine': e126,
... 'number_of_turbines': 6},
... {'wind_turbine': v90,
... 'total_capacity': 3 * 2e6}]}
>>> example_farm=wind_farm.WindFarm(**example_farm_data)
>>> example_farm = wind_farm.WindFarm(**example_farm_data)
>>> print(example_farm.nominal_power)
31200000.0
"""
Expand Down Expand Up @@ -275,7 +275,7 @@ def mean_hub_height(self):
-----
The following equation is used [1]_:

.. math:: h_{WF}=e^{\sum\limits_{k}{ln(h_{WT,k})}
.. math:: h_{WF} = e^{\sum\limits_{k}{ln(h_{WT,k})}
\frac{P_{N,k}}{\sum\limits_{k}{P_{N,k}}}}

with:
Expand Down Expand Up @@ -470,12 +470,15 @@ def assign_power_curve(
wind_farm_efficiency=self.efficiency,
)
else:
logging.info(
"`wake_losses_model` is {} but wind farm ".format(
wake_losses_model
msg = (
"If you use `wake_losses_model` '{model}' your WindFarm "
"needs an efficiency but `efficiency` is {eff}. \n\n"
"Failing farm:\n {farm}"
)
raise ValueError(
msg.format(
model=wake_losses_model, farm=self, eff=self.efficiency
)
+ "efficiency is NOT taken into "
"account as it is None."
)
self.power_curve = wind_farm_power_curve
return self
6 changes: 4 additions & 2 deletions windpowerlib/wind_turbine_cluster.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,8 +148,10 @@ def assign_power_curve(
Parameters
----------
wake_losses_model : str
Defines the method for taking wake losses within the farm into
consideration. Options: 'wind_farm_efficiency' or None.
Defines the method for taking wake losses within the wind farms of
the cluster into consideration. Options: 'wind_farm_efficiency'
or None. If 'wind_farm_efficiency' is chosen the `efficiency`
attribute of the WindFarms must be set.
Default: 'wind_farm_efficiency'.
smoothing : bool
If True the power curves will be smoothed before or after the
Expand Down