-
Notifications
You must be signed in to change notification settings - Fork 148
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implement TurbOPark as a Gaussian model #907
base: develop
Are you sure you want to change the base?
Conversation
Hi @JasperShell , thank you again for taking the time to dig into FLORIS and for submitting this pull request. I've now had more of a chance to start working with it, and I've started with reorganizing the PR_TurbOParkGauss folder and turning it into an example in the examples/ directory (under a new subdirectory, examples_turbopark). The key changes I've made are:
Now, running 001_compare_turbopark_implementations.py produces the following figures (which match those from the case scripts/notebooks): |
The process I'm planning for working on this PR is
|
TurbOPark implemented like Gauss wake model using sequential_solver
The current implementation of TurbOPark follows Orsted's original implementation (https://github.com/OrstedRD/TurbOPark), and has a dedicated solver,
turbopark_solver
insolver.py
.However, the current implementation does not match the results of Orsted's model.
This pull request proposes a new implementation of the TurbOPark wake model,
turboparkgauss.py
. Instead of introducing a dedicated solver, it makes use of thesequential_solver
, the same as used for Gauss (GCH) wake model.This new implementation gives exact match with the original Orsted model.
It also improves the modularity of Floris, because this implementation doesn't need a dedicated solver.
Related issue
The new implementation benefits from the cubature_grid integration scheme that was introduced in #649. It uses:
Test cases
All test cases are stored in the
PR_TurbOParkGauss
folder.In these examples, all turbines have a constant CT of 0.75. Wind speed is fixed to 8.0m/s and TI is set to 6%.
Example 1: Single wake
This example is based on
Case_SingleTurbineWake.ipynb
andCase_SingleTurbineWake.yaml
NOTE: This test case is built in Floris v3.6.
Because the new implementation uses the
sequential_solver
, also thefull_flow_sequential_solver
can be used to visualize a single wake. This is not possible with the current TurbOPark implementation.The new implementation is compared with Orsted's model and with my own ShellWakes tool.
Example 2: Wind direction sweep
This example is based on
Case_TwinPark_TurbOPark_implementation.py
,Case_TwinPark_TurbOPark.yaml
andCase_TwinPark_TurbOParkGauss.yaml
.NOTE: This test case is built in Floris v4.0.
A wind direction sweep is done with 2 wind turbines.
Example 3: Row of turbines
This example is based on
Case_Rowpark_TurbOPark.py
,Case_RowPark_TurbOPark.yaml
andCase_RowPark_TurbOParkGauss.yaml
NOTE: This test case is built in Floris v4.0.
A fully aligned wind farm of 10 wind turbines with 5D spacing.
Examples 2 and 3 show the mismatch of the original implementation of
turbopark.py
and the matching implementation ofturboparkgauss.py
.Note that in the same way, other wake models can be implemented that use the
sequential_solver
, as long as the wake profiles are smooth. Models like, gaussian, super-gaussian, double-gaussian, polynomial (Larson), and even EV.Only hat-shaped models, like Jensen, or models with integrated super-positioning, like CC, require a dedicated solver.