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
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from scipy.interpolate import NearestNDInterpolator

import floris.flow_visualization as flowviz
from floris import FlorisModel, WindRose
Expand Down
5 changes: 5 additions & 0 deletions floris/core/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,11 @@ def solve_for_velocity_deficit_profiles(
for more details.
"""

self.logger.warning(
"Velocity deficit profiles will move to a Numpy data structure in the next release. "
"See https://github.com/NatLabRockies/floris/pull/1194."
)

# Create a grid that contains coordinates for all the sample points in all profiles.
# Effectively, this is a grid of parallel lines.
n_lines = len(downstream_dists)
Expand Down
35 changes: 20 additions & 15 deletions floris/core/turbine/turbine.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

import attrs
import numpy as np
import pandas as pd
from attrs import define, field
from scipy.interpolate import interp1d

Expand Down Expand Up @@ -656,34 +655,40 @@ def _initialize_multidim_power_thrust_table(self):
self.power_thrust_data_file = self.turbine_library_path / self.power_thrust_data_file

# Read in the multi-dimensional data supplied by the user.
df = pd.read_csv(self.power_thrust_data_file)
data = np.genfromtxt(self.power_thrust_data_file, delimiter=',', names=True)

# Down-select the DataFrame to have just the ws, Cp, and Ct values
index_col = df.columns.values[:-3]
self.condition_keys = index_col.tolist()
df2 = df.set_index(index_col.tolist())
# The CSV columns are: [condition_keys..., ws, power, thrust_coefficient]
# Condition keys are the leading columns (e.g. Tp, Hs)
# ws/power/thrust_coefficient are always the last 3 and are excluded.
self.condition_keys = list(data.dtype.names[:-3])

# Find unique combinations of condition key values.
# np.column_stack promotes 1D arrays to (N, 1), so this works for any number of keys.
cond_data = np.column_stack([data[c] for c in self.condition_keys])
unique_keys = [tuple(row) for row in np.unique(cond_data, axis=0)]

# Loop over the multi-dimensional keys to get the correct ws/Cp/Ct data to make
# the thrust_coefficient and power interpolants.
power_thrust_table_ = {} # Reset
for key in df2.index.unique():
# Select the correct ws/Cp/Ct data
data = df2.loc[key]
if type(key) is not tuple:
key = (key,)
for key in unique_keys:
# Build a boolean mask selecting rows that match this condition combination
mask = np.ones(len(data), dtype=bool)
for col, val in zip(self.condition_keys, key):
mask &= data[col] == val

rows = data[mask]

# Build the interpolants
power_thrust_table_.update(
{
key: {
"wind_speed": data['ws'].values,
"power": data['power'].values,
"thrust_coefficient": data['thrust_coefficient'].values,
"wind_speed": rows['ws'],
"power": rows['power'],
"thrust_coefficient": rows['thrust_coefficient'],
**power_thrust_table_ref
},
}
)
# Add reference information at the lower level

# Save names of dimensions and set on-object version
power_thrust_table_.update({"condition_keys": self.condition_keys})
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ dependencies = [
"numpy~=2.0",
"scipy~=1.1",
"matplotlib~=3.0",
"pandas~=2.0",
"pandas>=2.0,<4",
"shapely~=2.0",
"coloredlogs~=15.0",
"pathos~=0.3",
Expand Down
1 change: 0 additions & 1 deletion tests/geometric_yaw_unit_test.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@

import numpy as np
import pandas as pd

from floris import FlorisModel
from floris.optimization.yaw_optimization.yaw_optimizer_geometric import (
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@

import numpy as np
import pandas as pd

from floris import FlorisModel, WindRose
from floris.optimization.layout_optimization.layout_optimization_random_search import (
Expand Down
1 change: 0 additions & 1 deletion tests/reg_tests/scipy_layout_opt_regression.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@

import numpy as np
import pandas as pd

from floris import FlorisModel, WindRose
from floris.optimization.layout_optimization.layout_optimization_scipy import (
Expand Down
1 change: 0 additions & 1 deletion tests/serial_refine_unit_test.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@

import numpy as np
import pandas as pd

from floris import FlorisModel
from floris.optimization.yaw_optimization.yaw_optimizer_sr import YawOptimizationSR
Expand Down
24 changes: 0 additions & 24 deletions tests/turbine_multi_dim_unit_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
from pathlib import Path

import numpy as np
import pandas as pd
import pytest

from floris.core import (
Expand All @@ -23,29 +22,6 @@

INDEX_FILTER = [0, 2]

# NOTE: MultiDimensionalPowerThrustTable not used anywhere, so I'm commenting
# this out.

# def test_multi_dimensional_power_thrust_table():
# turbine_data = SampleInputs().turbine_multi_dim
# turbine_data["power_thrust_data_file"] = CSV_INPUT
# df_data = pd.read_csv(turbine_data["power_thrust_data_file"])
# flattened_dict = MultiDimensionalPowerThrustTable.from_dataframe(df_data)
# flattened_dict_base = {
# ('Tp', '2', 'Hs', '1'): [],
# ('Tp', '2', 'Hs', '5'): [],
# ('Tp', '4', 'Hs', '1'): [],
# ('Tp', '4', 'Hs', '5'): [],
# }
# assert flattened_dict == flattened_dict_base

# # Test for initialization errors
# for el in ("ws", "Cp", "Ct"):
# df_data = pd.read_csv(turbine_data["power_thrust_data_file"])
# df = df_data.drop(el, axis=1)
# with pytest.raises(ValueError):
# MultiDimensionalPowerThrustTable.from_dataframe(df)


def test_turbine_init():
turbine_data = SampleInputs().turbine_multi_dim
Expand Down
1 change: 0 additions & 1 deletion tests/yaw_optimization_integration_test.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import numpy as np
import pandas as pd
import pytest

from floris import FlorisModel
Expand Down
Loading