CableDyn verification and validation

This is the validation record for the CableDyn solver core. It is for users and reviewers who need the evidence behind a CableDyn result: each case lists its reference, metric, measured result, and acceptance value, and names the CTest case or script that reproduces it.

Case identifiers group the evidence into five levels:

Level

Evidence

L1

Analytical verification

L2

Comparisons with MoorDyn, and with OrcaFlex on the same MoorDyn benchmark decks

L3

Comparisons with OrcaFlex and physical experiments

L4

Coupled OpenFAST analysis

L5

Computational performance and robustness

CTest runs the unit, integration, and regression tests. The validation/ directory holds the experimental and performance records that are too long for continuous integration. The solver design is in ARCHITECTURE.md; cited works are listed with DOIs in the References chapter of the manual.

The comparison codes are MoorDyn-C and MoorDyn-F (Hall et al.), the OpenFAST framework of NLR (National Laboratory of the Rockies, formerly NREL), and OrcaFlex, which serves as the industry reference. OrcaFlex is a product of Orcina Ltd. The comparisons describe how each code was set up and report the measured differences; they are not rankings. OrcaFlex comparisons are provided as summary values (the statistics, peaks and scalars each test checks); the full OrcaFlex outputs are not redistributed and can be regenerated by OrcaFlex licence holders with the scripts in validation/scripts/, as described in validation/README.md.

The journal article’s CableDyn results, re-run with the release defaults and with the article’s methods, are compared in validation/PAPER_REPRODUCTION.md.

Summary

ID

Case

Reference

Result

Acceptance

Status

L1-1

Axial patch (EI = 0)

closed-form EA·ε

1.1e-13

<1e-10

Pass

L1-2

Bending/axial patch

½EA·ε²·L, ½EI·κ²·L

axial 1.2e-14; arc energy 1.0e-10 at order 4.00

<1e-12 / <1e-6, ≥3.5

Pass

L1-3

Cantilever

P L³/3EI

1.1e-7

<1e-3

Pass

L1-4

Large deflection

Bisshopp–Drucker (1945) elastica

≤1.9e-6 (cold start)

<1e-3

Pass

L1-5

Taut-string vibration

T₁ = 2L√(μ/T)

4.1e-4

<1e-3

Pass

L1-6

Euler-beam vibration

ω₁ = (π/L)²√(EI/ρₐ)

8.2e-5

<1e-3

Pass

L1-7

Static catenary

inextensible catenary

2.1e-4

<1e-3

Pass

L1-8

Energy stability

gen-α no growth over 60 T

peaks ≤ E₀; ρ∞=1 band 2.3e-8

ρ∞=0.8: peaks ≤ E₀(1+1e-6), mean drift ≤ 1e-9; ρ∞=1: band < 5e-3

Pass

L1-9

Seabed reaction

consistent lumped weight

4.1e-4

<1e-3

Pass

L1-10

Convergence order

EB-quartic refinement slope

3.99

≥3.5

Pass

L2-1

Static chain WD0050/0200/0600

MoorDyn-C quasi-static

0.13–1.59%

<3%

Pass

L2-2

Dynamic chain ×6 cells

OrcaFlex summary values

0.049–0.104; first harmonic 6–20%

<0.15; <25%

Pass

L2-2

Dynamic chain ×6 cells

MoorDyn-C v2.6.1 series

0.016–0.142

<0.15

Pass

L2-V

VolturnUS-S mooring static (1 line)

OrcaFlex 11.6d / MoorDyn

FairTen 0.42% / 0.08%; end element 1.28% / 1.77%

<3%

Pass

L2-V

VolturnUS-S mooring static (3-line ring, deck)

reference tensions

<0.1%

<5%

Pass

L2-V

VolturnUS-S anchor tension

closed-form catenary

0.77%

<3%

Pass

L2-80

Lozon 80 m all-chain mooring

catenary (H) / MoorDyn-F (fairlead)

0.03% / 1.8%

<2% / <5%

Pass

L2-arb

Closed-form catenary reference check

OrcaFlex VolturnUS-S ref

0.69%

<2%

Pass

L3-1

WD0050 static

OrcaFlex

0.15 / 0.85%

<2%

Pass

L3-2

Regular-wave dynamic

OrcaFlex (pinned, dt-converged)

mean 0.30%, swing 8.4%

<2% / <15%

Pass

L3-3

Current-deflected static

OrcaFlex

0.07–0.67%

<2%

Pass

L3-4

Finite-EI bending touchdown

OrcaFlex

curv 0.86%, fairlead 1.67%, anchor 3.22%

<2% / <3% / <5%

Pass

L3-5

Finite-EI lazy-wave curvature (80/200/800 m)

OrcaFlex 11.6d

peak curv 0.08 / 0.26 / 4.80%

<1 / 1 / 6%

Pass

L3-5

Full installed lazy-wave cable (800 m)

OrcaFlex 11.6d installed

peak curv 0.06%, hang-off tension 0.15%

<5%

Pass

L3-6

Dynamic lazy-wave, 3 depths, one protocol

OrcaFlex 11.6d

see L3

≤2% (hang-off ≤5%; 800 m static-curv ≤3%)

Pass

L3-6a

Axial-drag closed-form reference (1D)

closed form ½ρπd·Cdt·|v|v

CableDyn 0.012%; OrcaFlex 1.0002×

<2%

Pass

L3-6b

MoorDyn-F dynamic comparison on the cable

MoorDyn-F v2.3.8

tension ≤0.53% all depths; see L3

tension <1.5%; mesh-dependence contrast reported

Pass

L3-6c

Irregular-sea (JONSWAP) dynamic lazy-wave

OrcaFlex 11.6d (same 80-component sea)

curv 0.21%; tension 0.20/0.19/0.23%; wave-driven curv rise 1.0%, tension range 2.1%

curv <2%, tension <1%; rise <15%, range <10%

Pass

L3-6d

Moving-touchdown dynamic contact

OrcaFlex 11.6d installed

curv 0.48/0.58%, tension 0.74/0.90/0.80%, TDP 0.08 m, migration 2–3 m/cycle

curv <3–5%, tension <2–3%, TDP excursion bounds <1.5 m

Pass

L3-6e

Out-of-plane / 3D whirl response

OrcaFlex 11.6d

3D curv 0.52%, interior Y env ≤1.0 mm, sag ≤22 mm, tension 0.14/0.17/0.12%

curv <3%, env <5 cm, tension <2–3%

Pass

L3-7

1-hour VolturnUS-S mooring dynamic

OrcaFlex 11.6d

FairTen mean 0.28%, std 0.25%, min/max 0.15/0.43%, Fourier 0.27/1.13%

≤5%

Pass

L3-H

Holcombe static lazy-wave experiment

measured marker geometry

position RMSE 1.07–1.89% of suspended length; peak marker-curvature error 0.34–5.54%

end-restraint bracket

Pass

L3-B

Bergdahl chain experiment, 30 orbit conditions

measured upper-end force

RMSE 1.58 N; MAPE 3.11%; Pearson 0.993; Lin concordance 0.989

full published matrix

Pass

L-fig

Along-arc curvature overlay (CableDyn / OrcaFlex / MoorDyn-F ±4×)

3-code committed record

CableDyn peak 0.11% from OrcaFlex

<0.5%

Pass

L4-1

Coupled platform + mooring

synthetic reference

bit-for-bit

—

Pass

L4-1b

VolturnUS-S coupled platform + power cable

OpenFAST v5.0.0 (CompMooring 5 vs 3)

platform DOFs <0.6% (3-seed DLC-1.1); fairlead and anchor <0.001% static

<3% platform

Pass

L4-1c

Lozon lazy-wave cable under coupled FOWT motion, 3 depths

OrcaFlex 11.6d

curv amplification 0.05/0.09/0.01%; dyn curv 0.24/0.35/1.01%; tension <0.7%

ampl <2%, curv <2–3%, tension <1.5–2%

Pass

L4-rot

Coupled mooring rotational stiffness

held 1° pitch geometry

upwind −16.0 kN, downwind +7.8 kN each; first-order restoring moment

signs + first-order

Pass

L5-stab

Snap-load Δt-stability

sub-CFL fine-dt (0.5 ms) self-ref

peak 2.7% at dt = 20 ms (explicit limit 3.2 ms)

—

Pass

L5-stab

Snap-load Δt-stability, implicit and explicit steps

MoorDyn-C explicit step limit

20 ms implicit; ~1 ms explicit

—

Pass

L5-V

VolturnUS-S 1-hr mooring wall-clock

measured, matched protocol

CableDyn 18.1–32 s across repeated runs (full Newton) vs OrcaFlex 14.5 s; heave-only config 10.3 s

—

Pass (response at L3-7)

L5-wc

Wall-clock vs explicit C solver

external-C RK2 (WD chain)

L2 0.967 s vs external-C 0.541 s; traces validated

matched comparison reported

Pass measured

L5-DPC

Pinned-TDP lazy-wave spans, 80/200/800 m

OrcaFlex / refined MoorDyn-F

CableDyn 1.55/4.64/7.37 s; OrcaFlex 2.29/4.56/23.17 s; MoorDyn-F 249/145/243 s

resolved meshes, same host, one thread

Pass measured

L5-pk

Snap-load peak, 3-code

MoorDyn-C + OrcaFlex

4.86 / 6.32 / 10.22 MN

—

Informative

T-1

Torsion kernel: twist of the centreline, gradient, Hessian

automatic differentiation; finite differences

≤3.8e-15; ≤5.3e-11

<1e-10; <1e-6

Pass

T-2

Pure torsion (multi-section, end springs, five turns)

Φ/C; OrcaFlex 11.6d

round-off; ≤1.7e-8

<1e-12; <1e-7

Pass

T-3

Greenhill onset, clamped, TL²/EI −20 to 1600

van der Heijden et al. (2003) eq. 33

≤3.9e-5 (32 elements); ≤6.5e-6 (128)

<1e-4; <1e-3

Pass

T-4

Onset, bending-pinned torsional (semi-tangential) end

tan x = −x/3

6.4e-7 / 4.5e-7

<1e-4

Pass

T-5

Onsets against OrcaFlex 11.6d (clamped and pinned)

OrcaFlex, extrapolated to zero segment length

≤3.0e-5

<2e-4

Pass

T-6

Lazy-wave cable twisted 0–5 turns at the hang-off

OrcaFlex 11.6d

torque ≤0.019%, peak curvature ≤0.056%, offset ≤27 mm, tension ≤0.091%

1% / 1% / 0.1 m / 0.5%

Pass

T-7

Kirchhoff helix, four turns

helical equilibrium

end force 1.5e-4, end moment 6.5e-5

<5e-3

Pass

T-8

Cross-check with the Cosserat rod path

Cosserat path

shape 4.2e-4 L, torque 5.2e-5

<1%

Pass

T-9

Bordered Newton step on post-buckled states

predicted linear rate without the rank-one term

3 iterations; rate 0.055 / 0.217 vs 0.055 / 0.218

≤4; within 25%

Pass

T-10

Torsion dynamics, restart and body torque

quasi-static torque, energy, uninterrupted run, pendulum

torque 2.2e-16; energy band 4.9e-4; restart bit-identical; pendulum 6.4e-5

see Torsion

Pass

Pass meets the stated acceptance value. Pass measured records a measured comparison without an acceptance value. Informative is reported but not used for acceptance. Wall-clock comparisons are measurements on one host with the stated settings; they depend on each code’s configuration and are not rankings.

Scope

CableDyn has two position-based solver paths. Both support static equilibrium and time-domain analysis.

  1. EI = 0 cable path: tension-only elements, environmental loads, and penalty seabed; static Newton/Armijo solve; generalised-α dynamics with Morison drag, added mass, Froude–Krylov loading, Airy waves, wetting, seabed normal and friction forces, and MoorDyn-style axial (BA) damping.

  2. Finite-EI cubic-Hermite path for lazy-wave dynamic power cables: a position and material-tangent element without rotation DOFs, with closed-form internal force and tangent (automatic differentiation is only a test cross-check); a damped-Newton static solve with EI and buoyancy continuation, consistent self-weight, and penalty seabed on a banded system; and generalised-α dynamics with consistent mass, prescribed support motion, shape-distributed Morison drag with an implicit velocity Jacobian, added mass held over the step, and Airy waves with consistent Froude–Krylov load.

The Hermite element is the position-and-tangent Kirchhoff-rod formulation of Boyer et al. (2011) and Meier, Popp and Wall (2015). The implicit integrator suits the finite-bending lazy-wave cases; for the tested tension-only chain, MoorDyn-C’s explicit lumped-mass scheme runs faster (L5).

L1 analytical

Run with ctest -L l1; all 10 cases pass.

  • EI = 0 path: L1-1 axial patch, L1-5 taut string, L1-7 catenary, L1-9 seabed reaction.

  • Cubic-Hermite path: L1-2 bending/axial patch, L1-3 cantilever, L1-4 large-deflection elastica (Bisshopp and Drucker, 1945), L1-6 Euler-beam vibration, L1-8 energy stability, L1-10 convergence order.

Results are in the summary table. Test names and exact acceptance rules are in VALIDATION_SPEC.md.

L2 MoorDyn comparisons

All CableDyn runs start from independent seeds; no external solver state enters initialisation.

  • L2-1 static chain (l2_chain_parity): WD0050/0200/0600 grounded chains, catenary-seeded and continuation-solved. Fairlead/anchor tension differences from MoorDyn-C quasi-static: 0.50/1.59% (WD0050), 0.28/0.39% (WD0200), 0.16/0.13% (WD0600); acceptance 3%.

  • L2-2 dynamic chain (l2_2_dynamic_parity_*): six depth × amplitude cells under prescribed ZZP1 heave with drag, added mass, BA damping, buoyancy recovery, and seabed. Against OrcaFlex the fairlead-tension variation is compared through the summary values of the OrcaFlex series (mean, standard deviation, maximum, minimum, and the first three harmonics of the drive), each normalised by the reference peak-to-peak variation: the largest difference per cell is 0.049–0.104 (acceptance 0.15) and the first-harmonic amplitude agrees within 6–20% (acceptance 25%). A run with half the normal drag fails the comparison (l2_2_dynamic_parity_perturbed_rejected). Against MoorDyn-C v2.6.1 the pointwise fairlead-variation metric is 0.016–0.142; acceptance 0.15. The two reference solvers differ from each other by up to 0.189.

  • L2-V VolturnUS-S catenary mooring (l2_volturnus_mooring): one 120° all-chain line. The FairTen line-end force, 2437.1 kN, is within 0.42% (OrcaFlex 11.6d, 2427 kN) / 0.08% (MoorDyn, 2439 kN). The end-element tension, 2395.9 kN, leaves out the fairlead node’s share of the chain weight and is 1.28% / 1.77% lower. The anchor is within 0.77% of the closed-form catenary. The full 3-line ring solved through the deck driver agrees to <0.1%. The closed-form catenary reference agrees with OrcaFlex to 0.69% on this chain.

