wcomp

← All comparisons

Rotor velocity averaging

This comparison passes the same rotor-plane velocity fields to the installed FLORIS, FOXES, and PyWake packages and compares the outputs of their native rotor sampling and averaging implementations. It does not compare wake-model physics, turbine curves, superposition, or induction.

All sampling coordinates are normalized by rotor radius R.

Methods used by each software

FLORIS

TurbineCubatureGrid (3 x 3)

Samples
9
Aggregation
linear cubature of velocity

9 cubature points spanning the rotor disk with FLORIS' native cubature quadrature.

Executed with FLORIS TurbineCubatureGrid(grid_resolution=3) and FLORIS average_velocity using the grid's native power_average_method and cubature weights.

FOXES

GridRotor (grid16)

Samples
16
Aggregation
weighted arithmetic mean of velocity

Sixteen cell-center points on a 4 x 4 square spanning the rotor. Weights are evaluated by FOXES from each cell's overlap with the disk; the four corner cell centers lie outside the disk but retain partial-cell weight.

Executed with FOXES ModelBook grid16 and GridRotor.eval_rpoint_results, requesting FOXES' native REWS output.

PyWake

CGIRotorAvg(n=9)

Samples
9
Aggregation
weighted arithmetic mean of velocity

9 quadrature points in the rotor plane with built-in CGI weights.

Executed with PyWake CGIRotorAvg.__call__. PyWake averages the supplied deficit at its native rotor nodes; the comparison converts that result back to normalized velocity.

A ladder of test cases

Rather than jumping straight to a waked rotor, the comparison walks through four velocity fields of increasing difficulty. Each step adds exactly one new way for a coarse stencil to go wrong, so a deviation can be attributed to a specific cause instead of to the case as a whole.

  1. Uniform inflow — U/U∞ = 1
  2. Linear vertical shear — U/U∞ = 1 + 0.2 (z/R)
  3. Quadratic radial deficit — U/U∞ = 1 - 0.2 (r/R)²
  4. Offset Gaussian velocity deficit — U/U∞ = 1 - 0.35 exp(-((y/R - 0.35)² + (z/R)²) / (2 · 0.28²))

Reference: 128-point Gauss-Legendre radial integration with 720 azimuthal points. Each software result is compared with a dense-disk reference using the same aggregation semantics.

1. Uniform inflow

U/U∞ = 1

A constant field. Any quadrature whose weights sum to one is exact here, so this verifies the harness and the normalization of each stencil rather than discriminating between methods.

Exact area average: 1

SoftwarePointsRotor averageDense referenceAbsolute errorRelative error
FLORIS91.0000001.0000000.0000000.00%
FOXES161.0000001.0000000.0000000.00%
PyWake91.0000001.0000000.0000000.00%

2. Linear vertical shear

U/U∞ = 1 + 0.2 (z/R)

A linear profile. Because all three stencils are symmetric about the hub height, the positive and negative contributions cancel and the area average is still recovered exactly. Point placement starts to matter only once the aggregation is nonlinear.

Exact area average: 1

SoftwarePointsRotor averageDense referenceAbsolute errorRelative error
FLORIS91.0000001.0000000.0000000.00%
FOXES161.0000001.0000000.0000000.00%
PyWake91.0000001.0000000.0000000.00%

3. Quadratic radial deficit

U/U∞ = 1 - 0.2 (r/R)²

The first case with real curvature. The exact area average is 0.9. Stencils clustered near the hub under-resolve the slower flow near the blade tips and overpredict the rotor average, which exposes how far each sampling pattern reaches toward the rotor edge.

Exact area average: 0.9

SoftwarePointsRotor averageDense referenceAbsolute errorRelative error
FLORIS90.9000000.9000000.0000000.00%
FOXES160.8968000.9000000.0032000.36%
PyWake90.9000000.9000000.0000000.00%

4. Offset Gaussian velocity deficit

U/U∞ = 1 - 0.35 exp(-((y/R - 0.35)² + (z/R)²) / (2 · 0.28²))

A laterally offset deficit that approximates a partially waked rotor. It is neither symmetric nor smooth on the scale of the coarse stencils, so it is the most demanding case and the one most representative of wake-model use.

SoftwarePointsRotor averageDense referenceAbsolute errorRelative error
FLORIS90.9453900.9461320.0007420.08%
FOXES160.9471920.9461320.0010600.11%
PyWake90.9515280.9461320.0053960.57%

Errors across the ladder

All three methods use arithmetic averaging in this configuration, so each error is measured against a dense-disk arithmetic reference.

How to interpret this comparison