Skip to content

Commit 2085f0d

Browse files
committed
Merge branch 'dev' into features/improve_modelchain_documentation
2 parents 77781e2 + fcdb75a commit 2085f0d

10 files changed

+513
-279
lines changed

example/turbine_cluster_modelchain_example.ipynb

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
"source": [
8484
"### Initialize wind farm\n",
8585
"\n",
86-
"To initialize a specific wind farm you need to provide a wind turbine fleet and optionally a wind farm efficiency and a name as an identifier."
86+
"To initialize a specific wind farm you need to provide a wind turbine fleet specifying the wind turbines and their number or total installed capacity (in Watt) in the farm. Optionally, you can specify a wind farm efficiency and a name as an identifier."
8787
]
8888
},
8989
{
@@ -95,10 +95,12 @@
9595
"# specification of wind farm\n",
9696
"example_farm_data = {\n",
9797
" 'name': 'example_farm',\n",
98-
" 'wind_turbine_fleet': [{'wind_turbine': my_turbine,\n",
99-
" 'number_of_turbines': 6},\n",
98+
" 'wind_turbine_fleet': [{'wind_turbine': my_turbine, # as windpowerlib.WindTurbine\n",
99+
" 'number_of_turbines': 6}, # number of `my_turbine` turbines in farm (float \n",
100+
" # values are possible as well)\n",
100101
" {'wind_turbine': e126,\n",
101-
" 'number_of_turbines': 3}\n",
102+
" 'total_capacity': 12.6e6} # installed capacity of `my_turbine` turbines \n",
103+
" # in farm in Watt\n",
102104
" ]}\n",
103105
"\n",
104106
"# initialize WindFarm object\n",
@@ -139,7 +141,7 @@
139141
"example_farm_2 = WindFarm(**example_farm_2_data)\n",
140142
"\n",
141143
"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))"
144+
" example_farm_2.wind_turbine_fleet.loc[0, 'wind_turbine'].nominal_power))"
143145
]
144146
},
145147
{
@@ -339,7 +341,7 @@
339341
"name": "python",
340342
"nbconvert_exporter": "python",
341343
"pygments_lexer": "ipython3",
342-
"version": "3.6.6"
344+
"version": "3.6.7"
343345
}
344346
},
345347
"nbformat": 4,

