Skip to content

Commit 4746c2b

Browse files
committed
Adapt tests and cluster modelchain example to changes in WindFarm
1 parent 2bc6c8d commit 4746c2b

File tree

4 files changed

+74
-35
lines changed

4 files changed

+74
-35
lines changed

example/turbine_cluster_modelchain_example.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@
139139
"example_farm_2 = WindFarm(**example_farm_2_data)\n",
140140
"\n",
141141
"print('nominal power of first turbine type of example_farm_2: {}'.format(\n",
142-
" example_farm_2.wind_turbine_fleet[0]['wind_turbine'].nominal_power))"
142+
" example_farm_2.wind_turbine_fleet.loc[0, 'wind_turbine'].nominal_power))"
143143
]
144144
},
145145
{

tests/test_turbine_cluster_modelchain.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -233,10 +233,6 @@ def test_ignore_wake_losses(self):
233233
**parameters)
234234
test_tc_mc.run_model(self.weather_df)
235235

236-
def test_wind_farm_repr(self):
237-
"""Test string representation of WindFarm"""
238-
assert 'E-126/4200' in repr(wf.WindFarm(**self.test_farm))
239-
240236
def test_wind_turbine_cluster_repr_with_name(self):
241237
"""Test string representation of WindTurbineCluster with a name."""
242238
assert 'Wind turbine cluster:' in repr(

tests/test_wind_farm.py

Lines changed: 70 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import pytest
2+
import pandas as pd
3+
import numpy as np
24
from windpowerlib import WindFarm, WindTurbine
5+
from windpowerlib.tools import WindpowerlibUserWarning
36

47

58
class TestWindFarm:
@@ -13,18 +16,39 @@ def setup_class(self):
1316
'turbine_type': 'V90/2000',
1417
'nominal_power': 2e6}
1518

16-
def test_initialization(self):
17-
"""simple initialization"""
18-
test_farm = {'wind_turbine_fleet': [
19+
def test_initialization_list(self):
20+
"""test simple initialization with wind turbine fleet list"""
21+
wind_turbine_fleet = [
1922
{'wind_turbine': WindTurbine(**self.test_turbine),
2023
'number_of_turbines': 3},
2124
{'wind_turbine': WindTurbine(**self.test_turbine_2),
22-
'number_of_turbines': 2}]}
23-
windfarm = WindFarm(**test_farm)
24-
assert windfarm.nominal_power == 3 * 4.2e6 + 2 * 2e6
25+
'number_of_turbines': 2}]
26+
windfarm = WindFarm(wind_turbine_fleet=wind_turbine_fleet)
27+
assert 3 * 4.2e6 + 2 * 2e6 == windfarm.nominal_power
28+
29+
def test_initialization_list_2(self):
30+
"""test simple initialization with wind turbine fleet list where
31+
once number of turbines and once total capacity is provided"""
32+
wind_turbine_fleet = [
33+
{'wind_turbine': WindTurbine(**self.test_turbine),
34+
'number_of_turbines': 3},
35+
{'wind_turbine': WindTurbine(**self.test_turbine_2),
36+
'total_capacity': 2 * 2e6}]
37+
windfarm = WindFarm(wind_turbine_fleet=wind_turbine_fleet)
38+
assert 3 * 4.2e6 + 2 * 2e6 == windfarm.nominal_power
39+
40+
def test_initialization_dataframe(self):
41+
"""test simple initialization with wind turbine fleet dataframe"""
42+
wind_turbine_fleet = pd.DataFrame(
43+
data={'wind_turbine': [WindTurbine(**self.test_turbine),
44+
WindTurbine(**self.test_turbine_2)],
45+
'number_of_turbines': [3, 2]})
46+
windfarm = WindFarm(wind_turbine_fleet=wind_turbine_fleet)
47+
assert 3 * 4.2e6 + 2 * 2e6 == windfarm.nominal_power
2548

2649
def test_initialization_2(self):
27-
"""WindTurbine in wind_turbine_fleet not initialized"""
50+
"""test catching error when WindTurbine in wind_turbine_fleet
51+
not initialized"""
2852
test_farm = {'wind_turbine_fleet': [
2953
{'wind_turbine': None,
3054
'number_of_turbines': 3}]}
@@ -33,28 +57,39 @@ def test_initialization_2(self):
3357
WindFarm(**test_farm)
3458

3559
def test_initialization_3(self):
36-
"""wind_turbine not specified in wind_turbine_fleet"""
37-
test_farm = {'wind_turbine_fleet': [
38-
{'wind_turbines': None,
39-
'number_of_turbines': 3}]}
40-
msg = 'Missing wind_turbine key in wind turbine'
60+
"""test catching error when wind_turbine not specified in
61+
wind_turbine_fleet"""
62+
wind_turbine_fleet = pd.DataFrame(
63+
data={'wind_turbines': [WindTurbine(**self.test_turbine),
64+
WindTurbine(**self.test_turbine_2)],
65+
'number_of_turbines': [3, 2]})
66+
msg = 'Missing wind_turbine key/column in wind_turbine_fleet'
4167
with pytest.raises(ValueError, match=msg):
42-
WindFarm(**test_farm)
68+
WindFarm(wind_turbine_fleet=wind_turbine_fleet)
4369

