Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
553b82d
Update r-test: set MirrorRotor to F in all regression test cases
andrew-platt Aug 18, 2026
50f0cb4
Fix GNU Debug build of fftpack5.1.f (-pedantic overrides -fallow-argu…
andrew-platt Aug 19, 2026
c7f2283
Mirror the AeroDyn rotor when MirrorRotor is set
andrew-platt Aug 19, 2026
bfa5527
Mirror blade pitch and the skewed-wake frames
andrew-platt Aug 19, 2026
b999b46
Mirror the SED rotor and fix the RK4 HSS brake sign
andrew-platt Aug 19, 2026
2963224
Wire up MirrorRotor and mirror the ElastoDyn rotor
andrew-platt Aug 19, 2026
a50195a
Mirror the ElastoDyn blade pitch command
andrew-platt Aug 19, 2026
8dd5377
Keep the gearbox loss opposing power flow on a mirrored rotor
andrew-platt Aug 19, 2026
fd536f5
Split the ElastoDyn shaft-axis output aliases
andrew-platt Aug 19, 2026
fbc5612
Document mirrored rotors
andrew-platt Aug 19, 2026
85066a7
Register the mirrored-rotor regression pair
andrew-platt Aug 19, 2026
8c08fbf
Mirror the BeamDyn blade for counter-clockwise rotors
andrew-platt Aug 19, 2026
77b7234
Register the BeamDyn mirrored-rotor regression pair
andrew-platt Aug 19, 2026
2f5a461
Update r-test: drop generated BeamDyn summary files
andrew-platt Aug 19, 2026
a4b78d2
Report the ElastoDyn pitch and brake outputs in the rotor's convention
andrew-platt Aug 19, 2026
fac18ee
Refuse to mirror a furling turbine
andrew-platt Aug 19, 2026
e477a17
Present the ServoDyn interface in the clockwise convention
andrew-platt Aug 19, 2026
d9dda46
Register the mirrored high-speed-shutdown case
andrew-platt Aug 19, 2026
ca0581b
Document controllers and the inputs the mirror does not touch
andrew-platt Aug 19, 2026
b6c9f54
Register the mirrored turbulent controller cases
andrew-platt Aug 19, 2026
abd985b
Allow a mirrored furling turbine, with a warning
andrew-platt Aug 19, 2026
24714f5
docs: allow 1200px width rtd render instead of default 800px
andrew-platt Aug 19, 2026
e932111
Document BeamDyn, the module map, and the driver input
andrew-platt Aug 19, 2026
151afb6
Add the missing MirrorRotor input to the driver examples
andrew-platt Aug 19, 2026
a7253c1
docs: wrap long entries in columns during render for easier readability
andrew-platt Aug 19, 2026
8f3de28
Update OutListParameters.xlsx for channel split
andrew-platt Aug 19, 2026
e895d9f
Register the mirrored floating case
andrew-platt Aug 19, 2026
4165f56
Frame the flag as a counter-clockwise rotor, not a mirrored turbine
andrew-platt Aug 19, 2026
54ba6f7
Split the SimplifiedElastoDyn shaft-speed output aliases
andrew-platt Aug 19, 2026
b8be322
Report the SimplifiedElastoDyn rotor speed as a physical quantity
andrew-platt Aug 19, 2026
de74386
Mirror the AeroDisk rotor and enable SED and AeroDisk
andrew-platt Aug 19, 2026
dbd8e0a
Register the mirrored AeroDisk and SimplifiedElastoDyn case
andrew-platt Aug 19, 2026
cee4a16
Mirror the AeroDyn nodal output channels
andrew-platt Aug 19, 2026
0e9c499
Register the two-rotor counter-clockwise case
andrew-platt Aug 19, 2026
fbb8bd7
Register the twin-rotor counter-clockwise case
andrew-platt Aug 19, 2026
ce3e2df
Mirror the MHK centre-of-buoyancy offset
andrew-platt Aug 20, 2026
53560e0
Register the marine turbine mirror pair
andrew-platt Aug 20, 2026
84e60e1
Update r-test for the OLAF note
andrew-platt Aug 20, 2026
d69cab2
Measure the sign table instead of asserting it
andrew-platt Aug 20, 2026
82db5da
Correct the mirrored AeroDisk force and moment signs
andrew-platt Aug 20, 2026
e9fabf0
Fix the AeroDisk output coordinate transforms
andrew-platt Aug 20, 2026
ab5bff3
Give the two wake models one rotor-speed convention
andrew-platt Aug 20, 2026
e664f8b
Register the yawed AeroDisk mirrored-rotor pair
andrew-platt Aug 20, 2026
0de171b
Version the mirror verification tooling
andrew-platt Aug 20, 2026
5f60a78
Bring the mirrored-rotor documentation back in step with the code
andrew-platt Aug 20, 2026
cb3102c
Let the guard check set up its own case directory
andrew-platt Aug 20, 2026
b2604ca
Mirror the free wake
andrew-platt Aug 21, 2026
5b3c8c4
Report the free-wake blade outputs in the rotor's convention
andrew-platt Aug 21, 2026
bf9098a
Register the free-wake mirrored-rotor pair
andrew-platt Aug 21, 2026
eed021e
Measure the free wake in the sign table
andrew-platt Aug 21, 2026
7c62322
Document the mirrored free wake
andrew-platt Aug 21, 2026
3053a68
Stop the guard check asserting the free-wake restriction
andrew-platt Aug 25, 2026
3f3b964
Render a mirrored VTK pair for visual inspection
andrew-platt Aug 25, 2026
62d9b9f
Mirror the airfoil coordinates in the VTK blade surfaces
andrew-platt Aug 25, 2026
8e06416
Mirror the generic blade shapes in the VTK surface fallback
andrew-platt Aug 25, 2026
052226c
Refuse a multi-rotor OpenFAST instance under FAST.Farm
andrew-platt Aug 25, 2026
dd3cbb8
Refuse MirrorRotor with FAST.Farm until the wake coupling is verified
andrew-platt Aug 25, 2026
1c6af94
Generate the per-channel mirror sign map into the documentation
andrew-platt Aug 25, 2026
e663763
Merge remote-tracking branch 'OpenFAST/dev' into f/reverseRotor
andrew-platt Sep 29, 2026
00a082a
Bump r-test for the deck fixes after the dev merge
andrew-platt Sep 29, 2026
691fd8f
Update 5MW_MRSemi_DLL_WSt_WavesIrr_MirrorRotor baseline
andrew-platt Sep 30, 2026
bfd57d2
Number the blades in the direction of rotation for a mirrored rotor
andrew-platt Sep 30, 2026
9329af4
Retire the blade permutation from the mirror tooling, assert sweep order
andrew-platt Sep 30, 2026
8340b56
Bump r-test for the blade renumbering baselines
andrew-platt Sep 30, 2026
946dcef
Document the blade numbering and remeasure the sign map
andrew-platt Sep 30, 2026
0f024b7
Fold the sign map page into the pull request, add the flag flow chart
andrew-platt Sep 30, 2026
25fc0e4
Document the remaining guard checks and render the flow chart properly
andrew-platt Sep 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified docs/OtherSupporting/OutListParameters.xlsx
Binary file not shown.
40 changes: 40 additions & 0 deletions docs/_static/custom.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/* Set the screen width maximum a bit wider than default. Improves readability on wide screens, but still scales down in width on smaller screen */
.wy-nav-content {
max-width: 1200px !important; /* the default was 800. allowing full width is too much on super wide screens */
}


/* Target the last column of any table and force word-wrapping */
table.docutils td:last-child,
table.citation td:last-child {
white-space: normal !important;
word-break: break-word;
min-width: 300px; /* Adjust this to match your ~100 character preference */
}

/* rather than the above, for a targetted table approach, use the below one by adding the following at the table
.. csv-table:: My Table Name
:class: wrap-last
:headers: "Command", "Description", "Very Long Comment"
:widths: 20, 20, 60
*/
/* Target only tables explicitly marked with the 'wrap-last' class */
table.wrap-last td:last-child {
white-space: normal !important;
word-break: break-word;
min-width: 300px;
}



/* Mermaid diagrams: fill the content column rather than rendering at
natural size (mermaid only scales down, never up). sphinxcontrib-mermaid
2.x emits <pre class="mermaid">, older versions <div class="mermaid">,
so match the class alone. */
.mermaid svg {
width: 70% !important;
max-width: 70% !important;
height: auto !important;
display: block;
margin: 0 auto;
}
23 changes: 23 additions & 0 deletions docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,29 @@ def setup(app):
objname="CMake configuration value",
indextemplate="pair: %s; CMake configuration"
)