L3 OrcaFlex and physical experiments

  • L3-1 WD0050 static (l3_orcaflex_static): fairlead/anchor 0.154% / 0.848%. The OrcaFlex reference is within 0.657/0.731% of MoorDyn-C.

  • L3-2 regular-wave dynamic (l3_orcaflex_wave_dynamic): mean fairlead tension 0.298% (2% acceptance), swing 8.405% (15% acceptance) against an OrcaFlex reference with implicit dt 0.005 s. Wave stretching changes the OrcaFlex swing by only 0.18%, and the unpinned OrcaFlex dt=0.1 s is not converged (refinement moves it toward CableDyn). The residual comes from surface-piercing load discretisation on the 10 m top segment: with matched discretisation the gap narrows 11.4 → 7.4 → 4.9%.

  • L3-3 current-deflected static (l3_orcaflex_current_static): WD0050 in 1 m/s uniform current; in-plane 0.627 / 0.068%, transverse 0.670 / 0.283%.

  • L3-4 finite-EI bending touchdown (l3_finite_ei_touchdown): 120 m stiff section over a 50 m touchdown on the cubic-Hermite path. Maximum curvature 0.861%; end tensions from EA(|m|−1) 3.216% anchor / 1.671% fairlead.

  • L3-5 finite-EI lazy-wave curvature (l3_lazywave_curvature): the three Lozon (2025) VolturnUS-S cables (80/200/800 m). Peak sag-bend curvature differs from OrcaFlex 11.6d by 0.08% / 0.26% / 4.80%. The 800 m difference against 0.0280 is a protocol difference (pinned span vs installed cable): see the 800 m mesh convergence and full installed cable results, where CableDyn matches OrcaFlex to 0.06% peak curvature / 0.15% hang-off tension (l3_lazywave_fullcable).

  • L3-6 dynamic lazy-wave, three depths (l3_lazywave_dynamic): matched suspended span, hang-off driven by a 3 m / 12 s heave in still water, scored over the last three periods, on the converged 240/480/960-element meshes with the journal article’s configuration blend. Tension differences are hang-off mean / minimum / maximum.

    • 80 m: dynamic maximum curvature 0.24%, amplification 0.10%, tension 0.28 / 0.02 / 0.05%.

    • 200 m: dynamic maximum 0.24%, amplification 0.02%, tension 0.03 / 0.37 / 0.16%.

    • 800 m (amplification 1.47×, vs ~1.07× at the shallow sites): dynamic maximum 0.46%, amplification 0.06%, tension 0.01 / 0.08 / 0.15%.

    With the default force blend (CD_L3_FORCE_BLEND=1) the dynamic maximum curvature differs by 0.32 / 0.24 / 0.45% (validation/PAPER_REPRODUCTION.md).

  • L3-6a reference protocol (hermite_axial_drag_arbiter): the OrcaFlex reference runs in still water with vessel motion prescribed directly. A default wave train with vessel RAOs would raise the commanded 3.0 m heave to about 3.50 m and the tension swing by (3.498/3.0)² = 1.36. A closed-form 1D axial-drag case shows both codes reproduce the tangential drag law (CableDyn 0.012%, OrcaFlex 1.0002×); with the still-water reference the tension range agrees to 0.15%.

  • L3-6b MoorDyn-F comparison (settled, same location): hang-off tension mean, minimum and maximum agree to ≤0.53% at all depths; dynamic curvature 0.27% at 80 m (2.6 m mesh). On the native MoorDyn-F meshes, whose node spacing grows with depth, the dynamic peak differs by ≈0.3% at 80 m (2.6 m), −2.0% at 200 m (5.7 m), and −28.8% at 800 m (18.6 m). At 800 m, the 1.47× amplification of both implicit codes reads 1.14× on MoorDyn-F’s native mesh. Refining 2×/4× moves the settled peak 0.0276 → 0.0363 → 0.0379 (difference −28.8 → −6.4 → −2.3%) and amplification 1.144 → 1.411 → 1.448 toward the implicit 1.471, at 80 → 140 → 259 s per window. On resolved meshes the three codes agree to 0.3% at 80 and 200 m; at 800 m the fourfold-refined MoorDyn-F peak is 2.3% below the implicit codes. MoorDyn’s relaxation initial condition stops on a tension criterion; for this 800 m geometry threshIC = 1e-3 stops about 32% short of the settled shape, so the MoorDyn-F references use threshIC = 1e-5 and are verified settled to <0.05%.

  • L3-6c irregular seas (l3_lazywave_irregular): CableDyn’s seeded JONSWAP synthesis (Hs 2 m, Tp 12 s, γ 3.3, seed 12345, 80 components) is given to OrcaFlex as user-specified components, whose surface elevation it reproduces to 3.9e-14 m, so both codes run the same 120 s realisation: curvature 0.21%, tension 0.20 / 0.19 / 0.23%, and the wave-driven parts (curvature rise above static, tension range) 1.0% / 2.1%. Halving the normal drag moves the curvature rise by 24% and fails the test. The journal article used OrcaFlex’s own 78-component realisation; with that table, which OrcaFlex licence holders regenerate, the test reproduces the article’s 0.22% curvature difference.

  • L3-6d moving touchdown (l3_lazywave_touchdown_dynamic): installed 80 m cable on the penalty seabed. Static curvature 0.48%, dynamic maximum 0.58%, TDP region 0.51%, tension 0.74 / 0.90 / 0.80%, static TDP arc within 0.08 m; both codes show the touchdown migrating ~2–3 m per cycle.

  • L3-6e 3D whirl (l3_lazywave_3d_dynamic): out-of-plane DOFs free, elliptical 3 m heave + 1.5 m sway at 90°, 0.75 m spatial resolution, 0.025 s step. Three-dimensional curvature differs by 0.52%, the interior out-of-plane envelope by at most 1.0 mm, and the sag-bend probe by at most 22 mm. Hang-off tension mean/minimum/maximum differ by 0.14 / 0.17 / 0.12%.

  • L3-7 1-hour mooring dynamic (l3_longduration_mooring): VolturnUS-S all-chain line driven for one hour by 5 m/90 s surge + 2 m/12 s heave. Over the steady 3400 s window the FairTen channel differs from OrcaFlex by 0.28% in mean, 0.25% in std, 0.15 / 0.43% in minimum / maximum, and 0.27% (90 s) / 1.13% (12 s) in Fourier amplitude. The end-element tension carries the 1.28% static offset of L2-V in its mean and extremes.

  • L-fig curvature overlay: l3_lazywave_dynamic writes each site’s along-arc curvature profile. validation/scripts/curvature_profile_overlay.py assembles the 800 m 3-code overlay, records each series’ peak curvatures, their arc positions and envelope quantiles in tests/data/lfig_800m_curvature_summary.csv, and fails unless the CableDyn peak is within 0.5% of the committed OrcaFlex value (measured 0.11%) and the MoorDyn-F series reproduce their committed values. The implicit codes trace each other to the 0.0388 sag-bend peak; MoorDyn-F’s native 18.6 m node spacing samples it at 0.0276, and its 4× refinement follows the implicit curves.

Physical experiments

No line or load parameter is fitted to either experiment. Inputs, reduction scripts, results, and source provenance are in validation/experiments.

  • L3-H Holcombe static lazy-wave test (Holcombe et al., 2025): six independently predicted marker centres give position RMSEs of 39.4 mm for free rotation and 69.4 mm for an ideal vertical clamp (1.07–1.89% of suspended length). The same three-marker curvature operator is applied to measured and calculated centres. Both end restraints place the measured maximum at material coordinate 2.73 m; peak differences are 0.34% and 5.54%. The two-pixel digitisation interval and the unmeasured rotational restraint are carried through the comparison.

  • L3-B Bergdahl dynamic chain test (Bergdahl et al., 2016): over the full 30-condition period-radius matrix, cycle-maximum upper-end force has RMSE 1.58 N, mean absolute percentage error 3.11%, Pearson correlation 0.993, and Lin concordance 0.989. Two phase-averaged measured histories have waveform RMSEs of 5.95% and 2.54% of their force ranges. Halving the mesh length and the time step changes the mean cycle maximum by at most 0.49% and 0.28%. The 0.3125 ms step resolves the segment axial modes that the snap loads excite; at 1.25 ms the maxima are 2–15% higher and vary from cycle to cycle.

L4 coupled OpenFAST

  • L4-1 synthetic (l4_platform_mooring): 6-DOF platform moored by three taut catenaries, solved by the coupled augmented Newton method (fairlead Schur condensation, Jᵀg wrench, JᵀK_fairJ, and geometric-lever tangent). The symmetric settle matches the reference bit-for-bit; the inner Schur complement (FD 1.7e-9) and heeled 6-DOF tangent (FD 1.3e-11) are verified.

  • L4-1b VolturnUS-S in OpenFAST: one binary contains CableDyn (CompMooring = 5) and stock MoorDyn (= 3), so each A/B changes one input.

    • Settled statics (600 s quiescent, validation/scripts/openfast_settled_ab.py): platform surge/heave/pitch agree to <0.02% (sub-mm / sub-0.001°), and fairlead and anchor tensions to <0.001%. Both codes report the line-end force, including the end node’s share of the chain weight, so CableDyn’s Newton static equilibrium and MoorDyn’s dynamic relaxation give the same static line loads.

    • DLC-1.1, 3 seeds (NTM 6 m/s turbulent wind, JONSWAP Hs 2.5 m/Tp 10 s, 4200 s, full aero-servo-elastic-hydro): every in-plane platform DOF agrees to <0.6% in mean and std — surge 0.06/0.45, 0.07/0.55, 0.01/0.23%; heave ≤0.01/0.02%; pitch 0.22/0.05, 0.25/0.24, 0.05/0.21% (mean/std). Fairlead tension statistics match CableDyn’s own per-glue-step solution to 0.01% mean / ~3% std. Tension agreement with MoorDyn is scored in the settled case above and in the DLC matrix below.

    • Mixed deck: the shipped example iea15mw_umaine_mixed_cabledyn.dat (three chain moorings and an 87-element finite-EI power cable that touches down on the 200 m seabed) runs to completion under full coupled physics with finite, bounded channels. Coupled touchdown is covered by the 40 Hz openfast_touchdown test; no full-DLC touchdown result is claimed.

    • Wall-clock: see Coupled throughput under L5.

    • PtfmInit: MoorDyn-F’s convention (rigid transform of Coupled/Vessel points, undisplaced reference Position + TranslationDisp); tested by ptfm_init_equivalence and by a 6-DOF displaced free decay that agrees with stock MoorDyn to ≤0.51% of each DOF’s dynamic range.

    • Correction iterations (NumCrctn > 0): snapshot/rewind/re-advance is bit-identical (correction_rewind); a 40 s NumCrctn = 1 OpenFAST run matches stock MoorDyn to ≤0.16% of range and is bit-identical to its own NumCrctn = 0 run.

    The mooring-only A/B compares an all-chain system that both codes model in the same way; the finite-EI cable under coupled motion is compared with OrcaFlex in L4-1c.

  • L4-1c Lozon cable under coupled motion (l4_lazywave_coupled): the three cables are driven by the hang-off surge and heave from the coupled OpenFAST run, reduced by FFT to a shared 16-harmonic table that drives both codes. The hang-off trajectories are first shown to be identical (cross-correlation 1.0000, after matching the sign of OrcaFlex’s phase-lag convention for harmonic motion). Sag-bend curvature amplification differs by 0.05 / 0.09 / 0.01%, dynamic maximum curvature by 0.24 / 0.35 / 1.01% (the 800 m cell carries the ~1% mesh offset), and hang-off effective tension mean/min/max by <0.7%. One coupled run drives all three depths: the VolturnUS-S panel hydrodynamics are for ≈200 m, and the platform response is insensitive to the mooring model to <0.04% (L4-1b).

  • L4-rot rotational stiffness (case_fmf_rotational_stiffness in openfast_shell): at 1° pitch the upwind line tension changes by −16.0 kN and each downwind line by +7.8 kN, giving a first-order restoring pitch moment. Only Coupled/Vessel points move with the platform; anchors stay fixed.

L5 performance and robustness

Time-step stability

  • Snap load (snap_load): a grounded tension-only line goes slack, then snaps to ~10 MN. Implicit generalised-α integrates it at dt = 20 ms, above the explicit CFL limit of about 3.2 ms, with every step converged (stable up to about 30 ms in a sweep); the peak is within 2.7% of the 0.5 ms sub-CFL reference.

  • Implicit and explicit steps: on the matched near-taut snap, MoorDyn-C’s explicit RK2 needs dtM ≲ 1 ms, as expected of an explicit scheme at this line stiffness; CableDyn’s implicit step remains stable at 20 ms.

  • Snap peak, three codes (Informative): step-converged peaks are 4.86 MN (MoorDyn-C), 6.32 MN (OrcaFlex), and 10.22 MN (CableDyn). The spread reflects the line, contact, and damping models. It is not an acceptance case because no measurement exists.

Wall-clock time

  • Tension-only chain (Pass measured): MoorDyn-C runs the 8 s snap in about 0.03 s and CableDyn in about 0.26 s; cheap lumped-mass substeps make the explicit model faster for this short axial-line problem. For the L2 WD0050/A1 80 s deck, CableDyn takes 0.967 s and the external-C RK2 calculation 0.541 s; the traces agree to 1.67 / 3.61% in mean / maximum fairlead tension.

  • VolturnUS-S one-hour mooring:

Case

CableDyn

Reference

Note

All-chain static IC

converged

OrcaFlex 2427 / MoorDyn 2439 kN

FairTen 2437 kN (0.42% / 0.08%); anchor 0.77% (L2)

1-hour (3600 s) dynamic, heave-only config

10.3 s (dt=0.1 s, 36000 steps, 0 non-convergent, ~2 iterations/step)

—

throughput at production step

1-hour dynamic, matched 2-component drive (L3-7)

18.1–32 s across repeated runs (full Newton)

OrcaFlex 14.5 s

same drive and host

  • Finite-bending lazy-wave spans (L5-DPC): the 80, 200, and 800 m pinned-TDP suspended spans are timed after spatial convergence, without grounded tail or seabed contact. CableDyn uses 240, 480, and 960 Hermite elements at 0.05 s. OrcaFlex uses independently checked segment lengths and the same step. MoorDyn-F uses a fourfold-refined mesh and the largest step for which all reported responses change by less than 0.01% on further halving.

Depth

CableDyn

OrcaFlex

Refined MoorDyn-F

80 m

1.55 s

2.29 s

249.07 s

200 m

4.64 s

4.56 s

144.61 s

800 m

7.37 s

23.17 s

243.08 s

Totals include initialisation and the same 60 s dynamic interval. The explicit MoorDyn-F step is set by its stability limit on the fourfold-refined bending mesh, so these times reflect the chosen resolution protocol rather than a general property of any code. Each value is the median of three runs after one warm-up on one Intel Core i9-13900K thread. Model sizes, timing ranges, memory, Newton work, and the OrcaFlex mesh sweep are in validation/performance.

  • Hermite solver timings (development workstation; machine-specific, not portable tests): the banded solves reproduce the dense reference to identical digits and Newton counts, and the dynamic step performs no heap allocation. The 960-element Humboldt static solve takes 40.3 s and the 480-element solve 17.3 s; the 240-element pinned-span static solve takes 471 Newton iterations direct and 477 with mesh sequencing; the installed-cable sequence takes 529 coarse and 20/60/14 polishing iterations; the 240-element 200 m dynamic case runs at 2.21 ms per step with 3.95 Newton iterations per step; and the 78-component irregular-wave lazy-wave comparison (the article’s sea) runs in 66.6 s.

  • Coupled throughput: at dtM = 0.025 s the one-line, 50-element aggregate advances at 0.540 ms per step and the three-line spread at 0.590 ms per step; these are mooring-module figures only. With OpenFAST DT = CableDyn dtM = OpenFAST DT_Out = 0.025 s, uninterrupted 4200 s runs of the full IEA-15 MW model (turbulent wind, controller, SeaState, HydroDyn, 40 Hz output) take 1196.81 s of wall time with the three-line mooring deck and 1399.44 s with an added 55-element suspended finite-EI power cable (a variant of the mixed example without touchdown), using default full-Newton settings (no dynamic_solver override, no modified Newton, no adaptive remeshing), on the development workstation. Each binary output has exactly 144,001 rows from 600 s to 4200 s with 47 channels. The OpenFAST runtime Jacobian is the fixed-state direct-feedthrough derivative; formal linearisation uses the re-equilibrated quasi-static stiffness.

Numerical robustness

  • Mesh sequencing: each finer-level full-load Newton batch is limited to one iteration, and non-convergence is reported only after all hierarchy and recovery paths are exhausted. EI/buoyancy continuation is not replayed on finer levels, so the branch selected on the coarse mesh is kept. The hierarchy admits odd and prime element counts, preserves section, load, and contact-diameter interfaces, and always polishes on the exact user mesh. For suspended spans the longest interface-preserving coarse cell must be within 3.2 local bending lengths lambda = (EI/|w|)^(1/3). A 476-element lazy-wave cable placed below −2000 m must keep every node below −2050 m after polishing (no spurious contact). A 476-element installed cable with mesh sequencing and adaptive_mesh=True keeps its fairlead tension within the 5% physical-observable limit without compression-dominated folding.

  • Deterministic threading: the dynamic tangent-only element evaluation equals the full symmetric-half evaluation bit for bit. Finite-EI dynamic tests exercise the OpenMP tangent path above its 32-element threshold with a deterministic serial scatter. System and aggregate tests exercise concurrent lines and cables with object-ordered failure reduction and transactional rollback. All non-slow CTest cases pass with four OpenMP threads.

  • Temporal resolution: Newton can converge an under-resolved finite-EI step, so the step is rejected if an element chord changes by more than 20% of its reference length or a nodal tangent turns more than 15 degrees, and the interval is retried by internal generalised-α subdivision. In the 4200 s run with the power cable above, 449 of 168,000 coupling intervals used this recovery and all completed on the host time grid with finite results.

  • C ABI: on POSIX/MinGW pthread toolchains, c_api_concurrency runs 4,000 concurrent Create/Close cycles on eight workers, then an eight-way close race on copied handles that must give exactly one successful claim and seven BAD_HANDLE rejections. c_api_shared compiles a C consumer against CableDyn_CAPI.h, links the versioned shared library, and checks version identity, exported symbols, version-string termination, and Create/Close ownership; an install test places the library, import archive, and header in bin/lib/include.

  • Windows distribution: the release build compiles the deck driver and a CableDyn-enabled OpenFAST from the pinned upstream revision plus the integration patch series, using Intel Fortran, the static MSVC runtime, and the reference LAPACK/BLAS 3.12.1 compiled with the same compiler (openfast.exe takes only the single-precision routines the reference build omits from the solution’s MKL). It rejects non-system PE imports, runs both executables with a system-only PATH, solves chain_catenary_shallow_30m.dat, and completes CompMooring = 5 and CompMooring = 3 OpenFAST smoke models (ModCoupling = 3, NumCrctn = 0) that must print the initialisation inventory, the fairlead report, and the FairTen1 channel. IFX versions older than 2025.3 are rejected. CableDyn_driver.exe imports only KERNEL32.dll, SHELL32.dll and imagehlp.dll, and openfast.exe only KERNEL32.dll and imagehlp.dll; a model with an external ServoDyn controller still needs that controller’s DLL.

Reference systems: Lozon et al. (2025)

The reference designs are the IEA 15 MW turbine (Gaertner et al., 2020) on the UMaine VolturnUS-S semi-submersible (Allen et al., 2020) at the three US sites of Lozon et al. (2025): catenary chain (Gulf of Mexico 80 m), semitaut chain + polyester (Gulf of Maine 200 m), and taut chain–polyester–chain (Humboldt 800 m).

CableDyn computes the static equilibrium. The paper’s tensions and curvatures are dynamic extremes from coupled OpenFAST DLC/SLC runs and are listed as upper bounds. “Paper” is the article’s MoorPy quasi-static + MoorDyn-F reference; OrcaFlex 11.6d and CableDyn are independent static cross-checks. All static comparisons use a frictionless seabed, and the comparison cells model polyester at constant EA (the paper’s tabulated stiffness). The lozon_gomaine200_mooring.dat and lozon_humboldt800_mooring.dat examples also demonstrate the series-Kelvin viscoelastic form, with non-paper dynamic parameters labelled as assumptions. The l2_volturnus_mooring test covers the original all-chain VolturnUS-S mooring, not the Lozon designs.

