Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit

* Speed up angle wrap functions and improve API (#505)

* replace wrap functions with faster implementations

* slight change to unit test as 180 -> -180

* Update doc string to reflect accurate return type

* Use executable book project for documentation

* Add a gh-pages deploy action

* Add more content

* Add a logo

* Add a brief description of each example

List examples in numeric order

Small cleanup to Examples listing

* Add initial API documentation

* Add input file reference

* Use autodoc and autosummary instead of autoapi

Remove TOC from intro page

* Locally install the current repo

* Configure autodocs better

Include undocumented objects as well as all members of an object

Add all default autodoc options to config

* Link to API docs in references to Python objects

* Git-ignore docs build

* Add instructions for building documentation

And other minor changes

* Add Google Analytics tracker

* Update README with documentation links

* List floris packages in API docs

* Enforce building docs from the develop branch

* Add a method to show mpl plots

This means users don’t have to also import matplotlib.pyplot as plt only to run

* Update documentation references list (#519)

* initial entry for cumulative curl

* copy in v2 references

* add cc references

* add cc refs

* replace references to zrefs with references.bib

* API improvements

* Add a subtract overload to CutPlane

Also replaces another method CutPlane.subtract to do something similar. That one made assumptions about the order and expected operations. The new subtract method expects all preprocessing to be down outside of the class.

* Fix incorrect yaw angles in fi.calculate_wake

In subsequent function calls, the yaw angles are not reset when they are all zeros. This means that if initially the yaw angles are non-zero and then they’re all-zero, the non-zero yaw settings are retained.

* Remove requirement to use codecov token to upload reports (#532)

* remove potentially error causing line

* Update codecov upload action to v3

Co-authored-by: Rafael M Mudafort <>

* Update API in examples

And clean up examples imports

* Use standard conventions in argument case

minSpeed, maxSpeed => min_speed, max_speed

* Add function to label turbines on CutPlane plots

* Rotate turbine lines and ID annotations with wind

* Configure isort and apply rules (#535)

* Configure isort and apply to floris.simulation

* Apply isort to

* Apply isort to shared modules

* Apple isort to examples and tests

* Increase line length to 100

* Add isort description in docs

* Add weights to AEP wind rose function (#541)

* Add weights to get_farm_AEP_wind_rose_class

* updating layout passed to floris_interface in example

* Remove typecast to int for turbine weighting


Co-authored-by: bayc <>
Co-authored-by: Rafael M Mudafort <>

* Add parallel computing interface for farm simulation and yaw optimization (#555)

* Add parallel computing class

* Simplify and lighten the way floris information is passed to single-core functions

* Remove unc_options and only pass unc_pmfs internally: all information already contained in that variable.

* Update how wind directions are split up

* Add example for parallel computing

* Introduce separate variable for number of workers

* Expand PCI capabilities with reinitialize, copy. This is needed for some FLASC functionalities like precalculating table of floris solutions

* Allow user to reinitialize atmospheric conditions but then also reload how atmospheric conditions are divided by cores

* Add toggle to silence print statements from Serial Refine and set default in parallel computing. Namely, with 16 workers, you will see 16 times these print statements. This only becomes more with more workers and quickly clutters up the log file.

* Add the option to propagate flow field information from workers to main florisinterface object

* Add parallel processing example

* Remove duplicate example listing


Co-authored-by: Rafael M Mudafort <>

* Feature/update layout vis (#496)

* Update layout visualization functions

* Provide an example of layout visualization

* list 23_visaluze_layout in


Co-authored-by: Rafael M Mudafort <>

* Add ruff configuration

* Fix all E and F codes

F are pyflakes
E are pycodestyle

Note: line length errors are not excluded here

* Line length corrections - floris.simulation

Max line length setting is 100

* Line length corrections -

* Line length corrections - floris/

* Line length corrections - tests

* Line length corrections - examples

* Line length corrections - profiling

* Fix W codes

Here, it’s only adding a blank line at the end

* Fix C4-comprehensions codes

* Fix I codes

Import formatting. Ruff is not yet at parity with isort, but it is pretty close.

* Include Ruff in CI

Use pre-commit with Actions

Also update the developer dependencies

* Add Ruff usage documentation in developer guide

* Enable and fix pre-commit formatting hooks (#567)

* Enable and fix pre-commit formatting hooks

* Add pre-commit instructions to developer documentation

* Support heterogeneous wind direction definition via FlorisInterface.reinitialize (#453)

* Provide ability to pass het_map to reinitialize

* re-order reinitialize inputs

* Add a new example

* Add an error if het map doesnt match on dimensions to wd

* Add error example to example

* updating format of example

* Add indication final error is on purpose

* line length check

* Comment out forced error

* Add example 16b to docs

* use n directions instead of x

* Add comment


Co-authored-by: Paul <>
Co-authored-by: bayc <>

* Infrastructure improvements (#569)

* Preserve isort formatting - run it last

Also enables splitting imports on trailing comma. If a multi-line import statement is short and includes a trailing comma, it will not be refactored into a single line.

* Use token for codecov upload

* Reduce computational load in an example

Initially, this example slowed the Actions workflow by 2x. This commit reduces the amount of work in the example to speed up the Actions workflow.

* Restrict PyPI deploy workflow to NREL/floris

* Run tests regardless of linting results

* Fail the linter

* Revert "Fail the linter"

This reverts commit d7bfa62.

* Add virtual turbine plotting method (#418)

* Add func calculate_horizontal_plane_with_turbines

* Add demo example

* Correct sort order

* Improve resolution and force matching range

* fix append

* Remove calculate with turbine from floris interfa

* Delete turbine scan example

* Add calc with turbines to

* Add vis with turbine to visualization example

* Support for yaw angles

* Fix handling of yaw angles

* fix outdated layout keyword

* ruff linting

* test pre-commit

* test pre-commit

* Pre-commit fixes

* Fixed doc errors

* Clean out commented code

* Preserve isort formatting - run it last

Also enables splitting imports on trailing comma. If a multi-line import statement is short and includes a trailing comma, it will not be refactored into a single line.

* Use token for codecov upload

* Reduce computational load in an example

Initially, this example slowed the Actions workflow by 2x. This commit reduces the amount of work in the example to speed up the Actions workflow.

* Restrict PyPI deploy workflow to NREL/floris

* Add info on plotting method

* Use coarse mesh for turbine plotting


Co-authored-by: Rafael M Mudafort <>

* Add linear wind condition upsampling method to WindRose (#544)

* Add LinearNDInterpolant to wind_rose

* Change from returning interpolant to immediately interpolating to values

* Add example to docstring


Co-authored-by: Paul <>
Co-authored-by: Rafael M Mudafort <>

* Improve the documentation navigation menu and organization (#570)

* minor formatting updates

* start overhaul of docuemntation structure

* convert input reference to markdown for consistency

* add a serious placeholder for theory and update the example input file

* remove my notes

* add top-level workflow description for getting started

* add missing period

* Add intro notebook

* Add developer section to menu

* Bug fix: fix toc reference to placeholder page

* Warning fix: use alternate cross reference form


Co-authored-by: Rafael M Mudafort <>

* Feature: External Turbine Library (#568)

* add the external library functionality

* update tests for new functionality

* enable future typing

* fix extra white space

* remove extra parameters

* add missing test file

* fix name bug and address #513

* get tests passing and ensure dictionary entries still work

* address Raf's comment

* add _path to turbine library references

* update typo, FI, and tests for _path

* fix error on case of using turbine dictionary and missing air density

* add additional test for the unique turbine check

* Specify coverage file in Codecov upload action

* Add a link to Discussions from Issues

* Add helpful info to GitHub Issue and PR templates (#597)


Co-authored-by: paulf81 <>
Co-authored-by: Rob Hammond <>
Co-authored-by: bayc <>
Co-authored-by: Bart Doekemeijer <>
Co-authored-by: pjireland <>

Git stats


Failed to load latest commit information.

FLORIS Wake Modeling and Wind Farm Controls Software

FLORIS is a controls-focused wind farm simulation software incorporating steady-state engineering wake models into a performance-focused Python framework. It has been in active development at NREL since 2013 and the latest release is FLORIS v3.3. Online documentation is available at

The software is in active development and engagement with the development team is highly encouraged. If you are interested in using FLORIS to conduct studies of a wind farm or extending FLORIS to include your own wake model, please join the conversation in GitHub Discussions!


If upgrading from v2, it is highly recommended to install FLORIS V3 into a new virtual environment. Installing into a Python environment that contains FLORIS v2 may cause conflicts. If you intend to use pyOptSparse with FLORIS, it is recommended to install that package first before installing FLORIS.

FLORIS can be installed by downloading the source code or via the PyPI package manager with pip.

The simplest method is with pip by using this command:

pip install floris

Developers and anyone who intends to inspect the source code can install FLORIS by downloading the git repository from GitHub with git and use pip to locally install it. It is highly recommended to use a Python virtual environment manager such as conda in order to maintain a clean and sandboxed environment. The following commands in a terminal or shell will download and install FLORIS.

    # Download the source code from the `main` branch
    git clone -b main

    # If using conda, be sure to activate your environment prior to installing
    # conda activate <env name>

    # If using pyOptSpare, install it first
    conda install -c conda-forge pyoptsparse

    # Install FLORIS
    pip install -e floris

With both methods, the installation can be verified by opening a Python interpreter and importing FLORIS:

    >>> import floris
    >>> help(floris)

    Help on package floris:

        floris - # Copyright 2021 NREL

        simulation (package)
        tools (package)



It is important to regularly check for new updates and releases as new features, improvements, and bug fixes will be issued on an ongoing basis.

Quick Start

FLORIS is a Python package run on the command line typically by providing an input file with an initial configuration. It can be installed with pip install floris (see installation). The typical entry point is FlorisInterface which accepts the path to the input file as an argument. From there, changes can be made to the initial configuration through the FlorisInterface.reinitialize routine, and the simulation is executed with FlorisInterface.calculate_wake.

from import FlorisInterface
fi = FlorisInterface("path/to/input.yaml")
fi.reinitialize(wind_directions=[i for i in range(10)])

Finally, results can be analyzed via post-processing functions available within FlorisInterface such as

and in a visualization package at A collection of examples describing the creation of simulations as well as analysis and post processing are included in the repository and described in detail in Examples Index.

Engaging on GitHub

FLORIS leverages the following GitHub features to coordinate support and development efforts:

  • Discussions: Collaborate to develop ideas for new use cases, features, and software designs, and get support for usage questions
  • Issues: Report potential bugs and well-developed feature requests
  • Projects: Include current and future work on a timeline and assign a person to "own" it

Generally, the first entry point for the community will be within one of the categories in Discussions. Ideas is a great spot to develop the details for a feature request. Q&A is where to get usage support. Show and tell is a free-form space to show off the things you are doing with FLORIS.


Copyright 2022 NREL

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.