wcomp

← All comparisons

Turbine power and thrust

This comparison gives FLORIS, FOXES, and PyWake the same wind turbine power curve and thrust coefficient curve, then asks each package to evaluate the turbine over a sweep of wind speeds. It isolates the turbine model: the flow is uniform and there are no wakes, shear, or yaw, so any difference comes from how each software ingests and evaluates the curves.

One unwaked turbine in uniform, shear-free flow at 1.225 kg/m³ air density, evaluated at 303 wind speeds.

Common turbine definition

Turbine
IEA Wind Task 37 15MW Offshore Reference Turbine
Rotor diameter
240 m
Hub height
150 m
Air density
1.225 kg/m³
Tabulated range
3.0 to 25.0 m/s (59 points)
Peak power
16056 kW

The curves are the IEA 15 MW power coefficient and thrust coefficient used by the wake cases. The power curve in kW is derived once from the power coefficient at the reference air density,P = ½ ρ A U³ Cp, so that every software receives the same power and Ct tables on the same wind speed grid.

How each software ingests the curves

The common curves are passed to each installed software's native tabular turbine input and the turbine is simulated with that software's own solver. No software result is calculated by a wcomp replacement formula.

FLORIS

power_thrust_table with the cosine-loss operation model

Inputs
Power in kW, thrust coefficient, and wind speed arrays in a power_thrust_table; yaw and tilt are zero so the cosine losses are inactive.
Interpolation
Linear (scipy interp1d) in wind speed.
Outside range
Power is zero outside the tabulated wind speeds. Thrust coefficient is clipped to the range [0.0001, 0.9999], so it never reaches zero.

Executed with FlorisModel.run(), get_turbine_powers(), and get_turbine_thrust_coefficients().

FOXES

PCtFromTwo turbine type

Inputs
Separate power (kW) and Ct tables, each with its own wind speed column.
Interpolation
Linear (numpy interp) in rotor effective wind speed.
Outside range
Power and Ct are exactly zero outside the tabulated wind speeds.

Executed with the Downwind algorithm, no wake models, and the grid16 rotor model; results read from calc_farm() P and CT.

PyWake

WindTurbine with a PowerCtTabular function

Inputs
Wind speed, power (kW), and Ct arrays plus the cut-in and cut-out wind speeds, which are set to the first and last tabulated speeds.
Interpolation
Linear (numpy interp) in wind speed.
Outside range
With cut-in and cut-out set, power and Ct take their idle values (zero) outside the table. Without them PyWake would hold the end values.

Executed with the NOJ wind farm model on a UniformSite; with one turbine no wake is applied. Results read from the Power and CT outputs.

Power

Each software's power at every wind speed in the sweep. The three curves coincide, so each is drawn with a different line style on top of the common input points.

Power error: each software's power minus the common curve, interpolated to the same wind speed.

Thrust coefficient

The thrust coefficient returned by each software. Inside the tabulated range all three agree with the common curve; they differ only in what they report outside it.

Ct error: each software's thrust coefficient minus the common curve, interpolated to the same wind speed.

Selected wind speeds

Wind speed (m/s)Power (kW)Thrust coefficient
FLORISFOXESPyWakeFLORISFOXESPyWake
2.00.000.000.000.000100.000000.00000
3.075.0675.0675.060.819750.819750.81975
5.01530.291530.291530.290.823270.823270.82327
8.06941.146941.146941.140.804570.804570.80457
10.013558.4713558.4713558.470.803450.803450.80345
11.016054.9716054.9716054.970.607280.607280.60728
15.016052.4416052.4416052.440.201420.201420.20142
20.016047.8416047.8416047.840.085070.085070.08507
25.00.000.000.000.000100.000000.00000
26.00.000.000.000.000100.000000.00000

Error against the common curve

Reference: Linear interpolation of the common power and Ct curves inside the tabulated range, and zero outside it.

SoftwareMax power error, tabulated range (kW)Max power error, all speeds (kW)Max Ct error, tabulated rangeMax Ct error, all speeds
FLORIS< 1e-6< 1e-6< 1e-60.000100
FOXES< 1e-6< 1e-6< 1e-6< 1e-6
PyWake< 1e-6< 1e-6< 1e-6< 1e-6

How to interpret this comparison