Skip to content
Open
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
6 changes: 3 additions & 3 deletions .github/workflows/tests-coverage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,16 @@ jobs:

steps:
- name: Checkout repo
uses: actions/checkout@v3
uses: actions/checkout@v7

- name: Set up Python
uses: actions/setup-python@v4
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}

- name: Set up Conda
if: runner.os == 'Windows'
uses: conda-incubator/setup-miniconda@v2
uses: conda-incubator/setup-miniconda@v4
with:
miniconda-version: "latest"
python-version: ${{ matrix.python-version }}
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ def read(fname):
"nbsphinx",
"numpy",
"pytest",
"pytest-notebook",
"pytest-notebook>=0.9.0",
"sphinx >= 1.4",
"sphinx_rtd_theme",
]
Expand Down
11 changes: 11 additions & 0 deletions tests/test_modelchain.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,17 @@ def setup_class(cls):
],
)

def test_get_closest_height(self):
"""Test the _get_closest_height helper method."""
test_mc = mc.ModelChain(wt.WindTurbine(**self.test_turbine))
# Hub height is 100, so 110 is the closest height
heights = np.array([10, 80, 110, 150])
assert test_mc._get_closest_height(heights) == 110

# Test when there is an exact match
heights = np.array([10, 100, 150])
assert test_mc._get_closest_height(heights) == 100

def test_temperature_hub(self):
# Test modelchain with temperature_model='linear_gradient'
test_mc = mc.ModelChain(wt.WindTurbine(**self.test_turbine))
Expand Down
70 changes: 24 additions & 46 deletions windpowerlib/modelchain.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
)


class ModelChain(object):
class ModelChain:
r"""Model to determine the output of a wind turbine

The ModelChain class provides a standardized, high-level
Expand Down Expand Up @@ -163,6 +163,14 @@ def __init__(
self.hellman_exp = hellman_exp
self.power_output = None

def _get_closest_height(self, heights):
return heights[
min(
range(len(heights)),
key=lambda i: abs(heights[i] - self.power_plant.hub_height),
)
]

def temperature_hub(self, weather_df):
r"""
Calculates the temperature of air at hub height.
Expand Down Expand Up @@ -200,15 +208,9 @@ def temperature_hub(self, weather_df):
logging.debug(
"Calculating temperature using temperature " "gradient."
)
closest_height = weather_df["temperature"].columns[
min(
range(len(weather_df["temperature"].columns)),
key=lambda i: abs(
weather_df["temperature"].columns[i]
- self.power_plant.hub_height
),
)
]
closest_height = self._get_closest_height(
weather_df["temperature"].columns
)
temperature_hub = temperature.linear_gradient(
weather_df["temperature"][closest_height],
closest_height,
Expand Down Expand Up @@ -273,15 +275,9 @@ def density_hub(self, weather_df):
logging.debug(
"Calculating density using barometric height " "equation."
)
closest_height = weather_df["pressure"].columns[
min(
range(len(weather_df["pressure"].columns)),
key=lambda i: abs(
weather_df["pressure"].columns[i]
- self.power_plant.hub_height
),
)
]
closest_height = self._get_closest_height(
weather_df["pressure"].columns
)
density_hub = density.barometric(
weather_df["pressure"][closest_height],
closest_height,
Expand All @@ -290,15 +286,9 @@ def density_hub(self, weather_df):
)
elif self.density_model == "ideal_gas":
logging.debug("Calculating density using ideal gas equation.")
closest_height = weather_df["pressure"].columns[
min(
range(len(weather_df["pressure"].columns)),
key=lambda i: abs(
weather_df["pressure"].columns[i]
- self.power_plant.hub_height
),
)
]
closest_height = self._get_closest_height(
weather_df["pressure"].columns
)
density_hub = density.ideal_gas(
weather_df["pressure"][closest_height],
closest_height,
Expand Down Expand Up @@ -358,15 +348,9 @@ def wind_speed_hub(self, weather_df):
logging.debug(
"Calculating wind speed using logarithmic wind " "profile."
)
closest_height = weather_df["wind_speed"].columns[
min(
range(len(weather_df["wind_speed"].columns)),
key=lambda i: abs(
weather_df["wind_speed"].columns[i]
- self.power_plant.hub_height
),
)
]
closest_height = self._get_closest_height(
weather_df["wind_speed"].columns
)
wind_speed_hub = wind_speed.logarithmic_profile(
weather_df["wind_speed"][closest_height],
closest_height,
Expand All @@ -376,15 +360,9 @@ def wind_speed_hub(self, weather_df):
)
elif self.wind_speed_model == "hellman":
logging.debug("Calculating wind speed using hellman equation.")
closest_height = weather_df["wind_speed"].columns[
min(
range(len(weather_df["wind_speed"].columns)),
key=lambda i: abs(
weather_df["wind_speed"].columns[i]
- self.power_plant.hub_height
),
)
]
closest_height = self._get_closest_height(
weather_df["wind_speed"].columns
)
wind_speed_hub = wind_speed.hellman(
weather_df["wind_speed"][closest_height],
closest_height,
Expand Down
2 changes: 1 addition & 1 deletion windpowerlib/wind_farm.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import warnings


class WindFarm(object):
class WindFarm:
r"""
Defines a standard set of wind farm attributes.

Expand Down
2 changes: 1 addition & 1 deletion windpowerlib/wind_turbine.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from typing import NamedTuple


class WindTurbine(object):
class WindTurbine:
r"""
Defines a standard set of wind turbine attributes.

Expand Down
2 changes: 1 addition & 1 deletion windpowerlib/wind_turbine_cluster.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import pandas as pd


class WindTurbineCluster(object):
class WindTurbineCluster:
r"""
Defines a standard set of wind turbine cluster attributes.

Expand Down