PRO — 11/18: calculation fidelity - #233
Merged
Merged
Conversation
…d an axial part, and the active set in JS Self-weight is a load of a case (`analysis.selfWeight`): case, global direction, factor and scope (whole model, a list or a group), applied along each member as rho*A, so a beam takes its own wL^2/8. A project without the rule keeps the older one until the PRO panel migrates it to its first D case, with a notice; a shipped example is given the rule quietly when it loads. Every member load goes through one representation, a global force per metre at the ends of the loaded stretch (`member-loads.ts`), read by the solve, the statics check and the viewport. Distributed 3D loads take `frame` (local, global, projected) and an axial part, which goes to the end nodes with its couple when an offset separates them. Transverse loads on axial-only members go to their nodes as simply supported reactions, since the truss assembly drops them. One-way members and lifting supports are solved by an active-set loop over the linear solve, replacing the contact solve: members out of the input carry exact zeros, reactions stay, a settlement is its own case, and each result carries a NonlinearReport that Results shows. Combinations are solved each on its own loads or superposed from their cases (`analysis.combinationMethod`), and optionally with P-Delta per combination. Numbers re-recorded with their reason: the 408-member frame designs nine more beams (their lateral ratio falls under 10 %), the 7-storey example has no proposal left, fewer beams need a hanger pair, and the CIRSOC 201 post's shear row reads 0.88. The RC QA frame states its dead line load as 22 - rho*A so its beams carry the 22 kN/m they were sized for; its CAD handoff golden is byte-identical. The quantities card's coverage line meets its contrast bar.
…cal, global or projected axes, one-way members and how combinations are formed
Batuis
marked this pull request as ready for review
September 28, 2026 03:33
… loads A quarter of q·A (or rho·t·A) to each corner puts the resultant at the average of the corners, which is the centroid only for a parallelogram; on an irregular mesh it moved the moment of every slab pressure and of every shell's self-weight. Each corner now takes its share of the integral of its bilinear shape function, in the solve and in the statics check alike.
…s load The active set took out, with the slack members, every node only they reached, and a supported node went with its support and with the share of the guys' loads already moved to it. A supported node now stays in the solve whatever is slack around it.
This was referenced Sep 28, 2026
diegokingston
changed the base branch from
feat/pro-10-steel-sections
to
main
September 30, 2026 16:30
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part 11 of 18. Stacked on #232.
This part is about calculation fidelity: loads that go where they are stated, one-way members solved in JS, and one explicit rule for how combinations are formed. The engine is not touched.
What it brings
Self-weight as a load of a case (
analysis.selfWeight).Distributed 3D loads with axes and an axial part.
frame:local(qx along the member, which is the axial part, and qy, qz along its local axes),global(per metre of member) orprojected(per metre of the member's projection, so a rafter's snow can be stated per metre of plan).member-loads.ts). The solve, the statics check and the viewport all read it from there.frameand the axial part correctly: a global load is rotated with the model, and only a local axial load changes sign on a flip.Transverse loads on axial-only members. The engine's truss assembly drops a transverse member load, so a load on a truss member used to vanish. It now goes to the two end nodes as the reactions of a simply supported span. The model diagnostic says so instead of warning that the load is lost.
One-way members solved in JS (the active set).
solveNonlinear3Dis now a loop over the ordinary linear solve: a tension-only or compression-only member working the wrong way, or a lifting support that pulls, leaves the input and the model is solved again, until nothing changes. The engine's contact solve is no longer used.NonlinearReport: converged, iterations, slack members, lifted supports, and members that keep switching. The Results panel shows it when there is one.How combinations are formed (
analysis.combinationMethod).solveEach(default): each combination is solved on its own factored loads, with its own active set.superpose: the cases are solved one by one, each with its own active set, and summed. The report then lists the one-way members and supports whose state in the sum contradicts their behaviour.P-Delta per combination (
analysis.perCombination: 'pdelta'). Cases stay linear; each combination is solved with P-Delta on its own factored loads, with the corrected member forces from #232.Found on the way
The engine's contact solve and its truss assembly have five defects that this part works around in JS (M7 to M11 in the engine's pending list): the contact solve returns no reactions; a member it switches off reports the forces of the full structure; a tension-only
framemember keeps its stiffness; its iterations, convergence and diagnostics were discarded; and the 3D assembly drops transverse loads ontrussmembers.The flagship 408-member frame designs nine more beams. Self-weight now bends every beam about its strong axis and adds nothing lateral, so nine BEAM-Y members fall under the 10 % biaxial threshold (0.104–0.125 before, 0.080–0.097 after). 395 verified and 13 proposals, from 386 and 22. Utilisation moved on 100 members, 65 up and 35 down, and the worst is still 1.000.
The 7-storey example has no proposal left. Its slabs meet the beams only at the columns, so a beam's primary moment used to be little more than frame action; with its own weight (6 kN/m on a 30×80 over 6 m) the five former proposals drop to ratios of 0.031–0.055. The tests that exercise the proposal on every projection now run on the 408-member frame, which still has 13.
The RC QA frame stopped closing its detailing. With 22 kN/m stated on top of the weight, the 300×550 beams got Ø16 bottom bars, and the 135° tails of the crossing beams' stirrups then reached a second-layer bar at every corner. The frame was sized for a dead line load of 22 kN/m, so its stated line load is now 22 − ρ·A = 17.875 kN/m with the weight as a case load. It designs exactly as before, and the CAD handoff golden reproduces its bytes. The detailing limitation is real and is recorded for later: the design loop does not try another layout when every stirrup corner is blocked.
A uniform load on a quad was split a quarter to each corner. That puts the resultant at the average of the corners, which is the centroid only for a parallelogram, so on an irregular mesh every slab pressure and every shell's self-weight had its moment shifted (3·10⁻⁵ on a published building with an irregular slab mesh). Each corner now takes ∫Nᵢ dA, its consistent share, in the solve and in the statics check alike. No test needed re-recording.
An anchor whose guys all went slack lost its support. The active set took out every node only slack members reached, supported ones included, and with them the share of the guys' own loads already moved to that node. A supported node now stays in the solve.
The quantities card's coverage line was under its contrast bar (3.62 against 4.5 at 9.6 px), which failed the documents-stage legibility check in all three languages on the base branch as well. It now uses the secondary text colour.
Numbers re-recorded, with the reason
rc-baseline-digest,autodesign-regression,coverage-outcomes, e2erc-designB9rc-baseline-digestfingerprint792b6f88…f4681de2…beam-reinforcement-audittop-steel-projectionsbeam-emptiness-diagnosticrebar-3dproject-restore,ded-roundtrip15ce4e15…1637ce2d…Not changed
ProDiagnosticsTab.svelte.Tests
fidelity-loads: wL²/8 and wL²/12 from self-weight; its own case, factor, direction and group; the legacy rule; global against projected on a 3-4-5 rafter (10 against 8); an axial column load; a truss equal to the pin-ended frame; P-Delta per combination against the exact solution.active-set: tension-only frame diagonals, exact zeros, reactions, statics in six components, a swap of the active diagonal, solveEach against superpose with the sign violations, a settlement in each combination once and in no case, and a slack guy at an anchor nothing else reaches.quad-load-shares: a rectangle in four equal shares, a trapezoid with its resultant at the centroid, and the surface load and shell self-weight handed to the engine with those shares.pro-analysis-rules(self-weight rows, factor and new entry on the model, combination method and P-Delta, load axes from the table, an older project migrated once with its notice, the active-set report in Results), plus the loads, results, project-file, round-trip, design and rebar suites that these numbers reach.basic-demos(drawing a beam),landing(the deck's pricing table) andsection-analysis(closing the panel). A@perforbit case is flaky under load, and the visual baselines are non-blocking.m2-steel-workflow's Lb cell locator also matched the Lb editor's card; it is narrowed to the table's cells.QA
.dedwith members and loads): the notice names the case the weight went into.