example/turbine_cluster_modelchain_example.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,11 @@ def initialize_wind_farms(my_turbine, e126):
3333
Initializes two :class:`~.wind_farm.WindFarm` objects.
3434
3535
This function shows how to initialize a WindFarm object. A WindFarm needs
36-
a wind turbine fleet. Optionally, you can provide a wind farm efficiency
37-
(which can be constant or dependent on the wind speed) and a name as an
38-
identifier. See :class:`~.wind_farm.WindFarm` for more information.
36+
a wind turbine fleet specifying the wind turbines and their number or
37+
total installed capacity (in Watt) in the farm. Optionally, you can provide
38+
a wind farm efficiency (which can be constant or dependent on the wind
39+
speed) and a name as an identifier. See :class:`~.wind_farm.WindFarm` for
40+
more information.
3941
4042
Parameters
4143
----------
@@ -54,11 +56,15 @@ def initialize_wind_farms(my_turbine, e126):
5456
# specification of wind farm data
5557
example_farm_data = {
5658
'name': 'example_farm',
57-
'wind_turbine_fleet': [{'wind_turbine': my_turbine,
58-
'number_of_turbines': 6},
59-
{'wind_turbine': e126,
60-
'number_of_turbines': 3}
61-
]}
59+
'wind_turbine_fleet': [
60+
{'wind_turbine': my_turbine, # as windpowerlib.WindTurbine
61+
'number_of_turbines': 6}, # number of `my_turbine` turbines in
62+
# farm (float values are possible as
63+
# well)
64+
{'wind_turbine': e126,
65+
'total_capacity': 12.6e6 # installed capacity of `my_turbine`
66+
# turbines in farm in Watt
67+
}]}
6268
# initialize WindFarm object
6369
example_farm = WindFarm(**example_farm_data)
6470

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: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
import pytest
2+
import pandas as pd
3+
import numpy as np
4+
from windpowerlib import WindFarm, WindTurbine
5+
from windpowerlib.tools import WindpowerlibUserWarning
6+
7+
8+
class TestWindFarm:
9+
10+
@classmethod
11+
def setup_class(self):
12+
"""Setup default values"""
13+
self.test_turbine = {'hub_height': 100,
14+
'turbine_type': 'E-126/4200'}
15+
self.test_turbine_2 = {'hub_height': 90,
16+
'turbine_type': 'V90/2000',
17+
'nominal_power': 2e6}
18+
19+
def test_initialization_list(self):
20+
"""test simple initialization with wind turbine fleet list"""
21+
wind_turbine_fleet = [
22+
{'wind_turbine': WindTurbine(**self.test_turbine),
23+
'number_of_turbines': 3},
24+
{'wind_turbine': WindTurbine(**self.test_turbine_2),
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
48+
49+
def test_initialization_1(self):
50+
"""test catching error when wind_turbine_fleet not provided as list"""
51+
msg = 'Wind turbine fleet not provided properly.'
52+
with pytest.raises(ValueError, match=msg):
53+
WindFarm(wind_turbine_fleet=[{'wind_turbine': 'turbine',
54+
'number_of_turbines': 2}, 'dummy'])
55+
56+
def test_initialization_2(self):
57+
"""test catching error when WindTurbine in wind_turbine_fleet
58+
not initialized"""
59+
test_farm = {'wind_turbine_fleet': [
60+
{'wind_turbine': None,
61+
'number_of_turbines': 3}]}
62+
msg = 'Wind turbine must be provided as WindTurbine object'
63+
with pytest.raises(ValueError, match=msg):
64+
WindFarm(**test_farm)
65+
66+
def test_initialization_3(self):
67+
"""test catching error when wind_turbine not specified in
68+
wind_turbine_fleet"""
69+
wind_turbine_fleet = pd.DataFrame(
70+
data={'wind_turbines': [WindTurbine(**self.test_turbine),
71+
WindTurbine(**self.test_turbine_2)],
72+
'number_of_turbines': [3, 2]})
73+
msg = 'Missing wind_turbine key/column in wind_turbine_fleet'
74+
with pytest.raises(ValueError, match=msg):
75+
WindFarm(wind_turbine_fleet=wind_turbine_fleet)
76+
77+
def test_initialization_4(self, recwarn):
78+
"""test overwriting and raising warning when number_of_turbines and
79+
total_capacity in wind turbine fleet do not fit"""
80+
wt1 = WindTurbine(**self.test_turbine)
81+
wt2 = WindTurbine(**self.test_turbine_2)
82+
wind_turbine_fleet = pd.DataFrame(
83+
data={'wind_turbine': [wt1, wt2],
84+
'number_of_turbines': [3, 2],
85+
'total_capacity': [3, np.nan]},
86+
index=[0, 1])
87+
windfarm = WindFarm(wind_turbine_fleet=wind_turbine_fleet)
88+
total_cap_wt1_expected = \
89+
wt1.nominal_power * wind_turbine_fleet.loc[0, 'number_of_turbines']
90+
assert windfarm.wind_turbine_fleet.loc[0, 'total_capacity'] == \
91+
total_cap_wt1_expected
92+
total_cap_wt2_expected = \
93+
wt2.nominal_power * wind_turbine_fleet.loc[1, 'number_of_turbines']
94+
assert windfarm.wind_turbine_fleet.loc[1, 'total_capacity'] == \
95+
total_cap_wt2_expected
96+
assert recwarn.pop(WindpowerlibUserWarning)
97+
98+
def test_initialization_5(self):
99+
"""test catching error when number of turbines cannot be deduced"""
100+
wt = WindTurbine(**self.test_turbine)
101+
wt.nominal_power = None
102+
test_farm = {'wind_turbine_fleet': [
103+
{'wind_turbine': wt,
104+
'total_capacity': 3e6}]}
105+
msg = 'Number of turbines of type'
106+
with pytest.raises(ValueError, match=msg):
107+
WindFarm(**test_farm)
108+
109+
def test_initialization_6(self):
110+
"""test catching error when neither number_of_turbines nor
111+
total_capacity is provided"""
112+
test_farm = {'wind_turbine_fleet': [
113+
{'wind_turbine': WindTurbine(**self.test_turbine),
114+
'number_of_turbine': 3e6}]}
115+
msg = 'Number of turbines of type '
116+
with pytest.raises(ValueError, match=msg):
117+
WindFarm(**test_farm)
118+
119+
def test_initialization_7(self):
120+
"""test catching error when total capacity cannot be deduced"""
121+
wt = WindTurbine(**self.test_turbine)
122+
wt.nominal_power = None
123+
test_farm = {'wind_turbine_fleet': [
124+
{'wind_turbine': wt,
125+
'number_of_turbines': 3}]}
126+
msg = 'Total capacity of turbines of type'
127+
with pytest.raises(ValueError, match=msg):
128+
WindFarm(**test_farm)
129+
130+
def test_mean_hub_height(self):
131+
"""tests mean_hub_height method"""
132+
test_farm = {'wind_turbine_fleet': [
133+
{'wind_turbine': WindTurbine(**self.test_turbine),
134+
'number_of_turbines': 2},
135+
{'wind_turbine': WindTurbine(**self.test_turbine_2),
136+
'total_capacity': 3e6}]}
137+
windfarm = WindFarm(**test_farm)
138+
assert 97.265 == pytest.approx(
139+
windfarm.mean_hub_height().hub_height, 1e-3)
140+
141+
def test_repr(self):
142+
"""Test string representation of WindFarm"""
143+
test_fleet = [{'wind_turbine': WindTurbine(**self.test_turbine),
144+
'number_of_turbines': 2}]
145+
assert 'E-126/4200' in repr(WindFarm(wind_turbine_fleet=test_fleet))
146+
147+

windpowerlib/oedb/power_coefficient_curves.csv

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@ E-82/2300,,,0.0,,0.12,,0.29,,0.4,,,0.43,,,0.46,,,0.48,,0.49,,,,0.5,,0.49,,,0.44,
1212
E-70/2300,,,0.0,,0.1,,0.27,,0.36,,,0.42,,,0.46,,,0.48,,0.5,,,,0.5,,0.5,,,0.49,,,0.45,,0.39,,0.34,,0.28,,0.23,,0.19,,0.16,,0.14,,0.12,,0.1,,0.09,,0.08,,0.07,,0.06,
1313
E-82/2000,,,0.0,,0.12,,0.29,,0.4,,,0.43,,,0.46,,,0.48,,0.49,,,,0.5,,0.49,,,0.42,,,0.35,,0.29,,0.23,,0.19,,0.15,,0.13,,0.11,,0.09,,0.08,,0.07,,0.06,,0.05,,0.05,,0.04,
1414
E-53/800,,,0.0,,0.19,,0.39,,0.44,,,0.46,,,0.48,,,0.49,,0.49,,,,0.49,,0.48,,,0.42,,,0.34,,0.27,,0.22,,0.18,,0.15,,0.12,,0.1,,0.09,,0.08,,0.06,,0.06,,0.05,,0.04,,0.04,
15+
SWT142/3150,,,,,,,0.21,,0.385,,,0.453,,,0.462,,,0.457,,0.443,,,,0.398,,0.319,,,0.244,,,0.188,,0.148,,0.118,,0.096,,0.079,,0.066,,0.056,,0.047,,0.041,,0.035,,0.03,,0.027,,,,,
1516
N131/3600,0.0,0.0,0.0,0.0,0.0,0.0,0.067,0.254,0.348,,0.4,0.429,,0.444,0.451,,0.456,0.458,0.46,0.46,,0.458,,0.453,0.435,0.403,,0.365,0.326,,0.287,0.252,0.223,0.198,0.177,0.159,0.143,0.129,0.117,0.106,0.097,0.089,0.081,0.075,0.069,0.064,0.059,0.055,,,,,,,,,,,
1617
N131/3300,,,,,,,0.148,0.299,0.373,,0.413,0.433,,0.444,0.451,,0.455,0.458,0.46,0.458,,0.452,,0.438,0.41,0.374,,0.336,0.299,,0.263,0.231,0.205,0.182,0.162,0.146,0.131,0.118,0.107,0.098,0.089,0.081,0.075,0.069,0.063,0.058,0.054,0.05,,,,,,,,,,,
1718
N131/3000,,,,,,,0.148,0.294,0.367,,0.407,0.428,,0.442,0.45,,0.455,0.458,0.458,0.453,,0.444,,0.421,0.387,0.349,,0.31,0.273,,0.239,0.21,0.186,0.165,0.148,0.132,0.119,0.108,0.098,0.089,0.081,0.074,0.068,0.062,0.057,0.053,0.049,0.045,,,,,,,,,,,
1819
N117/2400,0.0,0.0,0.0,0.0,0.0,0.0,0.13,0.29,0.37,,0.41,0.43,,0.45,0.45,,0.46,0.46,0.46,0.46,,0.45,,0.43,0.39,0.35,,0.31,0.28,,0.24,0.21,0.19,0.17,0.15,0.13,0.12,0.11,0.1,0.09,0.08,0.07,0.07,0.06,0.06,0.05,0.05,0.05,,,,,,,,,,,
20+
SWT113/3200,,,,,,,0.386,,0.43,,,0.456,,,0.47,,,0.477,,0.479,,,,0.472,,0.442,,,0.377,,,0.3,,0.237,,0.19,,0.154,,0.127,,0.106,,0.089,,0.076,,0.065,,0.056,,0.049,,0.043,,0.038,,0.033,
1921
N100/2500,,,,,,,0.023,0.224,0.329,,0.392,0.427,,0.447,0.456,,0.462,0.465,0.468,0.468,,0.466,,0.462,0.457,0.44,,0.411,0.376,,0.339,0.302,0.267,0.237,0.212,0.19,0.171,0.155,0.14,0.127,0.116,0.106,0.097,0.089,0.082,0.076,0.07,0.065,0.061,0.056,0.053,0.049,0.046,0.043,0.04,0.038,0.035,0.033,
20-
V90/2000,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.254,0.379,,0.407,0.433,,0.438,0.46,,0.461,0.449,0.447,0.442,,0.452,,0.439,0.43,0.408,,0.389,0.361,,0.327,0.296,0.262,0.234,0.211,0.188,0.168,0.153,0.139,0.128,0.116,,,,,,,,,,,,,,,,,,
2122
N90/2500,,,,,,,0.01,0.221,0.337,,0.4,0.435,,0.454,0.465,,0.471,0.475,0.478,0.477,,0.473,,0.465,0.455,0.442,,0.427,0.409,,0.385,0.355,0.323,0.291,0.261,0.234,0.21,0.19,0.172,0.157,0.143,0.131,0.12,0.11,0.101,0.094,0.087,0.08,0.074,0.069,0.065,0.06,0.056,0.053,0.049,0.046,0.044,0.041,0.037
2223
V126/3450,0.0,0.0,0.0,0.0,0.0,0.0,0.17,0.308,0.376,,0.407,0.423,,0.433,0.439,,0.444,0.447,0.449,0.45,,0.449,,0.446,0.438,0.417,,0.381,0.338,,0.297,0.261,0.231,0.206,0.184,0.165,0.148,0.134,0.121,0.11,0.101,0.092,0.084,0.077,0.071,0.066,0.061,0.056,0.052,0.049,0.045,0.042,0.04,,,,,,
2324
V126/3300,0.0,0.0,0.0,0.0,0.0,0.0,0.15,0.3,0.37,,0.4,0.42,,0.42,0.43,,0.44,0.44,0.44,0.44,,0.44,,0.44,0.43,0.41,,0.37,0.32,,0.28,0.25,0.22,0.2,0.18,0.16,0.14,0.13,0.12,0.11,0.1,0.09,0.08,0.07,0.07,0.06,0.06,0.05,0.05,0.05,0.04,0.04,0.04,,,,,,
@@ -28,11 +29,10 @@ V112/3450,0.0,0.0,0.0,0.0,0.0,0.0,0.043,0.205,0.318,,0.378,0.41,,0.425,0.435,,0.
2829
V112/3300,0.0,0.0,0.0,0.0,0.0,0.0,0.14,0.28,0.35,,0.38,0.4,,0.41,0.42,,0.43,0.44,0.44,0.44,,0.45,,0.44,0.44,0.43,,0.41,0.38,,0.35,0.31,0.28,0.25,0.22,0.2,0.18,0.16,0.15,0.13,0.12,0.11,0.1,0.09,0.09,0.08,0.07,0.07,0.06,0.06,0.06,0.05,0.05,0.05,0.04,0.04,0.04,0.04,
2930
V112/3075,0.0,0.0,0.0,0.0,0.0,0.0,0.16,0.28,0.34,,0.38,0.4,,0.41,0.43,,0.43,0.44,0.44,0.45,,0.45,,0.45,0.44,0.43,,0.4,0.37,,0.33,0.29,0.26,0.23,0.21,0.19,0.17,0.15,0.14,0.12,0.11,0.1,0.1,0.09,0.08,0.07,0.07,0.06,0.06,0.06,0.05,0.05,0.05,0.04,0.04,0.04,0.04,0.03,
3031
V112/3000,,,,,,,0.141,0.263,0.337,,0.375,0.399,,0.416,0.427,,0.434,0.441,0.444,0.446,,0.446,,0.444,0.439,0.426,,0.402,0.372,,0.332,0.294,0.261,0.232,0.207,0.186,0.167,0.151,0.137,0.124,0.113,0.104,0.095,0.087,0.08,0.074,0.069,0.064,0.059,0.055,0.051,0.048,0.045,0.042,0.039,0.037,0.035,0.033,
32+
V90/2000,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.254,0.379,,0.407,0.433,,0.438,0.46,,0.461,0.449,0.447,0.442,,0.452,,0.439,0.43,0.408,,0.389,0.361,,0.327,0.296,0.262,0.234,0.211,0.188,0.168,0.153,0.139,0.128,0.116,,,,,,,,,,,,,,,,,,
3133
SWT130/3600,,,,,,,0.196,,0.354,,,0.414,,,0.443,,,0.455,,0.457,,,,0.444,,0.401,,,0.327,,,0.256,,0.202,,0.161,,0.131,,0.108,,0.09,,0.076,,0.065,,0.055,,0.048,,0.042,,0.036,,0.032,,0.028,
3234
SWT120/3600,,,,,,,0.0,,0.392,,,0.438,,,0.458,,,0.466,,0.47,,,,0.471,,0.447,,,0.378,,,0.3,,0.236,,0.189,,0.154,,0.127,,0.106,,0.089,,0.076,,0.065,,0.056,,0.049,,0.043,,0.038,,0.033,
3335
SWT130/3300,,,,,,,0.191,,0.346,,,0.405,,,0.433,,,0.445,,0.448,,,,0.437,,0.384,,,0.303,,,0.235,,0.185,,0.148,,0.12,,0.099,,0.083,,0.07,,0.059,,0.051,,0.044,,0.038,,0.033,,0.029,,0.026,
34-
SWT113/3200,,,,,,,0.386,,0.43,,,0.456,,,0.47,,,0.477,,0.479,,,,0.472,,0.442,,,0.377,,,0.3,,0.237,,0.19,,0.154,,0.127,,0.106,,0.089,,0.076,,0.065,,0.056,,0.049,,0.043,,0.038,,0.033,
35-
SWT142/3150,,,,,,,0.21,,0.385,,,0.453,,,0.462,,,0.457,,0.443,,,,0.398,,0.319,,,0.244,,,0.188,,0.148,,0.118,,0.096,,0.079,,0.066,,0.056,,0.047,,0.041,,0.035,,0.03,,0.027,,,,,
3636
SWT113/2300,,,,,,,0.398,,0.435,,,0.458,,,0.47,,,0.476,,0.476,,,,0.448,,0.366,,,0.281,,,0.217,,0.17,,0.136,,0.111,,0.091,,0.076,,0.064,,0.055,,0.047,,0.04,,0.035,,0.031,,0.027,,0.024,
3737
S114/3400,0.0,,0.0,,0.0,,0.14,,0.35,,,0.42,,,0.45,,,0.46,,0.47,,,,0.46,,0.44,,,0.39,,,0.32,,0.25,,0.2,,0.16,,0.13,,0.11,,0.09,,0.08,,0.07,,0.06,,0.05,,,,,,,
3838
S122/3200,,,,,,,0.285,,0.402,,,0.437,,,0.449,,,0.456,,0.444,,,,0.425,,0.392,,,0.326,,,0.259,,0.203,,0.163,,0.132,,0.109,,0.091,,0.077,,0.065,,0.056,,0.048,,0.042,,,,,,,

0 commit comments

Comments
 (0)