Multidimensional Wind Turbine

Multidimensional Wind Turbine#

Many external factors can affect the power and thrust curves of wind turbines. FLORIS supports the ability to define "multidimensional" wind turbines, where the power and thrust curves are defined as a function of external parameters. To enable this functionality, rather than defining power and thrust_coefficient as a function of wind_speed on the power_thrust_table, users should instead provide a path to a data file (described below) as power_thrust_data_file. Additionally, users must set the multi_dimensional_cp_ct option on the turbine definition to True.

The power thrust data file should be a CSV file with the following columns: (<external_parameter_1>, <external_parameter_2>, ..., ws, power, thrust_coefficient). The external parameters can be any relevant factors that affect the turbine performance, and the values to be used will be specified at run time or in the FLORIS input file. For example, the external parameters could be air density, wave height, etc. The ws column should contain the wind speed values for specification of the power and thrust coefficient (stored in the power and thrust_coefficient columns, respectively). The wind speed, power, and thrust coefficient values should be defined for each combination of the external parameters.

The user can then specify the values of the external parameters either on the FLORIS input file or using the multidim_conditions argument of FlorisModel.set(). The power and thrust coefficient are determined based on the specified conditions using a nearest-neighbor approach.

The following code snippet shows an example of a multidimensional wind turbine definition and its corresponding power thrust data file.

import numpy as np
import matplotlib.pyplot as plt

from floris import FlorisModel, TimeSeries

n_wind_speeds = 100
wind_speeds = np.linspace(0.1, 30, n_wind_speeds)

fmodel = FlorisModel("defaults") # Defaults to NREL 5MW turbine
fmodel.set(
    wind_data=TimeSeries(
        wind_directions=np.zeros(n_wind_speeds),
        wind_speeds=wind_speeds,
        turbulence_intensities=0.06
    ),
    layout_x=[0],
    layout_y=[0],
    wind_shear=0.0,
    turbine_type=["iea_15MW_floating_multi_dim_cp_ct"],
    reference_wind_height=-1,
)

# Now, we need to specify what external parameters to run the model for
fmodel.set(multidim_conditions={"Tp": 2, "Hs": 1})
fmodel.run()

powers = fmodel.get_turbine_powers()
thrust_coefficients = fmodel.get_turbine_thrust_coefficients()

fig, ax = plt.subplots(2, 1, sharex=True)
ax[0].plot(wind_speeds, powers, label="First condition")
ax[0].grid()
ax[0].set_ylabel("Power [kW]")
ax[1].plot(wind_speeds, thrust_coefficients)
ax[1].grid()
ax[1].set_ylabel("Thrust coefficient [-]")
ax[1].set_xlabel("Wind speed [m/s]")
ax[1].set_xlim([0, 30])

# Set a second multidimensional condition and rerun
fmodel.set(multidim_conditions={"Tp": 4, "Hs": 5})
fmodel.run()

powers = fmodel.get_turbine_powers()
thrust_coefficients = fmodel.get_turbine_thrust_coefficients()
ax[0].plot(wind_speeds, powers, label="Second condition")
ax[0].legend(loc="upper left")
ax[1].plot(wind_speeds, thrust_coefficients)
floris.logging_manager.LoggingManager WARNING The current model does not account for vertical wake deflection due to tilt. Corrections to power and thrust coefficient can be included, but no vertical wake deflection will occur.
floris.logging_manager.LoggingManager WARNING The current model does not account for vertical wake deflection due to tilt. Corrections to power and thrust coefficient can be included, but no vertical wake deflection will occur.
[<matplotlib.lines.Line2D at 0x7f3f2dc98550>]
_images/44b4d8981f1e2a7862aed3beea65e9ef39a73e2a0b0cb339e90be84577061190.png

Note that this example is not meant to be represntative of a real turbine, but rather to illustrate the functionality. At this time, FLORIS only support a single external condition combination at a time, but multiple combinations can be run sequentially as is shown above.