Skip to content

fix(openfast): restart from a checkpoint at any glue step - #101

Merged
SMI-Lab-Inha merged 6 commits into
devfrom
fix/openfast-interval-restart
Nov 7, 2026
Merged

SMI-Lab-Inha merged 6 commits into
devfrom
fix/openfast-interval-restart

Conversation

@SMI-Lab-Inha

@SMI-Lab-Inha SMI-Lab-Inha commented Nov 7, 2026 •

Copy link
Copy Markdown
Owner

Summary

A coupled run can now restart from a checkpoint at any glue step. ChkptTime no longer has to be a multiple of dtM, and the restarted run matches the uninterrupted one bit for bit.

  • Interval restart: nothing in the solver moves between commits, and the coming solve takes its input from the glue, so the last commit is all a restart needs. A new OtherState field, commit_input, holds the kinematics and the line-control command that commit was reached with. A rebuild stands on it at the commit's clock, wherever t falls in the interval. A restart on the last glue step reaches the solve with no CalcOutput since the commit, so it evaluates the committed loads first. Only a time outside the mooring step is still refused.
  • CalcSteady and -VTKLin at dtM > DT: both hit the same refusal and now complete.
  • Early restart of bodies and rods: a restart before the first commit diverged from row 1, because the restored mirror marked the accelerations committed. The start now stays open, as in the run it continues.
  • Range graphs of an earlier run go as soon as the deck is parsed, so an initialisation that stops after that leaves none. A deck that does not parse names no lines, and a module that stops before CableDyn starts never reaches it: there every output of the earlier run stays, which doc/outputs.rst states.
  • Module driver: a rotating motion stopped at the first step in a single-precision build, because the rotation matrix was rounded to ReKi. OpenFAST itself is not affected.

Checkpoint format: OtherState gains commit_input, so checkpoints from earlier builds cannot be restarted.

Checks

Real OpenFAST, restarting from the continuous run's own checkpoints at every step of the first interval and of one interval inside the range window. All rows and range files must be byte-identical.

Deck, at dtM = 2 and 4 DT Double Single
Mixed: predictor on and held, retried and not 48 of 48 48 of 48
Line break and coupled rods, retried 24 of 24 24 of 24
Rigid6 buoy, retried 12 of 12 12 of 12

In-process restores into CalcOutput or straight into UpdateStates:

Case Double Single
Mixed deck, line control on and off, first-interval restores included 80 of 80 80 of 80
Torsion-restrained cable under rotation, about 28 degrees of twist 20 of 20 20 of 20
  • Removing the committed-load evaluation fails 8 of 24, and removing the line-control half of commit_input fails 20 of 48.
  • An abort straight after a retry in the last step, under ModCoupling 3 at dtM = 1, 2 and 4 DT, leaves no range files and a .CD.out equal to the uninterrupted run's.
  • A continuous run at dtM = 1, 2 and 4 DT is byte-identical to the previous build in .CD.out, range and static files.
  • CTest 360 of 360 on the default kernel, with OPENBLAS_CORETYPE=Prescott and in Debug; pytest passes; no compiler warnings.

The CHANGELOG entry lands with the release batch.

Further checks

Fresh OpenFAST and FAST.Farm builds of this head, in double and single precision, with restarts from the continuous run's own checkpoints.

Case, at dtM = 2 and 4 DT, predictor on and held, retried and not Double Single
Line control through ServoDyn CCmode 5 48 of 48 48 of 48
Line break 48 of 48 48 of 48
Coupled rods 48 of 48 48 of 48
Rigid6 body 48 of 48 48 of 48
  • Taking the line-control command from the input instead of commit_input fails all 24 double-precision restarts, and without the reopened start rods and bodies each fail 8 of 24.
  • A real static-solve failure removes an earlier run's range files; the previous build left them. CTest now covers this.
  • CTest 362 of 362 on the default kernel, with OPENBLAS_CORETYPE=Prescott and in Debug.

Line control on rope segments, through the same gate, on a composite line of a 100 m rope section at the fairlead and 750 m of chain:

Controlled segment Double Single
Viscoelastic, Es|Ed 48 of 48 48 of 48
Syrope 48 of 48 48 of 48
Syrope, run on until the running maximum rises 48 of 48 48 of 48

Dropping the slow state at a restart fails 8 of 12 on each rope, and dropping the running maximum alone fails 6 of 12, every step of its window.

A checkpoint written between two commits stopped the restart: the rebuild
overlaid the glue's input at the restart time, which the state of the last
commit was never reached with, so ChkptTime had to be a multiple of dtM.

Between commits nothing of the solver moves, and the coming solve takes its
input from the glue, so the state of the last commit is all a restart needs.
The OtherState now keeps what that commit was reached with (commit_input):
the coupled kinematics and the line-control command, from Init on. The rebuild
stands on these at the commit's clock, wherever t lies in the mooring step
after it, and refuses only a time outside that step.

A restart on the last glue step of an interval reaches the solve with no
CalcOutput since the commit, so the committed loads the load predictor shifts
are evaluated there first.

A restarted run matches the uninterrupted one bit for bit from every glue step
of the interval, in .CD.out and the range graphs.

A checkpoint written before this change cannot be restarted: OtherState has a
new field.

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

The range graphs of an earlier run went late in CD_Init, so an initialisation
that stopped before that, on the statics, on a refusal or on a warning at
AbortLevel WARNING, left them to be taken for this run's.

They now go as soon as the parsed deck names them, before anything else of the
initialisation can fail. A rebuild of a run under way passes no root and leaves
them. A deck that does not parse names no line, and a module that stops before
CableDyn starts never reaches it: both leave every output of the earlier run
as it was.

Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
A restart inside the first mooring step, which an interval restart now
allows, diverged on a deck with Rigid6 bodies or rods. The restored state
mirror marks their accelerations committed, while at dtM > DT the uninterrupted
run reaches its first step with the start still open and the fluid fields of
that step re-solve them.

A rebuild before the first commit now reopens the start. At dtM = DT there is
no such state: the CalcOutput at t = 0 restores the mirror, which closes it.

Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
The driver rounded the rotation matrix of a prescribed motion to ReKi before it
stored it in the mesh, whose orientation field is double precision on every
build. In a single-precision build the matrix is then no longer orthogonal to
CableDyn's tolerance, and a rotating motion stopped at the first step.

Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
@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-07T18:32:37.531181Z 912762a 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.

@SMI-Lab-Inha

Copy link
Copy Markdown
Owner Author

@codex review

@read-the-docs-community

read-the-docs-community Bot commented Nov 7, 2026 •

Copy link
Copy Markdown

Documentation build overview

📚 CableDyn | 🛠️ Build #35722789 | 📁 Comparing 912762a against latest (3d04008)

  🔍 Preview build  

19 files changed · ± 19 modified

± Modified

Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. More of your lovely PRs please.

Reviewed commit: 42c562293f

ℹ️ 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".

The discard at the parse was tested against a refusal after the parse. A body
far too heavy for its lines now fails the static solve itself, by name, and the
test requires the files gone.

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

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. What shall we delve into next?

Reviewed commit: 912762a662

ℹ️ 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 cf5d48a into dev Nov 7, 2026
16 checks passed
@SMI-Lab-Inha
SMI-Lab-Inha deleted the fix/openfast-interval-restart branch November 7, 2026 20:31
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