Skip to content

Implementation of the Syrope model for polyester ropes in MoorDyn#369

Open
zhilongwei wants to merge 16 commits intoFloatingArrayDesign:devfrom
zhilongwei:features/syrope-for-polyester
Open

Implementation of the Syrope model for polyester ropes in MoorDyn#369
zhilongwei wants to merge 16 commits intoFloatingArrayDesign:devfrom
zhilongwei:features/syrope-for-polyester

Conversation

@zhilongwei
Copy link
Copy Markdown

Feature or improvement description

This pull request implements the Syrope model for polyester mooring ropes in MoorDyn-C.

The implementation captures:

  • nonlinear, path-dependent, and loading-rate-depedent tension–strain behaviour of polyester ropes,
  • dependence of dynamic stiffness on mean tension (Wave-frequecy and low-frequency regimes),
  • working-curve-based quasi-static response.

Impacted areas of the software

  • Mooring line constitutive model (new rope type: Syrope-based polyester rope)
  • Time-domain solver (integration of visco-elasto-plastic response)
  • Input file handling (additional parameters for Syrope model)
  • Documentation

Additional supporting information

Generative AI usage

Test results

  • All existing and new tests pass.

Notes for reviewers

  • A new elastic_model type, ELASTIC_SYROPE = 4, has been added alongside the existing three models. It is triggered exclusively when the Syrope model is specified through the EA field in the input file.
  • No modifications have been made to existing line types.
  • Full backward compatibility is maintained.

