Skip to content

PRO — 12/18: validation models - #234

Merged
diegokingston merged 21 commits into
mainfrom
feat/pro-12-validation-models
Sep 30, 2026
Merged

diegokingston merged 21 commits into
mainfrom
feat/pro-12-validation-models

Conversation

@Batuis

@Batuis Batuis commented Sep 28, 2026 •

Copy link
Copy Markdown
Collaborator

Part 12 of 18. Stacked on #233.

Seven published sample structures modelled one to one, in a new "Validation models" group of the PRO examples. They are what parts 13 to 16 measure the app against.

What it brings

Seven validation models (validation-01 to validation-07). Each is a model-code file (templates/validation/*.stabileo.txt) that reproduces its source structure:

  • the same geometry, with the source's node and member numbering;
  • the same supports, releases, end offsets and roll angles;
  • the sections by their declared properties (A, Iy, Iz, J and shear areas), so shear deformation is in, as in the source;
  • the same material, cases, loads and combinations.

What each file adapts is written at its top, and on its card:

  • Z up instead of Y up: (x, y, z) becomes (x, −z, y);
  • SI units by exact factors (inches, feet, pounds and kips where the source used them);
  • loads the source program computed and here are ordinary loads: a generated seismic load as nodal forces (06), area loads already spread to the beams (07), reference cases as ordinary cases;
  • where the source gives G apart from E, ν is set so that G is exact (02);
  • the source's own design check is not reproduced (04).
Model What it is Size What it exercises
01 Steel-framed building with shell slabs and walls 1153 nodes, 552 members, 1000 shells end offsets, slab pressures, shells
02 Light warehouse with roof trusses 56 nodes, 119 members offsets, roll angles, loads in local axes
03 Storehouse with shell walls and a truss roof 230 nodes, 97 members, 156 shells single angles on principal axes, shells
04 Hangar with crane runways 1149 nodes, 2482 members releases, 22 cases, P-Delta per combination
05 Guyed lattice tower 150 nodes, 450 members tension-only guys, superposed combinations
06 Plane frame under lateral forces 18 nodes, 25 members shear deformation, seismic forces as loads
07 Four-storey building with floor loads 40 nodes, 76 members rigid diaphragms, trapezoidal floor loads

The "Validation models" group. Seven cards in the examples list, after the showcase group. A card loads its model as it is: no regulation combinations are generated over the model's own, and its self-weight rule is the one the file states.

The loader. loadValidationModel(id) parses the code and restores the model as one undo step.

Found on the way

  • The orphan-rotation stabiliser put springs on shell corners. It counted only frame members, so every node that a quad or triangle alone reaches got a vanishing spring on all three rotations. The engine's shells stiffen those rotations themselves, drilling included, and the springs were not harmless: they carried part of the moment about the shell's normal to ground, outside the reported reactions. Shell corners now count as resisted.
  • The engine's shell drilling penalty is not invariant under a rigid rotation (M14 in the engine's pending list). It stiffens the rotation about the normal alone, uncoupled from the in-plane translations, so the element acts as a weak spring to ground about its normal: on model 03 the reactions come short of the loads by 7·10⁻⁷ of the moment about the walls' normal. The balance test asserts every force and the moments the defect does not touch exactly, and an it.fails per shell model pins the rest, so fixing the engine flips it.
  • The engine's 3D P-Delta assembles dense matrices (M15). On model 04 (about 6700 degrees of freedom) each matrix takes about 360 MB and the WASM aborts after four or five minutes. The same model solves linearly in 0.14 s. P-Delta per combination does not solve a model this size here; the balance test checks the cases and does not trigger it. Part 13 (PRO — 13/18: engine, sparse 3D P-Delta, released members, cables and shell shear #235) assembles it sparse.
  • Two corrections went into PRO — 11/18: calculation fidelity #233 while building these, and are merged here: a uniform load on a quad now reaches its corners as consistent loads (model 01 depends on it), and a supported node stays in the active set when every member at it goes slack (model 05 depends on it).

Not changed

  • The Rust/WASM engine and its bindings. M14 and M15 are recorded for part 13.
  • ProDiagnosticsTab.svelte.
  • Every other example, and how regulation combinations are generated for them.
  • No capability is added here: every feature the seven models use came in PRO — 11/18: calculation fidelity #233 or before.

Tests

  • Unit (validation-models.test.ts), for each of the seven:
    • the file parses without an error;
    • it loads with its counts and exactly the ids it states;
    • writing the loaded model back as code and reading it again gives the same model;
    • every case solves and balances in six components (forces and untouched moments exactly for the shell models, with M14 pinned by it.fails);
    • and the group lists one card per model, each loading its own model with its own combinations and self-weight rule.
  • Unit: a node only a quad reaches gets no stabilising spring.
  • E2E: pro-validation-models, the group lists the seven and a card loads its model as it is.
  • Gates: typecheck at its baseline, both test passes, build, check:gate.
  • Full E2E locally: 1390 passed. The failures are the ones the base has too (basic-demos drawing a beam, landing, section-analysis, and the non-blocking rc-design-visual baseline); pro-modelling-flow failed once under load and passes on its own. In CI one shard failed on basic-demos "section walkthrough" and passed when rerun.

QA

  1. Project › New model › Examples: the "Validation models" group lists seven cards, each describing what was adapted.
  2. Load Validation 06, solve: three cases, EX, DL and LL, with self-weight in DL only.
  3. Load Validation 07, open Loads: the floor trapezoids on the beams, and the four diaphragms in Constraints.
  4. Load Validation 05, open Loads › Combinations: "Superpose the cases" is selected; solve and read the active-set report in Results.
  5. Load Validation 02: the purlins show their roll, the top chords their offset.
  6. Load Validation 04 and open the model code: 2482 members with their releases. Solving it with P-Delta per combination is the engine limit described above.

…nd the "Validation models" group

The model is model code, loaded as it is (no regulation combinations): the same nodes and
members with their numbering, the section by its declared properties with shear areas, the
generated seismic forces as nodal loads, and the two mass-only gravity cases as ordinary cases.
The loader parses the code and restores it as one step. Tests: it parses, loads with its counts
and numbering, writes back identically, balances every case, and loads from its card.
…floor loads

The floor loads are the source's area loads already spread to the beams as trapezoids; they
were stated along the physical beams and are cut at each analytical member here. Each floor is
a rigid diaphragm, self-weight is a load of the dead case, and the combination keeps its id.
…sses

Rigid joints, global end offsets equal at both ends, the purlins' roll angles, and the chord
loads in global and local axes, each stated over its physical member and applied to every
member of it. The source gives G apart from E, so nu is set to reproduce G exactly.
The orphan-rotation stabiliser counted only frame members, so every node a quad or triangle
alone reaches got a spring on all three rotations. The engine's shells stiffen those rotations
themselves, drilling included, and the springs were not harmless: they carried part of the
moment about the shell's normal to ground, outside the reported reactions.
…teel truss roof

The walls are the source's own quadrilateral mesh; the single angles are given about their
principal axes, with beta as the roll angle. The balance test asserts every force and the
in-plane moments exactly, and pins with it.fails the engine's drilling penalty, which leaves
the moment about the walls' normal short by 7e-7.
…abs and walls

The slabs and core walls are the source's own meshes; the floor beams sit below the slab
mid-plane by a global end offset, and the slab pressures act as surface loads. Every force
balances exactly; the moments are pinned with the drilling defect M14.
…ly guys

The eighteen guys work in tension only and the combinations are sums of the cases, each solved
with its own active set (combinationMethod superpose), as in the source. Self-weight is on the
tower members only, and the wind loads every member, the guys included.
…82 members

Many members pinned at their ends (and two with the axial force released too, as a joint
mask), 22 load cases stated in feet and pounds, and 14 combinations solved with P-Delta on their
own factored loads. The balance test checks the cases; the engine's 3D P-Delta assembles dense
matrices and does not fit a model this size (M15).
@diegokingston
diegokingston changed the base branch from feat/pro-11-fidelity to main September 30, 2026 18:07
@diegokingston
diegokingston merged commit 58868e3 into main Sep 30, 2026
14 checks passed
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.

2 participants