Skip to content

Conversation

@luwang00
Copy link
Contributor

@luwang00 luwang00 commented Oct 20, 2025

Feature or improvement description
This PR introduces additional blade pitch DoFs in ElastoDyn and a simple spring-damper pitch actuator model in ServoDyn.

  • When the new PitchDOF in ElastoDyn is set to false, OpenFAST functions in the same way as before. The instantaneous blade pitch angles are set to BlPitchCom from ServoDyn.
  • When PitchDOF in ElastoDyn is set to true, ElastoDyn will simulate blade pitch dynamics based on the user provided pitch bearing and blade pitch inertias. In this case, the blade pitch motion is driven by the actuator torque BlPitchMom from ServoDyn.

New Inputs for ElastoDyn
Line 11:

          False         PitchDOF    - Blade pitch DOF (flag)

Lines 77-82:

          0   PBrIner(1)  - Pitch bearing inertia, blade 1 (kg m^2)
          0   PBrIner(2)  - Pitch bearing inertia, blade 2 (kg m^2)
          0   PBrIner(3)  - Pitch bearing inertia, blade 3 (kg m^2) [unused for 2 blades]
          0   BlPIner(1)  - Blade pitch inertia, blade 1 (kg m^2)
          0   BlPIner(2)  - Blade pitch inertia, blade 2 (kg m^2)
          0   BlPIner(3)  - Blade pitch inertia, blade 3 (kg m^2) [unused for 2 blades]

When ElastoDyn is used to model the blades, the total inertia of blade pitching is the sum of PBrIner and BlPIner augmented by additional contributions due to blade deflection.

When BeamDyn is used, BlPIner is ignored and replaced by the BeamDyn blade models. In this case, it is still necessary to provide nonzero values for PBrIner to allow ElastoDyn to solve the blade pitch DOF.

New Inputs for ServoDyn
Lines 9-17:

          0   PitNeut(1)   - Blade 1 neutral pitch position--pitch spring moment is zero at this pitch (degrees)
          0   PitNeut(2)   - Blade 2 neutral pitch position--pitch spring moment is zero at this pitch (degrees)
          0   PitNeut(3)   - Blade 3 neutral pitch position--pitch spring moment is zero at this pitch (degrees)
      7.0e8   PitSpr(1)    - Blade 1 pitch spring constant (N-m/rad)
      7.0e8   PitSpr(2)    - Blade 2 pitch spring constant (N-m/rad)
      7.0e8   PitSpr(3)    - Blade 3 pitch spring constant (N-m/rad)
      2.3e5   PitDamp(1)   - Blade 1 pitch damping constant (N-m/(rad/s))
      2.3e5   PitDamp(2)   - Blade 2 pitch damping constant (N-m/(rad/s))
      2.3e5   PitDamp(3)   - Blade 3 pitch damping constant (N-m/(rad/s))

The pitch neutral positions given by PitNeut are only used when PCMode=0 or during t<TPCOn when PCMode>0. In this case, the ServoDyn blade pitch command BlPitchCom for each blade is fixed at the corresponding PitNeut position. If any of the active pitch control options is enabled, the PitNeut inputs are ignored.

In addition to pitch position commands, pitch rate commands BlPRateCom are also added to ServoDyn. Currently, BlPRateCom is only available with DLL controllers (PCMode=5). During normal operation, the pitch rate commands are estimated using finite differencing based on the pitch set points from two consecutive controller steps. During pitch maneuver, the pitch rate commands are simply set to PitManRat provided in the ServoDyn input file.

The pitch rate commands are also low-pass filtered in parallel with the pitch set points using the same filter and cutoff frequency set in the ServoDyn input file. The pitch rate commands are set to zero when PCMode is 0, 3, or 4, but can be enabled for 3 and 4 in the future if supplied by the user-defined routine or Simulink/Labview controller.

A simple spring-damper actuator model is added in ServoDyn to compute the pitch actuator torque as:

 BlPitchMom = - p%PitSpr  * ( u%BlPitch - BlPitchCom )  &
              - p%PitDamp * ( u%BlPRate - BlPRateCom )

New Outputs from ElastoDyn

BldPRate1 - blade 1 pitch rate (deg/s)
BldPRate2 - blade 2 pitch rate (deg/s)
BldPRate3 - blade 3 pitch rate (deg/s)
BldPAcc1 - blade 1 pitch acceleration (deg/s^2)
BldPAcc2 - blade 2 pitch acceleration (deg/s^2)
BldPAcc3 - blade 3 pitch acceleration (deg/s^2)

These output channels are valid only if PitchDOF=True with positive values toward the feathered position.

New Outputs from ServoDyn

BlPRateC1 - blade 1 pitch rate command (deg/s)
BlPRateC2 - blade 2 pitch rate command (deg/s)
BlPRateC3 - blade 3 pitch rate command (deg/s)
BlPitchM1 - blade 1 pitch actuator moment applied on the blade (kN-m)
BlPitchM2 - blade 2 pitch actuator moment applied on the blade (kN-m)
BlPitchM3 - blade 3 pitch actuator moment applied on the blade (kN-m)

These output channels are always available; however, the pitch actuator moments are ignored by ElastoDyn if PitchDOF=False. Positive values indicate pitch rate/moment toward the feathered position.

Impacted areas of the software
ElastoDyn, ServoDyn, glue-codes, r-test, docs (updated ED and SrvD docs with new inputs and outputs; also updated api_change.rst)

Updates to the controllers for the NREL 5-MW

The controllers in r-test for the NREL 5-MW need to be slightly updated to work with the blade pitch and actuator modeling introduced through this PR.

In the past, blade pitch rate saturation was based on the actual pitch positions at each step. This can lead to erratic pitch controller behavior when the actual pitch angles deviate from the pitch command, especially with small DLL_DT in ServoDyn. To address this problem, the controllers have been updated to enforce pitch rate saturation based on the pitch command only. See luwang00/r-test@a28872f.

Note that this change to the controllers has no impact on existing models and previous r-tests without blade pitch and actuator dynamics. This is because the pitch commands and the actual pitch angles were always the same.

This issue with the controllers was identified by @dzalkind.

ServoDyn setting recommendations

In addition to the new inputs for the blade pitch actuator, the ServoDyn inputs DLL_Ramp and BPCutoff also affect the controller and blade pitch behavior.

  • Set BPCutoff to an appropriate value to avoid discontinuities in the pitch-rate command. This can help reduce large fluctuations in the actuator torque.
  • For consistency with the pitch-rate command estimated using finite differencing, set DLL_Ramp to True. This can reduce small jitter in the actuator moment when DLL_DT is larger than the simulation time step.

See example results below for some reference settings.

Example results based on land-based NREL 5-MW model

Step response

No aerodynamic loading and controls (PCMode=0). Zero rotor speed. All DOF false in ElastoDyn except for PitchDOF. The blades starts from an initial position of 0-deg pitch and move toward PitNeut of 10 deg.

PitSpr and PitDamp are set to achieve a natural period of 0.1 s and different damping ratios from 0.10 to 1.00 based on the pitch inertia of an undeflected blade of 28,578 kg-m^2 with a pitch bearing inertia of 200 kg-m^2.

The blade pitch time series are shown below.

image

Note that this example is for verification only. The pitch rate is NOT realistic.

ROSCO controller

Baseline ROSCO controller with turbulent wind, same as 5MW_Land_DLL_WTurb. All DOF are false in ElastoDyn except for blade-bending DOF, PitchDOF, and GenDOF.

PitSpr and PitDamp are set to achieve target damped periods while fixing the damping ratio to 0.70 based on the inertia of an undeflected blade and no aerodynamic loading. Note that in the presence of aerodynamic loading and blade deflection, blade inertia about the pitch axis can increase significantly, effectively increasing the system period.

For reference, the ServoDyn settings for the example results below are provided here.

Damped period [s] Damping ratio [-] PitSpr [Nm/rad] PitDamp [Nm/(rad/s)] DLL_Ramp BPCutoff [Hz]
0.10 0.7 2.2277E8 3.5447E6 True 2
0.25 0.7 3.5643E7 1.4179E6 True 2
0.50 0.7 8.9107E6 7.0895E5 True 2
1.00 0.7 2.2277E6 3.5447E5 True 2

The blade pitch time series are shown below. When the damped period is greater than or equal to 0.50 s, the actuator stiffness is too low to reasonably maintain the blade pitch angle in the presence of aerodynamic loading even when the controller pitch command is constant. When the damped period is less than or equal to 0.25 s, the blade pitch responses appear consistent with that obtained with PitchDOF=False. Of course, some differences are still present due to the addition of blade pitch and actuator dynamics.

image

The actuator torque time series are shown below. Except for the case with a damped period of 1.00 s, the torque time series are generally consistent with different actuator stiffnesses. The prevailing 5-s period observed in the torque time series corresponds to the 1P frequency of approximately 12 RPM.

image

Blade pitch rate:

image

Test results, if applicable
All existing r-tests are updated with PitchDOF set to false, so there are no changes to the r-test results. However, the linearization outputs need to be updated because ElastoDyn now has additional states, leading to different state-space matrix dimensions. The eigenfrequencies and damping ratios remain mostly unchanged. Also, the controllers for the NREL 5-MW have been slightly updated as discussed above.

Future work
In a separate pull request, the incomplete pitch actuator implementation in BeamDyn will be removed. It is superseded by the features added through this PR.

@andrew-platt andrew-platt self-assigned this Oct 20, 2025
@andrew-platt andrew-platt requested a review from jjonkman October 20, 2025 19:39
@andrew-platt andrew-platt added this to the v5.0.0 milestone Oct 20, 2025
 * Currently, the pitch rate commands are only used when computing the pitch moments.
 * The pitch rate commands are estimated using finite differencing based on the pitch set points from two consecutive controller steps.
 * The pitch rate commands are low-pass filtered in parallel with the pitch commands using the same filter and cutoff frequency set in the ServoDyn input file.
 * During pitch maneuver, the pitch rate commands are simply set to PitManRat provided in the ServoDyn input file.
 * The pitch rate commands are set to zero when PCMode=0, 3, or 4, but can be enabled for 3 and 4 in the future if the user-defined routine or Simulink/Labview controller can provide pitch rate commands.
@jjonkman
Copy link
Collaborator

You state above that PitNeut is only used with PCMode = 0. I would reword this to say that when PCMode > 0, PitNeut is only used up until simulation time = TPCOn.

@luwang00 luwang00 marked this pull request as ready for review November 2, 2025 18:04
@andrew-platt andrew-platt removed the Module: SED Simplified-ElastoDyn label Nov 19, 2025
@andrew-platt
Copy link
Collaborator

andrew-platt commented Nov 19, 2025

remaining issue:

…ad mesh to the new BladeRootLoads mesh

In the past, all blade root loads from BeamDyn are mapped/summed at the same hub point in ElastoDyn. Now, the root loads of each blade should be mapped to separate root nodes in ED. This is necessary for the new blade pitch DoF in ED.
@deslaughter
Copy link
Collaborator

@luwang00 I think the issue with BeamDyn is resolved. Can you update the r-test pointer?

@andrew-platt
Copy link
Collaborator

  • Check the new mode that appears in BD linearization after changing mapping. @deslaughter ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants