Skip to content

feat: run lines restrained in torsion in coupled OpenFAST runs - #11

Merged
SMI-Lab-Inha merged 1 commit into
devfrom
feat/coupled-torsion
Oct 14, 2026
Merged

SMI-Lab-Inha merged 1 commit into
devfrom
feat/coupled-torsion

Conversation

@SMI-Lab-Inha

Copy link
Copy Markdown
Owner

Summary

Runs finite-EI lines restrained in torsion in coupled OpenFAST (CompMooring = 5) runs and, on the aggregate surface, FAST.Farm. Torsion was 0.1.1's main feature but ran in the standalone driver only; every coupled entry refused torsion columns.

Most of the machinery already existed:

  • the cable module turns a parent-attached End A frame with the host orientation;
  • it returns the torque moment with the connection moment;
  • it cuts a large turn into substeps within a step;
  • it carries the unwrapped twist in its snapshot and checkpoint mirror;
  • the OpenFAST and FAST.Farm shells already pass the platform orientation every update.

Changes:

  • Opt-in for hosts that turn the fairlead. CD_Init_Deck_Aggregate, CD_AGG_Init_From_Deck and CD_Init_Deck_HermiteCable take a host_orientation flag, which the OpenFAST and FAST.Farm shells set (init and checkpoint rebuild). Without it (the C API and the standalone mixed EI = 0 + finite-EI route, which move line ends by translation only) a deck with torsion columns is refused by name instead of running with a frozen fairlead frame. A coupled run is always dynamic, so False alpha_force_blend is refused at initialisation, as on the standalone route.
  • Checkpoint rebuild order (fix). The rebuild moved the fairlead to the restart pose before reloading the cable mirror, so the preflight bounded the twist change against the static twist; a restart after more than 90° of turn about the line axis failed. The rebuild now reloads the torsion cables' mirror first (reload_cable_mirrors), then sets the coupled kinematics, then reloads the full mirror as before.
  • Linearisation. Refused for a line restrained in torsion also at a bending-pinned end, whose torque stiffness a aᵀ / C the translation-only quasi-static reduction would silently drop.
  • State registration (fix). CD_InitVars subtracted the friction and force-blend slots but not the 14 torsion slots, so the cable velocity/position blocks were mislabelled; CD_HFMF_TorsionMirrorSize is now public and subtracted.
  • Python deck validation mirrors the native rules; docs (OpenFAST page Line torsion, capabilities, driver format, troubleshooting), VALIDATION.md (T-11) and CHANGELOG updated.

Tests

New coupled_torsion (aggregate, openfast label). The straight 100 m neutral line (GJ 5e4 N·m²), End A on the platform fairlead, End B anchored:

Check Result
Non-stepping update rolled 20° about the line axis Twist1 = −20°, Torq = GJ(−roll)/L at both ends to 1e-6; fairlead moment = torque about the line axis, resisting the roll; no bending moment
60 °/s roll, 10 steps twist error 1.8e-15°, torque error 1.7e-13 N·m (quasi-static); aggregate column = single coupled cable driven with the same calls, bit for bit
1.5 turns in 18° steps −540° with no 2π slip (1.1e-13)
snapshot → step → restore → step bit-identical (state, twist, moment)
non-stepping turn of 100° refused by name (pi/2), state unchanged
PtfmInit yaw 15° over a vertical line static twist +15°, torque GJ·yaw/L
checkpoint recipe after 150° of roll continues bit-identically; the previous order is refused
FAST.Farm: vertical line under Turbine2, farm_ptfm_init yaw 10° static twist +10°; follows the turbine to +30°

torsion_deck: callers without orientation are refused by name; with it, both coupled entries build; the configuration blend is refused.

OpenFAST build of this branch (gfortran, IEA-15 MW VolturnUS-S, 3 chains + the lazy-wave power cable restrained in torsion, 60 s of irregular SeaState waves, no wind):

  • runs to completion, also with NumCrctn = 1;
  • Torq4N1 = GJ·Twist4/L; the twist follows the platform yaw (±0.14° against ±0.12°);
  • openfast -restart from 30 s reproduces all 1200 later rows of the OpenFAST and CableDyn outputs bit for bit.

