Skip to content

ROSCO v2.10.6 - #509

Merged
dzalkind merged 10 commits into
mainfrom
develop
Sep 29, 2026
Merged

dzalkind merged 10 commits into
mainfrom
develop

Conversation

@dzalkind

Copy link
Copy Markdown
Collaborator

Description and Purpose

Release ROSCO v2.10.6 by merging develop into main. This release adds windIO support, adds OpenFAST v5.0 compatibility, and reworks the fixed-blade-pitch (FBP) MHK control path. The DISCON.IN format has not changed.

What's changed

windIO support (#492, #498)

  • New rosco.toolbox.inputs.windio module with windio_to_discon() and discon_to_windio(), which convert between the control section of a windIO turbine file and ROSCO DISCON parameters.
  • Speeds are converted using the gearbox ratio, because windIO inputs are rotor-based and ROSCO inputs are generator-based (Account for gearbox ratio in windio conversion #498).
  • New Examples/34_discon_windio.py converts in both directions and checks that a round trip gives back the original values. It has been added to test_examples.py. windIO turbine yamls for the IEA-15, IEA-22 and NREL-5MW are in Examples/example_inputs/windio/.

OpenFAST v5.0 support (#503)

  • environment.yml pins openfast=5.0 / openfast-io=5.0, and pyproject.toml requires openfast_io~=5.0.
  • The Test_Cases input decks are updated to the OpenFAST v5 format.
  • Turbine.load_from_fast() no longer reads the ElastoDyn/BeamDyn blade files, and the unused Turbine.bld_flapwise_damp attribute has been removed.
  • The RM1 MHK model and tuning yamls are updated. CaseLibrary.sweep_control_params can now sweep a discon_param.

Fixed-blade-pitch MHK control (#508, which has the full details, plus follow-up commits)

  • Controller: in FBP mode, VS_MaxTq is now de-rated by PRC_R_Torque. PRC_R_Torque defaults to 1, so existing configurations behave the same. PRC_Mode = 2 can now be used with VS_FBP > 0 to soft-start the rotor. PRC_Mode = 1 is still rejected.
  • Toolbox: FBP mode conflicts that ROSCO aborts on at runtime are now caught during tuning. The toolbox warns when VS_ControlMode does not match the selected VS_FBP. Fixed the below-rated Cp_op and the order in which minimum-speed limits are applied.
  • PRC_WindSpeeds / PRC_GenSpeeds defaults now come from the turbine (v_min / v_max and PC_RefSpd) instead of hard-coded values.
  • VS_ControlMode is now described as the below-rated torque mode in the schema, the DISCON writer, and the example DISCONs.
  • CaseLibrary.sweep_control_params accepts a param_sweeps list of full controller_params overrides. Each sweep case now gets its own deep copy of the controller parameters, so one case cannot change the next.
  • docs/source/marine_hydro.rst is substantially expanded, and Examples/31_fixed_pitch_mhk.py is reorganized. The docs give the tip-cavitation speed limit as design guidance. Neither ROSCO nor the toolbox checks it, so use AeroDyn's CavitCheck to confirm a schedule.

Docs and small fixes (#506 and others)

  • ControllerInterface docstrings now say that yaw inputs are in radians, not degrees (Update documentation errors #506). Fixed a docstring typo in sim.py.
  • The Ind_StructControl error message now names StC_Mode (it said CC_Mode).
  • load_ascii_output now pads or truncates rows with the wrong number of columns instead of failing.
  • README: new section on extracting a precompiled libdiscon from the conda-forge package.
  • Docs: added instructions for building the docs locally. The Read the Docs build now uses mamba.

Packaging / CI

  • requires-python >= 3.11: Python 3.9 and 3.10 are no longer supported. The install docs now use Python 3.11.
  • Wheels: no longer built for manylinux_i686, and Linux wheels are built on manylinux_2_28. macOS wheels use Apple clang from the runner instead of Homebrew LLVM.
  • The compile CI installs ROSCO with --no-deps.
  • Version bumped to 2.10.6 in pyproject.toml and the generated registry (ROSCO_Types.f90, ROSCO_IO.f90).

Compatibility notes

  • DISCON.IN: no parameters were added or removed, so existing DISCON files work unchanged.
  • Toolbox: requires Python ≥ 3.11 and OpenFAST v5.0 input files for tuning (openfast_io~=5.0).

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: 34_discon_windio added to test_examples.py
  • Update registry: regenerated with the v2.10.6 version string
  • Run testing: CI_rosco-compile passed at 8294a23 and needs to be re-run after the cavitation-check removal

TODO Items API Change:

  • Update docs with API change: N/A, no DISCON API change
  • Run update_rosco_discons.py in Test_Cases/
  • Update DISCON schema: VS_ControlMode description only

Github issues addressed, if one exists

None. This PR includes #492, #498, #503, #506 and #508, plus two follow-up commits to #508: removing the toolbox cavitation check, and deep-copying controller parameters for each sweep case.

Examples/Testing, if applicable

  • CI_rosco-compile passed on develop at 8294a23. It will be re-run on the final head of develop before this is merged.
  • Examples/34_discon_windio.py converts DISCON → windIO → DISCON for the IEA-15 (monopile and semi) and NREL-5MW, and fails if any value differs by more than 1e-3.
  • Examples/31_fixed_pitch_mhk.py tunes and simulates all six FBP configurations. The results are used in the verification section of the MHK docs.

🤖 Generated with Claude Code

dzalkind and others added 10 commits November 14, 2025 10:38
* Clean up examples to clarify inputs/outputs

* Change default ss_pcgain

* Add tuning input to change setpoint separation when tuning

* Fix directories in ex 06

* Bug fix: Use LSS speed throughout TRA subroutine

* Add setpoint separation to DISCON_dict

* Test build on macos-latest and not 13, those runners being depreciated

* Clarify DISCON description for SD_TimeActivate

* Remove macos-13 from publish CI

* Tidy example 02

* Increment version

* Update discons

* Add script for creating windio input yamls

* Create rosco vt from windio and functionize

* Add windio schema conversion to own file

* Make example self-contained in ROSCO

* Update inputs for openfast 4.2.0 (#491)

* Update inputs for openfast 4.2.0

* Update openfast versions in environment

* Pull windIO yamls from their repos for example

* Revert to windIO versions because they have the updated control inputs
* Account for gearbox ratio in windio conversion

* Pin openfast_io pip install

* Add windio yaml for nrel-5mw

* Fix typo while here
* Update RM1 model and control

* Update RM1 tuning yaml and SeaState input

* Add discon parameter sweep to CaseLibrary

* Make shorter MHK example

* Update inputs for openfast 4.2.0

* Update openfast versions in environment

* Disable cavitcheck, shutdown at 9999

* Tidy MHK example

* Increase generator inertia

* Set new tuning parameters for RM1

* Update DISCONs

* Update input files to openfast v5

* Update environment yaml

* Add discon_param sweep to CaseLibrary

* Update output file reader so it can grab partial lines without failing

* Read elastodyn file more robustly

* Skip blade input reading, unused

* Increase toml version

* Re-generate discons

* Add note about getting pre-compiled libraries from conda

* Re-generate registry

* Update NREL-5MW, RM1 models to OF 5.0

* Update NREL 2.8 MW

* Update toml, discons

* Update StC_DOF_MODE for OF5, add TEST_MODE

* Update FAST.Farm for OF5.0

* Pip install with no-deps

* Set default DISCON dict

Co-authored-by: Copilot Autofix powered by AI <[email protected]>

* Restore explicit GenDOF setting in base_op_case

* Use generic DLL_Filename

Co-authored-by: Copilot Autofix powered by AI <[email protected]>

* Use generic DISCON_LIB_PATH for external users with generic flag

* Update StC mode description

* Update python versions to >=3.11

* Try manylinux_2_28

* Skip 32-bit linux, not supported with numpy 2.5

* Fix toml format

---------

Co-authored-by: dzalkind <[email protected]>
Co-authored-by: Copilot Autofix powered by AI <[email protected]>
Co-authored-by: copilot-swe-agent[bot] <[email protected]>
* Update yaw/rad errors

* remove accidental mispelling

---------

Co-authored-by: dzalkind <[email protected]>
* Account for gearbox ratio in windio conversion

* Add docs for building the docs

* Add more generic param_sweeps

* Clean up and sweep all cases in ex 31

* Add a few more checks to FBP modes

* Review MHK control docs

* Add cavitation check and docs

* Align VS_ControlMode with docs

* Try mamba install with fewer solves

* Re-organize example and docs to follow three main examples

* Add soft-start to FBP modes

* Update comment, defaults for MHK settings, VS_ControlMode

* Add variable-pitch section

* Copy-edit the marine_hydro docs

* Clarify 2- vs. 3-bladed remarks

* Fix and document v_rated change for FBP

* Fix Cp_op in below rated FBP

* Relocate min rotor speed limits to before they are used in all cases

* Fix comment, FULL_TEST

* Fix output name

* Try skipping the compiler on macoc-14

---------

Co-authored-by: dzalkind <[email protected]>
Controller.__init__ writes per-case OL_* DISCON overrides into the nested
open_loop dict, which was shared across sweep cases by the shallow merge,
so later cases could inherit an earlier case's open-loop file or indices.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The check needed the steady angle of attack at each blade section to be
more than a heuristic, which the toolbox does not have without CCBlade.
AeroDyn's CavitCheck does this properly, so drop the toolbox check and
keep the cavitation speed limit in the docs as design guidance.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@dzalkind dzalkind changed the title Develop ROSCO v2.10.6 Sep 29, 2026
@dzalkind
dzalkind merged commit 9d6c0a7 into main Sep 29, 2026
34 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