Moorings, static pretension (kN):

Site

Design (fairlead → anchor)

Paper

OrcaFlex

MoorDyn-F ¹

CableDyn end element ²

CableDyn FairTen ³

Paper dyn. max (SLC)

Gulf of Mexico 80 m

160 mm chain 364.5 m (catenary)

748

747.4

756.3 (750.5)

727.1

749.6

4233

Gulf of Maine 200 m

181.8 mm poly 199.8 m + 155 mm chain 497.7 m (semitaut)

1205

1199.2

1212.0

1206.2

1205.4

6429

Humboldt 800 m

120 mm chain 80 m + 184 mm poly 1378.9 m + 120 mm chain 80 m (taut)

1704

1881.5

1875.9 (1864.5)

1875.6

1881.5

5527

¹ From the authors’ three-line coupled MoorDyn-F decks, which are not redistributed. The values in parentheses come from the single-line decks in validation/scripts/moordyn_lozon, which anyone can rerun. ² The fairlead element’s axial tension on the journal article’s meshes, the quantity the article reports, re-run with the release in the article’s configuration (see validation/PAPER_REPRODUCTION.md). With the release defaults, l2_lozon80_mooring reports 742.7 kN on the article’s 80 m mesh and l2_lozon200_semitaut 1206.2 kN. ³ The FairTen line-end force of the example decks lozon_*_mooring.dat with the release defaults; it adds the fairlead node’s share of the line weight to the end element’s tension.

  • 80 m: the four FairTen-type values (OrcaFlex, MoorDyn-F, CableDyn FairTen, paper) agree within 1.2%; the end-element value is 3.9% below MoorDyn-F because it leaves out the fairlead node’s share of the chain weight. CableDyn’s anchor H (l2_lozon80_mooring) matches the closed-form catenary to 0.03%.

  • 200 m: four-way within 1.1%; CableDyn is within 0.1% of the paper (l2_lozon200_semitaut, 1206.2 kN; MoorDyn-style deck l2_lozon200_semitaut_deck with kBot 3e6 Pa/m, 1203.9 kN).

  • 800 m: MoorDyn-F 1875.9, CableDyn 1875.6 (end element) or 1881.5 (FairTen), and OrcaFlex 1881.5 kN agree within 0.3%. The paper’s 1704 kN is the MoorPy quasi-static value; the three codes above are about 10% higher on this stiff taut fibre line.

Lazy-wave cables, static peak curvature (m⁻¹):

Site

CableDyn / OrcaFlex / MoorDyn-F

Difference

Hang-off T (OrcaFlex)

Paper dyn. max curv

Gulf of Mexico 80 m

0.09688 / 0.0968 / 0.0966

3-way <0.3%

9.32 kN

0.130

Gulf of Maine 200 m

0.08331 / 0.0831 / 0.0809

3-way <3%

25.16 kN

0.118

Humboldt 800 m

0.02666 / 0.0280 / 0.0318

see below

56.53 kN

0.0325

At 800 m the three values span ~0.027–0.032 (~19%). MoorDyn-F’s 0.0318 peak lies at the hang-off connector rod on its 18.6 m native mesh; OrcaFlex (0.0280) and CableDyn (0.02666) peak at the mid-span sag bend, which that mesh samples at 18.6 m spacing. The 4.80% is CableDyn vs OrcaFlex on the resolved sag bend (l3_lazywave_curvature).

800 m mesh convergence (l3_lazywave_refinement, mesh-sequenced 480 → 1920):

Elements

Element length

Peak curvature /m

vs OrcaFlex 0.0280

240 (test mesh)

3.84 m

0.026656

4.80%

480

1.92 m

0.026389

5.75%

960

0.96 m

0.026376

5.80%

1920

0.48 m

0.026414

5.66%

The three fine meshes span ~0.15% around ≈0.0264 /m (non-monotone: field convergence competes with finer sampling of the peak). The remaining difference from 0.0280 is the reference protocol: 0.0280 models the installed cable, the CableDyn test the pinned suspended span. OrcaFlex on the matched pinned span gives 0.02639; CableDyn agrees to 1.01% on the test mesh and to 0.00–0.09% on the fine meshes. The protocols coincide to <0.4% at 80/200 m. Releasing the touchdown pin onto the frictionless bed is a different boundary-value problem: installed 0.0280 vs pinned 0.0264.

Full installed cable (l3_lazywave_fullcable): fairlead → arch → touchdown → grounded run → seabed anchor, mesh-sequenced 89 → 712 elements. Seabed friction does not affect this static, so the frictionless comparison is like-for-like.

Quantity

CableDyn (712 el.)

OrcaFlex 11.6d

Difference

Acceptance

peak curvature (sag bend, arc ≈ 357 m)

0.028002 /m

0.02802 /m

0.06%

5%

hang-off tension

56.448 kN

56.535 kN

0.15%

5%

Buoyancy continuation runs once at 89 elements, followed by Hermite prolongation and polishing. The test checks the iteration count per level (529 coarse continuation, then 20 / 60 / 14 polish) and the last doubling moves the peak 0.39% (2% drift limit). The arch is reached deterministically (byte-identical seeds, independent of continuation step) on Ubuntu/Windows × Debug/Release CI.

Example decks. The three lozon_*_power_cable.dat decks contain the full installed cable and grounded tail. From POINTS, SECTIONS, properties, and the flat seabed alone, the solver finds grounded length and touchdown with its signed-weight extensible-catenary cold start. Large meshes select the physical branch on a coarse mesh and return to the requested resolution by cubic-Hermite prolongation and full-load polishing; no saved centreline or case-specific tolerance is used. The decks carry the journal article’s refined meshes (1024, 952 and 1024 elements) and give fairlead tension / peak curvature of 9.320 kN / 0.09683 m⁻¹, 25.160 kN / 0.08317 m⁻¹, and 56.539 kN / 0.02802 m⁻¹ for 80/200/800 m, within 1% of the OrcaFlex values above (the 800 m installed-cable reference is 0.0280 m⁻¹). Seven example tests plus lozon_example_equilibrium (1% limits on both observables) cover the three cable statics, three single-line moorings, and the sampled-motion 80 m cable.

200 m refinement robustness. The Gulf of Maine cable is rebuilt from the article’s 119-element starting mesh (58/20/41 segments per section) at 2, 3, and 4 times its section counts (238, 357, and 476 Hermite elements), from the same trivial cold start. Mesh sequencing selects the equilibrium on a coarser mesh and prolongates it, preventing a direct fine solve from landing on a folded branch with hundreds of MN of negative effective tension. The refinements reproduce the example’s fairlead tension and peak curvature within 5%, without a saved shape, relaxed tolerance, or case-specific limit. On the 476-element installed mesh, adaptive meshing after sequencing starts from a full-load one-stage polish and cannot restart the buoyancy ramp. AutoMesh warm-start refinement is tested by hermite_automesh.

Static-initialisation robustness (static_init_sweep)

122 deterministic parametric rigs span depth (50–800 m), slackness, buoyancy ratio (0–2.5), EA (5e7–2e9 N), EI (5e2–2e5 N·m²), seabed stiffness, span ratio, and buoyant fraction. Each is solved by the production mesh-sequenced solver from a library-built trivial seed (CD_HermiteCable_Trivial_Seed: endpoints, rest lengths, and seabed in; isometric seed out; no catenary, seed files, or per-case tuning). Result: 117 pass, 3 known failures, 2 cases annotated as known failures that now pass, 0 unexpected failures, and 0 silent wrong answers. Known-failure annotations are checked both ways: an annotated case must either fail cleanly or be reported when it passes.

  • On a frictionless bed, a smooth planar equilibrium exists only while the rest length is below the L-shape bound L < h_fairlead + x_anchor; beyond it the surplus must fold on the bed. The slack axis runs to 0.97× the bound. A separate family crosses it and must return either a clean error or a finite bounded-curvature solution, never NaN or a silent cusp. The three known failures are hard contact cases at the lowest EI of the sweep (5e2 N·m²).

  • A residual-converged state is not sufficient: the solver rejects an element-localised branch when max(h*kappa) > 0.7, so a folded equilibrium cannot enter dynamics.

  • The adaptive contact diagnostic permits several contiguous grounded runs but labels a contact state that toggles at one interior node as mesh-scale chatter and refines. Resolution and AutoMesh unit tests cover a resolved two-island state accepted at the refinement cap and a fragile isolated interior contact node.

Dynamic robustness across the DLC motion envelope

Prescribed-motion power cables. The 80 / 200 / 800 m lazy-wave cables are driven at the hang-off in heave and in surge over a matrix bracketing semi-submersible response: operational (3 m / 10 s), severe (6 m / 12 s), 50-year extreme (10 m / 14 s), steep wind sea (5 m / 7 s), and long swell (8 m / 20 s), giving 30 cases (five motions, heave and surge, three depths). A 15 m heave and a 15 m surge at each depth, in which the 80 m hang-off leaves the water, are added as six margin probes. With the release’s recovering step, which subdivides an interval whose Newton iteration stalls, all 30 cases and all six probes complete at a standalone dynamic tolerance of 1e-3 on ‖G‖, at 1.2–3.9 ms per step and at most 52 Newton iterations. Advanced with single unsubdivided steps, as in the journal article, all 30 cases complete with the article’s configuration blend, while 2 of the 30 stop with the default force blend; see validation/PAPER_REPRODUCTION.md.

The Hermite tangent holds added mass over the step and omits the wave-field gradient, so the residual plateaus at about 1.3e-4 for one-dimensional motion. Use 1e-3 as the standalone tolerance; 5e-3 lets a steep-sea trajectory drift over a cycle. A combined surge-and-heave orbit raises the plateau to about 1e-3 and is not robust standalone at that tolerance. Combined six-DOF motion is robust in the coupled CompMooring = 5 path, whose correction iterations and platform feedback re-converge each step (three-seed DLC-1.1, L4-1b, <0.6%).

Prescribed-motion moorings. The Lozon all-chain catenary and semitaut chain–polyester moorings are driven through the same surge-and-heave envelope at dtM = 0.1 s. The all-chain mooring needs no step subdivision and takes 0.7–1.1 ms of wall time per 0.1 s step with at most 16 Newton iterations; the stiffer composite subdivides about 1.4% of steps at the severe and extreme excursions and takes less than 3.3 ms per step.

Coupled OpenFAST sea states. In the full IEA-15 MW VolturnUS-S model with SeaState JONSWAP waves, the all-chain mooring completes Hs = 10 m, Tp = 14 s with finite output. A suspended power cable, which receives the full wave field on its interior nodes, completes the DLC 1.6 severe sea state (Hs = 5 m) with adaptive step subdivision (dt/4 to dt/256). At the 50-year extreme (Hs = 10 m) the run reaches the largest crest at t ≈ 48.6 s, where the residual plateaus at ‖G‖ ≈ 8.1 × 10⁻³ against the coupling tolerance 5 × 10⁻³, identically at 64 and 256 substeps. This is a limit of the inexact tangent (held added mass, omitted wave-field gradient), not of the step size; the tolerance is not relaxed because under-converged states accumulate drift.

Full-turbine comparison with stock MoorDyn. The complete IEA-15 MW VolturnUS-S model (AeroDyn, ROSCO, TurbSim turbulent wind, JONSWAP seas) is run twice, changing only CompMooring (3 = stock MoorDyn-F, 5 = CableDyn), and platform motion and fairlead/anchor tension are compared. Method and reproduction: validation/OPENFAST_DLC_VERIFICATION.md; script and limits: validation/scripts/dlc_ab_compare.py (platform standard deviation and maximum <3%, mean informational; fairlead mean <2%; anchor mean <3%).

Case

Wind and sea

Platform dynamic response

Fairlead tension

Anchor tension

Status

DLC 1.1 class

NTM 6 m/s; JONSWAP Hs 6 m, Tp 16 s

≤0.81%

<0.01%

<0.01%

Pass

DLC 1.6 class

severe sea, JONSWAP Hs 10 m

≤0.26%

<0.01%

<0.01%

Pass

Above rated

NTM 18 m/s, pitch control

≤0.07%

<0.01%

<0.01%

Pass

DLC 6.1 class

EWM ~50 m/s, ESS Hs 11 m, parked

≤1.70%

<0.03%

<0.03%

Pass

Platform means differ by less than 0.05% in surge, heave and pitch and are informational. The mean fairlead and anchor tensions agree to within 0.03% in every case: both codes report the line-end force, and the two static formulations (Newton equilibrium of the finite-element line and dynamic relaxation of the lumped-mass line) give the same line loads, as in L4-1b. A mixed deck of three chains and one finite-EI power cable also completes the full-turbine model under Hs = 11 m waves with finite output and the cable curvature channel; the cable is not part of this MoorDyn-F A/B, and its accuracy is established against OrcaFlex (L3-4 to L3-6, L4-1c). DLC 6.3, 6.4, and 1.4 and multi-seed one-hour ensembles are not part of this record.

OpenFAST feature coverage (CompMooring = 5)

Every MoorDyn-F coupled feature used by the reference cases is verified against stock MoorDyn or measured to identity. The table lists each MoorDyn-F feature, checked against the MoorDyn-F and FAST.Farm sources. Unsupported combinations stop with a named error.

MoorDyn-F feature

CableDyn status

Evidence

Coupled time-domain (Init/UpdateStates/CalcOutput) + own dtM

Pass verified

DLC-1.1 3-seed A/B <0.6% mean+std

Nonzero PtfmInit

Pass verified

6-DOF displaced free decay ≤0.51%

Correction iterations (NumCrctn > 0)

Pass verified

bit-identical to own NumCrctn = 0 run

SeaState wave/current kinematics

Pass verified

wave A/B ≤0.16% of range

Checkpoint-restart (incl. Free/Connect points)

Pass verified

restarted window = continuous run to 0.0

Linearisation

Pass scoped

quasi-static dYdu; invariants tested; not compared entry by entry with MoorDyn’s -lin output, which is sensitive to the seabed-contact operating point in this case

FAST.Farm shared moorings + clumps + channel record

Pass verified

60 s farm A/B against stock MoorDyn; tension differences range from 0.04% to 3% across the compared statistics

Slack-line tension convention

Pass verified

tension-only dynamics; BA on slack lines matches MoorDyn_Line.f90

Farm + restart / Farm + linearisation

Not applicable

FAST.Farm has no restart and does not call module linearisation; the same applies to stock MoorDyn

Line failures (FAILURE table)

Pass verified

MoorDyn semantics on both paths (reserve-point pre-allocation, time or tension trigger, detach onto a massless Free point); standalone (point systems and free Rigid6 bodies), coupled, and checkpoint-replay tests

Viscoelastic stiffness (ElasticMod > 1; Hall et al., 2023)

Pass verified

both MoorDyn forms as per-element two-branch series-Kelvin laws eliminated implicitly in the generalised-α step; the standard linear solid is recovered only when the fast-branch dashpot BA_D is zero; md_viscoelastic r-test 0.007–0.97% at 5× dt; the coupled module carries dl_1 in the checkpoint state

Active tension (CtrlChan)

Pass verified

CONTROL parsing, last-segment length/rate modulation, and exact unit tests; coupled A/B in which a ServoDyn cable-control DLL drives the same pay-out/haul-in DeltaL schedule into =5 (CableDyn) and =3 (stock MoorDyn) in one binary: hold tensions agree to <0.03% and the tension responses to <0.6% (controlled fairleads) / <0.7% (anchors) (validation/scripts/activetension/, validation/scripts/openfast_activetension_ab.py)

Coupled Rigid6 bodies + Point3 buoys

Pass verified

6-DOF Rigid6 motion with hydrostatic (C33/C44/C55) restoring, checkpoint state (bit-identical openfast -restart of a 13.9 MN-swinging tethered body), and SeaState drag / Froude–Krylov / added mass. Point3 buoys take buoyancy and drag/added-mass/FK; a submerged volume-only buoy takes FK. Tests: case_coupled_rigid6/_mirror/_fluid, case_coupled_point3_buoy/_fluid

Coupled rigid rods

Pass verified

host-driven Rod<N>A/B endpoints, correction rewind, bit-identical 24-scalar-per-rod checkpoint state, and two Gauss fluid nodes per rod with SeaState drag/Froude–Krylov/added mass; case_coupled_rod, _mirror, and _fluid pass, and the OpenFAST module compiles with rod decks enabled

Coupled finite-EI touchdown/contact

Pass verified

flat WtrDpth and equivalent constant structured bathymetry initialise and step with matching loads; friction and checkpoint restore are tested. The IEA-15 mixed example has 38 grounded nodes and completes a 20 s aggregate trajectory at dtM=0.025 s with 2 m surge, 1 m heave, and 0.5 m/s host current, without fallback or stall recovery, at most 14 Newton iterations. This is an aggregate integration test, not a full-turbine touchdown DLC

WaterKin from file

Pass verified

See WaterKin and SeaState modes

Syrope polyester (SYROPE: syntax; Falkenberg et al., 2017)

Pass verified

MoorDyn-F/C `BA_s

VIV (compVIV)

Not supported

outside CableDyn’s scope

Standalone mixed aggregate. CableDyn_driver.exe partitions and steps the same aggregate used by OpenFAST. The IEA-15 three-chain + touchdown-cable deck writes all four static profiles and a one-step dtM=0.025 s dynamic test with progress/ETA. On this held-end mixed route (mixed lines without bodies, rods or free points), motionFile and deck-owned waves/current stop with an error. Mixed decks that also contain bodies, rods or free points run on the multibody march, which accepts deck waves and current (mixed_body_rods_points.dat).

WaterKin and SeaState modes

The WaterKin parser and coupled module keep the wave and current mode switches independent:

WaterKin request

Coupled result

WaveKinMod = 0, CurrentMod = 0

no host wave or current contribution

WaveKinMod = 0, CurrentMod = 1

file depth-table current only

WaveKinMod = 0, CurrentMod = 2

host steady + dynamic current, with host waves and wave elevation removed

WaveKinMod = 1, CurrentMod = 0/1

file elevation history, optionally with the file depth-table current

WaveKinMod = 2 or SEASTATE, CurrentMod = 0

host waves only; embedded SeaState steady current is removed

WaveKinMod = 2 or SEASTATE, CurrentMod = 1

host waves plus the file depth-table current; SeaState current is removed

WaveKinMod = 2 or SEASTATE, CurrentMod = 2

complete host SeaState wave/current field

SeaState stores its CurrMod-1 steady current inside the wave-velocity grid; its dynamic-current switch controls only the separate dynamic field. CableDyn evaluates the stock steady-current law at the same four vertical grid nodes with the same interpolation weights. A current-only request subtracts the wave-plus-steady sample and restores the steady component; a host-wave/file-current request removes the steady component before adding the file profile. Above-water no-stretch samples do not reuse stale grid weights, and current-only wetting uses still-water level. For vertical or extrapolation stretching above SWL, separation subtracts only SeaState’s surface-current value, because OpenFAST keeps the PWaveVel0 extrapolation derivative wave-only.

Standalone WaveKinMod-1 resamples over deck TMax, preserves an exact final sample, truncates or zero-pads records, and uses one padded DFT time base for coefficients and runtime frequencies. Coupled WaveKinMod-1 stops with an error, because the aggregate has no self-driven wave refresh. WaveKinMod-2 and in-file SEASTATE consume SeaState through the OpenFAST module and stop with an error when the host field is absent. CurrentMod-1 depth tables are bit-identical to inline currents.

Tests:

  • hydro checks the CurrMod-1 subsurface, near-surface, and depth-independent vector sum against the closed form, zero out of water, and rejection of unsupported current models.

  • deck_driver checks CurrentMod-1 table identity, SEASTATE token recognition, independent wave/current selectors, current-only parsing, explicit 0/0 host opt-out, file-only profile retention with a host present, missing-host rejection, Hermite-only rejection, and WaterKin mode provenance when a CurrentMod-1 file coexists with an inline wave OPTION. Its WaveKinMod-1 reference record check uses a record longer than TMax with a contaminated tail (the run window, not the file duration, is reduced); a short record is bit-identical to an explicitly zero-padded twin through TMax, including an exact final sample; a caller-driven WaveKinMod-1 deck must stop with an error.

  • openfast_aggregate checks selector and profile propagation into the coupled aggregate; openfast_shell checks the surrounding lifecycle.

  • src/openfast/CableDyn_OF.f90 compiles as the cabledynlib target against the OpenFAST SeaState and NWTC modules.

Two combinations stop with named errors instead of applying a mixed field: self-driven WaveKinMod-1 waves with WaterKin CurrentMod-2 host current, and a host SeaState using its own user-current CurrMod-2, which cannot be split into wave and current parts.

Torsion

Condensed isotropic torsion of finite-EI lines (theory in the manual) is checked against closed forms, against the Cosserat rod path, and against OrcaFlex 11.6d. The OrcaFlex values are summary values in tests/data/torsion_orcaflex_refs.txt, written by validation/scripts/orcaflex_torsion_reference.py (OrcFxAPI 11.6d, line torsion included, statics tolerance 1e-9 for pure torsion and 1e-8 otherwise, TensionTorqueCoupling 0, no seabed friction; about 5 min). Torque is positive for a right-handed twist of End B relative to End A, the OrcaFlex sign; OrcaFlex reports twist as a rate in deg/m and end twisting stiffness in kN·m/deg. Every case below is a CTest test (names in parentheses).

  • T-1 twist kernel (hermite_torsion_kernel). The geometric twist Θ of the centreline, its gradient and Hessian, with clamped and articulated ends, match automatic differentiation of an independent implementation on random large-deformation lines (Θ ≤4.4e-16, gradient ≤9.2e-16, Hessian ≤3.8e-15, relative) and finite differences (Hessian 5.3e-11). Θ is invariant under rigid rotation (2.2e-15), zero for planar curves, and equals −τℓ on a helix (9.0e-7 at 48 elements, fourth order); unwrapping is continuous through three turns; the π/2 step limit and the fold guard stop by name.

  • T-2 pure torsion (hermite_torsion_static, torsion_deck, torsion_orcaflex). A straight clamped rod with alternating GJ and end springs carries Φ/C to round-off with no lateral drift; through the deck, Torq, Twist<L>N<J> and Twist<L> follow GJ Φ/L and the end-spring compliance. Against OrcaFlex (90°, 450°, 1800° and −90°, γ_A 30° / γ_B 120°, two sections in series) the deck torque agrees to the 8 digits of the output. OrcaFlex’s line in this case has EI 1 kN·m², so every case but ±90° lies above its buckling onset; OrcaFlex statics stays on the straight branch there, while CableDyn’s stability check leaves it for the buckled shape. The deck therefore uses EI 1e3 kN·m²; the straight-branch torque does not depend on EI.

  • T-3 Greenhill onset (hermite_torsion_static, torsion_validation). The critical torque of a straight clamped rod under the dead tension T, bisected on the static stability report, against eq. 33 of van der Heijden et al. (2003): at TL²/EI = −20, 0, 10, 50, 200 the 32-element error is 1.8e-5, 9.0e-6, 7.5e-6, 6.8e-6 and 3.9e-5 with an observed order of 3.7 to 3.9; at 400 and 1600, where the onset approaches the infinite-rod value 2√(EI T) (ratio 1.0124 and 1.0031), the 128-element error is 3.8e-7 and 6.5e-6. Above the onset the straight state is reported unstable and the static solve descends to a stable buckled state of lower energy and relaxed torque. Dynamic loop formation and self-contact are not resolved (see Limits below).

  • T-4 semi-tangential end (hermite_torsion_static). A bending-pinned end restrained in torsion carries the torque about the bisector of the connection direction and the tangent. The onset is the root of tan x = −x/3 (4.9112877 EI/L at T = 0, 7.2692742 at TL²/EI = 10), reproduced to 6.4e-7 and 4.5e-7; it is not Greenhill’s 2π EI/L for an axial-torque hinge.

  • T-5 onsets against OrcaFlex (torsion_orcaflex). OrcaFlex detects the onset by bisection on its modal stability flag and converges at second order in the segment length; extrapolated, it reproduces eq. 33 to 3e-8–9e-6. CableDyn at 32 elements differs from the extrapolated OrcaFlex value by 9.1e-6, 7.4e-6, 5.0e-6 and 3.0e-5 (clamped, TL²/EI 0, 10, 50, 200) and 4.9e-6 and 6.8e-7 (OrcaFlex’s bending-free end with a twisting spring, TL²/EI 0 and 10), which confirms that both codes transmit torque semi-tangentially at such an end.

  • T-6 lazy-wave cable (torsion_orcaflex). The Lozon et al. (2025) Gulf of Mexico 80 m cable with an illustrative GJ of 50 kN·m² is clamped at both ends in its untwisted static orientation and twisted 1 to 5 turns at the hang-off. Against OrcaFlex at 0.375 m segments, the hang-off torque agrees to ≤0.019%, the geometric twist Θ to ≤1.8e-4 turn per imposed turn (Θ = 0.188 turn at 5 turns, so the torque is 3.8% below GJ Φ/L), the peak interior curvature to ≤0.056% (0.1197 against 0.1196 1/m at 5 turns), the out-of-plane offset to ≤27 mm of 6.8 m and the hang-off tension to ≤0.091%. The torque is uniform along the line. At zero twist the restrained deck reproduces the same cable without torsion columns (positions identical, tensions to 1.1e-8), the zero-twist parity case.

  • T-7 Kirchhoff helix (torsion_validation). A rod clamped on four turns of a helix (radius 1, pitch angle 30°, EI 1, 96 elements) with Φ = Θ_helix + M C, M = 0.5, stays on the helix (radius drift 2.4e-4 of the radius), and the end reaction, taken as the derivative of the discrete energy, is the helical wrench F = 0.058013 along the axis and K = 0.899519 about it to 1.5e-4 and 6.5e-5. A three-dimensional sagging line restrained with Φ equal to its own untwisted Θ (0.61 rad) reproduces the solve without torsion to solver tolerance.

  • T-8 Cosserat cross-check (torsion_validation). The same rod, solved by the cubic-Hermite element with condensed torsion (16 elements) and by the secondary Cosserat rod path (128 elements with shear, a different formulation with nodal rotations), clamped with its far end displaced and turned by exp([0.25, −0.3, 1.2]): the shapes agree to 4.2e-4 of the length and the torques to 5.2e-5. Pure torsion agrees to round-off. The Cosserat path has no stability report, so Greenhill onsets are not cross-checked on it.

  • T-9 bordered Newton step (torsion_validation). On a rod buckled out of plane at 1.05 and 1.20 times its clamped onset (GJ = 2.5 EI, the reference cable’s ratio), Newton with the bordered tangent B + ∇Θ∇Θᵀ/C (Sherman–Morrison on the band factor) returns from a 1e-6 perturbation in 3 iterations. Without the rank-one term the iteration converges only linearly, at the rate ρ = ∇Θᵀ B⁻¹ ∇Θ / C predicted for it: ρ = 0.055 and 0.218, observed 0.055 and 0.217 (5 and 9 iterations). On these stable states B itself remains positive definite.

  • T-10 dynamics, restart and bodies (hermite_torsion_dynamic, torsion_deck). An imposed twist step gives GJ Φ/L from the first step (2.2e-16): torsion has no inertia. A parent turned through 1.5 turns carries the twist without a 2π slip. A bowed, twisted line in free vibration (ρ∞ = 1, no drag) keeps its total energy, torsional part included, within a band of 4.9e-4 of the vibration energy over ten periods, while the torsional share swings by 22%. A run restored from a snapshot or rebuilt from the checkpoint mirror after more than one turn continues bit-identically. A Rigid6 body on a twisted line receives the torque along the line axis (3.6e-12), its net wrench equals the line loads, it turns against the torque in statics (net moment ≤1e-6 N·m), and released with a roll rate it swings as a torsional pendulum at √(GJ/(L I)) to 6.4e-5 of the torque amplitude, with clamped and with bending-pinned torsional ends. Stepped coarsely from rest, at Ω Δt = 2 and 5, the pendulum follows the closed form of the march’s trapezoidal body integrator at every step (≤9.7e-8°), so the body–twist coupling is stable at any step. The motionFile roll column and a rolling vessel give Twist<L> = −roll and the quasi-static torque at every step.

  • Backward compatibility and refusals (torsion_deck, full suite). Without torsion columns, with Free columns (whatever their normal), or with one restrained end, every output is byte-identical to the 6-column deck, and Rigid, Infinity, Inf and a quoted "Rigid" give the same run. Malformed rows, a missing GJ, an EI = 0 line, a rod end, a Point3 body, ATTACHMENTS, modal analysis, the configuration blend, misuse of the roll column, channels on an unrestrained line, the coupled entries and a mixed EI = 0 + finite-EI deck without a body stop with named errors.

Limits. The torsion model is quasi-static (no torsional inertia), takes no seabed friction against twist and no torque–tension coupling, and does not resolve self-contact. Dynamic loop formation (hockling) and a twisted slack catenary against OrcaFlex are not part of this record, and there is no experimental torsion case.

Cross-code comparison method

Cross-code validation compares physical observables, not another solver’s internal objects: endpoint loads and tensions, platform or vessel response, touchdown, and fields sampled at normalised arc length. MoorDyn point/rod node identities and RK integration states are not comparison targets.

validation/scripts/fem_observable_compare.py reads whitespace-delimited MoorDyn, OpenFAST, and CableDyn output, checks finite monotone coordinates, interpolates the candidate onto the reference coordinates, and applies normalised RMS error, bias, standard deviation, and peak-magnitude limits from a versioned JSON manifest. Each observable must carry at least one finite, non-negative limit; missing limits and duplicate names are rejected. Per-observable reference_scale / candidate_scale factors convert units (for example kN→N); the default is identity because the MoorDyn r-test tension histories and CableDyn both use N. An arc-profile mode normalises each solver’s ArcLength to 0–1 before interpolation, so mesh identity and small length differences do not matter.

Its self-test (fem_observable_compare) covers wrapped MoorDyn headers, CableDyn Time(s) headers without a units row, Fortran D exponents, unequal time grids, row width, non-numeric and overflow fields, truncated, overlong, and duplicate columns, limit failures, and rejection of a rod-node name as a comparison object. validation/scripts/rtest_fem/moordyn_line_cases.template.json lists line-dominated MoorDyn r-test cases for this comparison. It is a template, not validation evidence.

Module tests

Every Fortran module has a CTest program that compares its output with a closed form, an independent numerical reference, or a conserved quantity; all compile with -Wall -Wextra. Coverage: mesh, element, assembly, loads, static solve, catenary seed, robust initialisation, composite line, and deck driver (EI = 0 path); Hermite element, static, dynamic, drag, added mass, and wave forcing (finite-EI path); SO(3), AD, and Cosserat strains, force, mass, dynamics, and EMC (secondary Cosserat path, ctest -L cosserat); and linalg, hydro, damping, prescribed motion, and snap load.

Finite-EI deck tests cover smoke, prescribed motion, current seed, modified-Newton identity, lazy-wave, contact, and per-line output cases on the cubic-Hermite path:

  • Installing the t=0 held current field recomputes a consistent initial acceleration.

  • A prescribed-motion deck starting with a position offset and nonzero velocity and acceleration has t=0 node channels equal to motion row 1.

  • Contact tests cover the C1 normal penalty, compression-only damping, friction sensitivity, and identical response for a flat WtrDpth bed and a constant structured bathymetry. Installing contact refreshes the initial acceleration, and malformed nodal contact data are rejected before the committed state changes.

  • Seed and deck-driver tests include a slack grounded span with both endpoints above the bed and a surplus-length two-touchdown seed.

  • An FMF lifecycle test offsets motion row 1 from the deck fairlead, checks that the post-commit refresh changes free-node acceleration while keeping the prescribed boundary acceleration, and evaluates M*a + f_int - f_ext from the unfactored mass and residual workspaces to show that the M_fp*a_p coupling term is included.

  • The OpenFAST aggregate adds flat and structured contact, nonzero friction, moving-fairlead stepping, and snapshot/restore tests. openfast_touchdown runs the IEA-15 mixed example at 40 Hz and requires a multi-node grounded run.

Python post-processing tests

These tests certify workflow and arithmetic integrity; they do not replace the solver validation above.

  • Results and studies: native-table parsing, immutable typed arrays, unit preservation, static and dynamic range statistics, protection of source files during export, and result discovery. Batch studies record source/generated-deck and solver SHA-256 provenance, keep manifest order deterministic under process-level concurrency, continue after an individual failure, keep stdout/stderr logs, and return explicit nonzero CLI exit codes.

  • Fatigue: reproduces the ASTM E1049 example cycle table exactly (cycle weight, range, mean, reversal indices), plus plateau/endpoint reversals, residual half-cycles, constant and monotonic histories, exact unbinned DEL range, Wöhler/reference-count validation, overflow-resistant scaling, histogram conservation, unit propagation, atomic CSV export, plotting, and CLI behaviour. It certifies the counting arithmetic, not an S–N curve, Miner life, or mean-stress correction.

  • Spectra: exact-bin analytical sinusoids verify one-sided Welch density scaling, periodic-Hann power, Parseval/variance consistency, DC/Nyquist moment weighting, amplitude-squared scaling, zero-padding power conservation, spectral moments, dominant frequencies, compound-unit propagation, and duration consistency. Coherence tests require multiple segments, recover unity at a shared frequency, and mark low-power bins NaN. Nonuniform time, inconsistent FFT/overlap settings, source-file export targets, and malformed rows are rejected. These tests do not assess stationarity, statistical confidence, or record length.

Reproducing

From an activated cabledyn environment (see the development guide):

cmake -S . -B build
cmake --build build
ctest --test-dir build --output-on-failure
ctest --test-dir build -L fortran -LE slow   # fast development tier
ctest --test-dir build -L l1                 # the 10 analytical L1 cases

Expected: all registered tests pass with the conda-forge toolchain (215 tests in the release record’s build, with every optional Python dependency present). analytical_catenary_arbiter, python_package and a few platform-specific tests register only when their dependencies are available, so the count varies between builds. 10 tests carry the l1 label; 7 carry cosserat (secondary Cosserat path regressions, not part of this record). Python-based checks include example_deck_style (the OPTIONS and OUTPUTS record style of every example deck), documentation_sources (Sphinx navigation, :doc: targets, and included Markdown), and fem_observable_compare.

A single test program, such as test_cable_dynamic in the build tree (build/, or build/bin/ on Windows GNU builds), can be run directly; it prints PASS: or stops at the first mismatch. The build is warning-clean under -std=f2018 -Wall -Wextra -fimplicit-none with conda-forge gfortran, CMake ≥ 3.20, LAPACK, and OpenMP when available.