Skip to content

Closed-loop active wake control#450

Merged
dzalkind merged 45 commits into
NatLabRockies:developfrom
jfrederik-nrel:awc_cl
Jul 31, 2025
Merged

Closed-loop active wake control#450
dzalkind merged 45 commits into
NatLabRockies:developfrom
jfrederik-nrel:awc_cl

Conversation

@jfrederik-nrel

@jfrederik-nrel jfrederik-nrel commented Jul 3, 2025

Copy link
Copy Markdown
Contributor

Description and Purpose

This PR adds closed-loop (CL) active wake mixing capabilities. It adds 3 new operable AWC_Modes that use different CL control algorithms to regulate the blade pitch based on a prescribed AWC excitation signal:

AWC_Mode = 3: CL AWC using PI controllers
AWC_Mode = 4: CL AWC using proportional-resonant (PR) controllers
AWC_Mode = 5: CL AWC using the "Strouhal transformation" combined with PI controllers

Example 20, 20_active_wake_control.py, has also been updated to document how to use these new modes and show an example of how to run it.

Type of change

What types of change is it?
Select the appropriate type(s) that describe this PR

  • Bugfix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (non-backwards-compatible fix or feature)
  • Code style update (formatting, renaming)
  • Refactoring (no functional changes, no API changes)
  • Documentation update
  • Maintenance update
  • Other (please describe)

TODO Items General:

  • Add example/test for new feature
  • Update registry
  • Run testing

TODO Items API Change:

  • Update docs with API change
  • Run update_rosco_discons.py in Test_Cases/
  • Update DISCON schema

Examples/Testing, if applicable

20_active_wake_control.py has been updated. No tests added yet.

@dzalkind
dzalkind self-requested a review July 11, 2025 20:44
Comment thread Examples/20_active_wake_control.py
Comment thread rosco/controller/src/Controllers.f90 Outdated
! Closed-loop PI / PR controller
ELSEIF ((CntrPar%AWC_Mode == 3) .OR. (CntrPar%AWC_Mode == 4)) THEN

!! For now, only works with AWC_NumModes=2

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's actually a bit more complicated than that. It only sometimes works. If we really want to, we can still throw a warning, but it would be a lot of if statements.

Comment thread rosco/controller/src/ROSCO_Types.f90 Outdated
IF (CntrPar%AWC_harmonic(1) == 0) THEN
! Calculate mean moments, subtract later to get zero-mean tilt and yaw
LocalVar%TiltMean = LocalVar%TiltMean + FixedFrameM(1)
StartTime = 1/CntrPar%AWC_freq(1)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is StartTime if this condition is not met?

@dzalkind

Copy link
Copy Markdown
Collaborator

@jfrederik-nrel, this is passing all the CI tests and is ready to merge. There are 2 minor questions to address. Let me know when you're finished testing and ready to merge.

@jfrederik-nrel

Copy link
Copy Markdown
Contributor Author

@dzalkind made tiny changes to address your comments. I'm good to have it merged into develop!

@dzalkind
dzalkind merged commit ccba75f into NatLabRockies:develop Jul 31, 2025
21 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants