Skip to content

MoorDyn slip support - #3501

Merged
andrew-platt merged 15 commits into
OpenFAST:devfrom
luwang00:f/MD_SlipSupport
Nov 3, 2026
Merged

andrew-platt merged 15 commits into
OpenFAST:devfrom
luwang00:f/MD_SlipSupport

Conversation

@luwang00

@luwang00 luwang00 commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

This PR is ready for merging.

Feature or improvement description
This PR introduces slip supports to MoorDyn. A slip support can be attached to any Point type (free, fixed, coupled, or attached to a Body) and acts like a hoop that lines pass through. A slip support constrains line motion in the normal direction only (through stiffness and damping), while allowing the line to slip through the support along the tangent direction, resisted only by friction.

The formulation uses a smooth B-spline kernel to distribute loads across several neighboring nodes, giving a smooth load handoff as the line nodes slip past the support, without requiring remeshing. The normal constraint is enforced through stiffness and damping based on the normal offset and relative normal velocity between the line contact point and the slip support. In the tangential direction, the line experiences friction modeled with either regularized Coulomb friction with a Stribeck transition from static to kinetic friction, or the single-state LuGre model, which captures true sticking.

The contact point kinematics are also interpolated from neighboring line nodes using the same B-spline kernel, so the contact point lies on a smooth curve that can be offset from the polyline representation of the mooring line. The offset is larger for sharper bends and decreases with a smaller kernel width (a user input), at the cost of more ripple as nodes pass the support. Because the kernel width is specified relative to the segment length, refining the line discretization reduces the offset while keeping the same smoothness. Using the same kernel for interpolating the contact kinematics and spreading the loads ensures adjoint consistency, so the contact spring and damper act passively on the line.

With the current implementation, the force and velocity projections are consistent for the normal damping and the tangential friction. The node forces and the velocities they act against use the same per-node projections. As a result, damping and Coulomb friction are dissipative, and LuGre friction is passive. The spring force is different. It is computed from the gap at the contact point, normal to the line tangent there. When it is spread to the nodes, the component along each node's local tangent is dropped. Without that projection, the normal support would push the line along its own axis and cause spurious snatching. The trade-off is that the spring force is not exactly conservative. It cannot add energy through axial motion, but it is not the gradient of a potential either.

Each line can have multiple slip supports, and each Point can serve as a slip support for multiple lines. A free Point used as a slip support must have nonzero mass, and a very light Point may require a reduced, user-specified stiffness. If a line end moves past a slip support, the line is permanently released from that support.

Linearization is supported, and new output channels report the contact location, slip velocity, normal and friction forces, bristle deflection (LuGre), and the reaction force on the support Point.

Impacted areas of the software
MoorDyn, docs

Additional supporting information
Detailed user and theory guide for slip support can be found in
docs/source/user/moordyn/moordynf_features.rst
docs/source/user/moordyn/slip_support_theory.rst

Example results
The example below was simulated using MoorDyn driver. A slack line is draped over a slip support, the red cross. The left end of the line is anchored, and the right end follows prescribed motion. Initially, the right end is at rest. At t=20 s, the right end starts moving toward +x at a constant speed of 0.5 m/s until t = 132 s, at which point, the motion stops. During this process, the line is pulled to the right until taut, with the line nodes sliding past the slip support smoothly.

MD_SlideSupport_Demo1.mp4

In addition to the normal force at the slip support, friction based on the LuGre model is also included. The time series of the friction force is shown below, including a zoomed-in figure around 20 s when the sliding started.

The friction is zero initially when the system is at rest. This is a direct consequence of the dynamic initialization, which produces a friction-free configuration at t=0 by design. After the dynamic initialization, the bristle deflection state of the LuGre model is reset to zero, so that there is no elastic stiction force.

There is a spike in friction at about 20 s when the right end of the line starts to get pulled. For the most part of the time series, the line is sliding at about 0.5 m/s, well above the Stribeck velocity of 0.1 m/s defined in the input file. Therefore, the friction is capped at the dynamic friction limit that starts to grow rapidly after about 120 s. This is the point where the line starts to get pulled taut, and the normal force at the slip support rises rapidly. At 132 s, the pulling stops, and the line stiction at the slip support reestablishes. A spike in friction followed by oscillation and slow relaxation can be observed.

image

Focusing around 20 s when the line just starts to move, a spike in friction past the dynamic friction limit can be seen due to stiction. The max friction does not quite reach the static friction limit. This rate-dependent slip is a known behavior of the LuGre model, where a fast start can undercut the peak static friction. Right after the slipping starts, the friction can temporarily remain above the dynamic friction limit and takes a finite amount of time to drop down to the limit. This is all related to the friction lag effect.

image

The new slip support should also correctly interact with other existing MoorDyn features, such as line failure. In the example below, we continue to pull the right end of the chain after 132 s. The anchor point is set to detach after reaching 1e5 N tension. The line continues to move past the slip support after detaching from the anchor until it is fully released from the support and drops to the seabed.

MD_SlideSupport_Demo1.mp4

Note that in the two examples above, the slip support is attached to a fixed Point. It is also possible to use a free or coupled Point as slip support. In the latter case, the slip support becomes attached to the rest of the OpenFAST structure like a fairlead. This is shown in the example below. The horizontal cylinder floating on the free surface is modeled in HydroDyn and ElastoDyn. The two ends of the cylinder are both coupled to MoorDyn slip supports. The nonlinear hydrodynamic loading causes the cylinder to drift downstream, sliding along the two mooring lines that act like guide ropes.

HMember_MDSlipSupport.mp4

Generative AI usage
This development is heavily supported by AI both during formulation and implementation.

  • The mathematical formulation has gone through careful human review.
  • The code was not yet checked. Example cases have been developed to demonstrate that the results are plausible. The new codes are mostly isolated in the new module MoorDyn_SlipSupport.f90 with minimal interface with the existing MoorDyn codebase; therefore, it is extremely unlikely it will cause any issue with existing features.

Models/tools:

Test results, if applicable
The two examples above, a line over a slip support pulled taut and a floating horizontal cylinder with two guide ropes, are both added as new r-tests. The floating horizontal cylinder glue-code test also serves as an additional r-test for PR #3489.
The two new tests are md_SlipSupport_LuGre and Floating_Cylinder_Guide_Ropes.

  • r-test branch merging required

luwang00 and others added 7 commits October 26, 2026 18:07
New optional SLIP SUPPORTS input section (ID Point Line Shape K Zeta MuS MuK VTol VS) and MoorDyn_SlipSupport module. The hoop acts on a virtual contact point on the line through a transverse penalty spring-damper and regularized Coulomb friction with static/kinetic coefficients and Stribeck transition. Contact load is spread with linear (2-node) or cubic B-spline (4-node) weights, split per node along each node's own tangent so a frictionless hoop applies no along-line force. The reaction is added to the host Point in Point_DoRHS. Includes piecewise initial line layout through hoops, viscous slip damping during IC generation, deferred line release committed after accepted time steps, and SLIP<n>{S,VS,FN,FF,FX,FY,FZ} output channels.

Co-authored-by: GitHub Copilot <noreply@github.com>

Co-authored-by: Claude <noreply@anthropic.com>
…split

Add a Width column to SLIP SUPPORTS (ID Point Line Shape Width K Zeta MuS MuK VTol VS). Width > 0 spreads the contact load with a hat (LINEAR) or cubic B-spline (CUBIC) kernel of fixed scale in unstretched arc length, normalized and mirrored about the line ends, so the number of loaded nodes grows with refinement and node-passing ripple vanishes. Width = 0 keeps node-based weights. Contact normal and friction are split per node along each node's own tangent so a frictionless hoop applies no along-line force; FN is the normal force actually delivered to the line and sets the friction capacity.

Co-authored-by: GitHub Copilot <noreply@github.com>

Co-authored-by: Claude <noreply@anthropic.com>
…t length

Remove the Shape input and the linear/node-based contact weights; every slip support now spreads its load with the fixed-width cubic B-spline kernel. The SLIP SUPPORTS row is now ID Point Line Width K Zeta MuS MuK VTol VS, where Width is a multiple of the longest segment length among all lines through the same hoop point (2 recommended). Width < 1 is a fatal error, Width < 2 gives a ripple warning, and the resulting kernel must stay shorter than a quarter of the line.

Co-authored-by: GitHub Copilot <noreply@github.com>

Co-authored-by: Claude <noreply@anthropic.com>
Add a StickDisp column to SLIP SUPPORTS (ID Point Line Width K Zeta MuS MuK VTol VS StickDisp). StickDisp > 0 selects LuGre friction with one continuous bristle-deflection state per support, appended after the line states, held at zero during IC generation, and registered for linearization as a first-order variable. Bristle stiffness is MuS/StickDisp, capped for explicit stability with a one-time warning; bristle damping is critical and faded out with the Stribeck velocity; sigma2 = 0. Friction is bounded by MuS*Fn, or by mu(v)*Fn when the relaxation rate is capped, preserving LuGre frictional lag at breakaway. StickDisp = 0 keeps the regularized Coulomb model. Adds the SLIP<n>Z output channel.

Co-authored-by: GitHub Copilot <noreply@github.com>

Co-authored-by: Claude <noreply@anthropic.com>
Add MoorDyn-F specific features page documenting slip support input, outputs, and usage, and a slip support theory page. Store the contact segment (search-window center) in OtherStates so glue-code rollbacks restore it; misc copy still tracks the contact within a coupling step.

Co-authored-by: GitHub Copilot <noreply@github.com>

Co-authored-by: Claude <noreply@anthropic.com>
…p to 1/dtM

Clarify contact kernel, contact search, effective contact mass, force distribution, friction stability limits, LuGre rate cap, and initial line layout in the theory page. Raise the LuGre bristle relaxation-rate cap from 0.5/dtM to 1/dtM (fastest RK2 decay, half the stability limit).

