Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dynamic tensions on mooring lines #60

Merged
merged 13 commits into from
Sep 12, 2024
Merged

Dynamic tensions on mooring lines #60

merged 13 commits into from
Sep 12, 2024

Conversation

lucas-carmo
Copy link
Contributor

@lucas-carmo lucas-carmo commented Aug 5, 2024

Purpose

This PR implements dynamic tension on mooring lines based on the amazing work done by @serag-abdulmotaleb. It requires the MoorPy capabilities introduced in NREL/MoorPy#29

RAFT can now use the recently implemented MoorPy's lumped mass approach to account for inertia, hydrodynamic added mass, and hydrodynamic damping (from linearized quadratic drag) due to the moorings acting on the floater. This approach provides a much better prediction of dynamic mooring line tension than the quasi-static stiffness-only approach. Still need to check how the lumped mass approach affects resonant motions of the floater induced by second-order waves and/or turbulent wind.

The lumped mass approach requires a MoorDyn input file including the added mass, drag, and mass coefficients of the line. The user can choose the mooring model with the key moorMod within mooring (for a FOWT-level mooring system) or within array_mooring (for an array-level mooring system). The available options are:

  • moorMod=0: quasi-static stiffness-only model (i.e., the only mooring model that was available in RAFT before)
  • moorMod=1: the lumped mass approach
  • moorMod=2: hybrid model where the stiffness matrix is computed using the quasi-static approach while the other matrices (inertia, added mass, and damping) are computed using the lumped mass model. I added an example in the examples folder that corresponds to one of the results shown below.

image

image

If the user does not specify a value of moorMod, it is assumed to be zero and everything should work as before. Hence, this new functionality should NOT affect existing code. Please let me know if you find any problem.

Note: moorMod=1 doesn't seem to be working well with shared moorings. There's something weird going on when we lump the dynamic matrices (stiffness, damping, etc) to the body. The dynamic tension calculation seems to be ok.

Type of change

  • Bugfix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (non-backwards-compatible fix or feature)
  • Code style update (formatting, renaming)
  • Refactoring (no functional changes, no API changes)
  • Documentation update
  • Maintenance update
  • Other (please describe)

Testing

Some examples of this new functionality are given below

  • Comparison of RAFT results of the UMaine VolturnUS-S semisubmersible (under both waves and wind) against OpenFAST. 'qs' stands for quasi-static (moorMod=0) and 'dyn' stands for dynamic (lumped mass approach implemented in this PR, moorMod=1). The 'dyn' results correspond to the case included in the examples folder.
    image

  • Comparison of RAFT results against OpenFAST of the UMaine VolturnUS-S semisubmersible (under both waves and wind) with a taut mooring system using multi-segment lines
    image

  • Fairlead and anchor tensions of a two-unit array with shared moorings (also UMaine VolturnUS-S semisubmersible under both waves and wind). No comparison against FAST.Farm yet.
    image

Checklist

  • I have run existing tests which pass locally with my changes
  • I have added new tests or examples that prove my fix is effective or that my feature works
  • I have added necessary documentation

Tests are not passing on GitHub actions because this PR requires MoorPy capabilities that weren't merged yet (NREL/MoorPy#29). All tests pass locally. Tests are passing after the new MoorPy release.

This is based on an algebraic approximation by Aranha and Pinto, "Dynamic tension in risers and mooring lines: an algebraic approximation for harmonic excitation".

This version is still for comparisons with MoorDyn, so there is a part of the code that is used to read a MD output file and use the motions from there. This will be removed after the validation is done.
This commit incorporates the dynamic mooring developments from MoorPy into RAFT. The solution of body dynamics in model.solveDynamics can now account not only for the stiffness induced by the moorings but also for the inertia, added mass, and damping. Currently, it works only with the code in MoorPy's "dynamics branch" (commit #4bddb152cbaf607ca24f0303f93ed10b6ce197de).

Still WIP. Need to verify and debug.
- The values of the tension computed with the lumped mass approach (which includes dynamic amplification) at the extremities of the line are now saved to  the results dictionary
- Changed the values of moorMod. Now
moorMod = 0 is quasi static (before it was 1)
moorMod = 1 is dynamic
moorMod = 2 is dynamic but with the stiffness matrix from the quasi-static approach
- Damping due to moorings, which is obtained from linearizing the quadratic drag along the lines, is now evaluated iteratively depending on FOWT motion (only for mooring systems within each fowt, not array level)
- The lumped mass approach can now be used for array level mooring systems, including shared moorings
- New helper function "getLineEndsRAO" to avoid code repetition
Due to the lumped mass approach, we now convert all lines to subsystem before computing the dynamic tensions in mooring lines. That required changing the true values of VolturnUS-S_farm because this example includes multisegment lines
@lucas-carmo lucas-carmo requested a review from mattEhall August 5, 2024 17:04
Due to the lumped mass capability (which is not currently tested), we now convert mooring lines to subsystem before computing tensions. That changes the size of  the arrays stored in model.results['case_metrics'][iCase]['array_mooring'][metric] used in test_analyzeCases(), as the 7 lines of the test case become 5 due to aggregating composite lines into a single subsystem.
@lucas-carmo lucas-carmo merged commit 6405cd9 into dev Sep 12, 2024
14 checks passed
@lucas-carmo lucas-carmo deleted the moorDynTen branch September 12, 2024 20:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant