Tutorial 9 — A floating wind turbine in OpenFAST

Goal: run the IEA-15MW reference turbine on the UMaine VolturnUS-S semi-submersible in the release openfast.exe (OpenFAST, maintained by NLR, the National Laboratory of the Rockies, formerly NREL) with CableDyn as its mooring module (CompMooring = 5), read the CableDyn results, compare against stock MoorDyn in the same binary, and add a lazy-wave power cable.

Needs: openfast.exe from the release, the examples folder, and Git (or a browser) to fetch the turbine model · Run time: about 5 s for 70 s of simulation (the MoorDyn comparison run takes a few minutes)

1. Fetch the turbine model

The CableDyn repository ships the mooring decks and .fst templates in examples/openfast/, but not the turbine sub-models (ElastoDyn, SeaState, HydroDyn with its WAMIT database, AeroDyn, InflowWind), which are maintained by the OpenFAST project. The templates are wired to the IEA-15MW turbine-1 files of OpenFAST’s regression-test case glue-codes/fast-farm/MD_Shared. Use the revision the release was tested against, dd5feaaaa500ba7283140107806300d551cff0a7.

With Git (downloads only that folder, about 7 MB):

Set-Location C:\CableDyn
git clone --filter=blob:none --no-checkout https://github.com/OpenFAST/r-test.git
Set-Location r-test
git sparse-checkout set glue-codes/fast-farm/MD_Shared
git checkout dd5feaaaa500ba7283140107806300d551cff0a7
Set-Location ..

Without Git, download https://github.com/OpenFAST/r-test/archive/dd5feaaaa500ba7283140107806300d551cff0a7.zip (the whole regression suite, much larger) and extract only glue-codes/fast-farm/MD_Shared to C:\CableDyn\r-test\glue-codes\fast-farm\MD_Shared.

2. Assemble the case folder

Copy the turbine model and the CableDyn/MoorDyn integration files (every .fst and .dat in examples\openfast) into one folder:

$case = 'C:\CableDyn\iea15_case'
New-Item -ItemType Directory -Force $case | Out-Null
Copy-Item -Recurse .\r-test\glue-codes\fast-farm\MD_Shared\* $case
Copy-Item .\examples\openfast\*.fst, .\examples\openfast\*.dat $case
Set-Location $case

The folder now holds, among others:

File

Role

IEA-15-UMaine_CompMooring5_CableDyn.fst

top-level OpenFAST input selecting CableDyn

CableDyn_UMaine.dat

the CableDyn MooringFile: three 850 m R4 chains, 200 m water depth

IEA-15-UMaine_CompMooring3_MoorDyn.fst / MoorDyn_UMaine.dat

the identical model with stock MoorDyn, for the A/B

IEA-15-240-RWT-UMaineSemi_ElastoDynT1.dat, ..._HydroDynT1.dat, SeaState.dat, HydroData\, Airfoils\, …

the turbine and platform model from MD_Shared

3. Make the model a single turbine at the origin

MD_Shared is a two-turbine FAST.Farm case. Its turbine-1 files start the platform at its farm pose (20.3 m surge, 180° yaw, small roll/pitch/heave) and set HydroDyn’s reference yaw PtfmRefY to 180°. The CableDyn and MoorDyn templates place the fairleads in platform axes and the anchors around the origin, so reset the platform to the origin:

$ed = 'IEA-15-240-RWT-UMaineSemi_ElastoDynT1.dat'
(Get-Content $ed) -replace '^\s*\S+(\s+Ptfm(Surge|Sway|Heave|Roll|Pitch|Yaw)\s)', '          0$1' |
    Set-Content $ed -Encoding ascii
$hd = 'IEA-15-240-RWT-UMaineSemi_HydroDynT1.dat'
(Get-Content $hd) -replace '^\s*\S+(\s+PtfmRefY\s)', '             0$1' |
    Set-Content $hd -Encoding ascii

This sets PtfmSurge, PtfmSway, PtfmHeave, PtfmRoll, PtfmPitch, PtfmYaw (ElastoDyn) and PtfmRefY (HydroDyn) to zero and changes nothing else.

Warning

Skipping this step still runs to completion, but the yawed, offset platform stretches line 1 far beyond its 850 m length: CableDyn and MoorDyn then both report a physically meaningless 321 MN fairlead tension. Always read the initial fairlead tensions before trusting a coupled run.

4. How CableDyn is wired in

Two rows of the .fst select the module and its input:

      5   CompMooring     - Compute mooring system (switch) {0=None; 1=MAP++; 2=FEAMooring; 3=MoorDyn; 4=OrcaFlex; 5=CableDyn}
"CableDyn_UMaine.dat"  MooringFile     - Name of file containing mooring system input parameters (quoted string)

The rest of the template: TMax = 70 s, glue step DT = 0.025 s, ElastoDyn, SeaState, and HydroDyn on; InflowWind, AeroDyn, and ServoDyn off (no wind, no controller DLL needed). SeaState.dat from MD_Shared specifies an irregular JONSWAP sea, Hs = 6 m, Tp = 12 s.

Division of responsibility:

  • OpenFAST owns the clock (TMax, DT), gravity, water density, water depth, the platform motion, and the wave/current field (SeaState). Their values in the CableDyn deck are overridden; motionFile and deck waves rows are rejected in a coupled deck, and a deck current row is kept only as a steady current on a single-turbine, pure EI = 0 deck without Rigid6 bodies or rods in a SeaState without waves or current.

  • The CableDyn deck owns line types, points, lines, sections, seabed contact, solver settings, its own time step dtM, and the OUTPUTS list. Fairlead Coupled points are given in platform axes; Fixed anchors in global axes.

  • The time step. CableDyn_UMaine.dat sets dtM = 0.025 = DT, so CableDyn solves every glue step. Without a deck dtM, CableDyn targets 0.1 s rounded to a whole number of glue steps and holds its loads between solves. For fatigue, snap, or touchdown work use dtM = DT or prove that a coarser value converges.

The complete ownership table is in OPTIONS reference and defaults; the coupling contract in OpenFAST with CompMooring = 5.

5. Run it

C:\CableDyn\openfast.exe .\IEA-15-UMaine_CompMooring5_CableDyn.fst

The CableDyn part of the console (other modules’ lines trimmed):

Running CableDyn (v0.1.0, 2026-10-01).
  CableDyn: geometrically nonlinear cable & mooring dynamics for floating wind.
  ...
  CableDyn time step dtM = 2.50000E-02 s (1 x glue DT; deck dtM    )
 Parsing CableDyn input file: .\CableDyn_UMaine.dat
  CableDyn: SeaState wave/current kinematics drive the mooring hydro (153 sampling nodes,
  refreshed every mooring step).
  Created CableDyn model: 3 line object(s), 6 point(s), 3 section(s) [EI=0: 3, finite-EI: 0].
  Initial conditions: Newton static equilibrium with load continuation completed.
  Line results below are at this equilibrium; SeaState kinematics act from t = 0.
  Fairlead convention: force is on End A toward End B; inclinations are signed below horizontal.
  Line 1 fairlead effective tension: 2.43712E+06 N
     force [Fx, Fy, Fz]: [-1.35070E+06, 0, -2.02858E+06] N, inclination=56.343 deg
     line tangent: inclination=55.685 deg, declination=145.68 deg, azimuth=180 deg
  Line 2 fairlead effective tension: 2.43715E+06 N
     ...
 CableDyn initialization completed.
   Requested CableDyn OUTPUTS at t = 0 s (equilibrium pose, SeaState kinematics at t = 0):
     FairTen1 = 2.43621E+06 (N)
     AnchTen1 = 1.35173E+06 (N)
     FairIncl1 = 55.685 (deg)
     ...
   These values are also the t = 0 CableDyn columns in the OpenFAST output file.
Time: 0 of 70 seconds.
...
Total Real Time:       4.63 seconds
Simulated Time:        70 seconds
Time Ratio (Sim/CPU):  15.887

OpenFAST terminated normally.

Check, in order:

  1. Running CableDyn ( — the CableDyn-enabled executable is in use. A stock OpenFAST rejects CompMooring = 5 during input validation.

  2. The line inventory (3 lines, 6 points) and dtM.

  3. The initial fairlead tensions: 2.437 MN per line, with the line tangent 55.7° below horizontal, as in the standalone spread_3line_chain.dat of Tutorial 2 — A spread mooring and its output channels. The tension is the magnitude of the line-end force, which includes the fairlead node’s share of the chain weight, so the force points slightly steeper, 56.3° below horizontal, with a horizontal component of 1.351 MN.

  4. The OUTPUTS at t = 0: FairTen1 reads 2.436 MN, 0.04 % below the equilibrium value above. The equilibrium is solved before the SeaState kinematics act, and at t = 0 the wave kinematics add their hydrodynamic load on the fairlead end node. In still water (WaveMod = 0) the two values are equal. .CD.static.out holds the equilibrium, and the t = 0 row of .CD.out and of the main .out holds the t = 0 values.

  5. OpenFAST terminated normally.

6. Result files

File

Contents

IEA-15-UMaine_CompMooring5_CableDyn.out

the OpenFAST table at DT_Out: platform motions, tower loads, …, and the CableDyn OUTPUTS channels

IEA-15-UMaine_CompMooring5_CableDyn.CD.out

CableDyn’s own table: the OUTPUTS channels at t = 0 and at every committed CableDyn step (every dtM), with a units row

IEA-15-UMaine_CompMooring5_CableDyn.CD.static.out

the initial nodal equilibrium of every line (arc length, coordinates, tension, curvature, bend moment, declination, inclination, azimuth) — the coupled range graph

*.ED.sum, *.HD.sum

the usual OpenFAST module summaries

Time           FairTen1         AnchTen1         FairIncl1       AnchIncl1       FairTen2 ...
(s)            (N)              (N)              (deg)           (deg)           (N)      ...
  0.0000000E+00   2.436210E+06   1.351729E+06    5.568478E+01   -1.961023E-02   2.435610E+06 ...
  2.5000000E-02   2.434498E+06   1.352272E+06    5.568418E+01   -1.957846E-02   2.433048E+06 ...

CableDyn channels are chosen in the deck’s OUTPUTS section (keep its closing END), not in the .fst OutList. Channel names and units: Output files and channels; sign and angle conventions: Conventions.

7. Compare with MoorDyn

The same binary still contains stock MoorDyn. The twin .fst differs only in CompMooring = 3 and MooringFile = "MoorDyn_UMaine.dat". That deck sets the MoorDyn option SeaState WaterKin, so MoorDyn’s lines see the same SeaState waves that CableDyn samples at its line nodes by default. Without that row MoorDyn lines see still water while CableDyn’s see the waves, and the fairlead tension standard deviations then differ by tens of percent for reasons that have nothing to do with the solvers:

C:\CableDyn\openfast.exe .\IEA-15-UMaine_CompMooring3_MoorDyn.fst

Its console shows Running MoorDyn (v2.3.8, ...), Water kinematics will be simulated using the SeaState method, a dynamic-relaxation initialisation, and MoorDyn initialization completed.; MoorDyn writes ...MD.out and puts its channels (upper-case FAIRTEN1 …) in the main .out. Statistics over 10–70 s from the two main output files:

Channel

CableDyn mean

MoorDyn mean

CableDyn std

MoorDyn std

PtfmSurge (m)

0.893

0.893

1.364

1.363

PtfmHeave (m)

−1.030

−1.030

1.216

1.215

PtfmPitch (deg)

1.497

1.497

1.382

1.381

fairlead tension, line 1 (MN)

2.452

2.452

0.136

0.136

fairlead tension, line 2 (MN)

2.376

2.376

0.069

0.069

The platform motions agree to within 0.2 %, the mean fairlead tensions to within 0.01 % and their standard deviations to within 0.5 %. Both codes report the fairlead tension as the force at the line end, which includes the end node’s share of the chain weight. On this stiff chain the MoorDyn deck uses a 0.2 ms explicit step and a dynamic-relaxation start and evaluates the SeaState kinematics at every node of every substep, so allow a few minutes for that run.

To compare in still water instead, set WaveMod = 0 in SeaState.dat for both runs. To keep the waves on the platform but remove them from CableDyn’s lines (for example against a MoorDyn deck without WaterKin), point the CableDyn deck’s WaterKin row at a MoorDyn-style WaterKin file with WaveKinMod 0 and CurrentMod 0 (MoorDyn-F WaterKin file modes).

A 70 s run is a smoke test, not a comparison. For a real A/B, keep wind, waves, controller, DT, output channels, and initial conditions identical, discard the start-up transient, run at least one hour of analysis window, and compare statistics, spectra, and damage-equivalent loads (Tutorial 8 — Python studies and post-processing). The published comparisons are in CableDyn verification and validation.

8. Add a lazy-wave power cable

examples/iea15mw_umaine_mixed_cabledyn.dat adds a fourth, finite-EI line to the same three chains: a dynamic power cable from a platform hang-off to a seabed termination, with a bare/buoyant/bare section layout that forms a lazy wave and a grounded tail on the 200 m seabed. Copy it into the case folder and point a copy of the .fst at it:

Copy-Item C:\CableDyn\examples\iea15mw_umaine_mixed_cabledyn.dat .
(Get-Content .\IEA-15-UMaine_CompMooring5_CableDyn.fst) `
    -replace '"CableDyn_UMaine.dat"', '"iea15mw_umaine_mixed_cabledyn.dat"' |
    Set-Content .\Mixed_CableDyn.fst -Encoding ascii
C:\CableDyn\openfast.exe .\Mixed_CableDyn.fst
Created CableDyn model: 4 line object(s), 8 point(s), 6 section(s) [EI=0: 3, finite-EI: 1].
...
Line 4 fairlead effective tension: 11898 N
   force [Fx, Fy, Fz]: [1218.2, 0, -11835] N, inclination=84.123 deg
   line tangent: inclination=83.927 deg, declination=173.93 deg, azimuth=0 deg
...
   Curv4N20 = 9.15231E-02 (1/m)
   BendMom4N20 = 1821.3 (N.m)

CableDyn found the cable’s touchdown and lazy-wave shape by itself: in Mixed_CableDyn.CD.static.out, 38 of line 4’s 88 nodes lie on the seabed. The chain moorings use the cable element and the power cable the cubic-Hermite bending element, in one deck and one coupled solve. Plot line 4’s Curvature against ArcLength before looking at the time history, and request Curv4N<J>/BendMom4N<J> channels at the hang-off, sag bend, arch, and touchdown for fatigue.

Exercises

  1. Wind. Set CompInflow = 1 and CompAero = 2 in a copy of the .fst (the MD_Shared InflowWind and AeroDyn files are already present) and compare the mean surge and line-1 tension with the parked case.

  2. Supercycling. Remove the dtM row from CableDyn_UMaine.dat. The console now reports dtM = 0.1 s (4 x glue DT; the default ), the run takes about 3 s instead of 5 s, and .CD.out has one row per 0.1 s. Here the line-1 tension statistics over 10–70 s barely move (mean 2.453 MN, std 0.136 MN, against 2.452 and 0.136 MN); verify that for your own quantities before adopting a coarser step.

  3. Still water. Set WaveMod = 0 in SeaState.dat. Without waves the platform settles toward its still-water pose (mean heave −1.1 m, pitch 1.5°) with a decaying heave–pitch oscillation, and the line-1 tension stays within ±2 % of 2.41 MN.

Where next: OpenFAST with CompMooring = 5 (checkpoint/restart, linearisation, FAST.Farm, line failures, active tensioning), Coupling boundary, and Troubleshooting.