def setup(app):
# Register your new custom width override file
app.add_css_file('custom.css')

try:
app.add_css_file('css/math_eq.css')
except:
pass
app.add_object_type(
"confval",
"confval",
objname="input file parameter",
indextemplate="pair: %s; input file parameter"
)
app.add_object_type(
"cmakeval",
"cmakeval",
objname="CMake configuration value",
indextemplate="pair: %s; CMake configuration"
)

# --- Prolog that will be included at the top of every rst file
# Here: defining the role :red: for html and latex
rst_prolog = r"""
Expand Down
2 changes: 1 addition & 1 deletion docs/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ pyparsing>=2.1
Sphinx>=1.8.5
sphinxcontrib-bibtex>=2.0.0
sphinxcontrib-doxylink>=1.3
sphinxcontrib-mermaid>=0.6
sphinxcontrib-mermaid>=2.1
sphinx_rtd_theme>=0.3
requests[security]
urllib3<2.0.0
23 changes: 20 additions & 3 deletions docs/source/user/aerodyn/driver.rst
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,20 @@ Yawing occurs around the :math:`z_n` axis, the rotor rotates about the :math:`x

**Turbine geometry definition**

Each turbine block begins with `BasicHAWTFormat`, selecting between the two
geometry formats described below, followed by `MirrorRotor`. `MirrorRotor` is
read for both formats. Setting it to `True` runs the turbine as its mirror
image, so the rotor turns counter-clockwise viewed from upwind, without changing
any of the geometry, blade or airfoil inputs that describe it. The driver
mirrors the prescribed hub motion and blade pitch to match. In the basic HAWT
format the blade azimuth spacing also carries the rotation sense, so the blades
are numbered in the direction of rotation and blade k of a mirrored rotor is
the mirror image of blade k of a clockwise one. The advanced format takes the
blade azimuths (`BldOrientation_h`) as given, so for a mirrored rotor the user
supplies the mirrored azimuths themselves. See
:numref:`glue-code-mirror-rotor` for what the flag does and what it does not
mirror.

Two turbine input formats are supported:

- basic (`BasicHAWTFormat=True`): Basic horizontal axis wind turbine (HAWT) format.
Expand All @@ -178,7 +192,8 @@ Two turbine input formats are supported:
.. code::

----- Turbine(1) Geometry -------------------------------------------------------
True BasicHAWTFormat(1) - Flag to switch between basic or generic input format {True: next 7 lines are basic inputs, False: Base/Twr/Nac/Hub/Bld geometry and motion must follow}
True BasicHAWTFormat(1) - Flag to switch between basic or generic input format {True: basic HAWT inputs BaseOriginInit to Twr2Shft, False: Base/Twr/Nac/Hub/Bld geometry and motion must follow}
False MirrorRotor(1) - Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind)
0,0,0 BaseOriginInit(1) - Coordinates of turbine base in global coordinates (m)
3 NumBlades(1) - Number of blades (-)
3. HubRad(1) - Hub radius (m)
Expand Down Expand Up @@ -215,7 +230,8 @@ Two turbine input formats are supported:
.. code::

----- Turbine(1) Geometry -------------------------------------------------------
False BasicHAWTFormat(1) - Flag to switch between basic or generic input format {True: next 7 lines are basic inputs, False: Base/Twr/Nac/Hub/Bld geometry and motion must follow}
False BasicHAWTFormat(1) - Flag to switch between basic or generic input format {True: basic HAWT inputs BaseOriginInit to Twr2Shft, False: Base/Twr/Nac/Hub/Bld geometry and motion must follow}
False MirrorRotor(1) - Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind)
0,0,0 BaseOriginInit(1) - x,y,z coordinates of turbine base origin (m)
0,0,0 BaseOrientationInit(1) - successive rotations (theta_x, theta_y, theta_z) defining initial orientation of the base frame from the global frame (e.g. roll, tilt, yaw) (deg)
True HasTower(1) - True if turbine has a tower (flag)
Expand Down Expand Up @@ -492,7 +508,8 @@ An example of an AeroDyn driver for a basic inflow, basic HAWT, and combined cas
----- Turbine Data ----------------------------------------------------------------------
1 NumTurbines - Number of turbines
----- Turbine(1) Geometry ---------------------------------------------------------------
True BasicHAWTFormat(1) - Flag to switch between basic or generic input format {True: next 7 lines are basic inputs, False: Base/Twr/Nac/Hub/Bld geometry and motion must follow}
True BasicHAWTFormat(1) - Flag to switch between basic or generic input format {True: basic HAWT inputs BaseOriginInit to Twr2Shft, False: Base/Twr/Nac/Hub/Bld geometry and motion must follow}
False MirrorRotor(1) - Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind)
0,0,0 BaseOriginInit(1) - Coordinate of tower base in base coordinates (m)
3 NumBlades(1) - Number of blades (-)
3. HubRad(1) - Hub radius (m)
Expand Down
3 changes: 2 additions & 1 deletion docs/source/user/aerodyn/examples/ad_driver_example.dvr
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ False Echo - Echo input parameters to "<rootname>.ech"?
----- Turbine Data ----------------------------------------------------------------------
1 NumTurbines - Number of turbines
----- Turbine(1) Geometry ---------------------------------------------------------------
True BasicHAWTFormat(1) - Flag to switch between basic or generic input format {True: next 7 lines are basic inputs, False: Base/Twr/Nac/Hub/Bld geometry and motion must follow}
True BasicHAWTFormat(1) - Flag to switch between basic or generic input format {True: basic HAWT inputs BaseOriginInit to Twr2Shft, False: Base/Twr/Nac/Hub/Bld geometry and motion must follow}
False MirrorRotor(1) - Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind)
0,0,0 BaseOriginInit(1) - Coordinate of tower base in base coordinates (m)
3 NumBlades(1) - Number of blades (-)
3. HubRad(1) - Hub radius (m)
Expand Down
6 changes: 4 additions & 2 deletions docs/source/user/aerodyn/examples/ad_driver_multiple.dvr
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ False Echo - Echo input parameters to "<rootname>.ech"?
----- Turbine Data ----------------------------------------------------------------------
2 NumTurbines - Number of turbines
----- Turbine(1) ------------------------------------------------------------------------
False BasicHAWTFormat(1) - Flag to switch between basic or generic input format {True: next 7 lines are basic inputs, False: Base/Twr/Nac/Hub/Bld geometry and motion must follow}
False BasicHAWTFormat(1) - Flag to switch between basic or generic input format {True: basic HAWT inputs BaseOriginInit to Twr2Shft, False: Base/Twr/Nac/Hub/Bld geometry and motion must follow}
False MirrorRotor(1) - Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind)
00,00,00 BaseOriginInit(1) - x,y,z coordinates of base origin (m)
0,0,0 BaseOrientationInit(1) - successive rotations (theta_x, theta_y, theta_z) defining initial orientation of the base frame from the global frame (e.g. roll, tilt, yaw) (deg)
True HasTower(1) - True if turbine has a tower (flag)
Expand Down Expand Up @@ -66,7 +67,8 @@ True HAWTprojection(1) - True if turbine is a horizontal axis tu
"unused" BldMotionFileName(1_2) - Filename containing blade pitch motion [used only when BldMotionType=1]
"unused" BldMotionFileName(1_3) - Filename containing blade pitch motion [used only when BldMotionType=1]
----- Turbine(2) Geometry ---------------------------------------------------------------
True BasicHAWTFormat(2) - Flag to switch between basic or generic input format {True: next 7 lines are basic inputs, False: Base/Twr/Nac/Hub/Bld geometry and motion must follow}
True BasicHAWTFormat(2) - Flag to switch between basic or generic input format {True: basic HAWT inputs BaseOriginInit to Twr2Shft, False: Base/Twr/Nac/Hub/Bld geometry and motion must follow}
False MirrorRotor(2) - Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind)
100,0,0 BaseOriginInit(2) - Coordinate of tower base in base coordinates [used only when HasTower is True] (m)
3 NumBlades(2) - Number of blades (-)
3. HubRad(2) - Hub radius (m)
Expand Down
7 changes: 7 additions & 0 deletions docs/source/user/fast.farm/InputFiles.rst
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,13 @@ For each wind turbine:
:numref:`FF:Input:OFInput` for information on the contents of
the OpenFAST input files.

Two OpenFAST features are refused under FAST.Farm at initialization,
with a fatal error, rather than run unverified: an OpenFAST model with
more than one rotor (**NRotors** > 1 — only one rotor per OpenFAST
instance is supported with FAST.Farm), and a mirrored rotor
(**MirrorRotor** = True — the wake coupling has not yet been verified
for a counter-clockwise rotor; see :numref:`glue-code-mirror-rotor`).

- When **Mod_AmbWind** = 2 or 3, the Wind Turbines table has six
additional columns to complete the spatial discretization of the
high-resolution wind domain for each wind turbine:
Expand Down
1 change: 1 addition & 0 deletions docs/source/user/glue-code/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,5 @@ the glue code from a user and module-developer perspective.
modvar
modglue
solver
mirror_rotor
linearization
Loading
Loading