Skip to content

Commit

Permalink
Squashed 'ROSCO/' changes from 6c2807a9e..b994e4de6
Browse files Browse the repository at this point in the history
b994e4de6 ROSCO v2.9.0 (#304)
REVERT: 6c2807a9e Merge remote-tracking branch 'upstream/develop' into v2.9.0_prep
REVERT: 7fa1ae25e Don't check ZMQ period if no ZMQ_Mode
REVERT: 4cdef25d4 Merge pull request #300 from NREL/smart_lib_path
REVERT: b1c943ea0 fixes for windows
REVERT: 8c39105a3 hopefully caught everything
REVERT: 2d0525830 switch to cmake-build-extension and logic for finding rosco library path
REVERT: 45aad140c Add more error checking in checkpoint file I/O
REVERT: c5de22f59 Modernize setup and CI (#297)
REVERT: 92e2ac5ab Reorganize Repo (#294)
REVERT: 6a3b194ac Merge pull request #164 from dzalkind/f/exclusion_zone
REVERT: fb5c43de3 Skip upload of artifacts
REVERT: eed259db9 Update toolbox input rst
REVERT: 9d97bc285 Revert IEA yaml
REVERT: 173a91580 Remove extra update_discons
REVERT: 4f7d27376 Separate TD and TRA control modes
REVERT: 77255d15a Rename TRA example, add to CI testing
REVERT: 2decc8166 Add ZMQ_ID to api change
REVERT: 1e455a0e8 Merge remote-tracking branch 'upstream/develop' into f/exclusion_zone
REVERT: f93f28162 Add clarification on fastcall
REVERT: 69da72105 Change guidance in api reference
REVERT: ef5aa138c Add signals to IO and Types
REVERT: 3c9e00fb0 Add PC_RefSpd interim signals
REVERT: b2acd3efb Clean up PRC example
REVERT: 2b0f88223 Set up TRA example
REVERT: 05ed0f4df Wind Farm Control Interface (#280)
REVERT: 47dd2d61e Update API docs
REVERT: be4753b5f Revert PC_PitComC to T
REVERT: 7d6b45a03 Try apt-get update
REVERT: a681eb7ef Update toolbox docs
REVERT: 5b38681c1 Clean up inputs further
REVERT: 9d5e21a7e Clean up Twr_ variables and names names
REVERT: f71b8ec04 Rate limit set point, needs clean up
REVERT: c75738eee Modified ZeroMQ interface to include pitch offsets (#261)
REVERT: a610e55eb Better Open Loop Control Error Catching (#273)
REVERT: dd01047c5 Update .readthedocs.yaml remove old python version
REVERT: 8693d4ba4 Update .readthedocs.yaml
REVERT: 328d29e7d Update .readthedocs.yaml with version key
REVERT: c4790340d Update .readthedocs.yaml with another python version
REVERT: 04d3f5284 Update .readthedocs.yaml with new python version
REVERT: 80973fe16 Update .readthedocs.yaml with python 3.9
REVERT: 6f1ccfa33 Update .readthedocs.yaml with other build options
REVERT: f2a624db1 Update .readthedocs.yaml with build.os
REVERT: 0e800947d Update api_change.rst formatting
REVERT: b66cd1170 Add types to scalars (#264)
REVERT: 31b7cc823 Update API docs
REVERT: 9ca681b3c Clean up more old TD_Modes
REVERT: 3c0c800ca Add Twr_Mode error catching and warnings
REVERT: 93b16623f Remove TD_Mode, regen inputs, docs
REVERT: 2c76747fa Increase max file unit (#253)
REVERT: 4ebd1350f Clean up types, make band total width of band
REVERT: b10ec71b2 Merge remote-tracking branch 'upstream/develop' into f/exclusion_zone
REVERT: 25cf21977 Re-work exclusion zone with simpler implementation
REVERT: 989ce5ba9 Merge pull request #170 from dzalkind/power_ref_tracking
REVERT: e75baa29a Remove pCrunch notebook
REVERT: 3b0bde0fa Update PRC example with PRC_GenSpeeds
REVERT: 32292e588 Bring back saturation of torque reference speed
REVERT: d9a31fb76 Document API changes
REVERT: 38f27def4 Add LPF on WSE for speed selection, use gen speed rather than rotor
REVERT: b817a5ca8 Bring back new VS_ControlMode that merge lost
REVERT: 3092e387b Tidy example documentation, output
REVERT: 24052dc20 Revert run_FAST cases
REVERT: b5eb5c0ad Use updated DISCON writing functions for PRC inputs
REVERT: ea55560f7 Shorten PRC example
REVERT: b27629b3d Rename power ref example
REVERT: 716b2e46d Merge remote-tracking branch 'upstream/develop' into power_ref_tracking
REVERT: 63bcb0d4b Extend ROSCO for MHK (#257)
REVERT: 31332d923 Update .readthedocs.yaml to remove use of 'system_packages' as it is being depreciated by readthedocs (#258)
REVERT: c641b54a6 Rotor Position Control (#255)
REVERT: 178217bb1 Regenerate registry, inputs
REVERT: d9547ddcd Fix relative Cp filepaths
REVERT: 9de385b3c Merge remote-tracking branch 'upstream/develop' into power_ref_tracking
REVERT: 273af277d Regen registry, discons
REVERT: fef92431b Fix relative Cp filepaths
REVERT: d4d4cb261 Merge remote-tracking branch 'upstream/develop' into f/exclusion_zone
REVERT: 2f069daec Floating Feedback Gain Scheduling (#241)
REVERT: c701f6776 OpenFAST 3.5.0 (#246)
REVERT: e5b1af538 Yaw Rate Bug Fix (#239)
REVERT: 5fd97e254 Increment version number
REVERT: 12f8fdb4b Merge remote-tracking branch 'upstream/main' into develop
REVERT: 90357a2cd Merge remote-tracking branch 'upstream/develop' into power_ref_tracking
REVERT: 23879c815 Remove old TD_Mode references
REVERT: 1c644ecde Update TRA example
REVERT: 0dc1ad0c1 Merge remote-tracking branch 'upstream/develop' into f/exclusion_zone
REVERT: 79426f799 Increment version number
REVERT: 339ad5391 Tidy example output
REVERT: 585e2c8b1 Open loop platform control (#236)
REVERT: 24bded08f Add note about offset
REVERT: 60b366d0a Revert openfast changes
REVERT: ac14b174d Init PC_RefSpeed if no PRC
REVERT: de15e52d4 Various bug fixes (#233)
REVERT: 766941943 Merge remote-tracking branch 'upstream/develop' into power_ref_tracking
REVERT: 8a39f3cc7 Update example with ramp, reference
REVERT: 5a7046f70 Active Wake Control (#230)
REVERT: 099532bc7 Finish merge with awc inputs and registry
REVERT: f1037ec6e Merge remote-tracking branch 'origin/awc' into power_ref_tracking
REVERT: 9e5fd58cd Add PRC example
REVERT: e49f3837d Add latest plot_FAST notebook
REVERT: 1e38c90d7 Update IPC example for testing sat modes
REVERT: 52e370867 Finish merge with inputs and registry
REVERT: fe2470475 Merge remote-tracking branch 'upstream/develop' into power_ref_tracking
REVERT: fbb44c4b2 Add IPC gain to NREL2p8
REVERT: 5afb385bd Parallelize output processing
REVERT: 90c40416b Add optimized NREL2p8 controller input
REVERT: 820aa6630 Merge pull request #2 from kbrown1snl/patch-2
REVERT: 728c61da3 Update 20_active_wake_control.py
REVERT: 17ce1a5c4 Merge remote-tracking branch 'jfred/patch-1' into awc
REVERT: bc3341760 Update api_change.rst
REVERT: 8e4cf8b24 Allow more than 99 local variables in dbg2
REVERT: 7f12c9c92 Clean up comments
REVERT: 9d7e18de4 Tidy file writing
REVERT: 3851a6baf Remove lingering comment
REVERT: e02379d93 Remove AWC references from IPC
REVERT: 50bd08c19 Tidy up IPC, allow AWC and IPC with warning
REVERT: 50f419119 Update error message
REVERT: 1e25c88ae Fixed bug in added AWC input checks.
REVERT: bd4d7d5d9 Added checks for AWC inputs.
REVERT: cae3f1733 Updated AWC input parameters.
REVERT: 2947b4f10 Dylib -> so in Test_Cases
REVERT: e1379de0a Run ROSCO_testing from anywhere
REVERT: de8d228a6 Fix input file writing, force into int in write_array
REVERT: 5e75601ca Make AWC_n a list, too
REVERT: c1e4be785 Force AWC_n into int better
REVERT: 4194da43f Force AWC_n into int
REVERT: e4d7ec259 Tidy input writing, remove `future` references
REVERT: 74c7fcbfe Rename methods in readme
REVERT: 4e2a77833 Remove duplicate PF_Offsets input read
REVERT: ca7c44d8e Tidy print statements, file writing
REVERT: daf77e943 Merge remote-tracking branch 'ndev/rosco_awc_merge' into awc
REVERT: 8ea0a4c97 Merge remote-tracking branch 'jfred/AWC_NREL' into awc
REVERT: 87cde8c52 Merge remote-tracking branch 'upstream/develop' into awc
REVERT: 1ccc1b36b Platform control and Optional Inputs (#227)
REVERT: e8996003c Updated Coleman Transformation based AWC
REVERT: b2fdfbcf9 Update AWC_Mode descriptions
REVERT: b17f35005 Add 2.8 to update_discons, regenerate DISCON Should match closely to original DISCON
REVERT: 4604ebbee Add 20_awc to test_examples
REVERT: a9ec14e98 Update all DISCONs
REVERT: b24f07b6f Merge remote-tracking branch 'upstream/develop' into awc
REVERT: 70d5771c8 Fix file writing in AWC section
REVERT: 687b7603e Undo unintentional changes to wrie_registry.py
REVERT: 3bc2185ce Added NREL-developed AWC-implementation
REVERT: ff0ce39cf Update rosco_types.yaml
REVERT: 797e5544e Update utilities.py
REVERT: 826ca01fb Update toolbox_schema.yaml
REVERT: b141c4e04 Update 20_active_wake_control.py
REVERT: baaa8db06 Update ReadSetParameters.f90
REVERT: 5c878add4 Update ROSCO_Types.f90
REVERT: ae5090b5c Update Controllers.f90
REVERT: 32dc9fd8a Update NREL-2p8-127_DISCON.IN
REVERT: 46e7168d8 Update 20_active_wake_control.py
REVERT: 87b3f09c5 Revert setup directory
REVERT: de3a6fe44 Tidy up DISCON file writing
REVERT: de16ecdda Test all AWC cases in example 20
REVERT: cabbb2adc Merge pull request #1 from kbrown1snl/patch-1
REVERT: 1824f991a Fix units in schema
REVERT: f6d061f87 Update 20_active_wake_control.py
REVERT: a7d33035f Merge remote-tracking branch 'upstream/main' into develop
REVERT: 83022e586 Prep for more modes
REVERT: 3c40565ea Formatting fixes
REVERT: d93d44321 Update AWC example with instructions/theory
REVERT: 2bb01760d Tidy example
REVERT: 1693602fb Add AWC to toolbox schema
REVERT: 1201a6672 Update other DISCONs
REVERT: cc4080d03 Tidy up input additions
REVERT: da46fac31 Set min pitch for AWC
REVERT: 5c5333b12 Remove LocalVar%PC_MinPit = CntrPar%PC_MinPit, breaking setpoint smoother
REVERT: b102b34d2 Update example to point to correct inputs
REVERT: 80bd691ac Add AWC_Mode and move AWC into subroutine
REVERT: d05ef6c7a Merge branch 'develop' into rosco_awc_merge
REVERT: 2f941e38f Merge remote-tracking branch 'upstream/main' into develop
REVERT: a4717839d Add initial AWC example, needs OF3.4
REVERT: f5c3c1e5d Add case generation updates
REVERT: 42525a98a V270 prep (#218)
REVERT: a1cf97bbe Rename examples (#215)
REVERT: 20c9c9d1d Adding NREL 2.8 127 for AWC testing
REVERT: 0c0e466a8 Fixes to readsetparams and awc location
REVERT: 3155b63dd Add script for updating DISCON versions (#214)
REVERT: c51ed30ac Removed duplicate pitch assignment and removed MinPitch mods for AWC
REVERT: e554c1da0 IPC Saturation Fix [RAAW] (#210)
REVERT: be28641f1 Allow PA_Mode 1 (#213)
REVERT: 515da1797 Make AWC_complexangle a LocalVar for logging
REVERT: 974e271c7 Separate contribution to PitCom from mode calculation
REVERT: 0575d7527 Re-organize AWC pitch contribution, before actuator
REVERT: 1e802638f Apply DbKi to COMPLEX
REVERT: 0be88d47e Add AWC parameters to registry, regenerate types
REVERT: f5428de80 Merge remote-tracking branch 'upstream/develop' into rosco_awc_merge
REVERT: 721fbf5d1 Use new numpy
REVERT: 15c0603fb Merge remote-tracking branch 'upstream/develop' into f/exclusion_zone
REVERT: 05d7b3b94 Compatibility with Numpy v1.24 (#208)
REVERT: 75a648cdf AWC First Version, collected changes
REVERT: b3a8b1cbf Try compilers in macOS build
REVERT: b5c65bdb5 Add example_19 to CI
REVERT: c8d08c11d Fix default Twr_GainTau
REVERT: b1e122985 Allow Twr_Mode of 3 in tuning yaml
REVERT: 591571e76 Add Twr_GainFactor and Twr_GainTau
REVERT: 6881ac098 Add TRA example
REVERT: f7bae0009 Tidy input writer
REVERT: a3aa81fac Separate collective pitch command from total, use in SS
REVERT: b1f78e088 Add VS_RefSpd and PC_RefSpd to LocalVars
REVERT: f2db21273 Tidy up merge with develop
REVERT: a2741f20a Merge remote-tracking branch 'upstream/develop' into f/exclusion_zone
REVERT: 9d27a333b OpenFAST v3.3.0 (#202)
REVERT: 5ad1d4109 Doc fix (#200)
REVERT: 827b2814f Update sim.py (#196)
REVERT: 602332eac Various Bug Fixes (#188)
REVERT: 9384f0307 Added feature to read AeroDyn 14 files also for the case without tower influence. (#177)
REVERT: decd69470 Various Bug Fixes (#167)
REVERT: 2efac8480 Adding pitch actuator fault (#163)
REVERT: 34ca985ef Update discons
REVERT: b933b3bab Add rotor speed tracking, test case
REVERT: 86c8acfb2 Update Windows install instructions
REVERT: 778822b5d Add generator efficiency to power output of simple simulation
REVERT: ae7b26748 Update example 05 units
REVERT: 16bd05c66 Clean up TwrControl_Mode
REVERT: 2da1a16ab Change TD_Mode to Twr_Mode
REVERT: eec3d5f23 Merge branch 'develop' into f/exclusion_zone
REVERT: 772e36f96 update discons
REVERT: df919635b Update registry
REVERT: 9bc45ce27 Merge remote-tracking branch 'upstream/develop' into f/exclusion_zone
REVERT: 40a4edc9f F/zmq (#145)
REVERT: b45fb4300 External Control Interface (#141)
REVERT: 9ca75e1e2 Robust control updates (#139)
REVERT: 0bf504ee3 Pass through (#136)
REVERT: 75e7fb8dc RAAW Updates (#133)
REVERT: 50a2f90e3 Add OpenFAST channels that Simulink reads (#135)
REVERT: 5cdb0b5fb Pitch Actuator and IPC updates (#123)
REVERT: e035a7d95 Flip Ct and Cq table allocation (#130)
REVERT: bd0562cd4 sigma + ipc (#125)
REVERT: d52019231 Update docs to reflect CI process
REVERT: e9c9378e3 Merge remote-tracking branch 'upstream/develop' into develop
REVERT: 4126adbfd Bladed readthedocs (#117)
REVERT: d7d15b044 Update version in API change docs
REVERT: 8c312875c Bladed docs (#116)
REVERT: 5f18bf8c1 Increment version number
REVERT: 9b5499d76 ipc (#105)
REVERT: a857211fa Allow default inputs (#110)
REVERT: 1be503c03 Fix print var type for WE_CP
REVERT: 2d8a9451b Update DISCONs
REVERT: 7e30c4d64 Add exclusion zone to example
REVERT: eb9b901b8 Add exclusion zone mode to
REVERT: a5eb72c35 fix units for exclusion zone
REVERT: d50e23a00 Add twr frequency exclusion zone
REVERT: 38a13da46 add control packageg
REVERT: a9f43b948 Print when finished with ROSCO
REVERT: 58b4e1b5d Update discons - resolve conflict
REVERT: c8b23371f Merge remote-tracking branch 'upstream/develop' into f/ipc
REVERT: 480c7c4ad Disable logging level
REVERT: 3beca3eb9 Clean up, hone in on debug call
REVERT: 5692ab844 Add more debugging lines 2
REVERT: a568be6a5 Add more debugging lines
REVERT: e119569f4 Debug OL reading
REVERT: 0971f300c Set wind speed, rotor speed IC in example 14
REVERT: a362dc473 Fix OL_Input reading
REVERT: 41e0dc6e2 Fix ccrotor inputs (#104)
REVERT: b4c755844 Update DISCONs again
REVERT: db919993c Fix Material parameter path
REVERT: 1dc03765f shorten simulation time
REVERT: 5cb3725e3 Allow IPC to command pitch value below peak shaving saturation limit
REVERT: 07753d8ca Add IPC tuning vars
REVERT: 6caf61ed4 cleanup and streaamline run_examples
REVERT: 1e5398f9f add examples to readme
REVERT: 26bd784e9 Update cp surfaces and DISCONS
REVERT: 7f3d89a3d Add example 13 for IPC
REVERT: e35f20a13 expand pitch_initial to 30 degrees
REVERT: 7760bcd77 update coord reader/writer
REVERT: c1d7908dc Add IEA15MW_OL.yaml
REVERT: 9a75c7114 ignore dbg2 files
REVERT: 280996714 Update Polars to point to coord files
REVERT: b6ba25358 make sure IPC_KP is positive
REVERT: 03f2b761c fix ipc gain printing bug
REVERT: 9bc06254d fix variable names
REVERT: 02e08f7d0 add IPC gains to schema for pass-through ability
REVERT: 86f3a9c4c numerical qualifiers for error handling
REVERT: abd83d731 Add IPC_KP to api changes
REVERT: 844b0693d add CMakeFiles to gitignore
REVERT: 2ade01535 add mutichannel plotting with tuples
REVERT: 7e5e2a3d7 Error checking foro flp or ipc
REVERT: 79e5d5400 Addd IPC_KP to DISCON.IN
REVERT: 0111087a8 Fix comments in ColemanTransformInverse
REVERT: fded9d422 Add cyclic flap conrol
REVERT: dbd81afda Better logic for filtering RootMOOP and fix notch filter slopes bug
REVERT: 5e40ac40f Add IPC and filtered RootMyc to registry
REVERT: 823f5f00f Add proportional control and cleanup IPC
REVERT: 065befa76 Fix performance table paths
REVERT: afca92fce Update surface and DISCON.INs
REVERT: 262d3f6fe rename aerodynblade inputs
REVERT: ee00f6786 remove interpolation of blade chord and twist
REVERT: aad739652 Merge pull request #103 from nikhar-abbas/hf/robust
REVERT: 5d5a9ba82 add bld edgewise freq to robust dict_inputs
REVERT: 93dceb7ed Break up if statement in open loop pitch (#100)
REVERT: 6c1e4dbf1 Restart & registry (#99)
REVERT: 50f686dd2 Open Loop Control (#98)
REVERT: f57ee4553 Merge pull request #97 from nikhar-abbas/b/listcheck
REVERT: 6f16a9da6 update listcheck method for numpy arrays
REVERT: aa888a1fc FOCAL Updates (#64)

git-subtree-dir: ROSCO
git-subtree-split: b994e4de67c423ff598a4bb354657b62ff61a50d
  • Loading branch information
dzalkind committed Jan 19, 2024
1 parent 5912bf5 commit 0fd984b
Show file tree
Hide file tree
Showing 15 changed files with 315 additions and 312 deletions.
8 changes: 4 additions & 4 deletions .readthedocs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ version: 2
build:
os: ubuntu-22.04
tools:
python: "3.8"
# nodejs: "18"
# rust: "1.64"
# golang: "1.19"
python: "mambaforge-22.9"

conda:
environment: environment.yml

# Build documentation in the docs/ directory with Sphinx
sphinx:
Expand Down
3 changes: 2 additions & 1 deletion docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ def __getattr__(cls, name):
"sphinx.ext.intersphinx",
"sphinx.ext.graphviz",
"sphinx.ext.autosectionlabel",
"sphinx_rtd_theme",
# "sphinxcontrib.bibtex",
]

Expand Down Expand Up @@ -84,7 +85,7 @@ def __getattr__(cls, name):
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = "furo"
html_theme = "sphinx_rtd_theme"

# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
Expand Down
79 changes: 26 additions & 53 deletions docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3,54 +3,39 @@ ROSCO Documentation
:Version: |release|
:Date: |today|

NREL's Reference OpenSource Controller (ROSCO) tool-set for wind turbine applications designed to ease controller implementation for the wind turbine researcher. The purpose of these documents is to provide information for the use of the tool-set.
NREL's "Reference Open Source Controller" (ROSCO) is a reference controller framework that facilitates design and implementation of wind turbine and wind farm controllers for fixed and floating offshore wind turbines.

:numref:`fig-RT` shows the general workflow for the ROSCO tool-chain. with OpenFAST
ROSCO frameworks includes a large set of available controllers and advanced functionalities that can be combined in a modular fashion based on the intended application and can be easily adapted to a wide variety wind turbines.
For example, ROSCO can be used to design turbine yaw controller along with an individual blade pitch controller with floating platform feedback for an offshore turbine while simulating a pitch actuator fault and running a user-defined torque controller.

.. _fig-RT:
.. figure:: /source/figures/ROSCO_toolbox.svg
:align: center
:width: 80%
ROSCO provides a single framework for designing controllers for onshore and offshore turbines of varying sizes.
It can be used to run representative dynamic simulations using OpenFAST.
This helps researchers perform 'apples-to-apples' comparison of controller capabilities across turbines.
Control engineers can also design their own controllers and compare them with reference controller design using ROSCO for existing and new turbines.
ROSCO has been used to provide reference controllers for many recent reference turbines including the `IEA 3.4-MW <https://github.com/IEAWindTask37/IEA-3.4-130-RWT>`_ , `IEA 10-MW <https://github.com/IEAWindTask37/IEA-10.0-198-RWT>`_ , `IEA 15-MW <https://github.com/IEAWindTask37/IEA-15-240-RWT>`_ and the upcoming `IEA 22-MW <https://github.com/IEAWindTask37/IEA-22-280-RWT>`_ turbines.

ROSCO toolchain general workflow
The ROSCO framework also includes a python based toolbox that primarily enables tuning the controllers.
The tuning process is extemely simple where only a tuning parameters need to be provided.
It is not necessary to run aeroelastic simulations or provide linearized state-space models to tune the controller to tune the controllers.
The toolbox has other capabilities like simple 1-DOF turbine simulations for quick controller capability verifications, linear model analysis, and parsing of input and output files.

Source code for ROSCO toolset can be found in this `github repository <https://github.com/NREL/ROSCO>`_ and it can be installed following the instructions provided in :ref:`install`.

**ROSCO Toolbox**
The python-based toolbox primarily used for tuning the controller and writing the DISCON.IN.
**Documentation Directory**

* Generic tuning of NREL's ROSCO controller
* Simple 1-DOF turbine simulations for quick controller capability verifications
* Parsing of OpenFAST input and output files
* Linear model analysis capability

**ROSCO Controller**
The controller implementation itself. This is compiled to :code:`libdiscon.*` file, reads the DISCON.IN file, and interfaces with OpenFAST using the Bladed-style interface.

* Fortran based
* Follows Bladed-style control interface
* Modular

Standard Use
------------

For the standard use case in OpenFAST (or similar), ROSCO will need to be compiled. This is made possible via the instructions found in :ref:`install`. Once the controller is compiled, the turbine model needs to point to the compiled binary. In OpenFAST, this is ensured by changing the :code:`DLL_FileName` parameter in the ServoDyn input file.

Additionally, an additional input file is needed for the ROSCO controller. Though the controller only needs to be compiled once, each individual turbine/controller tuning requires an input file. This input file is generically dubbed "DISCON.IN''. In OpenFAST, the :code:`DLL_InFile` parameter should be set to point to the desired input file. The ROSCO toolbox is used to automatically generate the input file. These instructions are provided in the instructions for :ref:`standard_use`.

Technical Documentation
-----------------------
A publication highlighting much of the theory behind the controller tuning and implementation methods can be found at:
https://wes.copernicus.org/preprints/wes-2021-19/

Survey
------
Please help us better understand the ROSCO user-base and how we can improve ROSCO through this brief survey:

.. raw:: html

<iframe width="640px" height= "480px" src= "https://forms.office.com/Pages/ResponsePage.aspx?id=fp3yoM0oVE-EQniFrufAgGWnC45k8q5Kl90RBkHijqBUN0JTNzBJT1QwMjIzNDhCWDlDTUZPWDdMWC4u&embed=true" frameborder= "0" marginwidth= "0" marginheight= "0" style= "border: none; max-width:100%; max-height:100vh" allowfullscreen webkitallowfullscreen mozallowfullscreen msallowfullscreen> </iframe>
.. toctree::
:maxdepth: 3
:numbered:


source/standard_use.rst
source/install.rst
source/examples.rst
source/rosco.rst
source/rosco_toolbox.rst
source/api_change.rst
source/toolbox_input.rst
source/how_to_contribute_code.rst
source/ROSCO_instructions_for_Bladed.rst

License
-------
Expand All @@ -67,15 +52,3 @@ 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.

.. toctree::
:maxdepth: 3
:numbered:

source/install.rst
source/standard_use.rst
source/rosco_toolbox.rst
source/rosco.rst
source/api_change.rst
source/toolbox_input.rst
source/ROSCO_instructions_for_Bladed.rst
2 changes: 1 addition & 1 deletion docs/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# File: docs/requirements.txt

sphinx>4.0.0
furo
sphinx_rtd_theme
4 changes: 2 additions & 2 deletions docs/source/api_change.rst
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ Thus, be sure to implement each in order so that subsequent line numbers are cor

* Each turbine is assigned a `ZMQ_ID` by the controller, which is tracked by a farm-level controller

**Tower resonance avoidance
**Tower resonance avoidance**

* When `TRA_Mode` is 1, change the torque control generator speed setpoint to avoid TRA_ExclSpeed +/- TRA_ExclBand.
* The set point is changed at a slow rate `TRA_RateLimit` to avoid generator power spikes. `VS_RefSpd`/100 is recommended.
Expand Down Expand Up @@ -89,7 +89,7 @@ Line Input Name Example Value
161 Ind_Azimuth 0 ! Ind_Azimuth - The column in OL_Filename that contains the desired azimuth position in rad (used if OL_Mode = 2)
162 RP_Gains 0.0000 0.0000 0.0000 0.0000 ! RP_Gains - PID gains and Tf of derivative for rotor position control (used if OL_Mode = 2)
186 ZMQ_ID 0 ! ZMQ_ID - Integer identifier of turbine
====== ================= ======================================================================================================================================================================================================
====== ======================= ===============================================================================================================================================================================================================================================================

====== ================= ======================================================================================================================================================================================================
Changed in ROSCO develop
Expand Down
100 changes: 100 additions & 0 deletions docs/source/examples.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@

.. toctree::

.. _examplepage:

ROSCO Examples
==============
Methods for reading turbine models, generating the control parameters of a :code:`DISCON.IN`: file, and running aeroelastic simulations to test controllers
Reading Turbine Models
----------------------
Control parameters depend on the turbine model.
The rosco.toolbox uses OpenFAST inputs and an additional :code:`.yaml` formatted file to set up a :code:`turbine` object in python.
Several OpenFAST inputs are located in `Test_Cases/ <https://github.com/NREL/ROSCO/tree/main/Test_Cases>`_.
The controller tuning :code:`.yaml` are located in `Tune_Cases/ <https://github.com/NREL/ROSCO/tree/main/Tune_Cases>`_.
A detailed description of the ROSCO control inputs and tuning :code:`.yaml` are provided in :ref:`discon_in` and :ref:`rt_tuning_yaml`, respectively.

* :code:`01_turbine_model.py` loads an OpenFAST turbine model and displays a summary of its information

ROSCO requires the power and thrust coefficients for tuning control inputs and running the extended Kalman filter wind speed estimator.

* :code:`02_ccblade.py` runs cc-blade, a blade element momentum solver from WISDEM, to generate a :math:`C_p` surface.

The :code:`Cp_Cq_Ct.txt` (or similar) file contains the rotor performance tables that are necessary to run the ROSCO controller.
This file can be located wherever you desire, just be sure to point to it properly with the :code:`PerfFileName` parameter in :code:`DISCON.IN`.


Tuning Controllers and Generating DISCON.IN
-------------------------------------------
The ROSCO :code:`turbine` object, which contains turbine information required for controller tuning, along with control parameters in the tuning yaml and the :math:`C_p` surface are used to generate control parameters and :code:`DISCON.IN` files.
To tune the PI gains of the torque control, set :code:`omega_vs` and :code:`zeta_vs` in the yaml.
Similarly, set :code:`omega_pc` and :code:`zeta_pc` to tune the PI pitch controller; gain scheduling is automatically handled using turbine information.
Generally :code:`omega_*` increases the responsiveness of the controller, reducing generator speed variations, but an also increases loading on the turbine.
:code:`zeta_*` changes the damping of the controller and is generally less important of a tuning parameter, but could also help with loading.
The default parameters in `Tune_Cases/ <https://github.com/NREL/ROSCO/tree/main/Tune_Cases>`_ are known to work well with the turbines in this repository.

* :code:`03_tune_controller.py` loads a turbine and tunes the PI control gains
* :code:`04_simple_sim.py` tunes a controller and runs a simple simualtion (not using OpenFAST)
* :code:`05_openfast_sim.py` loads a turbine, tunes a controller, and runs an OpenFAST simulation

Each of these examples generates a :code:`DISCON.IN` file, which is an input to libdiscon.*.
When running the controller in OpenFAST, :code:`DISCON.IN` must be appropriately named using the :code:`DLL_FileName` parameter in ServoDyn.

OpenFAST can be installed from `source <https://github.com/OpenFAST/openfast>`_ or in a conda environment using:

.. code-block:: bash
conda install -c conda-forge openfast
ROSCO can implement peak shaving (or thrust clipping) by changing the minimum pitch angle based on the estimated wind speed:

* :code:`06_peak_shaving.py` loads a turbine and tunes a controller with peak shaving.

By setting the :code:`ps_percent` value in the tuning yaml, the minimum pitch versus wind speed table changes and is updated in the :code:`DISCON.IN` file.

ROSCO also contains a method for distributed aerodynamic control (e.g., via trailing edge flaps):

* :code:`09_distributed_aero.py` tunes a controller for distributed aerodynamic control

The ROSCO toolbox also contains methods for working with OpenFAST linear models
* :code:`10_linear_params.py` exports a file of the parameters used for the simplified linear models used to tune ROSCO
* :code:`11_robust_tuning.py` shows how linear models generated using OpenFAST can be used to tune controllers with robust stability properties.
* :code:`12_tune_ipc.py` shows the tuning procedure for IPC

Running OpenFAST Simulations
----------------------------

To run an aeroelastic simulation with ROSCO, the ROSCO input (:code:`DISCON.IN`) must point to a properly formatted :code:`Cp_Cq_Ct.txt` file using the :code:`PerfFileName` parameter.
If called from OpenFAST, the main OpenFAST input points to the ServoDyn input, which points to the :code:`DISCON.IN` file and the :code:`libdiscon.*` dynamic library.

For example in `Test_Cases/NREL-5MW`:

* :code:`NREL-5MW.fst` has :code:`"NRELOffshrBsline5MW_Onshore_ServoDyn.dat"` as the :code:`ServoFile` input
* :code:`NRELOffshrBsline5MW_Onshore_ServoDyn.dat` has :code:`"../../ROSCO/build/libdiscon.dylib"` as the :code:`DLL_FileName` input and :code:`"DISCON.IN"` as the :code:`DLL_InFile` input.
Note that these file paths are relative to the path of the main fast input (:code:`NREL-5MW.fst`)
* :code:`DISCON.IN` has :code:`"Cp_Ct_Cq.NREL5MW.txt"` as the :code:`PerfFileName` input

The rosco.toolbox has methods for running OpenFAST (and other) binary executables using system calls, as well as post-processing tools in `ofTools/ <https://github.com/NREL/ROSCO/tree/main/rosco.toolbox/ofTools>`_.

Several example scripts are set up to quickly simulate ROSCO with OpenFAST:

* :code:`05_openfast_sim.py` loads a turbine, tunes a controller, and runs an OpenFAST simulation
* :code:`07_openfast_outputs.py` loads the OpenFAST output files and plots the results
* :code:`08_run_turbsim.py` runs TurbSim, for generating turbulent wind inputs
* :code:`14_open_loop_control.py` runs an OpenFAST simulation with ROSCO providing open loop control inputs


Testing ROSCO
-------------

The rosco.toolbox also contains tools for testing ROSCO in IEC design load cases (DLCs), located in `ROSCO_testing/ <https://github.com/NREL/ROSCO/tree/main/ROSCO_testing>`_.
The script :code:`run_Testing.py` allows the user to set up their own set of tests.
By setting :code:`testtype`, the user can run a variety of tests:

* :code:`lite`, which runs DLC 1.1 simulations at 5 wind speed from cut-in to cut-out, in 330 second simulations
* :code:`heavy`, which runs DLC 1.3 from cut-in to cut-out in 2 m/s steps and 2 seeds for each, in 630 seconds, as well as DLC 1.4 simulations
* :code:`binary-comp`, where the user can compare :code:`libdiscon.*` dynamic libraries (compiled ROSCO source code), with either a lite or heavy set of simulations
* :code:`discon-comp`, where the user can compare :code:`DISCON.IN` controller tunings (and the complied ROSCO source is constant)

Setting the :code:`turbine2test` allows the user to test either the IEA-15MW with the UMaine floating semisubmersible or the NREL-5MW reference onshore turbine.

Loading

0 comments on commit 0fd984b

Please sign in to comment.