Skip to content

Hydroelastic super-element capability for OpenFAST#3210

Merged
deslaughter merged 46 commits intoOpenFAST:devfrom
luwang00:f/superelement
Mar 12, 2026
Merged

Hydroelastic super-element capability for OpenFAST#3210
deslaughter merged 46 commits intoOpenFAST:devfrom
luwang00:f/superelement

Conversation

@luwang00
Copy link
Contributor

@luwang00 luwang00 commented Feb 18, 2026

This PR is not ready to be merged.

Feature or improvement description

This PR adds hydroelastic super-element capabilities to OpenFAST.

  • HydroDyn has been upgraded to support potential-flow bodies with additional generalized DOF beyond the 6 rigid-body modes. Currently, the generalized DOF is limited to NBody=1 and can only be used with the revamped ExtPtfm module. However, internally, HydroDyn supports generalized DOF for multiple bodies and any of the NBodyMod options.

  • The ExtPtfm module has been extensively revamped. Support for large rigid-body motion similar to SubDyn was implemented. The ability to specify connection points on the structure allowing coupling to mooring was also added. In addition to prescribed modal forcing, users can also prescribe force time series to be applied at these connection points (currently, only force is allowed, not moment). To support these new capabilities, the input files for ExtPtfm have been redesigned.

  • At the glue-code level, coupling between ExtPtfm and HydroDyn and between ExtPtfm and the mooring modules have been added. ExtPtfm is now moved to tight coupling, and the ability to perform linearization with ExtPtfm is also enabled.

Impacted areas of the software
Glue-code, HydroDyn, ExtPtfm

Test results, if applicable
No change to existing test results, except for the only case involving ExtPtfm, 5MW_OC4Jckt_ExtPtfm. The new results are noticeably different but are still generally in agreement with the old results. The changes in the results might be caused by updating ExtPtfm to use tight coupling. Another change to ExtPtfm is to compute the Jacobians based on central differencing instead of analytically. This might also influence the results. Also, the input files to HydroDyn and ExtPtfm need to be updated with the new inputs.

  • r-test branch merging required

To-dos

  • Add check to ensure the number of generalized DOF in HydroDyn matches the number of elastic modes in ExtPtfm.
  • Update documentation.

luwang00 and others added 26 commits January 13, 2026 16:01
…-weight for rigid-body modes. Also added some input validity check when RBMod>0.
@luwang00 luwang00 changed the title Super-element capability for OpenFAST Hydroelastic super-element capability for OpenFAST Feb 18, 2026
@luwang00 luwang00 added this to the v5.1.0 milestone Feb 18, 2026
@luwang00 luwang00 added the Type: IO Readers/Writers Input file readers and writers label Feb 24, 2026
@luwang00 luwang00 modified the milestones: v5.1.0, v5.0.0 Mar 4, 2026
@andrew-platt andrew-platt marked this pull request as ready for review March 10, 2026 15:28

! get the bounding indices from the WaveField info (same indexing used in WAMIT)
call GridInterpSetup4D( (/Real(Time,ReKi),pos(1),pos(2),pos(3)/), WF_p, WF_m, ErrStat3, ErrMsg3 )
WAMIT_ForceWaves_Interp_4D_vecN = GridInterp4DVecN( N, pKinXX, WF_m )
Copy link
Collaborator

Choose a reason for hiding this comment

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

It just occurred to me that the WF_m will prevent these calls from being parallelized, which could significantly speed up HydroDyn's calculations. It might be worth figuring out how to break out the relevant parts into their own structure that could be returned by GridInterpSetup* and then passed into the various GridInterp routines. Just a thought, nothing that needs to be done here.

Comment on lines 114 to +117
p%iModTC = [pack(modInds, ModIDs == Module_ED .and. p%ModCoupling /= LooseCoupling), &
pack(modInds, ModIDs == Module_BD .and. p%ModCoupling /= LooseCoupling), &
pack(modInds, ModIDs == Module_SD .and. p%ModCoupling /= LooseCoupling)]
pack(modInds, ModIDs == Module_SD .and. p%ModCoupling /= LooseCoupling), &
pack(modInds, ModIDs == Module_ExtPtfm .and. p%ModCoupling /= LooseCoupling)]
Copy link
Collaborator

Choose a reason for hiding this comment

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

There should probably just be an if statement around this that does allocate(p%iModTC(0) if p%ModCoupling == LooseCoupling so that we don't have to check each module. For loose coupling, that array should be empty.

@andrew-platt
Copy link
Collaborator

@deslaughter deslaughter merged commit b110881 into OpenFAST:dev Mar 12, 2026
25 of 26 checks passed
@deslaughter deslaughter deleted the f/superelement branch March 12, 2026 20:05
@andrew-platt andrew-platt mentioned this pull request Mar 12, 2026
36 tasks
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.

3 participants