Co-authored-by: GitHub Copilot <noreply@github.com>

Co-authored-by: Claude <noreply@anthropic.com>
Explain that using the same kernel weights for contact kinematics and force spreading makes the contact spring/damper passive on the line nodes and defines the contact inertia m_C. Add section labels and the Peskin (2002) reference.

Co-authored-by: GitHub Copilot <noreply@github.com>

Co-authored-by: Claude <noreply@anthropic.com>
@luwang00 luwang00 added this to the v5.1.0 milestone Oct 29, 2026
@luwang00 luwang00 added the ai assisted AI written with strong human guidance. label Oct 29, 2026
@luwang00
luwang00 marked this pull request as ready for review November 2, 2026 21:59

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

Unresolved critical defects can inject energy through damping and friction, retain incorrect support releases after state restoration, and cause out-of-bounds output access.

6 open issues
What changed in this PR

Adds slip supports to MoorDyn-F, allowing lines to slide through Point-based guides with transverse restraint and friction.

Changes:

  • Implements contact forces, Coulomb and LuGre friction, line release, outputs, and linearization integration.
  • Adds Python input/output support and registers standalone and coupled regression cases.
  • Documents inputs, usage, and theory, and updates both build systems.
File Description
vs-build/​modules/​MoorDyn.vfproj Includes the slip-support module in Visual Studio builds.
reg_tests/​CTestList.cmake Registers two slip-support regression cases.
openfast_io/​openfast_io/​FAST_writer.py Writes slip-support input tables.
openfast_io/​openfast_io/​FAST_reader.py Reads slip-support input tables.
modules/​moordyn/​src/​MoorDyn.f90 Integrates parsing, initialization, forces, release, and linearization.
modules/​moordyn/​src/​MoorDyn_Types.f90 Adds slip-support types and copy/serialization routines.
modules/​moordyn/​src/​MoorDyn_SlipSupport.f90 Implements contact search, force distribution, friction, and release.
modules/​moordyn/​src/​MoorDyn_Registry.txt Defines slip-support data and state fields.
modules/​moordyn/​src/​MoorDyn_Point.f90 Adds support reactions to Point forces.
modules/​moordyn/​src/​MoorDyn_Line.f90 Includes slip-support forces in line dynamics.
modules/​moordyn/​src/​MoorDyn_IO.f90 Adds slip-support output channels.
modules/​moordyn/​CMakeLists.txt Includes the new module in CMake builds.
docs/​source/​user/​moordyn/​slip_support_theory.rst Documents the contact and friction formulation.
docs/​source/​user/​moordyn/​moordynf_features.rst Describes inputs, outputs, usage, and linearization.
docs/​source/​user/​moordyn/​index.rst Links the new MoorDyn-F documentation.
docs/​source/​user/​api_change.rst Records the optional slip-support input section.

Review effort: Balanced

Comment thread modules/moordyn/src/MoorDyn_IO.f90 Resolved
Comment thread modules/moordyn/src/MoorDyn.f90 Resolved
Comment thread openfast_io/openfast_io/FAST_reader.py Resolved
Comment thread openfast_io/openfast_io/FAST_writer.py Resolved
- Reject slip output IDs below 1
- Measure damper and slip velocities with the per-node projections used to spread the forces (strictly dissipative damping and friction)
- Store slip release status in OtherState
- Reset viscoelastic dl_1 after the slip-support line layout
- Seed the contact search segment at initialization
- Reject free hoop Points with no mass and no attached lines
- openfast_io: stricter section match, scientific format for small slip inputs
- Docs: passivity, linearization secant damping, no release during IC

Co-authored-by: GitHub Copilot <noreply@github.com>

Co-authored-by: Claude <noreply@anthropic.com>
luwang00 and others added 3 commits November 3, 2026 12:47
… tangent

Near a line end, the +2a share that each virtual (point-reflected) node folds onto the end node now uses the tangent of its mirrored node for the damper/friction velocity projections and the distributed forces. Previously the end node's single-segment tangent was used, giving a spurious normal damping force while the hoop approaches or overshoots the end. Interior results are unchanged.

Co-authored-by: GitHub Copilot <noreply@github.com>

Co-authored-by: Claude <noreply@anthropic.com>
The damper now acts on the normal component of the kernel-interpolated relative velocity and is spread to the nodes with the same weights, without the per-node tangent projection. This keeps the damper strictly dissipative while avoiding the double cos^2 reduction of damping at sharp bends, which left the contact underdamped and roughened the release near line ends. The spring force keeps the per-node split, and friction keeps the per-node slip velocity and force. Theory docs updated accordingly.

Co-authored-by: GitHub Copilot <noreply@github.com>

Co-authored-by: Claude <noreply@anthropic.com>
@andrew-platt
andrew-platt merged commit 97afe57 into OpenFAST:dev Nov 3, 2026
14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai assisted AI written with strong human guidance. Module: MoorDyn Type: Enhancement

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants