Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
aac8105
docs(release): a version placeholder in the tagging example (#107)
SMI-Lab-Inha Nov 8, 2026
b7c883b
test(statics): gate the low-EI sweep cases on the deck route (#108)
SMI-Lab-Inha Nov 8, 2026
0b8eee3
fix(recovery): spread the touchdown node's floor reaction over its gr…
SMI-Lab-Inha Nov 8, 2026
fbcebdc
perf(hermite): remove overhead from the finite-EI dynamic step (bit-i…
SMI-Lab-Inha Nov 8, 2026
b8bb4b4
fix(outputs): the tangent outputs of a finite-EI line take its tangen…
SMI-Lab-Inha Nov 8, 2026
05f795b
fix(viv): MoorDyn's lift direction on either deck order; VIVphaseSeed…
SMI-Lab-Inha Nov 8, 2026
72e83f5
perf(ei0): coupled loads from the end rows; no OpenMP region on one t…
SMI-Lab-Inha Nov 8, 2026
65a740e
perf(modal): shift-invert block Lanczos eigenvalues for long lines (#…
SMI-Lab-Inha Nov 8, 2026
9582feb
perf(hermite): evaluate each element kernel once for load and tangent…
SMI-Lab-Inha Nov 8, 2026
7e3938c
fix(statics): smear the attachment drag in a cross current (#110)
SMI-Lab-Inha Nov 8, 2026
82cfa7a
perf(multibody): full Newton for cables in the monolithic step (#113)
SMI-Lab-Inha Nov 8, 2026
61e591c
fix(statics): a compression on unresolved elements names the mesh, no…
SMI-Lab-Inha Nov 8, 2026
2f4d2f5
fix(statics): an EI = 0 residual cycling inside its round-off floor i…
SMI-Lab-Inha Nov 8, 2026
a045075
fix(statics): the attachment polish accepts the line's residual floor…
SMI-Lab-Inha Nov 8, 2026
58519a2
fix(deck): named errors and validator parity for four deck rules (#127)
SMI-Lab-Inha Nov 8, 2026
451a4ad
fix(hermite): the axial damping in the round-off floor of the dynamic…
SMI-Lab-Inha Nov 8, 2026
30a4d0a
feat(damping): mesh-independent axial damping ratio; static balance a…
SMI-Lab-Inha Nov 8, 2026
ecde21a
fix(python): refuse a channel token containing a NUL (#126)
SMI-Lab-Inha Nov 8, 2026
ec86473
fix(statics): note a Point3 buoy that starts off balance (#134)
SMI-Lab-Inha Nov 8, 2026
9c79ae4
fix(modal): note a mode with omega^2 < 0 and document its signed freq…
SMI-Lab-Inha Nov 8, 2026
45693e7
fix(deck): overridden waves and current rows keep no stale values; va…
SMI-Lab-Inha Nov 8, 2026
026b9d9
perf(statics): stop the axial refinement when it leaves the compressi…
SMI-Lab-Inha Nov 8, 2026
252501e
fix(syrope): every element of a one-section rope takes its own static…
SMI-Lab-Inha Nov 8, 2026
ae59f10
docs(validation): re-measure the L5 performance records and commit th…
SMI-Lab-Inha Nov 8, 2026
3bc2450
fix(statics): refine a graded mesh element by element to the bending …
SMI-Lab-Inha Nov 8, 2026
eba09ad
fix(capi): sample a deck current at the line nodes on the point route…
SMI-Lab-Inha Nov 8, 2026
0a29d9e
fix(deck): a line of EI = 0 and finite-EI sections runs standalone as…
SMI-Lab-Inha Nov 8, 2026
0f61c02
fix(stiffener): no negative EI where two STIFFENERS rows meet inside …
SMI-Lab-Inha Nov 9, 2026
177e19e
fix(statics): the residual-floor note only for a residual above the t…
SMI-Lab-Inha Nov 9, 2026
d9165ba
docs(examples): decks and end-to-end tests for VIV, axial damping, Mo…
SMI-Lab-Inha Nov 9, 2026
c886c97
fix(step): a time step below 1e-100 s is refused by name (#130)
SMI-Lab-Inha Nov 9, 2026
c107545
docs(readme): lead with what CableDyn does and the evidence for it (#…
SMI-Lab-Inha Nov 9, 2026
d8620a1
fix(statics): the natural-level test of the object balance cannot cyc…
SMI-Lab-Inha Nov 9, 2026
7fb8a31
fix(statics): the drag arclength continuation takes a Rigid end conne…
SMI-Lab-Inha Nov 9, 2026
18e2c39
fix(statics): a restart at full stiffness runs on while its residual …
SMI-Lab-Inha Nov 9, 2026
d713941
docs(changelog): record the changes since 0.4.1 (#142)
SMI-Lab-Inha Nov 9, 2026
25bdfc1
release: CableDyn 0.4.2
SMI-Lab-Inha Nov 9, 2026
c45172f
chore(release): rerun the experiment records with 0.4.2
SMI-Lab-Inha Nov 9, 2026
98db4a5
chore(release): re-time the L5 records with the 0.4.2 drivers
SMI-Lab-Inha Nov 9, 2026
789cb6d
chore(release): the 0.4.2 release record
SMI-Lab-Inha Nov 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 10 additions & 8 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -322,14 +322,16 @@ analytic Jacobians.
about its static equilibrium, `K φ = ω² M φ`, over the free DOFs, with `K` the
static tangent (element stiffness and linearised seabed contact) and `M` the
consistent mass plus Morison added mass. `K` and `M` are assembled in symmetric
band storage; LAPACK `DSBGVX` gives the eigenvalues and inverse iteration on the
banded pencil gives each mode shape, so the cost grows with line length rather
than with its square. Dense `DSYGV` is kept as the test reference. Both line paths
are supported (`nModes`). A finite-EI line's modes (`CD_Modal_Hermite_Line`) take
its end connections and attachments from the dynamic model, and a line restrained
in torsion adds the twist angle of every node: its lumped polar inertia and the
second variation of the nodal-twist energy (`CD_HermiteCable_Dyn_Twist_Hessian`)
in a band of 7 DOFs per node.
band storage. A shift-invert block Lanczos iteration on the banded Cholesky factor
of `K` gives the eigenvalues, certified by a Sturm count of `K - σM` (LAPACK
`DSBGVX` takes short lines, an indefinite or singular `K`, and an uncertified run),
and inverse iteration on the banded pencil gives each mode shape, so the cost
grows with line length rather than with its square. Dense `DSYGV` is kept as the
test reference. Both line paths are supported (`nModes`). A finite-EI line's
modes (`CD_Modal_Hermite_Line`) take its end connections and attachments from the
dynamic model, and a line restrained in torsion adds the twist angle of every
node: its lumped polar inertia and the second variation of the nodal-twist energy
(`CD_HermiteCable_Dyn_Twist_Hessian`) in a band of 7 DOFs per node.

### Outputs

Expand Down
235 changes: 234 additions & 1 deletion CHANGELOG.md

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ authors:
repository-code: "https://github.com/SMI-Lab-Inha/CableDyn"
url: "https://github.com/SMI-Lab-Inha/CableDyn"
license: Apache-2.0
version: 0.4.1
date-released: 2026-11-08
version: 0.4.2
date-released: 2026-11-09
keywords:
- mooring dynamics
- cable dynamics
Expand Down
253 changes: 245 additions & 8 deletions CMakeLists.txt

Large diffs are not rendered by default.

115 changes: 79 additions & 36 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,38 +9,76 @@
[![License: Apache-2.0](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE)
[![DOI](https://img.shields.io/badge/DOI-10.1016%2Fj.oceaneng.2026.128332-blue.svg)](https://doi.org/10.1016/j.oceaneng.2026.128332)

CableDyn is an open-source, geometrically exact finite-element solver for the
static and dynamic analysis of offshore mooring lines and dynamic power cables.
Its strain and curvature are the exact large-deformation measures, never
linearised, so large displacements and rotations, slack and snap, and a line
lifting off the seabed lie inside the formulation. It is written in
Fortran 2018 and runs as a standalone program, as a mooring module of OpenFAST,
maintained by NLR (National Laboratory of the Rockies, formerly NREL)
(`CompMooring = 5`), through a C interface, or from Python. It reads input decks
in the MoorDyn v2 format and solves them with two line formulations:

- **Tension-only lines** (`EI = 0`): chains, wire ropes, and synthetic-fibre
moorings.
- **Finite-bending lines** (finite-EI): cubic-Hermite elements for dynamic power
cables, including lazy-wave configurations, with continuous centreline curvature.

The current stable release is `v0.4.1`. Interfaces are
versioned and may change before `1.0.0`.

## Capabilities

| Area | Features |
|---|---|
| Statics | Catenary seeding, Newton solution, load continuation, mesh sequencing, adaptive meshing |
| Dynamics | Implicit generalised-alpha integration, prescribed support motion, consistent mass, automatic step subdivision, torsion with a twist angle and rotary inertia at every node, cross-flow vortex-induced vibration |
| Environment | Buoyancy, Morison drag, added mass, Froude–Krylov loading, regular and irregular waves, current profiles, seabed contact with friction |
| Materials | Linear axial stiffness, Kelvin–Voigt damping, viscoelastic (series-Kelvin; MoorDyn `ElasticMod` 2/3), Syrope polyester model, torsional stiffness with torque–tension coupling, tapered bend stiffeners |
| Topology | Fixed, coupled, free, and connected points; clump weights; buoyancy modules along cables; rigid bodies and rods; end rotational stiffness; cables between two moving ends; active line-length control; line failure |
| Outputs | Effective tension, position, velocity, acceleration, curvature (also on the section's own axes), bending moment, torque and twist, end angles, contact response, natural modes, solver diagnostics |
| Interfaces | Standalone driver, OpenFAST and FAST.Farm (with linearisation of the line dynamics), C ABI, Python package |

Section and keyword names follow MoorDyn v2; unsupported combinations stop with
a named error rather than running approximately.
CableDyn is an open-source, geometrically exact finite-element solver for the static and
dynamic analysis of mooring lines and dynamic power cables. It resolves what a power cable is
designed against: the curvature along the line, under a bend stiffener, through a lazy wave and
across a moving touchdown, together with tension, torque and twist. Strain and curvature are the
exact large-deformation measures, never linearised, so slack and snap, large rotations and a line
lifting off the seabed lie inside the formulation.

It runs as a standalone program, as a mooring module of OpenFAST and FAST.Farm
(`CompMooring = 5`), through a C interface, or from Python.
The current stable release is `v0.4.2`; interfaces are versioned and may change before `1.0.0`.

## What CableDyn does

- **Finite-element cables with real bending stiffness.** Cubic-Hermite elements carry position
and tangent at every node, so the slope is continuous along the line, and the deflection of a
beam under its weight converges at fourth order with the mesh (measured slope 3.99).
Tension-only `EI = 0` elements serve chains, wire and fibre ropes in the same model.
- **An implicit solver.** Generalised-alpha integration with consistent mass and automatic step
subdivision: a snap load stays within 1.5 % of a 0.5 ms reference at a 20 ms step, where an
explicit lumped-mass step must stay near 1 ms.
- **Bend stiffeners and section curvature.** Tapered stiffener sleeves with their own mass,
buoyancy and drag; the curvature of the section, its two components on the section's own axes
(`CurvX`, `CurvY`) and the moments of the cable and of the sleeve, for fatigue.
- **Torsion.** A twist angle and polar inertia at every node, torque–tension coupling for
armoured cables, the buckling onset of a twisted line, and end restraints that are rigid,
elastic or free in twist.
- **Statics that start from the geometry alone.** No seed files: a catenary start, continuation in
bending stiffness and buoyancy, mesh sequencing and refinement to the bending length solve hard
lazy waves, long grounded runs, bathymetry and friction held as laid; a deck that has no
equilibrium stops with a named reason.
- **Coupled analysis.** OpenFAST and FAST.Farm coupling with checkpoint restart at any step, the
host's waves and current at every node, active line control, line failure, and linearisation
that carries the line dynamics as states.
- **More analyses.** Natural modes and shapes, cross-flow vortex-induced vibration of chains and
cables, viscoelastic and Syrope fibre ropes, buoyancy modules, clumps, rigid bodies and rods,
range graphs and seabed contact channels.
- **In-process hosts.** The C API and Python step a deck from a CFD code or a script, with the
host's fluid field at every node, saved and restored states and whole-line reads in one call.

## Evidence

Every capability above is tested, and the comparisons are published with their data and scripts
in the [validation record](https://cabledyn.readthedocs.io/en/latest/validation.html). A
selection:

| Case | Reference | Result |
|---|---|---|
| Large-deflection elastica | Bisshopp–Drucker closed form | error 1.9e-6 |
| Lazy-wave cables at 80, 200 and 800 m, static | OrcaFlex 11.6d | peak curvature within 0.08, 0.26 and 4.8 % |
| Installed 800 m lazy-wave cable | OrcaFlex 11.6d | peak curvature 0.06 %, hang-off tension 0.15 % |
| Lazy wave in an irregular sea | OrcaFlex 11.6d, same 80-component sea | curvature 0.21 %, tension 0.20 % |
| Moving touchdown under heave | OrcaFlex 11.6d | curvature within 0.6 %, touchdown point within 0.08 m |
| Tapered bend stiffener at a clamped hang-off | OrcaFlex 11.6d | curvature 0.45 % of its root value, moments 0.01 % |
| Lazy-wave cable twisted five turns | OrcaFlex 11.6d | torque 0.019 %, peak curvature 0.049 % |
| One-hour VolturnUS-S chain mooring | OrcaFlex 11.6d | fairlead tension mean 0.27 %, standard deviation 0.26 % |
| Holcombe lazy-wave model test | measured geometry | position error 1.1–1.9 % of the suspended length |
| Bergdahl dynamic chain test, 30 conditions | measured end force | correlation 0.993 |
| IEA 15 MW VolturnUS-S in OpenFAST with a power cable | OpenFAST with MoorDyn | platform motions within 0.6 % |

Run times on one processor thread, same host and protocol, with the timing scripts in
[`validation/performance`](https://cabledyn.readthedocs.io/en/latest/validation.html):

| Case | CableDyn 0.4.2 | OrcaFlex 11.6d |
|---|---|---|
| 80 / 200 / 800 m lazy-wave spans, 60 s of heave | 1.3 / 2.4 / 5.0 s | 2.7 / 5.3 / 27.8 s |
| One-hour VolturnUS-S chain mooring | 4.3 s | 19.7 s |

The method and the lazy-wave comparisons are peer-reviewed
([Ocean Engineering 368, 128332, 2026](https://doi.org/10.1016/j.oceaneng.2026.128332)).
Unsupported combinations stop with a named error rather than running approximately.

## Quick start

Expand All @@ -51,8 +89,8 @@ a named error rather than running approximately.
|---|---|
| `CableDyn_driver.exe` | Standalone solver for Windows x64 (AVX2 processor) |
| `openfast.exe` | OpenFAST with CableDyn available as `CompMooring = 5` |
| `cabledyn-0.4.1-py3-none-any.whl` | Python package (pre- and post-processing, batch runs) |
| `cabledyn-0.4.1.tar.gz` | Python source distribution |
| `cabledyn-0.4.2-py3-none-any.whl` | Python package (pre- and post-processing, batch runs) |
| `cabledyn-0.4.2.tar.gz` | Python source distribution |
| `SHA256SUMS.txt` | Checksums for the assets above |

Both executables are statically linked, need no installer, compiler, or runtime
Expand Down Expand Up @@ -90,7 +128,7 @@ a named error rather than running approximately.
cabledyn-run examples\wd0050_chain.dat wd0050
```

The pure Python wheel on the release page (`cabledyn-0.4.1-py3-none-any.whl`)
The pure Python wheel on the release page (`cabledyn-0.4.2-py3-none-any.whl`)
carries no driver: `cabledyn-run` then needs `--executable .\CableDyn_driver.exe`,
the `CABLEDYN_DRIVER` environment variable, or the driver on `PATH`. A source
build names the driver `cabledyn` (see [Build from source](#build-from-source));
Expand All @@ -101,6 +139,11 @@ a CableDyn deck; ready-to-run cases are in
[`examples/openfast`](https://cabledyn.readthedocs.io/en/latest/tutorial_openfast.html). Every shipped deck is listed
in [`examples/`](https://cabledyn.readthedocs.io/en/latest/examples.html).

Coming from MoorDyn: CableDyn reads decks written in the MoorDyn v2 format (its section and
keyword names), so an existing mooring model runs as it is and can then take finite-EI sections,
stiffeners and the other features above; the
[migration guide](https://cabledyn.readthedocs.io/en/latest/migrating.html) lists the differences.

## Documentation

The manual at <https://cabledyn.readthedocs.io> covers installation, tutorials,
Expand Down Expand Up @@ -157,7 +200,7 @@ If you use CableDyn in academic work, please cite:
> offshore wind. *Ocean Engineering* 368 (Part 2), 128332, 2026.
> <https://doi.org/10.1016/j.oceaneng.2026.128332>

To identify the software version, also cite the release (CableDyn 0.4.1).
To identify the software version, also cite the release (CableDyn 0.4.2).
The [citation file](https://cabledyn.readthedocs.io/en/latest/citing.html) contains both entries (GitHub **Cite this
repository**); BibTeX is on the manual's
[How to cite](https://cabledyn.readthedocs.io/en/latest/citing.html) page.
Expand Down
4 changes: 2 additions & 2 deletions RELEASE.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ The build fails if either executable imports a non-system DLL or lacks the UTF-8
active-code-page manifest (`release/check_static_windows_binary.ps1`), or if the
standalone and `CompMooring = 5` smoke cases fail with a system-only `PATH` or from
a folder named in mixed scripts. It also fails unless `openfast.exe -v` names the
executable `OpenFAST-v5.0.0-CableDyn-0.4.1`: the OpenFAST base and the CableDyn version,
executable `OpenFAST-v5.0.0-CableDyn-0.4.2`: the OpenFAST base and the CableDyn version,
never a `-dirty` describe of the patched tree.

The release workflow (`.github/workflows/release-windows-static.yml`) produces
Expand Down Expand Up @@ -140,7 +140,7 @@ python release/smoke_test_wheel.py examples/dynamic_chain_current.dat --expect-b
Tag only the commit that passed every check:

```powershell
$ReleaseVersion = "0.4.0"
$ReleaseVersion = "MAJOR.MINOR.PATCH"
git tag -s "v$ReleaseVersion" -m "CableDyn v$ReleaseVersion"
git push origin "v$ReleaseVersion"
```
Expand Down
Loading
Loading