The windIO inputs and their software-specific mappings are listed below. Matching literature-model names do not imply identical solver, rotor-averaging, superposition, turbulence, induction, or yaw treatments.
Uses Betz induction, quadratic wind-speed superposition with a freestream (ws_quadratic_amb_target) deficit reference, grid16, 4 x 4 cell centers rotor sampling, rotor-point partial wakes, and the rotor_wd wake frame. No separate wake-added turbulence model is configured.
FOXES keeps its grid16 rotor model; the requested cubature with 9 points rotor grid is not applied.
PyWake
velocity: BastankhahGaussianDeficitk = 0.03
Uses PropagateDownwind with squared-sum superposition, CGIRotorAvg, 9 points rotor averaging, freestream (use_effective_ws=false) deficit reference, and ct2a_mom1d induction. No separate wake-added turbulence model is configured.
Uses the lower-level BastankhahGaussianDeficit class rather than PyWake's Bastankhah_PorteAgel_2014 literature preset.
Layout & sample locations
Turbine positions (bold, rotated by yaw angle where applicable) and the cross-section sample planes (dashed) used by the plots below.
Streamwise velocity
Cross-sections
Horizontal contour
X-Y plane at hub height.
Vertical contour
X-Z plane at Y=0 (lateral centerline).
Cross-section contour
Y-Z plane at X=20D.
Effect of aligning the configuration
Streamwise RMSE for each software pair in both configurations of this case. Thedefault andaligned views differ only in the solver settings listed at the top of the page.
Software pair
Default RMSE (m/s)
Aligned RMSE (m/s)
FOXES vs PyWake
0.4899
0.6448
Comparison metrics
Pairwise error between software for each plotted quantity. Click a column to sort.
Software pair
Target
RMSE (m/s)
Max abs error (m/s)
Mean abs error (m/s)
NRMSE
How to interpret this comparison
Along the hub-height streamwise line FOXES vs PyWake differ by 0.64 m/s RMSE (6.1% NRMSE). For scale, the free-stream wind speed is 9.8 m/s.
For FOXES vs PyWake, cross-section RMSE is 0.000 m/s at 4D past first turbine, 0.012 m/s at 1D past last turbine, 0.001 m/s at 5D past last turbine, 0.001 m/s at 10D past last turbine. NRMSE is normalized by the range of the first-listed software's own values in that plot, so it can rise with distance even as RMSE falls, because the wake profile becomes shallower.
The horizontal contour shows how a small RMSE can hide a large maximum error: FOXES vs PyWake has an RMSE of 0.19 m/s but a maximum of 9.80 m/s. Those maxima come from a small fraction of grid points, found at the rotor plane (X = 0) or at the sharp edge of a wake, where the packages disagree about whether a point is inside the wake. Use RMSE for overall agreement and the maximum to locate where to look.
The Gaussian deficit has no sharp edge, so the largest contour errors are confined to a few points at the rotor plane rather than along a wake boundary.
The cross-sections downstream of the last turbine coincide (largest 0.012 m/s RMSE) but the hub-height streamwise line still differs (0.64 m/s), so the remaining difference is at locations along the line that the cross-sections do not sample, such as the rotor planes.
A value of 0.0000 means the two packages agree at the precision shown in the table.
These metrics measure how consistently the packages implement the same inputs. They are not errors against measurements, so close agreement does not show that a wake model is accurate, and differences should be read together with the implementation notes above.