Skip to content

Mesh-based nonlinear Froude-Krylov and hydrostatic load calculation in HydroDyn#3336

Open
luwang00 wants to merge 16 commits into
OpenFAST:devfrom
luwang00:f/NLFKHst
Open

Mesh-based nonlinear Froude-Krylov and hydrostatic load calculation in HydroDyn#3336
luwang00 wants to merge 16 commits into
OpenFAST:devfrom
luwang00:f/NLFKHst

Conversation

@luwang00
Copy link
Copy Markdown
Contributor

@luwang00 luwang00 commented May 16, 2026

This PR is ready to be merged.

Feature or improvement description
This PR adds mesh-based nonlinear Froude-Krylov and hydrostatic load calculation in HydroDyn for the potential-flow bodies. This is still a work in progress with only basic functionality implemented. More information to come.

Initially, the implementation will only support ASCII STL files. The algorithm only supports triangular patches. Clipping of the triangular patches at the instantaneous waterline is included for fast convergence on coarse mesh.

For potential-flow bodies with nonlinear FK and hydrostatics enabled. HydroDyn requires the *.3sc file from WAMIT, which only contains the linear scattering loads to avoid double-counting the Froude-Krylov part. It also automatically zeros out the hydrostatic loads from PtfmVol0 and the hydrostatic stiffness matrix. Any second-order potential-flow loads are also zeroed out. Note that for NBodyMod=1 (coupled potential-flow bodies), nonlinear Froude-Krylov and hydrostatics must be enabled or disabled for all bodies together. For decoupled bodies (NBodyMod=2 or NBodyMod=3), nonlinear FK and hydrostatics can be selectively enabled for some bodies. The new features are currently incompatible with generalized degrees of freedom with NAddDOF>0.

HydroDyn Inputs

This PR introduces two new input lines at the very end of the FLOATING PLATFORM section of the HydroDyn input file.

                1   FKMod   - Nonlinear Froude-Krylov and hydrostatic load model {0: none, 1: nonlinear F-K and hydrostatics} (switch) [1 to NBody if NBodyMod>1; only used when PotMod=1; must provide GeoFile if FKMod=1]
  "ASCII_STL.stl"   GeoFile - Full name(s) of geometry file (ASCII STL format) for nonlinear Froude-Krylov and hydrostatic load integration (quoted strings) [1 to NBody; only used when PotMod=1 and when the corresponding FKMod=1]

Output Channels

Added new output channels B1NFKFxi, B1NFKFyi, B1NFKFzi, B1NFKMxi, B1NFKMyi, B1NFKMzi, ..., B9NFKMzi. These outputs provide the combined nonlinear Froude-Krylov and hydrostatic forces and moments on the first 9 potential-flow bodies. The forces and moments are in the earth-fixed xi, yi, and zi directions and the moments are about the instantaneous body reference point, same as other similar output channels. For performance reasons, HydroDyn does not compute separate nonlinear Froude-Krylov excitation and hydrostatic forces and moments; only the combined loading is available.

Note that if nonlinear Froude-Krylov and hydrostatic calculation is enabled (FKMod=1), the regular wave excitation output channels, e.g., B1WvsFxi and B1WvsF1xi, will only give the linear scattering part of the wave excitation computed from the .3sc file. The linearized hydrostatic loads, e.g., B1HdsFzi, will also be zeroed. The sum of B1WvsFxi and B1NFKFxi, for example, gives the total (Froude-Krylov and scattering) wave excitation and hydrostatic loads on B1.

Example results

The total hydrodynamic and hydrostatic loads on a shallow-draft (5 m) body with a small freeboard (2.5 m) are computed using the new mesh-based nonlinear Froude-Krylov and hydrostatic load implementation. The side wall of the body is also heavily tapered with a corner at the still water level.

The loads reported include the mesh-based Froude-Krylov and hydrostatic loads and the scattering part of the linear wave excitation from frequency-to-time-domain transformation. The body is fixed. The irregular incident waves have a significant wave height of 5 m and a peak period of 12 s, leading to strongly nonlinear loading.

image

To check convergence, three different meshes are used, ranging from 92 triangular faces to 2,010 faces.

Coarse mesh (92 faces)
image
Medium mesh (506 faces)
image
Fine mesh (2,010 faces)
image

Good convergence is observed across the different mesh resolutions, with only occasional small differences between the coarsest mesh with only 92 faces and the medium mesh with 506 faces. Furthermore, the loads from both the medium and the fine mesh are smooth, indicating the waterline face clipping is functioning correctly.

Surge force
image

Heave force
image

Pitch moment
image

Pitch moment (zoomed in)
image

Still requires

  • New output channels
  • HydroDyn summary file update
  • Update openfast_io
  • Documentation update (HD user docs and api_change.rst)
  • r-test input file update
  • Optional/future work: HD Jacobian performance optimization
  • Add a new r-test

Impacted areas of the software
HydroDyn, openfast_io, docs, r-test

Generative AI usage
Co-authored-by: Google Gemini gemini@google.com

Test results, if applicable
Requires input file changes, but should not affect existing r-test results if the new features are not used. All existing r-test passed. Also added a new HydroDyn module r-test for the mesh-based load calculation.

  • r-test branch merging required

@luwang00 luwang00 added this to the v5.1.0 milestone May 19, 2026
luwang00 added 7 commits May 20, 2026 09:06
…Krylov and hydrostatic load model

Also fixed a potential bug when NBodyMod=1 and NBody>1. In this case, PotFile and WAMITULEN only have one entry each for all bodies instead of NBody entries. Updated r-test pointer.
@luwang00 luwang00 marked this pull request as ready for review May 21, 2026 19:39
@luwang00 luwang00 requested review from andrew-platt and jjonkman May 22, 2026 22:37
Copy link
Copy Markdown
Collaborator

@jjonkman jjonkman left a comment

Choose a reason for hiding this comment

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

This is a great addition to HydroDyn; thanks, Lu! See a few comments on the documentation below.

Comment thread docs/source/user/hydrodyn/input_files.rst Outdated
Comment thread docs/source/user/hydrodyn/input_files.rst
Comment thread docs/source/user/hydrodyn/input_files.rst Outdated
Comment thread docs/source/user/hydrodyn/input_files.rst Outdated
Comment thread docs/source/user/hydrodyn/input_files.rst
Comment thread docs/source/user/hydrodyn/input_files.rst
…ns on the nonlinear Froude-Krylov and hydrostatic load model
Copy link
Copy Markdown
Collaborator

@jjonkman jjonkman left a comment

Choose a reason for hiding this comment

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

Thanks for addressing my review comments!

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR introduces a new mesh-based nonlinear Froude–Krylov + hydrostatic pressure-integration capability for potential-flow bodies in HydroDyn, including new HydroDyn inputs (FKMod, GeoFile), updated WAMIT file handling (.3sc vs .3), new output channels, documentation updates, and a new regression test.

Changes:

  • Add a new NonlinearFK module (STL geometry ingestion + waterline clipping + pressure integration) and wire it into HydroDyn/WAMIT initialization and output mapping.
  • Extend HydroDyn input parsing + openfast_io reader/writer to support FKMod and GeoFile, and adjust WAMIT excitation file selection (.3 vs .3sc) accordingly.
  • Update docs and reg-tests to cover the new model and outputs.

Reviewed changes