No full FAST.Farm run with a torsion line is part of this PR; FAST.Farm is covered on the aggregate surface the farm shell drives.

Suites: full CTest suite, Windows, gfortran 16.2, Release, slow tier included: 251/251 pass (rebased on #10). Python: python/tests 1879 passed, tests 46 passed, with the native library.

Found along the way, not changed here: the standalone torsion statics of a lazy-wave cable with a long laid section on a coarse deck mesh stops as an unstable equilibrium; the cause (spurious Gauss-point compression of an under-resolved touchdown) and a mesh-refinement fix are prepared for a separate PR. The OpenFAST case above uses a shorter laid section.

Checklist

  • pre-commit run --all-files passes
  • ctest --test-dir build --output-on-failure passes
  • python -m pytest tests python/tests passes (if Python or validation records changed)
  • VALIDATION.md updated if a validation result changed
  • CHANGELOG.md updated under [Unreleased] (heading added if missing) for user-visible changes
  • Documentation in doc/ updated for changed inputs, options, or outputs
  • Conventional Commit title (feat:, fix:, docs:, ...)
  • Commits are signed off (git commit -s) under the
    Developer Certificate of Origin

Torsion of finite-EI lines was the main feature of 0.1.1 but ran in the
standalone driver only: the coupled entries refused any torsion column.
Most of what the coupled route needs was already in place. The cable
module turns a parent-attached End A frame with the host orientation,
returns the torque moment with the connection moment, substeps a large
turn within a step, and carries the unwrapped twist in its snapshot and
checkpoint mirror. The OpenFAST and FAST.Farm shells pass the platform
orientation every update.

The aggregate and the single-cable entry now take a host_orientation
flag, which the shells set: with it a deck with torsion columns builds,
without it (the C API, the standalone mixed route, which move line ends
by translation only) the deck is refused by name instead of running with
a frozen fairlead frame. A coupled run is always dynamic, so the
configuration blend is refused at initialisation as on the standalone
route.

Three shell changes complete it. The checkpoint rebuild moved the
fairlead to the restart pose before it reloaded the cable mirror, so the
preflight bounded the twist change against the static twist and a
restart after more than 90 deg of turn failed; the rebuild now restores
the torsion cables' mirror first. Linearisation now refuses a line
restrained in torsion also at a bending-pinned end, whose torque
stiffness the translation-only reduction would drop. The state
registration subtracted the friction and force-blend slots but not the
14 torsion slots, so the velocity and position blocks were mislabelled.

A new test, coupled_torsion, drives the aggregate: a rolled fairlead
gives Twist1 = -roll and GJ(-roll)/L, a 60 deg/s roll the quasi-static
torque at every step (bit-identical to the single coupled cable), 1.5
turns no 2 pi slip; rewind, refusal of a 100 deg non-stepping turn,
PtfmInit, a FAST.Farm turbine yaw, and the checkpoint recipe after 150
deg (the previous order is refused) are checked. In an OpenFAST build,
the IEA-15 MW mixed deck with its power cable restrained in torsion runs
60 s in waves and restarts from a checkpoint bit-identically.

Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
@SMI-Lab-Inha

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 14, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-14T14:07:02.457081Z 5fae139 Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@read-the-docs-community

Copy link
Copy Markdown

Documentation build overview

📚 CableDyn | 🛠️ Build #35144040 | 📁 Comparing 5fae139 against latest (f27c5e3)

  🔍 Preview build  

9 files changed · ± 9 modified

± Modified

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Another round soon, please!

Reviewed commit: 5fae139e70

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@SMI-Lab-Inha
SMI-Lab-Inha merged commit 13452d0 into dev Oct 14, 2026
15 checks passed
@SMI-Lab-Inha
SMI-Lab-Inha deleted the feat/coupled-torsion branch October 14, 2026 15:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant