Skip to content

fix(openfast): retries at any dtM, CalcSteady, FAST.Farm range files and full notes - #98

Merged
SMI-Lab-Inha merged 5 commits into
devfrom
fix/openfast-release-gaps
Nov 7, 2026
Merged

SMI-Lab-Inha merged 5 commits into
devfrom
fix/openfast-release-gaps

Conversation

@SMI-Lab-Inha

Copy link
Copy Markdown
Owner

Summary

Fixes from running the coupled route end to end in OpenFAST and FAST.Farm.

  • Solver step retries work at any dtM/DT. The glue copies the step-start OtherState back over the predicted one, which CableDyn read as a rewound checkpoint: at dtM = DT it rebuilt the model on every retry, and at dtM > DT it stopped. A retry now restores the aggregate's step-start snapshot, and the load predictor is mirrored back into OtherState. A retried step matches an unretried one, including across a restart.
  • The committed-force cache survives a restore: an output probe cleared it, so a restore dropped it. A restore now judges the cache as it stood when the step began.
  • CalcSteady: the linearisation state map survives a rebuild, a second operating point no longer stops the run, and .CD.out and the range graphs run to the end of the run.
  • Range graphs are written when the host reports a completed run, in OpenFAST and FAST.Farm, including at FAST.Farm's last whole DT_Low, and not after an error. A turbine's own instance in FAST.Farm writes them as <RootName>.T<n>.CD.Line<L>.range.out. Patch 0014 changes and patch 0023 is new.
  • Initialisation notes of a coupled line reach the console in full; both the shell and the cable's own note cut long lists.
  • A restart no longer rewrites .CD.static.out.

Checkpoint format: Parameter gains Linearize and Misc gains HostComplete, so checkpoints from earlier builds cannot be restarted.

Checks

Real runs, ModCoupling 3, forced retries, 0 rebuilds:

Case Solves, retried / reference Worst difference from the unretried run, of peak Rows differing after a restart
dtM = DT 242 / 120 6.8e-6 0 of 61
2 DT 120 / 60 7.6e-6 0 of 31
4 DT 60 / 30 1.4e-6 0 of 16
2 DT, predictor off 120 / 60 7.6e-6 0 of 31
  • A harness emulating the glue's copies, at dtM = 1, 2 and 4 DT and three retry and restore modes: .CD.out and the range files bit-identical to the unretried run, in double and single precision.
  • CalcSteady with 1 and 2 operating points: .CD.out and range samples agree to the end of the run.
  • FAST.Farm: a shared deck with the flag is refused by name; per-turbine files agree with .CD.out to print rounding; an aborting turbine writes none.
  • An abort in the final step writes no range file and removes a stale one.
  • All repeated in single precision. CTest 360 of 360 on the default kernel, with OPENBLAS_CORETYPE=Prescott and in Debug; pytest passes.

The CHANGELOG entry lands with the release batch.

The OpenFAST shell read a line's notes into 1024 characters while the
summary held 2048, so a long list was cut in mid-word, and a cable's own
1024-character note buffer dropped the notes past it, the omission marker
with them. A line with stiffener notes at both ends, the friction note and
the dtM advisory lost the friction note and the tail of the advisory.

All the holders now share CD_INIT_NOTE_LEN (32 KiB): a line reports fewer
than 32 notes of at most 1024 characters, so every note fits. Results are
unchanged.

Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
A rebuilt instance lost the map of its linearization states, so a run that
rebuilt before it linearized stopped with "dXdu exists only for a
linearization run": CalcSteady rewinds to its operating point through the
rebuild, and a restart of a linearizing run takes the same path. The
parameters now record that the run linearizes, and the rebuild maps the
states again. This adds a parameter to the OpenFAST checkpoint.

Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
CalcSteady linearizes at its saved operating points in time order, so after
the rewind to the first one each further restore goes forward. The rebuild
took that for a damaged history and stopped the run at the second operating
point. A forward restore has no rows to trim and now goes on.

Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
…leted

CD_End took a run that had reached TMax for a completed one. FAST.Farm ends
its turbines at the last whole DT_Low, so a per-turbine instance with a TMax
off that grid completed normally and wrote no range file; a run that
CalcSteady stopped early did the same; and an abort in another module after
CableDyn's last commit was written as if complete.

The hosts now say it: ExitThisProgram_T sets CD%m%HostComplete after a run
without an error, and FAST.Farm, which ends its turbines the same way on an
abort, sets it after its last step (patches 0014 and 0023). CD_End writes on
that signal alone. A process that only restored a checkpoint and stepped
nothing (-VTKLin) leaves the file as it is.

Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
… its restores

When the glue's solver retries a step it copies the states of the step's
start back over the predicted ones, the OtherState included. CableDyn took
that for a rewound checkpoint: at dtM = DT it rebuilt the whole model at
every retry, and at dtM > DT it stopped, because the retried call lies
inside the mooring interval and the rebuild accepts only a commit.

A retry is now recognised for what it is (step_retry) and takes the
aggregate's step-start snapshot, at any ratio. The load predictor, which
shifts once per mooring step, is mirrored again into the copied-back
OtherState. A retried step matches one that was never retried bit for bit.

That held at dtM = DT only after a change in the cable: an output probe
after the first pass cleared the cached committed force, and the restore
then dropped it, though the step had started from it. A restore now judges
the cache as it stood when the step began.

With retries gone from the rebuild, what remains in a run is the restore of
an operating point, so a restore no longer drops rows or range samples:
.CD.out and the range graphs run to the end of a CalcSteady run. They are
abandoned only if the run steps on from a restored state (resume_after_rewind).

A rebuild no longer writes .CD.static.out: its state is the checkpoint's, and
a restart overwrote the static equilibrium with it.

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 Nov 7, 2026 •

Copy link
Copy Markdown
Codex Review Summary: ✅ Completed

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

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-07T15:24:02.163701Z df72393 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 #35720719 | 📁 Comparing df72393 against latest (3d04008)

  🔍 Preview build  

16 files changed · ± 16 modified

± Modified

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Keep them coming!

Reviewed commit: df72393b2a

ℹ️ 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 9381284 into dev Nov 7, 2026
15 checks passed
@SMI-Lab-Inha
SMI-Lab-Inha deleted the fix/openfast-release-gaps branch November 7, 2026 17:05
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