Copilot reviewed 21 out of 23 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
reg_tests/CTestList.cmake Adds a new HydroDyn regression test entry for nonlinear FK/hydrostatics.
openfast_io/openfast_io/FAST_writer.py Writes new FKMod/GeoFile inputs and updates PotFile description for .3sc.
openfast_io/openfast_io/FAST_reader.py Reads FKMod/GeoFile and adjusts PotFile/WAMITULEN parsing for NBodyMod==1.
modules/hydrodyn/src/WAMIT2.txt Adds NonlinearFK registry dependency and FKMod parameter plumbing.
modules/hydrodyn/src/WAMIT2_Types.f90 Adds FKMod to WAMIT2 parameter type + copy/pack/unpack support.
modules/hydrodyn/src/WAMIT.txt Adds NonlinearFK registry dependency and FKMod into WAMIT types.
modules/hydrodyn/src/WAMIT.f90 Selects .3 vs .3sc based on FKMod and disables .hst usage when nonlinear FK is enabled.
modules/hydrodyn/src/WAMIT_Types.f90 Adds FKMod to WAMIT init/params + copy/pack/unpack support.
modules/hydrodyn/src/NonlinearFK.txt New registry describing geometry/body types and init/misc data.
modules/hydrodyn/src/NonlinearFK.f90 New implementation for STL parsing, clipping, and pressure integration.
modules/hydrodyn/src/NonlinearFK_Types.f90 Generated types for the new NonlinearFK module.
modules/hydrodyn/src/HydroDyn.txt Wires NonlinearFK types into HydroDyn registry/types.
modules/hydrodyn/src/HydroDyn.f90 Initializes and calls NonlinearFK, skips WAMIT2 for FK bodies, and maps new outputs.
modules/hydrodyn/src/HydroDyn_Types.f90 Adds FKMod/GeoFile and NonlinearFK init/param/misc fields to HydroDyn types.
modules/hydrodyn/src/HydroDyn_Input.f90 Parses/validates FKMod/GeoFile and enforces incompatibilities (e.g., NAddDOF>0).
modules/hydrodyn/CMakeLists.txt Adds NonlinearFK sources and type generation.
docs/source/user/hydrodyn/output_files.rst Documents summary-file behavior for mesh-based buoyancy/volume reporting.
docs/source/user/hydrodyn/input_files.rst Documents FKMod/GeoFile, .3sc requirements, and behavior changes.
docs/source/user/hydrodyn/appendix.rst Updates example inputs and output-channel appendix entries.
docs/source/user/api_change.rst Records new HydroDyn inputs in the API change log.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread modules/hydrodyn/src/NonlinearFK.txt Outdated
Comment on lines 34 to 38
USE HydroDyn_Input
USE HydroDyn_Output
USE YawOffset
USE NonlinearFK

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Unclear if this is necessary as the code compiled without issue.

Comment on lines +303 to +311
call AllocAry( p%FKMod , p%NBody, 'p%FKMod' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName)
p%FKMod = InitInp%FKMod
if (all(p%FKMod==FKMod_full)) then
dot3ext = '.3sc'
else if (all(p%FKMod==FKMod_none)) then
dot3ext = '.3'
else
ErrStat = ErrID_Fatal
ErrMsg = RoutineName//": When simulating multiple potential-flow bodies with NBodyMod=1, all bodies must have the same FKMod. "
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Unclear if this is necessary as the code compiled without issue.

Comment on lines +1569 to +1577
IF ( InputFileData%PotMod == 1 ) THEN
do i = 1,InputFileData%NBody
IF ( InputFileData%FKMod(i) /= FKMod_none .and. InputFileData%FKMod(i) /= FKMod_full )THEN
CALL SetErrStat( ErrID_Fatal,'FKMod must be '//trim(num2lstr(FKMod_none))//' or '//trim(num2lstr(FKMod_full))//' for all WAMIT bodies.',ErrStat,ErrMsg,RoutineName)
RETURN
END IF
IF ( InputFileData%FKMod(i) == FKMod_full .and. InputFileData%Wamit%ExctnMod == 2 ) THEN
CALL SetErrStat( ErrID_Fatal,'FKMod = '//trim(num2lstr(FKMod_full))//' is incompatible with state-space wave excitation model (ExctnMod=2). Need ExctnMod = 0 or 1.',ErrStat,ErrMsg,RoutineName)
RETURN
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Unclear if this is necessary as the code compiled without issue.

Comment thread modules/hydrodyn/src/HydroDyn.f90
Comment thread docs/source/user/hydrodyn/input_files.rst
Comment thread openfast_io/openfast_io/FAST_reader.py
Comment thread modules/hydrodyn/src/NonlinearFK.txt Outdated
@andrew-platt
Copy link
Copy Markdown
Collaborator

To do before merge:

  • update Visual Studio project for new files
  • Update RunRegistry.bat for new registry file

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