Example: Multi-dimensional Cp/Ct data

Example: Multi-dimensional Cp/Ct data#

This example creates a FLORIS instance and:1) Makes a two-turbine layout2) Demonstrates single ws/wd simulations3) Demonstrates multiple ws/wd simulationswith the modification of using a turbine definition that has a multi-dimensional Cp/Ct table.In the input file gch_multi_dim_cp_ct.yaml, the turbine_type points to a turbine definition,iea_15MW_floating_multi_dim_cp_ct.yaml located in the turbine_library,that supplies a multi-dimensional Cp/Ct data file in the form of a .csv file. This .csv filecontains two additional conditions to define Cp/Ct values for: Tp for wave period, and Hs for waveheight. For every combination of Tp and Hs defined, a Cp/Ct/Wind speed table of values is alsodefined. It is required for this .csv file to have the last 3 columns be ws, Cp, and Ct. In orderfor this table to be used, the flag 'multi_dimensional_cp_ct' must be present and set to true inthe turbine definition. With this flag enabled, the solver will down-select to use theinterpolant defined at the closest conditions. The user must supply these conditions in themain input file under the 'flow_field' section, e.g.:NOTE: The multi-dimensional Cp/Ct data used in this example is fictional for the purposes offacilitating this example. The Cp/Ct values for the different wave conditions are scaledvalues of the original Cp/Ct data for the IEA 15MW turbine.flow_field: multidim_conditions: Tp: 2.5 Hs: 3.01The solver will then use the nearest-neighbor interpolant. These conditions are currently globaland used to select the interpolant at each turbine.Also note in the example below that there is a specific method for computing powers whenusing turbines with multi-dimensional Cp/Ct data under FlorisModel, called'get_turbine_powers_multidim'. The normal 'get_turbine_powers' method will not work.

import numpy as np

from floris import FlorisModel


# Initialize FLORIS with the given input file.
fmodel = FlorisModel("../inputs/gch_multi_dim_cp_ct.yaml")

# Convert to a simple two turbine layout
fmodel.set(layout_x=[0.0, 500.0], layout_y=[0.0, 0.0])

# Single wind speed and wind direction
print("\n========================= Single Wind Direction and Wind Speed =========================")

# Get the turbine powers assuming 1 wind speed and 1 wind direction
fmodel.set(wind_directions=[270.0], wind_speeds=[8.0], turbulence_intensities=[0.06])

# Set the yaw angles to 0
yaw_angles = np.zeros([1, 2])  # 1 wind direction and wind speed, 2 turbines
fmodel.set(yaw_angles=yaw_angles)

# Calculate
fmodel.run()

# Get the turbine powers
turbine_powers = fmodel.get_turbine_powers() / 1000.0
print("The turbine power matrix should be of dimensions 1 findex X 2 Turbines")
print(turbine_powers)
print("Shape: ", turbine_powers.shape)

# Single wind speed and multiple wind directions
print("\n========================= Single Wind Direction and Multiple Wind Speeds ===============")

wind_speeds = np.array([8.0, 9.0, 10.0])
wind_directions = np.array([270.0, 270.0, 270.0])
turbulence_intensities = np.array([0.06, 0.06, 0.06])

yaw_angles = np.zeros([3, 2])  # 3 wind directions/ speeds, 2 turbines
fmodel.set(
    wind_speeds=wind_speeds,
    wind_directions=wind_directions,
    turbulence_intensities=turbulence_intensities,
    yaw_angles=yaw_angles,
)
fmodel.run()
turbine_powers = fmodel.get_turbine_powers() / 1000.0
print("The turbine power matrix should be of dimensions 3 findex X 2 Turbines")
print(turbine_powers)
print("Shape: ", turbine_powers.shape)

# Multiple wind speeds and multiple wind directions
print("\n========================= Multiple Wind Directions and Multiple Wind Speeds ============")

wind_speeds = np.tile([8.0, 9.0, 10.0], 3)
wind_directions = np.repeat([260.0, 270.0, 280.0], 3)
turbulence_intensities = 0.06 * np.ones_like(wind_speeds)

yaw_angles = np.zeros([9, 2])  # 9 wind directions/ speeds, 2 turbines
fmodel.set(
    wind_directions=wind_directions,
    wind_speeds=wind_speeds,
    turbulence_intensities=turbulence_intensities,
    yaw_angles=yaw_angles,
)
fmodel.run()
turbine_powers = fmodel.get_turbine_powers() / 1000.0
print("The turbine power matrix should be of dimensions 9 WD/WS X 2 Turbines")
print(turbine_powers)
print("Shape: ", turbine_powers.shape)
import warnings
warnings.filterwarnings('ignore')
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.
========================= Single Wind Direction and Wind Speed =========================
The turbine power matrix should be of dimensions 1 findex X 2 Turbines
[[3142.42549368 1232.93523471]]
Shape:  (1, 2)

========================= Single Wind Direction and Multiple Wind Speeds ===============
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.
The turbine power matrix should be of dimensions 3 findex X 2 Turbines
[[3142.42549368 1232.93523471]
 [4472.21685867 1797.15330492]
 [6105.9702431  2487.76236629]]
Shape:  (3, 2)

========================= Multiple Wind Directions and Multiple Wind Speeds ============
The turbine power matrix should be of dimensions 9 WD/WS X 2 Turbines
[[3142.42549368 1962.74466975]
 [4472.21685867 2815.91982043]
 [6105.9702431  3874.67666825]
 [3142.42549368 1232.93523471]
 [4472.21685867 1797.15330492]
 [6105.9702431  2487.76236629]
 [3142.42549368 1962.74539303]
 [4472.21685867 2815.92084444]
 [6105.9702431  3874.67803679]]
Shape:  (9, 2)