Repository navigation
fix: refine a coarse finite-EI static that fails its stability test - #15
Conversation
A lazy-wave power cable restrained in torsion (80 m bare, a 100 m buoyancy section and 420 m laid on a 200 m seabed, 10 m elements on the laid part) stopped its static initialisation as an unstable equilibrium. The same cable without torsion initialised. Torsion makes the static solve three-dimensional, and the stability test then checks the transverse DOFs that the planar solve holds. The full tangent of that discrete equilibrium does have one negative eigenvalue, local and out of plane just past touchdown. It comes from the mesh: elements longer than the bending length (about 4-5 m there) cannot represent the bend, and the pointwise axial force of these stiff-EA cubic-Hermite elements oscillates about its element mean, from -14.5 kN to +21 kN at the Gauss points against a true tension of 1.2-1.5 kN. The compressed Gauss points lower the transverse geometric stiffness below zero. Every refined mesh (half, 4 m, 2 m, 1 m, and adaptive_mesh) is stable, and so is a three-point axial rule on the deck mesh; positions converge as h^2. The static solve already refines a mesh whose elements exceed half the bending length, but only when the polish fails. When the catenary-continuation equilibrium on the deck mesh fails the stability test, the route is now repeated once on that refined mesh and its state audited and tested the same way; a note names both meshes. A physical instability persists on the refined mesh and still stops the solve, now saying so. Only paths that failed before change: of 97 decks (all examples and test decks) run through a dev build and this build, 87 give byte-identical outputs and the 10 that differ are those that stopped with exit code 2 and now initialise. A test deck covers the case, and the modelling guide gives the mesh rule for finite-EI lines. Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
|
@codex review |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5b9df18eb2
ℹ️ 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".
Review found that the stability retry ran only on the deck mesh: when adaptive_mesh, or the kink refinement, had already refined it, the retry was skipped, although that refinement does not enforce the half-bending-length rule and could leave elements too long; and the mesh-sequenced route had no retry at all. One function, bending_refine_scale, now holds the rule (the power-of-two factor that brings every element to at most half of (EI/|w|)^(1/3), capped at 16x and 4096 elements) and refined_restart uses it. The catenary-continuation retry runs when the returned mesh fails the rule, refining from that mesh, once; a mesh that meets the rule is never refined again. The mesh-sequenced route gains the counterpart: an unstable state on a mesh that fails the rule is prolongated to the refined mesh and polished there, as that route already refines, so the branch it chose is kept. Both share the audit and stability test, and the note names the intermediate mesh when it was itself a refinement. A second test deck runs the sequenced route first. A deck that reaches the already-refined case through adaptive_mesh could not be built (about 250 variants): AutoMesh's curvature target and the kink refinement brought the touchdown under the rule before any stability failure. Of 98 decks, 96 are byte-identical to the previous head; the two sequenced-first decks reach the same equilibrium by the new path. Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
|
@codex review |
|
Codex Review: Didn't find any major issues. 👍 Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
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". |
A finite-EI line solved in its vertical plane holds its transverse DOFs, so the static solve never sees a lateral instability; the dynamics then release those DOFs and start from that state. On a mesh too coarse at touchdown, the same spurious Gauss-point compression that the stability refinement handles for 3D solves makes such a state a discrete saddle, which only symmetry keeps planar. The hand-off now runs the existing stability test once on the planar static state with only the end positions held (0.35 ms on an 87-element lazy wave). If the tangent is indefinite it prints one note naming the line, the mesh size, its longest element against half the bending length and the refinement that meets it, and recommends a finer mesh or adaptive_mesh True; lines restrained in torsion are refined automatically. The check never changes a result or fails a run: of 100 decks every output file and exit code is unchanged, and the note appears on the coarse lazy-wave decks, including the IEA-15 MW mixed example, whose 10 m laid elements under-resolve its touchdown. Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
|
@codex review |
|
Codex Review: Didn't find any major issues. 👍 Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
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". |
…h rule The power cable of examples/iea15mw_umaine_mixed_cabledyn.dat had 10 m elements along its grounded run, four times half its bending length, and the hand-off note added in this branch fired on it. It now has 248 elements (2 m, 2.5 m and 2.5 m in its three sections), each at most half the bending length, and the note no longer fires; the flagship test again rejects every note. Against a 1 m reference mesh the static fairlead tension goes from 11 897.7 N to 11 921.7 N (reference 11 921.1 N), the anchor tension from 1218.2 N to 1230.0 N (1230.05 N) and the touchdown curvature from 0.058 to 0.079 1/m (0.080 1/m). The curvature channels follow the sag-bend peak (Curv4N20 -> Curv4N38). The one-hour full-turbine record is rerun on the new mesh: hang-off tension unchanged at 11.5 +/- 1.1 kN, touchdown curvature peak 0.109 1/m instead of 0.075 1/m, and the anchor tension stays at its static 1.23 kN; the stick-slip peaks up to 4.1 kN of the former record were an artefact of the coarse mesh. VALIDATION.md, the OpenFAST tutorial and the DLC verification note are updated. The other 51 examples are byte-identical; no solver source changes. Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: eeb0ae4949
ℹ️ 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 hand-off lateral-stability check skipped every line with ATTACHMENTS, because it ran before attachment_static_polish produces the discrete equilibrium the dynamics start from. A coarse attachment cable whose planar state is unstable out of its plane therefore started its dynamics without the note. The check now takes its mesh arrays as arguments. A line without attachments is checked as before; a line with attachments is checked after the polish, on the final mesh with the bare weights the polished state carries (the lumped attachment loads are dead loads and leave the tangent unchanged), and the bending-length rule of the note uses the smeared section weights. Results do not change. New tests: driver_lazy_wave_planar_coarse_att_note (the coarse lazy wave with its buoyant stretch built from 25 discrete modules: one note, after the polish) and driver_lazy_wave_planar_refined_att_quiet (2-2.5 m elements: no note). Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2e4a39007f
ℹ️ 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".
…nd-off The hand-off note took its refinement factor from bending_refine_scale, which is capped (CD_HC_REFINE_CAP and 4096 elements) and returns 1 when no doubling is allowed. A mesh beyond the caps was then reported as resolving the bending length, and a capped factor as the one that meets it. The new bending_refine_need returns the uncapped ratio; the note uses it to choose its wording and names the uncapped power of two. The refinement routes keep the capped factor. On a line with ATTACHMENTS in an in-plane current, the check after the attachment polish returned early because planar_current_saddle covers in-plane currents, but that check runs on the smeared state before the polish. The post-polish check now runs in an in-plane current too. The statics-matrix hang guard was a fixed 600 s while the Debug CPU bound is ten times the Release one, so a slow but healthy Debug run on a loaded runner (LW_1015__cur_fr, 168 s locally in Debug, failing closed as expected) was stopped as hung. The guard is now at least four times the configured CPU bound. Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a89e65dc04
ℹ️ 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".
A line with ATTACHMENTS solved in 3D (a cross-plane current or an end direction out of its plane) had its stability tested only on the smeared-attachment equilibrium; attachment_static_polish then moved it to the discrete equilibrium without any test, and the post-polish hand-off check returned early for 3D lines. The post-polish check now runs for them too, with the same end constraints as the dynamics, and its note names the discrete attachment equilibrium instead of a planar state. No result changes. Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2a0bbd6f5a
ℹ️ 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".
… factor A planar saddle in an in-plane current retried out of its plane holds only the six end translations while require_3d_static stays false, so after an attachment polish the hand-off check returned on its end-constraint guard and the discrete state went unaudited. A state held by the end translations alone now counts as solved in 3D and is checked after the polish. The refinement factor named in the note doubled until it met the bending-length ratio, which for a vanishing EI could overflow the integer and never end. It now stops at 2**20 and the note then says "at least". Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 25a9b4d9fa
ℹ️ 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 hand-off note paired the longest element with the shortest half bending length of the line, which can belong to different sections, and recommended adaptive_mesh True even when it was already set (AutoMesh refines by its own criteria, which need not meet the bending length). The note now names the element of the largest length-to-rule ratio, which sets the factor, and tells an adaptive run to refine the deck mesh. Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 062e430f0e
ℹ️ 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".
… test In an in-plane current whose planar equilibrium is a saddle, the out-of-plane pass is polished at the exact current and stability-tested (symmetric_current_polish). A failed test there only cleared the state, and the planar saddle was kept, even when the failure was the same under-resolved bending-length artefact the other routes refine away. The polished 3D state is now carried to the mesh that resolves the bending length and polished there (sequenced_refined_polish) before the planar saddle is fallen back on. Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a6e150ef99
ℹ️ 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".
In an in-plane current, a planar equilibrium that is unstable once the line may leave its plane is treated as a pitchfork: the driver looks for a symmetry-broken equilibrium or keeps the planar saddle. On a mesh longer than half the bending length that negative mode can be the mesh's. The planar state is now first carried to the mesh that resolves the bending length and polished there, and kept when it is no saddle on that mesh; otherwise the coarse state and its notes are restored and classified as before. Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 869848ca6f
ℹ️ 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".
sequenced_refined_polish, which carries a state that failed the stability test on a too-coarse mesh to the mesh resolving the bending length, polished it at the outer static tolerance only. A state the routes had accepted at a relaxed tolerance (the coupled static tolerance or the contact floor) then failed its refined polish and the planar saddle or the failure stood. The refined polish now takes the same ladder, starting from the outer tolerance as before, and reports a relaxed acceptance in the tolerance note. Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f8194b008a
ℹ️ 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 refined polish set the tolerance note only when it moved past the first rung of its ladder, but that rung is the outer tolerance, which the sequenced route may already have relaxed. The note is now set whenever the accepted tolerance is above the target. Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 020b849a1c
ℹ️ 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".
primary_walked was read by the saddle retry after a pass in which only the sequenced route ran, before anything had assigned it; it is now cleared at the start of every route pass. saddle_refined_retry restored the coarse state but kept the tolerance note of a discarded refined solve; it now restores the note as well. Signed-off-by: Jae Hoon Seo <jaehoon.seo@inha.ac.kr>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a6f05db867
ℹ️ 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".
Summary
A finite-EI line's static solve that fails its stability test on a coarse deck mesh is now repeated once on the mesh that resolves the bending length, and accepted if the refined state is stable.
Symptom. A lazy-wave power cable restrained in torsion stopped its static initialisation with "the converged state is an unstable equilibrium (tangent stiffness not positive definite)". The cable was 80 m bare, a 100 m buoyancy section and 420 m laid on a 200 m seabed, with 10 m elements on the laid part. The same cable without torsion initialised. Torsion makes the static solve three-dimensional, and the stability test then checks the transverse DOFs that the planar solve holds.
Cause: the mesh, not the physics.
Refinement settles it:
adaptive_mesh True(696 elements)axial_quadrature_order 3Positions converge as h². A physical instability would persist under refinement; this one does not.
Fix. The static solve already refines a mesh whose elements exceed half the local bending length, (EI/|w|)^⅓ / 2, but only when its polish fails. Now:
The modelling guide gains the mesh rule (element length at most half of (EI/w)^⅓ at touchdown, sag/hog bends and section changes) and explains the midpoint tension spikes of coarse meshes in
.t.out. The troubleshooting page covers the "unstable equilibrium" failure and the new note.Added after review (user decision): hand-off note. A finite-EI line solved in its vertical plane holds its transverse DOFs, so the static solve cannot see a lateral instability, and the dynamics start from that state. The hand-off now runs the stability test once on the planar state, with only the end positions held (0.35 ms on 87 elements). If the tangent is indefinite, it prints one note: the line, the mesh size, its longest element against half the bending length, and the refinement that meets it, recommending a finer mesh or
adaptive_mesh True. No result or exit code changes: across 100 decks every output file is identical. The note appeared on the coarse lazy-wave decks, including the IEA-15 MW mixed example, whose 10 m laid elements under-resolved its touchdown. New tests:driver_lazy_wave_planar_coarse_note(note once) anddriver_lazy_wave_planar_refined_quiet(no note on 2–2.5 m elements).Added after review (user decision): the IEA-15 MW mixed example is refined. Its power cable now has 248 elements (2 m, 2.5 m and 2.5 m in its three sections, each at most half the bending length) instead of 87 (4 m, 4 m and 10 m). The note no longer fires, and
test_flagship_compression_noteagain rejects every note.The curvature channels move to the sag-bend peak (
Curv4N20/BendMom4N20→Curv4N38/BendMom4N38).The one-hour full-turbine record of #14 is rerun on the new mesh:
The anchor stick-slip peaks of the old record came from the coarse mesh; on the resolved mesh the friction of the 370 m laid section absorbs the touchdown tension changes. VALIDATION.md, the OpenFAST tutorial output and
validation/OPENFAST_DLC_VERIFICATION.mdare updated (the Hs 11 power-cable run there is labelled as made on the former mesh). The other 51 examples are byte-identical; nosrc/file changes in this commit. The separate test fixtures copied from the old example keep the old mesh.Tests
tests/data/lazy_wave_touchdown_torsion_coarse.dat(static only, 2.2 s), CTestdriver_lazy_wave_torsion_coarse_refined: expects success, the refinement note once, "stable on the refined mesh of 348 elements" and "torsion solved". Against the dev driver it fails (driver exit 2). It also initialises withcable_statics sequenced(fairlead tension 11921.9 N, as on the 1 m and 2 m meshes).pre-commit run --all-filespasses.Not changed, for a later decision: a torsion-free line on such a coarse mesh is checked only in plane. Its dynamics then start from an equilibrium that is laterally unstable in 3D, and only symmetry keeps it planar. A 3D check or refinement at hand-off would change existing results, so it is not part of this PR.
Checklist
pre-commit run --all-filespassesctest --test-dir build --output-on-failurepassespython -m pytest tests python/testspasses (if Python or validation records changed) — not applicable[Unreleased](heading added if missing) for user-visible changesdoc/updated for changed inputs, options, or outputsfeat:,fix:,docs:, ...)git commit -s) under theDeveloper Certificate of Origin