tests/syrope.cpp Outdated
{
const auto sim = run_case(c, superimpose_fast);
const Eigen::Index n =
std::min(sim.tension_output.size(), sim.strain.size());
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

IDEM

------------------------- LINE TYPES --------------------------------------------------
LineType Diam MassDenInAir EA BA/-zeta EI Can Cat Cdn Cdt
(-) (m) (kg/m) (-) (Pa-s/-) (n-m^2) (-) (-) (-) (-)
poly 0.203 40 SYROPE:../owc.dat|1.53e8|23.12 5.0e10|1.0e5 0.0 0.0 0.0 0.0 0.0
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Not really a big fan on how syrope config is set, specially those new full sections. I will let anyway @RyanDavies19 @mattEhall and @shousner to decide

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Thanks for the feedback. The additional sections were introduced to keep all Syrope model parameters within the existing input file, avoiding the need for a separate configuration file. This may not be the most consistent approach with the current input structure. An alternative would be to move the Syrope-related parameters into a separate file if that better aligns with the overall design.

Copy link
Copy Markdown
Collaborator

@RyanDavies19 RyanDavies19 Mar 25, 2026

Choose a reason for hiding this comment

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

@zhilongwei, I think it would be better if all the Syrope inputs were a separate input file, which would be consistent with the approach used for a non-linear lookup table.

Then the main moordyn input file would read:

------------------------- LINE TYPES --------------------------------------------------
LineType  Diam   MassDenInAir        EA                   BA/-zeta      EI     Can   Cat  Cdn   Cdt
(-)       (m)     (kg/m)             (-)                  (Pa-s/-)    (n-m^2)  (-)   (-)  (-)   (-)
poly      0.203     40    SYROPE:input.dat|1.53e8|23.12  5.0e10|1.0e5  0.0    0.0   0.0   0.0  0.0

And then input.dat would read:

../owc.dat    nonlinear stiffness lookup table path
-------------------------- SYROPE WORKING CURVES ------------------------------------------------- 
LineType   WCType    k1      k2
(-)        (-)       (-)     (-)
poly      QUADRATIC  0.25     1.0
-------------------------- SYROPE IC ------------------------------------------------- 
Line     Tmax     Tmean 
(-)      (N)       (N)
1        1.3886e6   4.339e5

Note input.dat is just a placeholder, you could call the file whatever you wanted to.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

I am now thinking that the initial Tmax and Tmean should not be treated as line-type properties since they are line-specific. For example, different lines that share the same Syrope properties (e.g., original working curve, working curves, etc.) may still have different initial values of Tmax and Tmean. It may therefore be more appropriate to separate these parameters from the Syrope input file (input.dat). One idea is to add two additional fields in the Lines section (after LineOutputs). These fields would only be required and read when the corresponding line uses a Syrope-based line type.

An example is shown below.

------------------------- LINE TYPES --------------------------------------------------
LineType  Diam   MassDenInAir        EA                   BA/-zeta      EI     Can   Cat  Cdn   Cdt
(-)       (m)     (kg/m)             (-)                  (Pa-s/-)    (n-m^2)  (-)   (-)  (-)   (-)
poly      0.203     40    SYROPE:input.dat|1.53e8|23.12  5.0e10|1.0e5  0.0    0.0   0.0   0.0  0.0

The input.dat reads

-------------------------- SYROPE ORIGINAL WORKING CURVE -----------------------------------------
../owc.dat    nonlinear stiffness lookup table path
-------------------------- SYROPE WORKING CURVES ------------------------------------------------- 
LineType   WCType    k1      k2
(-)        (-)       (-)     (-)
poly      QUADRATIC  0.25     1.0
--------------------------- need this line -------------------------------------------------

And the Line section reads

-------------------------- LINES -------------------------------------------------
Line     LineType NodeA     NodeB  UnstrLen   NumSegs     Flags/Outputs   Tmax   Tmean
(-)      (-)       (-)       (-)    (m)         (-)          (-)          (N)     (N)
1        poly       2         1   1.0          1             tsc        1.5e6   8.0e5
2        poly       4         3   1.0          1             tsc        2.0e6   5.0e5
3        chain      6         5   1.0          1             tsc

Let me know your thoughts on this.

Copy link
Copy Markdown
Collaborator

@RyanDavies19 RyanDavies19 Mar 26, 2026

Choose a reason for hiding this comment

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

I think that could work well. We already do a similar thing for VIV in the line properties section. I would say that if we do this, error handling should be added that logs when the syrope model is being used and throws a non-fatal warning if the Tmax and Tmin columns are detected without the syrope model activated. Similarly a fatal error should be thrown if Syrope is activated and these are not found.

And just for clean looking input files, in the docs and test cases, you should add a - in the column for a non-syrope lines:

-------------------------- LINES -------------------------------------------------
Line     LineType NodeA     NodeB  UnstrLen   NumSegs     Flags/Outputs   Tmax   Tmean
(-)      (-)       (-)       (-)    (m)         (-)          (-)          (N)     (N)
1        poly       2         1   1.0          1             tsc        1.5e6   8.0e5
2        poly       4         3   1.0          1             tsc        2.0e6   5.0e5
3        chain      6         5   1.0          1             tsc          -       -

@sanguinariojoe
Copy link
Copy Markdown
Collaborator

BTW @zhilongwei , please direct the PR to the dev branch (and rebase with it) please

@zhilongwei zhilongwei force-pushed the features/syrope-for-polyester branch from 2963994 to 52eb76d Compare March 20, 2026 12:31
@zhilongwei zhilongwei changed the base branch from master to dev March 20, 2026 12:47
@zhilongwei
Copy link
Copy Markdown
Author

It seems that the new test syrope takes a long time to finish, which also failed locally with ctest -C RelWithDebInfo -T memcheck -j 4 -R syrope. I will try to reduce the simulation duration and see. I am not sure why the MoorDynF regression tests are failing, as they do not appear to be related to the changes in MoorDynC.

@sanguinariojoe
Copy link
Copy Markdown
Collaborator

sanguinariojoe commented Mar 23, 2026 via email

@sanguinariojoe
Copy link
Copy Markdown
Collaborator

@zhilongwei memcheck can be quite time consuming. If your test does not fit, it is not really a big deal. Just add it to the list of excluded tests here:

https://github.com/FloatingArrayDesign/MoorDyn/blob/master/.github/workflows/memcheck.yml#L39

I will run it anyway with memcheck to be sure and let you know

@sanguinariojoe
Copy link
Copy Markdown
Collaborator

Yep, a lot of beef. The stdout of the test:

18: Working Directory: /home/pepe/CoreMarine/MoorDyn/MoorDyn.gcc/tests
18: Test timeout computed to be: 1500
18: Randomness seeded to: 2632179782
18: 
18:  Running MoorDyn (v2.6.2)
18:          MoorDyn v2 has significant ongoing input file changes from v1.
18:    Copyright: (C) 2024 National Renewable Energy Laboratory, (C) 2014-2019 Matt Hall
18:    This program is released under the  BSD 3-Clause license.
18: The filename is Mooring/syrope/linear_wc/line.txt
18: MoorDyn v2 log file with output level MSG at 'Mooring/syrope/linear_wc/line.log'
18: Loading a curve from 'Mooring/syrope/linear_wc/../owc.dat'...
18: 29 lines of curve successfully loaded
18: Generated entities:
18:     nLineTypes  = 1
18:     nRodTypes   = 0
18:     nPoints     = 2
18:     nBodies     = 0
18:     nRods       = 0
18:     nLines      = 1
18:     nFails      = 0
18:     nFreeBodies = 0
18:     nFreeRods   = 0
18:     nFreePoints  = 0
18:     nCpldBodies = 0
18:     nCpldRods   = 0
18:     nCpldPoints = 1
18: Time integrator = 2nd order Runge-Kutta
18: Water kinematics for IC gen:
18:    No Waves or Currents, or set externally
18: Creating mooring system...
18: Initializing coupled Point 2 at 1.01478, 0, -5
18: dtM = 0.01 s (CFL = 2.15154)
18: Finalizing ICs using static solve
18:   - Line1:
18:     ID      : 1
18:     UnstrLen: 1
18:     N       : 1
18:     d       : 0.203
18:     rho     : 1235.88
18:     EAMod   : 4
18:     EA      : 0
18:     BA      : 5e+10
18:     EI      : 0
18:     Can     : 0
18:     Cat     : 0
18:     Cdn     : 0
18:     Cdt     : 0
18:     Cl      : 0
18:     dF      : 0
18:     cF      : 0
18:     ww_l    : 66.9571
18: WRN /home/pepe/CoreMarine/MoorDyn/MoorDyn/source/Line.cpp:676 initialize(): Catenary initial profile failed for Line 1, initalizing as linear 
18: Initialized Line 1
18: Remaining error after 0.01 s = 0 m/s2
18: Best score at 0.01 s = 0 m/s2
18: Water kinematics for runtime:
18:    No Waves or Currents, or set externally
18: /usr/include/c++/15.2.1/bits/stl_vector.h:1282: std::vector<_Tp, _Alloc>::const_reference std::vector<_Tp, _Alloc>::operator[](size_type) const [with _Tp = Eigen::Matrix<double, 3, 1>; _Alloc = std::allocator<Eigen::Matrix<double, 3, 1> >; const_reference = const Eigen::Matrix<double, 3, 1>&; size_type = long unsigned int]: Assertion '__n < this->size()' failed.
18: 
18: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18: syrope is a Catch2 v3.3.2 host application.
18: Run with -? for options
18: 
18: -------------------------------------------------------------------------------
18: Syrope tests
18:   Case: Linear
18: -------------------------------------------------------------------------------
18: /home/pepe/CoreMarine/MoorDyn/MoorDyn/tests/syrope.cpp:601
18: ...............................................................................
18: 
18: /home/pepe/CoreMarine/MoorDyn/MoorDyn/tests/syrope.cpp:601: FAILED:
18:   {Unknown expression after the reported line}
18: due to a fatal error condition:
18:   SIGABRT - Abort (abnormal termination) signal
18: 
18: ===============================================================================
18: test cases: 1 | 1 failed
18: assertions: 5 | 4 passed | 1 failed
18: 
1/1 MemCheck #18: syrope ...........................Subprocess aborted***Exception: 1398.72 sec
18: process test output now: syrope syrope
PostProcessTest memcheck results for : syrope

0% tests passed, 1 tests failed out of 1

Total Test time (real) = 1398.72 sec

The following tests FAILED:
         18 - syrope (Subprocess aborted)

The memory errors:

MemoryChecker.18.log

I see a lot of problems reading the config and setting up the system. For the time being, please rebase with dev branch, so at least the VTK issues will be knocked out. When the time allows I will check your changes and give some more feedback about all these errors

@zhilongwei zhilongwei force-pushed the features/syrope-for-polyester branch from 52eb76d to 1f52e7f Compare March 24, 2026 09:02
@zhilongwei
Copy link
Copy Markdown
Author

Hi @sanguinariojoe, thank you very much. I have rebased with the dev branch.

@sanguinariojoe
Copy link
Copy Markdown
Collaborator

OK, I found the main problem @zhilongwei and fixed it on #371 . I am running the memcheck again. Meanwhile please rebase again to dev branch.

Then you can try to reduce the simulation time (even on the regular environment your new test is taking 60 seconds), or drop it from the memcheck tests.

@zhilongwei
Copy link
Copy Markdown
Author

I will try to reduce the simulation time. Currently, for each working curve formula (linear, quadratic, exponential), the test includes six phases of 3 hours each to mimic realistic loading scenarios. This may not be necessary.

@zhilongwei zhilongwei force-pushed the features/syrope-for-polyester branch from 1f52e7f to ef5589a Compare March 25, 2026 08:49
@zhilongwei
Copy link
Copy Markdown
Author

I have reduced the memory-check runtime to about 4 minutes on my local machine. I hope this is acceptable. If not, I can exclude this test from the memcheck tests.

@sanguinariojoe
Copy link
Copy Markdown
Collaborator

I have reduced the memory-check runtime to about 4 minutes on my local machine. I hope this is acceptable. If not, I can exclude this test from the memcheck tests.

That should do the job. Anyway, we will see when launching the next release. If it is problematic I am droping it myself.

For me this is good to go. So let's wait for @RyanDavies19 @mattEhall and @shousner to give their feedback.

(name) (m) (kg/m) (N) (N-s)
poly ... ... SYROPE:owc.txt|EA_Dc|EA_D_Lm BA_s|BA_d

The file ``owc.txt`` follows the same format as the tabulated non-linear stiffness files described
Copy link
Copy Markdown
Collaborator

@RyanDavies19 RyanDavies19 Mar 25, 2026

Choose a reason for hiding this comment

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

When updating the docs for a separate input file for the Syrope model, this explanation should be moved to a new section in Additional MoorDyn Files.

If you are able to also move the explanation of the non-linear stiffness lookup table input file (lines 310-320) to a new section in Additional MoorDyn Files that would be great (that has been a TODO for a while but we haven't gotten around to it).

Ideally, The V2 Input File section only contains explanations of the main MoorDyn input file. And then Additional MoorDyn Files is a catchall for the additional sub models' input files that are added into MoorDyn.

`Hall, Matthew, Brian Duong, and Ericka Lozon, “Streamlined Loads Analysis of Floating Wind Turbines With Fiber Rope Mooring Lines.” In ASME 2023
5th International Offshore Wind Technical Conference, V001T01A029. Exeter, UK: American Society of Mechanical Engineers, 2023. <https://doi.org/10.1115/IOWTC2023-119524>`_

Syrope model for polyester ropes:
Copy link
Copy Markdown
Collaborator

@RyanDavies19 RyanDavies19 Mar 25, 2026

Choose a reason for hiding this comment

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

Can you move this to underneath Modeling of Bi-stable Nonlinear Energy Sinks in MoorDyn? The references here should be listed in chronological order.

To that end, I think Implementation of bending stiffness modeling for power cables needs to be moved above Seabed friction and bathymetry approach used in v2. Feel free to make this change if you want.

@RyanDavies19
Copy link
Copy Markdown
Collaborator

RyanDavies19 commented Mar 25, 2026

Hi all,

First off, the report is a great documentation of the code changes and validation. It will definitely be a useful reference for any future work building off of this. Thanks for putting it together!

I left a few comments on input file formatting and documentation. I don't have time for a full code review, but I trust that @sanguinariojoe can find any major issues. After the docs changes are made this looks good to merge to me too!

@zhilongwei, based on your report I am assuming there is a concurrent PR being prepared for OpenFAST?

- Diam – the volume-equivalent diameter of the line – the diameter of a cylinder having the same
displacement per unit length (m)
- MassDen – the mass per unit length of the line (kg/m)
- EA – the line stiffness, product of elasticity modulus and cross-sectional area (N)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Change the short description of EA to the following:

the line stiffness, product of elasticity modulus and cross-sectional area (N) --> the line stiffness, product of elasticity modulus and cross-sectional area (N), or nonlinear parameters (see descriptions below)

Note: MoorDyn has the ability to model the viscoelastic properties of synthetic lines in two ways. The first method, from work linked in the
:ref:`theory section <theory>`, allows a user to specify a bar-separated constant dynamic and static stiffness. The second method allows the user
to provide a constant static stiffness and two terms to determine the dynamic stiffness as a linear function of mean load. The equation is:
`EA_d = EA_Dc + EA_D_Lm * mean_load` where `EA_D_Lm` is the slope of the load-stiffness curve. Both of these methods allow users to provide static
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Once you add the Syrope section to the Additional MoorDyn Files, can you add the following after the equation sentence (with a link to the Syrope section): This method can be used standalone, and is also part of the Syrope model described in <link to syrope in the Additional MoorDyn Files section>.

Change: is the slope of the load-stiffness curve. Both of these methods allow users to provide static --> is the slope of the load-stiffness curve. This method can be used standalone, and is also part of the Syrope model described in <link to syrope in the Additional MoorDyn Files section>. Both of these methods allow users to provide static

@zhilongwei
Copy link
Copy Markdown
Author

Hi all,

First off, the report is a great documentation of the code changes and validation. It will definitely be a useful reference for any future work building off of this. Thanks for putting it together!

I left a few comments on input file formatting and documentation. I don't have time for a full code review, but I trust that @sanguinariojoe can find any major issues. After the docs changes are made this looks good to merge to me too!

@zhilongwei, based on your report I am assuming there is a concurrent PR being prepared for OpenFAST?

Thank you, @RyanDavies19. Yes, we have a concurrent PR for MoorDyn-F in OpenFAST that is nearly ready. We still need to update the Syrope input format there to align with the changes here. Once everything is finalized here, we will submit a corresponding PR to OpenFAST with the same functionality.

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