This is the initial release of foxes - ready for testing.

So far not many models have been transferred from the Fraunhofer IWES in-house predecessor flappy, they will be added in the following versions. Also optimization is not yet included. We are just getting started here!

Enjoy - we are awaiting comments and issues, thanks for testing.

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.1.0


  • New code style, created by black

  • Small fixes, discovered by flake8

  • Tests now via pytest instead of unittest

  • Introducing github workflow for automatic testing

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.1.1


  • Adding support for Python 3.9, 3.10

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.1.2


Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.1.3


  • Fixes

    • Static data: Adding missing data wind_rotation.nc to manifest

  • Models

    • New wake model added: TurbOParkWake from Orsted

    • New turbine type added: PCtSingleFiles, reads power and thrust curves from two separate files

    • New turbulence intensity wake model added: IECTI2019/Frandsen and IECTI2005

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.1.4


  • Core

    • Introducing the concept of runners

  • Opt

    • New sub package: foxes.opt, install by pip install foxes[opt]. This introduces the capability to run wind farm optimizations. As examples layout optimization for simple cases are given, see below.

  • Models

    • New turbine model: Thrust2Ct, calculates ct from thrust values

    • New turbine type: NullType, a turbine type with only rotor diameter and hub height data

    • Renamed PCtSingleFiles into PCtTwoFiles

  • Output

    • New output: WindRoseOutput, providing a plotly figure that shows a rose-type histogram

    • New output: AmbientWindRoseOutput, providing rose-type plotly figures of ambient data (no wake calculation involved)

  • Algorithms

    • Improved Downwind: Now with option for ambient runs (no wakes)

  • Utils

    • New utility: show_plotly_fig, opens a window that shows a plotly figure (instead of browser)

    • New runners: DefaultRunner, DaskRunner. The latter features parallel runs via dask

  • Examples

    • Introducing two sub-folders of examples: foxes and foxes.opt

    • New example: wind_rose, calculation of wind rose states data

    • New example: layout_single_state, wind farm layout optimization for a single wind state

    • New example: layout_wind_rose, wind farm layout optimization for wind rose states

  • Notebooks

    • New notebook: layout_opt.ipynb, demonstrating a simple layout optimization case

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.2.0


  • Input:

    • New input: MultiHeightStates and MultiHeightTimeseries, for input data at several height levels, e.g. WRF results at one point

  • Output:

    • New output: FarmResultsEval, calculates sum, mean, min, max over states or turbines for the whole wind farm. Also calculates capacity, efficiency, yield, P75, P90.

    • New output: ResultsWriter, writes farm results or pandas data to csv file

    • Renaming: AmbientRosePlotOutput is now called StatesRosePlotOutput

  • Notebooks:

    • New notebook: multi_height.ipynb, demonstrating the usage of multi-height wind input data

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.2.1


  • Bug fixes

    • Bug fixed in MultiHeightStates for wind veer cases

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.2.2


  • Input states

    • Improved: SingleStateStates now supports profiles

  • Turbine models

    • New model PowerMask: Derates or boosts a turbine

  • Examples

    • New: power_mask, demonstrates derating and boost

  • Utils

    • New: cubic_roots, solves a cubic equation

  • Output

    • New: StateTurbineMap, creates heat maps for state-turbine data

    • New: TurbineTypeCurves, creates power and thrust curve plots

    • Improved: FarmLayoutOutput now supports scatter color by variable

  • Documentation

    • Adding forgotten foxes.opt to API

  • Notebooks:

    • Now including results as colored layout plots

    • New notebook: wind_rose.ipynb, demonstrating how to calculate wind roses

    • New notebook: power_mask.ipynb, showing derating and boost via a power mask

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.2.3


  • Bug fixes

    • Hotfix for bug in TurbineTypeCurves output

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.2.4


  • Core:

    • New: ExtendedStates, allows for adding point data models to states

  • Input:

    • Improved: FieldDataNC, now with support for spatially uniform variables

  • Turbine types:

    • New: WsRho2PCtTwoFiles, air density dependent power and ct curves

  • Turbine models:

    • New: SectorManagement, sets variables by range rules on other variables

  • Point models:

    • New: SetUniformData, set uniform variables (optionally state dependent)

  • Examples:

    • New: sector_management, demonstrates how to model wind sector management

  • Notebooks:

    • New: sector_man.ipynb, demonstrates how to model wind sector management

    • New: data.ipynb, lists and shows the static data

  • Bug fixes:

    • Fix for bug with option col_models in farm layout from csv

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.2.5


  • Output:

    • Improved: FarmResultsEval can now handle NaN data in Einstein sums

    • Improved: ResultsWriter can now also write turbine names

  • Turbine models:

    • New: TableFactors, multiplies variables with data from a two dimensional table

    • New: YAW2YAWM, calculates yaw deltas from absolute yaw and wind direction

    • New YAWM2YAW, calculates absolute yaw from yaw deltas and wind direction

    • Generalized: kTI, now includes optional offset kb

  • Turbine types:

    • Changed: Now yaw correction of P and CT switched on by default

  • Point models:

    • New: TKE2TI, calculates turbulence intensity from TKE

  • Wake models:

    • New: PorteAgel, calculates wakes based on the Bastankhah PorteAgel 2016 wake model

  • Wake frames:

    • New: YawedWake, bends wakes in yawed conditions

  • Wake superposition models:

    • Improved: LinearSuperposition, now includes options for lower/higher limits of total wake deltas

  • Examples:

    • New: compare_wakes, compares wake models along horizontal lines

    • New: yawed_wake, demonstrates wake bending by yawing a rotor

  • Notebooks:

    • New: yawed_wake.ipynb, demonstrates wake bending by yawing a rotor

  • Bug fixes:

    • Fix for bug with ExtendedStates, now it is actually working

    • Fix for bug with wake width in CrespoHernandezTIWake

    • Fix for bug with YAW and WD when using the YAWM2YAW turbine model

    • Fix for bug in TurbOPark wake model, double counting constant offset in sigma

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.2.6


  • Core:

    • Models now with simplified structure, reduces memory load during calculations

  • Algorithms:

    • New: Iterative, iterative wind farm calculation until convergence has been reached

  • Input:

    • Improved: FieldDataNC now accepts xarray Dataset or file pattern str as input

    • New: ShearedProfile, Vertical WS profile can be determined with shear exponent

  • Output:

    • Improved: FlowPlots2D replacing horizontal/vertical –> xy, xz, yz, more intuitive

  • Wake models:

    • New: TurbOParkIX, integrates wake corrected TI along centreline for wake width sigma.

  • Wake frames:

    • Improved: All yawed wake frames now also support centreline data integration

  • Notebooks:

    • New: overview.ipynb, summarizes the setup steps

  • Bug fixes:

    • Fix for bug in TurbOPark wake model: Brackets in Eq. (4) were wrong

    • Fix for bug with long streamlines

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.3.0


  • Input states:

    • Improved: FieldDataNC now supports states subset selection

  • Wake frames:

    • Improved: Streamlines now with maximal length option

  • Turbine models:

    • New: Calculator, simple variable calculation via user function

  • Opt:

    • Now two abstract problems in core: FarmOptProblem and FarmVarsProblem, the latter invokes the SetFarmVars turbine model

    • New opt problem: RegularLayoutOptProblem, searches for a regular grid layout

    • New opt problem: GeomRegGrids, finds regular grid layout by purely geometrical means (no wind farm calculation)

    • New opt problem: GeomLayout, turbine positioning based on xy variables, also purely geometrical

    • New opt problem: GeomLayoutGridded, a purely geometrical optimization on a gridded background

  • Examples:

    • New in foxes.opt: Example layout_regular_grid, demonstrates regular grid layout optimization

    • New in foxes.opt: Example geom_reggrids, purely geometrical regular layout optimization

  • Utils:

    • New functions for shape file handling: read_shp, shp2csv, read_shp_polygons

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.3.1


  • Bug fixes:

    • Fix for bug in FarmResultsEval that affected time range calculations under Windows

    • Bug fixes for FarmResultsEval with time series data

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.3.2


  • Utils:

    • Now geopandas_helpers can handle interior areas

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.3.3


  • Installation:

    • foxes now supports Python 3.11

  • Input:

    • New layout input option: add_from_df, adding turbines from a pandas DataFrame

    • New interface to windIO case yaml files

  • Turbine types:

    • New turbine type CpCtFile, reads CP and CT data from file or pandas DataFrame

    • New turbine type CpCtFromTwo, reads CP and CT data from two files or pandas DataFrames

    • Improved: Turbine types now calculate P_nominal as maximum, if not explicitely given

  • Constants:

    • Introducing P_UNITS, used in turbine types and output evaluation

  • States:

    • Bug fixed in FieldDataNC with loading multiple files

  • Core:

    • Improved DataCalcModel: Now cleaner treatment of runs with progress_bar=False. Also now slimmer for distributed scheduler

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.3.4


  • General:

    • Moving identifier-type entries from foxes.variables to foxes.constants

  • Models:

    • New wake superposition model ProductSuperposition, computing factorized wake deltas

    • New turbine model: RotorCentreCalc, calculates data at rotor centre, irrespective of rotor model

  • Bug fixes:

    • Bug fixed that caused problems when restarting the SectorManagement turbine model, e.g. for flow plots

  • Documentation:

    • Completely new style, fixing issues with incomplete API entries

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.3.5


  • Models:

    • Improved: New option to specify wake growth variable name, such that multiple kTI models could be used, resulting in different k‘s for different wake models

    • New turbine model: LookupTable, interpolates data based on a multi-dimensional lookup table

  • Utils:

    • Improved DaskRunner: Now supports clusters that run the Slurm queueing system

  • Examples:

    • New: timeseries_slurm, shows how to run foxes on a HPC with Slurm queueing system

  • Optimization:

    • Improved: foxes.opt is now able to optimize for flow variables (at selected points in space) in addition to turbine variables

  • Documentation:

    • Improved API docu, now based on python-apigen

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.4.0


  • Algorithms:

    • Improved: Iterative now iterates through outer loop instead of within chunk

  • Models:

    • New wake frame: Timelines, propagates wakes for spatially uniform time series

  • Tests:

    • New test: consistency/iterative, checks if iterative algorithm gives same result

  • Examples:

    • New example: timelines, demonstrates the usage of the Timelines wake frame

    • Improved: All examples were update for the correct usage of the DaskRunner

  • Notebooks:

    • New notebook: timelines.ipynb, showing how to use the Timelines wake frame in a notebook

  • Data:

    • New states data timeseries_100.csv.gz, a short timeseries with timestep 1 min, varying wind direction only

  • Output:

    • Improved: FlowPlots2D now has the optional argument runner, for computing plots with the chosen parallelization settings

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.4.1


  • Bug fixes:

    • Fix of bug that slowed down TurbOParkIX by considering all TI wakes instead of only source turbine wake during integration

    • Fix of bug that prevented plotly wind roses to be shown in the documentation

    • Fix in docu that excluded the algorithm models from the API

  • Output:

    • New: Animator, creates animations based on generators that yield lists of artists

  • Examples:

    • Improved: timelines now includes turbine REWS signal in animations

  • Notebooks:

    • Improved: timelines.ipynb now includes turbine REWS signal in animations

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.4.2


  • Output:

    • Improved: RosePlotOutput and StatesRosePlotOutput now optionally return the binned data

  • Models:

    • New vertical profile: DataProfile, data based profile from file or pandas DataFrame

    • Improved ti superposition: Now supporting n-th power superposition

    • Improved wake model TurbOParkIX: New option for consideration of all wakes in ti integral

  • Bug fixes:

    • Fixed bug with windio input that resulted in wrong wind rose weights

    • Fixed bug with FlowPlots2D with value bounds in contour plots

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.4.3


  • Testing automated publishing to PyPi via workflow


  • Models:

    • New rotor model: LevelRotor, calculates the REWS from different height levels

    • New turbine type: WsTI2PCtFromTwo, reads turbulence-dependent ct- and power curves

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.4.5


  • Dependencies:

    • Dropping support for Python 3.7, due to netcdf4 dependency

  • Core:

    • Simplified model initialization/finalization. Removing the keep_models idea, instead all models are now kept in the algorithm’s idata memory until finalization. Adding a new model now mostly requires that the sub_models and the load_data functions are overloaded, if applicable. The initialize and finalize only need to be addressed explicitly in non-standard cases.

  • Algorithms:

    • New algorithm: Sequential, step wise evaluation of states for simulation environments that do not support chunking

    • Improved: Iterative now supports under-relaxation of parameters

  • Output:

    • New sub package: output.flow_plots_2d is now a package instead of a module

  • Models:

    • This version introduces induction models for modelling blockage effects.

    • New induction model: RHB, the classic Rankine-half-body model.

  • Examples:

    • New example: sequential, demonstrating the usage of the sequential algorithm

    • New example: induction_RHB, showing the Rankine-half-body model for blockage

  • Notebooks:

    • New notebook: blockage.ipynb, demonstrating how to apply the RHB induction model to a wind farm

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.5


  • Dependencies:

    • The windio package is now an optional dependency, to be installed by hand if needed. This is due to windio being not available at conda-forge

  • Notebooks:

    • New notebook: sequential.ipynb, creating an animation showing state-by-state wake propagation

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.5.1


  • Algorithms:

    • Improved Downwind: Now optional arguments that allow calculation of subsets in calc_farm and calc_points, e.g. a selection of states

  • Output:

    • New output: PointCalculator, a wrapper for the calc_points function of the algorithm

    • New output: SliceData, creating arrays, DataFrames or Datasets from 2D slices

    • Improved FlowPlots2D: Completely refactored, data based on SliceData. New option for creating figures for subsets of states only.

  • Vertical profiles:

    • Now optional support for ustar input data instead of reference data

  • Turbine types:

    • Fix for Cp-based models with interpolation within sparse input data

  • Wake models:

    • Renaming: BastankhahWake class now called Bastankhah2014. Models in the model book are also renamed from Bastankhah to Bastankhah2014

    • Renaming: PorteAgelWake class now called Bastankhah2016. Models in the model book are also renamed from PorteAgel to Bastankhah2016

    • Renaming: RHB class now called RankineHalfBody

    • Fix: RankineHalfBody no longer shows a jump at the rotor disc, but a small region of constant deficit instead

    • New default values: Bastankhah2014 now has default value sbeta_factor=0.2 (previously 0.25). Models with the previous value are available in the model book as Bastankhah025 etc.

  • Wake superpositions:

    • Restructured: Now simplified classes for WS or TI superposition only (less general but simpler), e.g. WSLinear or TIQuadratic, etc. Also in the model book the models are now called ws_linear or ti_quadratic, etc.

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.5.2


  • Bug fixes:

    • Bugs fixed that messed up the colorbar and the title in animations

  • Notebooks:

    • Improved animations in timelines.ipynb and sequential.ipynb

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.5.2.1


  • Dependencies:

    • Replacing dependency on plotly by dependency on windrose, since the latter is lighter

  • Core:

    • This version introduces AxialInductionModel classes, computing the axial induction factor a(ct)

  • Wake models:

    • Reformulating beta in terms of induction in Bastankhah2014 and CrespoHernandez

    • New default: Bastankhah2014, Bastankhah2016, TurbOPark and TurbOParkIX now with default axial induction model Madsen

    • New induction wake models: Rathmann, SelfSimilar and SelfSimilar2020, for blockage modelling

    • Introducing WakeMirror wrapper around wake models, modelling wake reflection from ground or horizontal plane via virtual mirrored turbines

  • Wake frames:

    • Renaming Streamlines to Streamlines2D, no changes in model book names

  • Axial induction models:

    • New induction model: BetzAxialInduction, the classic a = 0.5(1 - sqrt(1-ct)) relation. In the model book this is called Betz.

    • New induction model: MadsenAxialInduction, a third-order polynomial approximation of a(ct). In the model book this is called Madsen.

  • Output:

    • Improved: FlowPlots2D now includes an option for indicating the rotor disk by a colored line

    • Improved: RosePlotOutput no longer depends on plotly, but on the new utility TabWindroseAxes

  • Utils:

    • New: TabWindroseAxes, a derivative of windrose.WindroseAxes for input data that is based on bins with weights (and not timeseries)

  • Notebooks:

    • New: blockage_comparison.ipynb, comparing four turbine induction models

  • Bug fixes:

    • Fix for bug in Streamlines2D when used in combination with WakeMirror

  • Tests:

    • Fresh flappy v0.6.2 test data for all Bastankhah and CrespoHernandez wakes, also without the sbeta limitation

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.6


  • Input:

    • New ambient states: TabStates, single tab-file input

  • Data

    • New static data: winds100.tab, an example tab file

  • Examples:

    • New example: tab_file, demonstrating the usage of the TabStates

  • Bug fixes:

    • Bug fixed for RankineHalfBody turbine induction model that produced wrong results for wind directions unequal 270 degrees

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.6.1


  • Models:

    • New partial wakes model: PartialCentre, evaluating wake deltas at the rotor centre point only

  • Inputs:

    • New farm layout input: add_random, adds turbines at random positions, respecting a minimal distance

    • New states creation: random_timseries_data, creates uniform random timeseries data

  • Utils:

    • New function random_xy_square, generates random xy positions with minimal distance

  • Examples:

    • New example: random_timeseries, computes a random farm in a random timeseries. Both sizes are defined by user input

Full Changelog: https://github.com/FraunhoferIWES/foxes/commits/v0.6.2