One Line. Four Models. Which One, and When?

One Line. Four Models. Which One, and When?

Mooring lines bend, sag, drag along the seabed, and reshape with every platform motion. The force that shape produces at any given moment drives early design, safety margins, and real-time controllers alike. Four models answer that question — at speeds ranging from sub-millisecond to minutes.

This post benchmarks all four on the OC4 DeepCwind semi-submersible geometry — defined in Robertson et al. (2014), NREL/TP-5000-60510. Same anchor, same line, same offset — different fidelity, different cost.

OC4 platform animation

OC4 DeepCwind semi-submersible with NREL 5MW turbine undergoing circular surge (±10 m radius, 12 s loop). Three catenary mooring lines at 0°/120°/240° update each frame — brown = seabed contact segment, blue = suspended catenary.


The OC4 Setup

ParameterValue
Water depth200 m
Line length (unstretched)835.5 m
Submerged weight1 066 N/m
Nominal fairlead offset796.7 m
Nominal pretension≈ 1 112 kN
Minimum breaking load (MBL)1 786 kN

The anchor sits at (0, −200 m); the fairlead at (796.7, −14 m) in still water. A portion of the line rests on the seabed, acting as a passive restoring spring.


The Analytical Catenary

No tooling, sub-millisecond, broad operating range — this is your first answer and your design-space sweep.

The oldest trick in mooring engineering: treat the line as an inextensible, flexible cable under its own weight. Two equations — horizontal and vertical equilibrium — give a closed-form shape once horizontal tension $H$ and seabed touchdown length $L_b$ are known. A Newton solver finds $(H, L_b)$ in under a millisecond.

\[x_\text{span} = \frac{H}{w}\sinh\!\left(\frac{w L_s}{H}\right), \qquad z_\text{span} = \frac{H}{w}\!\left(\cosh\!\left(\frac{w L_s}{H}\right) - 1\right)\] \[T_\text{fairlead} = \sqrt{H^2 + (w L_s)^2}\]

where $w$ is submerged weight per unit length, $L_s = L - L_b$ is the suspended length, and $(x_\text{span},\, z_\text{span})$ must match the anchor-to-fairlead geometry.

Catenary sweep animation

Animation A: Line 1 shape as fairlead offset increases from 750 m to 850 m. Red = tension exceeds 50 % MBL.

Result at 795 m: T ≈ 1 068 kN (60 % MBL) — about 58 kN above the FEM, because this inextensible idealization ignores the line’s elastic stretch. Fast and closed-form, but it reads a few percent high.

Limitations: Tension reported at fairlead only — spatial distribution along the line is unknown. No bending stiffness, no hydrodynamic drag. This implementation is quasi-static — add inertia and drag terms along the line and you move into MoorDyn/OrcaFlex territory.

Catenary gives fairlead tension. It cannot tell you where along the line the load peaks — for that, reach for FEM.


The Finite Element Model

When you need a spatially resolved tension profile and the most complete physics — an elastic line resting on the seabed, not an inextensible idealization — this is the model to reach for.

Line 1 is cut into 20 straight rod segments — Lagrange P1 elements (P1 = linear, so displacement varies linearly along each rod) carrying a 3D displacement vector $(u_x, u_y, u_z)$ at each end node. C0 continuity means displacement is smooth across element boundaries — no gaps or jumps in shape — while strain (the derivative) can jump, which is fine for a chain modelled as pin-jointed rods. The unknown field $\mathbf{u}(s)$ is the 3D displacement from a straight reference configuration at seabed depth. Deformed position and Green–Lagrange axial strain:

\[\frac{d\mathbf{x}}{ds} = \left(1 + \frac{du_x}{ds},\; \frac{du_y}{ds},\; \frac{du_z}{ds}\right), \qquad E = \frac{1}{2}\!\left(\left\|\frac{d\mathbf{x}}{ds}\right\|^2 - 1\right)\]

The chain cannot push ($E < 0$ → slack), so the second Piola–Kirchhoff stress $S = EA\,\max(E, 0)$ — a stress measure defined in the original undeformed geometry, keeping the math on a fixed reference frame even as the chain deforms significantly; multiplying $S$ by cross-section $A$ and axial stretch gives the physical tension in Newtons. Internal virtual work and gravity loading:

\[\delta W_\text{int} = S\,\frac{d\mathbf{x}}{ds}\cdot\frac{d\mathbf{v}}{ds}\,ds, \qquad \delta W_\text{ext} = \mathbf{f}_\text{grav}\cdot\mathbf{v}\,ds, \quad \mathbf{f}_\text{grav} = (0,\,0,\,-w)\]

A one-sided contact penalty at the seabed ($z \ge -200$ m) keeps the slack portion resting on the floor instead of free-hanging below it. The tension-only tangent is singular wherever elements go slack, so I ramp gravity in a few load steps and factor each tangent directly; Newton–Raphson then converges in a handful of iterations. FEM runs inside the dolfinx/dolfinx:stable Docker image; it is not available natively on Windows.

FEM tension profile animation

Animation B: Nodal tension along Line 1 as offset sweeps 773 → 795 → 773 m. White dots = 5 Guyan master nodes. Color = T / MBL.

Result at 795 m: T ≈ 1 010 kN (57 % MBL). I take this as the reference for the benchmark below. The elastic line carries a little less than the inextensible catenary’s 1 068 kN because it actually stretches (EA = 753.6 MN) and sags slightly more — a physical difference, not numerical. Across the 773 → 795 m sweep the catenary sits ≈ 34 kN above it.

And here is the twist worth stating plainly: evaluated at the actual documented equilibrium — the 796.7 m nominal fairlead offset, not the nearby 795 m sweep endpoint — the FEM reads 1 081.5 kN against the documented OC4 pretension of about 1.1 MN at rest (Robertson et al., 2017), −2.7 % low. The inextensible catenary reads 1 151.5 kN at the same offset, +3.6 % high. So the FEM tracks closer to the documented benchmark than the inextensible catenary does — it is what I take as ground truth, and the fast analytical catenary becomes just another approximation to measure.

Limitations: This implementation is quasi-static — no inertia or drag along the line; add mass and drag terms per element for a dynamic formulation. Lagrange P1 truss — no bending stiffness (correct for chain with pin joints). Requires WSL2 + conda-forge or Docker to run.

FEM gives full resolution. It needs Docker and seconds per solve — for real-time use, Guyan reduces that cost by three orders of magnitude.


Guyan Reduction

Tight near the operating point, millisecond speed, assembled once — reach for this when your simulation loop tracks small motions and cannot afford a full FEM solve.

Guyan reduction partitions the full FEM stiffness matrix $\mathbf{K}$ into master (retained) and slave (condensed) DOFs:

\[\begin{bmatrix}\mathbf{K}_{mm} & \mathbf{K}_{ms}\\ \mathbf{K}_{sm} & \mathbf{K}_{ss}\end{bmatrix} \begin{bmatrix}\mathbf{u}_m\\ \mathbf{u}_s\end{bmatrix} = \begin{bmatrix}\mathbf{f}_m\\ \mathbf{0}\end{bmatrix}\]

Static condensation eliminates slave DOFs analytically:

\[\mathbf{K}_r = \mathbf{K}_{mm} - \mathbf{K}_{ms}\,\mathbf{K}_{ss}^{-1}\,\mathbf{K}_{sm}\]

We keep 5 nodes at the line quartiles — anchor, quarter-span, mid-span, three-quarter-span, and fairlead — an even spatial sampling that captures the line shape without tuning the reduction to any one load case. This gives a $15\times15$ reduced system $\mathbf{K}_r$ (5 nodes × 3 DOF/node) assembled once at nominal offset. Subsequent queries need only a $15\times15$ linear solve: three orders of magnitude faster than re-running FEM.

1
2
3
4
5
6
7
n_nodes = n_elements + 1
dof_per_node = K.shape[0] // n_nodes        # 3 for 3D Lagrange P1 (u_x, u_y, u_z)
# 5 master nodes at the line quartiles: 0, 25, 50, 75, 100% of arc length
node_idx = sorted({round(q) for q in np.linspace(0, n_nodes - 1, 5)})
master_dofs = [d for node in node_idx
               for d in range(dof_per_node*node, dof_per_node*node + dof_per_node)]
K_r, _ = guyan_reduce(K, master_dofs)       # 15×15

Guyan condensation animation

Animation C: 21 FEM nodes condense to 5 master DOFs (red) at the line quartiles — anchor, quarter-span, mid-span, three-quarter-span, fairlead. Remaining nodes (gray) are eliminated analytically.

Result at 795 m: T ≈ 964 kN — about 47 kN below the FEM at this 9 m excursion. Within ±1 m of nominal it tracks the full FEM to a few kN; the error grows toward ~94 kN at the slack end because $\mathbf{K}_r$ is a single fixed linearization. Mean ≈ 31 kN over the sweep — the closest of the three to the FEM, since it is built from the FEM tangent. Assembly requires Docker once; queries run anywhere.

Limitations: $\mathbf{K}_r$ assembled once at nominal offset — predictions degrade for large excursions. Inherits FEM truss geometry. 5 master nodes give partial spatial resolution only. This implementation is quasi-static; mass and damping terms are not condensed.

Guyan still requires a FEM assembly step. For solver-free co-simulation at runtime, the data-driven FMU eliminates that dependency entirely.


The Data-Driven Model

Physics baked into weights — inference replaces the Newton solve at runtime. Packages into any co-simulation environment.

The first attempt used a Gaussian Process Regressor on 12 OC4 catenary reference points — mean error ±54 kN. The fix: generate 750 synthetic points from the analytical catenary across a $30\times5\times5$ grid of offsets, pretension factors, and water depths, then train a two-hidden-layer MLP (128 → 64 neurons, ReLU, Adam):

\[\hat{y} = W_3\,\sigma\!\bigl(W_2\,\sigma(W_1\,\mathbf{x} + \mathbf{b}_1) + \mathbf{b}_2\bigr) + b_3, \qquad \sigma = \text{ReLU}\] \[W_1 \in \mathbb{R}^{128 \times 3},\quad W_2 \in \mathbb{R}^{64 \times 128},\quad W_3 \in \mathbb{R}^{1 \times 64}\]

MLP architecture

Figure E: Left — first attempt: GPR (RBF kernel) trained on 12 OC4 catenary reference points, mean error ±54 kN. Right — fix: MLP (3 → 128 → 64 → 1, ReLU, Adam) trained on 750 synthetic catenary points, mean error ±10 kN. Three identical networks trained independently for $F_x$, $F_z$, and $T$.

Targets are divided by $10^6$ before training (keeping gradients in $[-2,\,2]$) and multiplied back at inference:

\[T_\text{pred} = \hat{y} \times 10^6 \;\text{N}\]

Three ONNX files (one per output: $F_x$, $F_z$, $T$) are exported and wrapped in an FMI2 FMU for direct Modelica integration. Inference is $<1\,\text{ms}$ per query.

Result at 795 m: T ≈ 1 060 kN. It learned the inextensible catenary, so against the elastic FEM it inherits that model’s offset — mean ≈ 45 kN across the 773 → 795 m sweep, the largest of the four. (Against the catenary it was trained on, it sits within ≈ 10 kN.)

“750 training points, all synthetic — a model learning from model outputs. Somewhere Sam Altman is nervous. The difference: our data generator is Newton’s equations, not another neural network. The physics doesn’t hallucinate.”

Limitations: Trained on catenary outputs — inherits zero bending stiffness and zero drag. Predicts fairlead forces only, no spatial quantities. Extrapolation outside the training geometry is unvalidated. Retrain on FEM outputs to inherit geometric nonlinearity at the same inference speed.


Benchmarking the Four Models

Four approaches, same geometry, same load case. Here is where they land against the FEM — the elastic, physically complete model I take as ground truth.

Reference baseline: the FEM is the ground truth here. It carries the cable’s elasticity and seabed contact and tracks closest to the documented OC4 pretension (~1.1 MN at rest). The analytical catenary — fast but inextensible — is now just another model to score.

All 4 models benchmark animation

Animation D: All four models sweeping 773 → 795 m against the FEM reference (black dots). Dashed red = 50 % MBL.

ModelMean abs error [kN]Max abs error [kN]Docker required
FEM (dolfinx, extensible)0 (reference)0 (reference)Yes
Guyan 5-DOF (linear MOR)≈ 31≈ 94Yes (assembly only)
Analytical catenary≈ 34≈ 58No
ONNX MLP (750 pts)≈ 45≈ 60No

When to Use Which Model?

All four implementations here are quasi-static — inertia and drag along the line are absent. Each approach extends to dynamic formulations; that is Part 2’s terrain. On spatial tension distribution: FEM gives a full nodal profile along the line, Guyan retains 5 nodes, while the analytical and data-driven models report fairlead force only.

Decision guide

ScenarioRecommended model
Feasibility, design sweeps, optimization loopsAnalytical
Full tension profile along the line, elastic physicsFEM
Near-nominal real-time loop, FEM-derived tangentGuyan
Solver-free deployment — Python, embedded, co-simulationData-driven (ONNX)

Hybrid strategy: train the data-driven model on FEM outputs (rather than catenary) to inherit bending stiffness and seabed contact fidelity while keeping <1 ms inference.

At 795 m the four models span 964 – 1 068 kN, or 54 – 60 % MBL. The FEM ground truth reads 1 010 kN; the inextensible pair sits above it — analytical 1 068 kN and the MLP that learned it 1 060 kN — while Guyan, linearized 9 m from its assembly point, trails just below at 964 kN. Every one of them clears the 95 % MBL survival limit with room to spare. That is the real headline: the models disagree from the FEM by a few percent in ways you can predict — inextensibility pushes the catenary and its surrogate high, a fixed linearization pulls Guyan low — so you can pick the cheapest one whose error budget you can live with.


Code: vedat-s/Automation · part1_mooring_surrogate/

This post is licensed under CC BY 4.0 by the author.