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 ( |
closed-form |
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 |
|
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 |
|
4.1e-4 |
<1e-3 |
Pass |
L1-6 |
Euler-beam vibration |
|
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 |
|
<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 |
|
≤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) |
|
round-off; ≤1.7e-8 |
<1e-12; <1e-7 |
Pass |
T-3 |
Greenhill onset, clamped, |
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 |
|
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.
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.
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. TheFairTenline-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-3stops about 32% short of the settled shape, so the MoorDyn-F references usethreshIC = 1e-5and 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 theFairTenchannel 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_dynamicwrites each site’s along-arc curvature profile.validation/scripts/curvature_profile_overlay.pyassembles the 800 m 3-code overlay, records each series’ peak curvatures, their arc positions and envelope quantiles intests/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 Hzopenfast_touchdowntest; 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 referencePosition+TranslationDisp); tested byptfm_init_equivalenceand 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 sNumCrctn = 1OpenFAST run matches stock MoorDyn to ≤0.16% of range and is bit-identical to its ownNumCrctn = 0run.
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_stiffnessinopenfast_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 |
|
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 sthe 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. WithOpenFAST 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 (nodynamic_solveroverride, 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 lengthslambda = (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 andadaptive_mesh=Truekeeps 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_concurrencyruns 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 sevenBAD_HANDLErejections.c_api_sharedcompiles a C consumer againstCableDyn_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 inbin/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.exetakes 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-onlyPATH, solveschain_catenary_shallow_30m.dat, and completesCompMooring = 5andCompMooring = 3OpenFAST smoke models (ModCoupling = 3,NumCrctn = 0) that must print the initialisation inventory, the fairlead report, and theFairTen1channel. IFX versions older than 2025.3 are rejected.CableDyn_driver.exeimports onlyKERNEL32.dll,SHELL32.dllandimagehlp.dll, andopenfast.exeonlyKERNEL32.dllandimagehlp.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 |
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, CableDynFairTen, 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 anchorH(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 deckl2_lozon200_semitaut_deckwith 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 |
Pass verified |
6-DOF displaced free decay ≤0.51% |
Correction iterations ( |
Pass verified |
bit-identical to own |
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 |
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 |
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 ( |
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 ( |
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 |
Active tension ( |
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 |
Coupled |
Pass verified |
6-DOF |
Coupled rigid rods |
Pass verified |
host-driven |
Coupled finite-EI touchdown/contact |
Pass verified |
flat |
|
Pass verified |
|
Syrope polyester ( |
Pass verified |
MoorDyn-F/C `BA_s |
VIV ( |
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 |
|---|---|
|
no host wave or current contribution |
|
file depth-table current only |
|
host steady + dynamic current, with host waves and wave elevation removed |
|
file elevation history, optionally with the file depth-table current |
|
host waves only; embedded SeaState steady current is removed |
|
host waves plus the file depth-table current; SeaState current is removed |
|
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:
hydrochecks 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_driverchecks CurrentMod-1 table identity,SEASTATEtoken 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 thanTMaxwith a contaminated tail (the run window, not the file duration, is reduced); a short record is bit-identical to an explicitly zero-padded twin throughTMax, including an exact final sample; a caller-driven WaveKinMod-1 deck must stop with an error.openfast_aggregatechecks selector and profile propagation into the coupled aggregate;openfast_shellchecks the surrounding lifecycle.src/openfast/CableDyn_OF.f90compiles as thecabledynlibtarget 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π/2step limit and the fold guard stop by name.T-2 pure torsion (
hermite_torsion_static,torsion_deck,torsion_orcaflex). A straight clamped rod with alternatingGJand end springs carriesΦ/Cto round-off with no lateral drift; through the deck,Torq,Twist<L>N<J>andTwist<L>followGJ Φ/Land the end-spring compliance. Against OrcaFlex (90°, 450°, 1800° and −90°,γ_A30° /γ_B120°, two sections in series) the deck torque agrees to the 8 digits of the output. OrcaFlex’s line in this case hasEI1 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 usesEI1e3 kN·m²; the straight-branch torque does not depend onEI.T-3 Greenhill onset (
hermite_torsion_static,torsion_validation). The critical torque of a straight clamped rod under the dead tensionT, bisected on the static stability report, against eq. 33 of van der Heijden et al. (2003): atTL²/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 value2√(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 oftan x = −x/3(4.9112877 EI/L atT = 0, 7.2692742 atTL²/EI = 10), reproduced to 6.4e-7 and 4.5e-7; it is not Greenhill’s2π EI/Lfor 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²/EI0, 10, 50, 200) and 4.9e-6 and 6.8e-7 (OrcaFlex’s bending-free end with a twisting spring,TL²/EI0 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 illustrativeGJof 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% belowGJ Φ/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°,EI1, 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 wrenchF= 0.058013 along the axis andK= 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 byexp([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 tangentB + ∇Θ∇Θᵀ/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⁻¹ ∇Θ / Cpredicted for it: ρ = 0.055 and 0.218, observed 0.055 and 0.217 (5 and 9 iterations). On these stable statesBitself remains positive definite.T-10 dynamics, restart and bodies (
hermite_torsion_dynamic,torsion_deck). An imposed twist step givesGJ Φ/Lfrom the first step (2.2e-16): torsion has no inertia. A parent turned through 1.5 turns carries the twist without a2π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. ThemotionFileroll column and a rolling vessel giveTwist<L> = −rolland the quasi-static torque at every step.Backward compatibility and refusals (
torsion_deck, full suite). Without torsion columns, withFreecolumns (whatever their normal), or with one restrained end, every output is byte-identical to the 6-column deck, andRigid,Infinity,Infand a quoted"Rigid"give the same run. Malformed rows, a missingGJ, anEI = 0line, a rod end, aPoint3body,ATTACHMENTS, modal analysis, the configuration blend, misuse of the roll column, channels on an unrestrained line, the coupled entries and a mixedEI = 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=0held current field recomputes a consistent initial acceleration.A prescribed-motion deck starting with a position offset and nonzero velocity and acceleration has
t=0node channels equal to motion row 1.Contact tests cover the C1 normal penalty, compression-only damping, friction sensitivity, and identical response for a flat
WtrDpthbed 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_extfrom the unfactored mass and residual workspaces to show that theM_fp*a_pcoupling term is included.The OpenFAST aggregate adds flat and structured contact, nonzero friction, moving-fairlead stepping, and snapshot/restore tests.
openfast_touchdownruns 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.