44-
def test_initialization_4(self):
45-
"""deduce number_of_turbines from total_capacity"""
46-
total_capacity = 3e6
47-
test_farm = {'wind_turbine_fleet': [
48-
{'wind_turbine': WindTurbine(**self.test_turbine_2),
49-
'total_capacity': total_capacity}]}
50-
windfarm = WindFarm(**test_farm)
51-
number_of_turbines = total_capacity / \
52-
self.test_turbine_2['nominal_power']
53-
assert number_of_turbines == windfarm.wind_turbine_fleet[0][
54-
'number_of_turbines']
70+
def test_initialization_4(self, recwarn):
71+
"""test overwriting and raising warning when number_of_turbines and
72+
total_capacity in wind turbine fleet do not fit"""
73+
wt1 = WindTurbine(**self.test_turbine)
74+
wt2 = WindTurbine(**self.test_turbine_2)
75+
wind_turbine_fleet = pd.DataFrame(
76+
data={'wind_turbine': [wt1, wt2],
77+
'number_of_turbines': [3, 2],
78+
'total_capacity': [3, np.nan]},
79+
index=[0, 1])
80+
windfarm = WindFarm(wind_turbine_fleet=wind_turbine_fleet)
81+
total_cap_wt1_expected = \
82+
wt1.nominal_power * wind_turbine_fleet.loc[0, 'number_of_turbines']
83+
assert windfarm.wind_turbine_fleet.loc[0, 'total_capacity'] == \
84+
total_cap_wt1_expected
85+
total_cap_wt2_expected = \
86+
wt2.nominal_power * wind_turbine_fleet.loc[1, 'number_of_turbines']
87+
assert windfarm.wind_turbine_fleet.loc[1, 'total_capacity'] == \
88+
total_cap_wt2_expected
89+
assert recwarn.pop(WindpowerlibUserWarning)
5590

5691
def test_initialization_5(self):
57-
"""deducing number_of_turbines from total_capacity fails"""
92+
"""test catching error when number of turbines cannot be deduced"""
5893
wt = WindTurbine(**self.test_turbine)
5994
wt.nominal_power = None
6095
test_farm = {'wind_turbine_fleet': [
@@ -65,11 +100,12 @@ def test_initialization_5(self):
65100
WindFarm(**test_farm)
66101

67102
def test_initialization_6(self):
68-
"""number_of_turbines and total_capacity not given"""
103+
"""test catching error when neither number_of_turbines nor
104+
total_capacity is provided"""
69105
test_farm = {'wind_turbine_fleet': [
70106
{'wind_turbine': WindTurbine(**self.test_turbine),
71107
'number_of_turbine': 3e6}]}
72-
msg = 'Please provide `number_of_turbines` or `total_capacity`'
108+
msg = 'Number of turbines of type '
73109
with pytest.raises(ValueError, match=msg):
74110
WindFarm(**test_farm)
75111

@@ -84,3 +120,10 @@ def test_mean_hub_height(self):
84120
assert 97.265 == pytest.approx(
85121
windfarm.mean_hub_height().hub_height, 1e-3)
86122

123+
def test_repr(self):
124+
"""Test string representation of WindFarm"""
125+
test_fleet = [{'wind_turbine': WindTurbine(**self.test_turbine),
126+
'number_of_turbines': 2}]
127+
assert 'E-126/4200' in repr(WindFarm(wind_turbine_fleet=test_fleet))
128+
129+

windpowerlib/wind_turbine_cluster.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,8 @@ def mean_hub_height(self):
127127
128128
"""
129129
self.hub_height = np.exp(sum(
130-
np.log(wind_farm.hub_height) * wind_farm.get_installed_power() for
131-
wind_farm in self.wind_farms) / self.get_installed_power())
130+
np.log(wind_farm.hub_height) * wind_farm.nominal_power for
131+
wind_farm in self.wind_farms) / self.nominal_power)
132132
return self
133133

134134
def get_installed_power(self):
@@ -143,7 +143,7 @@ def get_installed_power(self):
143143
144144
"""
145145
for wind_farm in self.wind_farms:
146-
wind_farm.nominal_power = wind_farm.get_installed_power()
146+
wind_farm.nominal_power = wind_farm.nominal_power
147147
return sum(wind_farm.nominal_power for wind_farm in self.wind_farms)
148148

149149
def assign_power_curve(self, wake_losses_model='wind_farm_efficiency',

0 commit comments

Comments
 (0)