Skip to content
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

Open
wants to merge 29 commits into
base: develop
Choose a base branch
from

Conversation

JasperShell
Copy link

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 in solver.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 the sequential_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:

solver:
  type: turbine_cubature_grid
  turbine_grid_points: 4    # any value greater or equal to 3 should work

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 and Case_SingleTurbineWake.yaml
NOTE: This test case is built in Floris v3.6.
Because the new implementation uses the sequential_solver, also the full_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.
Screenshot 2024-05-14 102759

Example 2: Wind direction sweep

This example is based on Case_TwinPark_TurbOPark_implementation.py, Case_TwinPark_TurbOPark.yaml and Case_TwinPark_TurbOParkGauss.yaml.
NOTE: This test case is built in Floris v4.0.
A wind direction sweep is done with 2 wind turbines.
Example2

Example 3: Row of turbines

This example is based on Case_Rowpark_TurbOPark.py, Case_RowPark_TurbOPark.yaml and Case_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.
Example3

Examples 2 and 3 show the mismatch of the original implementation of turbopark.py and the matching implementation of turboparkgauss.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.

@rafmudaf rafmudaf added the enhancement An improvement of an existing feature label May 14, 2024
@misi9170 misi9170 self-requested a review May 23, 2024 15:55
@rafmudaf rafmudaf changed the title Feature/turbopark as gauss Implement TurbOPark as a Gaussian model May 24, 2024
@misi9170
Copy link
Collaborator

misi9170 commented Jun 4, 2024

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:

  • Condensing the floris input files into single files rather than using !includes throughout (not that there was anything wrong there, but just to be more consistent with other examples in the repository)
  • Condensing the two case scripts and one case notebook into a single script (001_compare_turbopark_implementations.py)
  • Renaming some variables and adding comments to the scripts; cleaning up the plots somewhat
  • Constructing the constant C_T model directly in the script
  • Moving the files over to the examples/examples_turbopark directory

Now, running 001_compare_turbopark_implementations.py produces the following figures (which match those from the case scripts/notebooks):
turbopark_1
turbopark_2

@misi9170
Copy link
Collaborator

misi9170 commented Jun 4, 2024

The process I'm planning for working on this PR is

  1. Reorganize examples
  2. Write regression tests (likely based on examples)
  3. Review models and model implementations, possibly request/discuss changes
  4. Check tests still pass, then ask @rafmudaf / others to review

@misi9170 misi9170 self-assigned this Jun 4, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement An improvement of an existing feature
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants