Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
9 changes: 7 additions & 2 deletions .github/workflows/fortran.yml
Original file line number Diff line number Diff line change
Expand Up @@ -95,10 +95,10 @@ jobs:
# OpenBLAS, sums in another order than the AVX2 and AVX-512 kernels the runners select.
# This job is advisory: branch protection names the jobs above, not this one.
roundoff:
name: round-off kernel (conda gfortran, ubuntu-latest, Prescott)
name: round-off kernel (conda gfortran, ubuntu-latest, SkylakeX)
runs-on: ubuntu-latest
env:
OPENBLAS_CORETYPE: Prescott
OPENBLAS_CORETYPE: SkylakeX
defaults:
run:
shell: bash -el {0} # login shell so the conda env is active
Expand All @@ -113,6 +113,11 @@ jobs:
environment-file: environment.yml
cache-environment: true

- name: Require AVX-512 for SkylakeX
run: |
grep -m1 "model name" /proc/cpuinfo
grep -q avx512f /proc/cpuinfo || { echo "this runner has no AVX-512; rerun the job"; exit 1; }

- name: Show toolchain
run: gfortran --version && cmake --version

Expand Down
16 changes: 15 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ All notable changes to CableDyn are recorded in this file. The format follows

## [Unreleased]

## [0.4.1] - 2026-11-08

### Added

- In-process stepping in moving water (ABI 1.4). On decks with finite-EI lines, bodies or rods
Expand Down Expand Up @@ -96,6 +98,13 @@ All notable changes to CableDyn are recorded in this file. The format follows
- Every initialisation note of a coupled line reaches the console; long lists were cut or dropped.
- The OpenFAST module driver runs a rotating motion in a single-precision build.
- A range-graph file that cannot be written completely is removed instead of left behind.
- A mean level in a MoorDyn-C kinematics file, a non-zero `omega = 0` row of `WaveKin 7` or the
mean of a `WaveKin 3` record, is added to the elevation alone, as MoorDyn-C does: the wave
numbers stay those of `WtrDpth` and the stretching maps the water under the total elevation.
CableDyn took the wave numbers at `WtrDpth` plus the level. With a 0.8 m level in 50 m of water
and six components in six directions, `WaveKin 7` now matches MoorDyn-C v2.7.2 to 1e-8 instead
of 7.7e-3 m in elevation and 1 % in velocity. The mean of a WaterKin `WaveKinMod 1` record still
raises the still-water level; MoorDyn-F drops it.
- The C API messages of `CableDyn_UpdatePointFluidFields` and `CableDyn_CalcOutputDerivatives` on
the coupled aggregate name its real scope: decks with finite-EI lines, bodies or rods.

Expand All @@ -121,6 +130,10 @@ All notable changes to CableDyn are recorded in this file. The format follows
`EI × Curv` only to within the strain. Tension, positions and forces are unchanged, and so are
`OutputRecovery element` values on elements without a stiffener sleeve.
- Azimuth values of the `EI = 0` lines named above read 360 degrees lower on those routes.
- On a `WaveKin 3` or `WaveKin 7` deck whose mean level is not zero, the elevation away from the
origin, the fluid velocity and acceleration, and so the loads and every output, change by the
order of the level over the depth: up to 1 % in velocity at 0.8 m in 50 m. A deck with no mean
level is unchanged bit for bit.
- OpenFAST checkpoints change format: they carry the range graphs and the input of the last
commit, so a checkpoint written by an earlier CableDyn cannot be restarted with this one.

Expand Down Expand Up @@ -805,7 +818,8 @@ Corrections made during the pre-release review.
values of the shipped example decks and states which tension (end element or
`FairTen` end force) each comparison uses.

[Unreleased]: https://github.com/SMI-Lab-Inha/CableDyn/compare/v0.4.0...HEAD
[Unreleased]: https://github.com/SMI-Lab-Inha/CableDyn/compare/v0.4.1...HEAD
[0.4.1]: https://github.com/SMI-Lab-Inha/CableDyn/releases/tag/v0.4.1
[0.4.0]: https://github.com/SMI-Lab-Inha/CableDyn/releases/tag/v0.4.0
[0.3.0]: https://github.com/SMI-Lab-Inha/CableDyn/releases/tag/v0.3.0
[0.2.0]: https://github.com/SMI-Lab-Inha/CableDyn/releases/tag/v0.2.0
Expand Down
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.0
date-released: 2026-11-04
version: 0.4.1
date-released: 2026-11-08
keywords:
- mooring dynamics
- cable dynamics
Expand Down
8 changes: 7 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
#
cmake_minimum_required(VERSION 3.20)
# VERSION is a bare numeric triple matching the release version.
project(CableDynCore VERSION 0.4.0 LANGUAGES C Fortran
project(CableDynCore VERSION 0.4.1 LANGUAGES C Fortran
DESCRIPTION "CableDyn geometrically exact cable/mooring solver — Fortran core")

option(CABLEDYN_ENABLE_COVERAGE "Instrument the GNU Fortran core for gcov/gcovr source coverage" OFF)
Expand Down Expand Up @@ -2321,6 +2321,12 @@ file(GLOB CD_WAVEKIN_MDC_FILES RELATIVE ${CMAKE_SOURCE_DIR}/tests/data/wavekin_m
foreach(f IN LISTS CD_WAVEKIN_MDC_FILES)
configure_file(tests/data/wavekin_mdc/${f} ${CMAKE_BINARY_DIR}/wavekin_mdc/${f} COPYONLY)
endforeach()
# the same with a mean level (an omega = 0 row, a raised record), against MoorDyn-C v2.7.2
file(GLOB CD_WAVEKIN_MDC_MEAN_FILES RELATIVE ${CMAKE_SOURCE_DIR}/tests/data/wavekin_mdc_mean
${CMAKE_SOURCE_DIR}/tests/data/wavekin_mdc_mean/*)
foreach(f IN LISTS CD_WAVEKIN_MDC_MEAN_FILES)
configure_file(tests/data/wavekin_mdc_mean/${f} ${CMAKE_BINARY_DIR}/wavekin_mdc_mean/${f} COPYONLY)
endforeach()
add_executable(test_wavekin_modes tests/test_wavekin_modes.f90)
target_link_libraries(test_wavekin_modes PRIVATE cabledyn_core)
add_test(NAME wavekin_modes COMMAND test_wavekin_modes WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
Expand Down
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ in the MoorDyn v2 format and solves them with two line formulations:
- **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.0`. Interfaces are
The current stable release is `v0.4.1`. Interfaces are
versioned and may change before `1.0.0`.

## Capabilities
Expand All @@ -51,8 +51,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.0-py3-none-any.whl` | Python package (pre- and post-processing, batch runs) |
| `cabledyn-0.4.0.tar.gz` | Python source distribution |
| `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 |
| `SHA256SUMS.txt` | Checksums for the assets above |

Both executables are statically linked, need no installer, compiler, or runtime
Expand Down Expand Up @@ -90,7 +90,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.0-py3-none-any.whl`)
The pure Python wheel on the release page (`cabledyn-0.4.1-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 Down Expand Up @@ -157,7 +157,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.0).
To identify the software version, also cite the release (CableDyn 0.4.1).
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
2 changes: 1 addition & 1 deletion 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.0`: the OpenFAST base and the CableDyn version,
executable `OpenFAST-v5.0.0-CableDyn-0.4.1`: 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
2 changes: 1 addition & 1 deletion VALIDATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ scripts, results, and source provenance are in
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 had
waveform RMSEs of 5.93% and 2.56% of their force ranges with 0.3.0 (not rerun for 0.4.0).
waveform RMSEs of 5.93% and 2.56% of their force ranges with 0.3.0 (not rerun for 0.4.0 or 0.4.1).
Halving the mesh length and the time step changes the mean cycle maximum by at most
0.29% and 0.27%. The
0.3125 ms step resolves the segment axial modes that the snap loads excite (and the axial
Expand Down
8 changes: 4 additions & 4 deletions doc/capi.rst
Original file line number Diff line number Diff line change
Expand Up @@ -122,12 +122,12 @@ files directly, as shown below.
- Library files
- Header
* - Linux
- ``lib/libcabledyn.so.0.4.0``, the soname link ``libcabledyn.so.1``, and the development
- ``lib/libcabledyn.so.0.4.1``, the soname link ``libcabledyn.so.1``, and the development
link ``libcabledyn.so``. ``lib`` is the platform ``CMAKE_INSTALL_LIBDIR``, which can be
``lib64`` or a multiarch directory.
- ``include/CableDyn_CAPI.h``
* - macOS
- ``lib/libcabledyn.0.4.0.dylib``, ``lib/libcabledyn.1.dylib``, ``lib/libcabledyn.dylib``
- ``lib/libcabledyn.0.4.1.dylib``, ``lib/libcabledyn.1.dylib``, ``lib/libcabledyn.dylib``
- ``include/CableDyn_CAPI.h``
* - Windows, GNU toolchain
- ``bin/libcabledyn.dll`` and the import library ``lib/libcabledyn.dll.a``. The GNU
Expand Down Expand Up @@ -257,7 +257,7 @@ ABI and versioning
- the same four numbers, reported by the loaded library
* - ``CableDyn_GetVersionString``
- runtime
- ``"CableDyn 0.4.0 C-ABI 1"``
- ``"CableDyn 0.4.1 C-ABI 1"``
* - shared-library ``SOVERSION``
- 1
- soname ``libcabledyn.so.1`` or install name ``libcabledyn.1.dylib``. The Windows DLL
Expand Down Expand Up @@ -830,7 +830,7 @@ Version queries
- ``char *``
- ``version_len``
- yes: no-op
- receives ``"CableDyn 0.4.0 C-ABI 1"``, truncated to ``version_len - 1`` characters and
- receives ``"CableDyn 0.4.1 C-ABI 1"``, truncated to ``version_len - 1`` characters and
``NUL``-terminated
* - ``version_len``
- in
Expand Down
2 changes: 1 addition & 1 deletion doc/citing.rst
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ software]. https://github.com/SMI-Lab-Inha/CableDyn
}

When results depend on a particular release, quote the version reported in the solver banner
(``CableDyn v0.4.0``) together with the options recorded for the run.
(``CableDyn v0.4.1``) together with the options recorded for the run.

Relation to the journal article
-------------------------------
Expand Down
10 changes: 6 additions & 4 deletions doc/coupling_boundary.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,9 @@ on `t + dt` and the host time grid is unchanged. In OpenFAST the module may adva
The public header declares the complete interface of C ABI version 1, including the object
queries of its minor extension 1 (ABI 1.1; check `CableDyn_GetAbiMinor() >= 1` before calling
them), the host-coupling calls of its minor extension 2 (ABI 1.2; check
`CableDyn_GetAbiMinor() >= 2`) and the host-rotation calls of its minor extension 3 (ABI 1.3;
check `CableDyn_GetAbiMinor() >= 3`). Signatures and examples are in the [C API guide](capi.rst),
`CableDyn_GetAbiMinor() >= 2`), the host-rotation calls of its minor extension 3 (ABI 1.3;
check `CableDyn_GetAbiMinor() >= 3`) and the host-fluid calls, initialisation notes and section
curvature of its minor extension 4 (ABI 1.4; check `CableDyn_GetAbiMinor() >= 4`). Signatures and examples are in the [C API guide](capi.rst),
whose section "Coupling a host (CFD) solver" gives the call sequence of a CFD host.

| Group | Functions |
Expand All @@ -92,10 +93,11 @@ whose section "Coupling a host (CFD) solver" gives the call sequence of a CFD ho
| Initialisation | `CableDyn_InitDeck` (a supported `EI = 0` point-system deck, through the deck parser and static solve, or a deck with finite-EI lines, free bodies or rods on the coupled aggregate); `CableDyn_InitLine` (one meshed `EI = 0` line); `CableDyn_InitLines` (several lines with a compact coupled-DOF map) |
| Stepping | `CableDyn_UpdateStates` (set coupled kinematics and recompute internal accelerations), `CableDyn_UpdatePointFluidFields`, `CableDyn_Step` |
| Output | `CableDyn_CalcOutput`, `CableDyn_CalcOutputDerivatives`, `CableDyn_GetCoupledMotion` |
| Queries | `CableDyn_NCoupledDOF`, `CableDyn_NPoints`, `CableDyn_NLines`, `CableDyn_GetLastError`, `CableDyn_GetInitNotes` |
| Queries | `CableDyn_NCoupledDOF`, `CableDyn_NPoints`, `CableDyn_NLines`, `CableDyn_GetLastError` |
| Object queries (ABI 1.1) | `CableDyn_GetAbiMinor`, `CableDyn_NObjects`, `CableDyn_GetObjectInfo`, `CableDyn_GetLineValues`, `CableDyn_GetPointState`, `CableDyn_GetBodyState`, `CableDyn_GetRodState`, `CableDyn_EvalChannel`: the model's lines, points, bodies and rods, their committed state, and any `OUTPUTS` channel |
| Host coupling (ABI 1.2) | `CableDyn_InitDeckAt` (`CableDyn_InitDeck` with the statics solved at the host's positions of the `Coupled` points), `CableDyn_SaveState`, `CableDyn_RestoreState` (a one-slot in-memory save of the whole model for outer correctors), `CableDyn_GetCoupledLayout` (the deck point id and type of every block of the coupled vector) |
| Host rotations (ABI 1.3) | `CableDyn_InitDeckRotating` (`CableDyn_InitDeck` for a host that turns its coupled points, so torsion and `Rigid` end connections turn with it), `CableDyn_UpdateRotations` (each coupled point's global-to-body DCM, angular velocity and acceleration), `CableDyn_GetCoupledMoments` (the moments the lines apply to the host) |
| Host fluid and notes (ABI 1.4) | `CableDyn_SetHostFluid` (before the initialisation: the host supplies the ambient fluid), `CableDyn_NFluidNodes`, `CableDyn_GetFluidNodePositions`, `CableDyn_UpdateFluidFields` (the fluid at every line node), `CableDyn_GetInitNotes` (the notes of the last deck initialisation), and the line quantity `CD_C_LINE_SECTION_CURVATURE` of `CableDyn_GetLineValues` |

Rules shared by every entry point:

Expand All @@ -115,7 +117,7 @@ Rules shared by every entry point:

The interface ships as the versioned shared library `libcabledyn` (`cabledyn.dll` in an Intel
Fortran and MSVC build; CMake target `cabledyn_shared`) with the installed header; it reports
CableDyn 0.4.0 and C ABI version 1, minor extension 3. The Python package uses the same library.
CableDyn 0.4.1 and C ABI version 1, minor extension 4. The Python package uses the same library.

### Concurrency

Expand Down
16 changes: 12 additions & 4 deletions doc/driver_format.md
Original file line number Diff line number Diff line change
Expand Up @@ -1385,10 +1385,13 @@ time-varying and of a sheared current to MoorDyn-C's within 0.9 % on a 70 m rope
([options](options.rst)) are an extension of CableDyn and no part of MoorDyn-C or MoorDyn-F: a
deck with them is not a plain MoorDyn deck, and a MoorDyn solver would not place the phases there.

A non-zero `omega = 0` row raises the still-water level. CableDyn then takes every wave number at
the depth `WtrDpth` plus that level, as it does for the mean of an elevation record, where
MoorDyn-C keeps `WtrDpth` and adds the level to the elevation alone. The two differ by the order
of the level over the depth in the long components.
A mean level, a non-zero `omega = 0` row or the mean of `wave_elevation.txt`, is added to the
elevation alone, as MoorDyn-C does: every wave number stays that of `WtrDpth`, and the Wheeler
stretching maps the water column under the total elevation, the level included. The
`wavekin_modes` test holds both files with a 0.8 m level, under six `WaveKin 7` components in
six directions, to MoorDyn-C v2.7.2: `WaveKin 7` to `1e-8` of its scale and `WaveKin 3` to the
tolerances above. The mean of a WaterKin `WaveKinMod 1` record raises the still-water level
instead ([below](#moordyn-f-waterkin-file-modes)).

(waterkin-file-modes)=
### MoorDyn-F `WaterKin` file modes
Expand All @@ -1406,6 +1409,11 @@ A MoorDyn-F deck may select a WaterKin file (grammar in [Auxiliary file formats]
| `CurrentMod = 1` | N-level WaterKin depth table, interpolated at structural nodes |
| `CurrentMod = 2` | current from the coupled host SeaState field |

The mean of a `WaveKinMod 1` record raises the still-water level: its wave numbers are those of
`WtrDpth` plus the mean, and the stretching maps the water column under the raised level.
MoorDyn-F instead drops the record's mean, and its Nyquist bin, so a record whose mean is not zero
puts the surface of the two codes apart by that mean.

**`WaveKinMod 1`** is standalone-only. It needs a `WaveKinFile` of at least four finite
`time elevation` rows starting at `t = 0` with strictly increasing times, a positive `dtWave`, a
positive `TMax`, and the ordinary `waves` requirements (`dtM`/`TMax` and `WtrDpth`). It cannot be
Expand Down
6 changes: 3 additions & 3 deletions doc/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ with MoorDyn-C, MoorDyn-F, and OrcaFlex on common reference cases.
.. admonition:: Release status
:class: note

CableDyn ``v0.4.0`` is the current stable release. It is on PyPI with wheels that carry the
CableDyn ``v0.4.1`` is the current stable release. It is on PyPI with wheels that carry the
solver (``pip install cabledyn``), runs 13-33 % faster in the release build, extrapolates the
coupled loads between OpenFAST solves at a ``dtM`` above ``DT``, restarts bit for bit at any
``dtM``, and recovers node tension through touchdown on coarse meshes.
Expand Down Expand Up @@ -53,8 +53,8 @@ Download to first result in five minutes
----------------------------------------

#. Download ``CableDyn_driver.exe``, ``SHA256SUMS.txt``, and **Source code (zip)** (for the
``examples`` folder) from the `v0.4.0 release
<https://github.com/SMI-Lab-Inha/CableDyn/releases/tag/v0.4.0>`_ and verify the checksum —
``examples`` folder) from the `v0.4.1 release
<https://github.com/SMI-Lab-Inha/CableDyn/releases/tag/v0.4.1>`_ and verify the checksum —
:doc:`installation`. No installer and no runtime DLLs.
#. Put ``CableDyn_driver.exe`` in a working folder, unzip the source archive, and copy its
``examples`` folder next to the executable.
Expand Down
Loading
Loading