Integraph

Section analysis

Run ultimate and serviceability limit state checks, prestress analysis, fire design, and moment-curvature analysis on concrete sections.

Overview

Once you have defined the section geometry, reinforcement, and materials, ACS runs design checks automatically as you enter or modify design actions. Results appear in the right panel, organised by limit state.

All calculations re-run with a short debounce delay after any input changes. You can also force a full refresh with Ctrl+Shift+Enter.

Result-panel tabs colour by design verdict: a tab turns green when every check in its group passes and red when any check fails (#4179). A grey tab means no result is available yet (no loads entered, or the calculation has not run). The colour reflects the outcome of the design calculation — a tab that ran to completion but found a failure shows red, not green.

ACS calculations are reconciled to AS 3600:2018 Amendment 2:2021 for Australian projects. See Design standards for a full code-by-code comparison.

Circular and arc ring sections are fully supported. A circular cross-section drawn as a two-vertex closed arc loop (the native representation — see Canvas editor) is now admitted by every analysis gate, including the stress map, shear, crack width, and fire heat transfer paths. Sections previously refused at any of those gates will now produce results. The “Define section geometry” progress message, which was incorrectly shown mid-analysis for circular sections, no longer appears once geometry is defined.

:::note[Self-touching ring at non-adjacent vertex refused — September 2026 (#5410)] A section ring whose outline touches itself at a non-adjacent vertex is now refused in both geometry kernels (ACS and GCS). A self-touching ring is topologically ambiguous — the two sub-regions it encloses are not independently identified as solid or void by the ring winding alone, so any area, centroid or fibre-integration result would depend on an implicit and unverified choice. The refusal fires before any calculation runs. Correct the outline in the canvas editor so that non-adjacent vertices do not coincide. :::

ACS concrete section designer — geometry, reinforcement, and results panels
ACS concrete section designer — geometry, reinforcement, and results panels
ACS Design Summary panel with the SLS group expanded — per-check results for the governing serviceability combination, beside the ULS Category Rollup.
ACS Design Summary panel with the SLS group expanded — per-check results for the governing serviceability combination, beside the ULS Category Rollup.

:::note[stressModel and memberType are required on payload routes — August 2026 (#4943)] Both fields are required on every concrete payload route that computes with them. Omitting either returns a 400 — not a fallback to the design code’s rectangular block or to a beam classification.

  • stressModel selects the concrete constitutive law ("rectangular", "hognestad", "parabolic_rectangular", "bilinear", "mander", "kent_park", "popovics", "fib_mc2010", "linear_elastic_cracked_transformed"). Before this change, an omitted stressModel silently resolved to the design code’s default — "rectangular" for AS 3600 and ACI 318, "parabolic_rectangular" for EN 1992-1-1. On the full analysis runner (/analyze), the substitution was worse: the flexural and interaction legs used the rectangular block while the ULS stress-distribution leg used Hognestad, so a single response could carry capacity values and a stress map integrated from two different constitutive laws, with neither named.
  • memberType ("beam", "column", "slab", or "wall") selects the ductility check family, the AS 3600 Cl. 10.1.2 minimum design moment row, and other member-type-scoped provisions. Before this change, an omitted value was treated as "beam" — the beam ductility verdict and moment floor applied to a column, and the column ductility omission applied to a beam, with no signal either way.

Two exceptions are deliberate: on /interaction and /mk-interaction, memberType is required only when the request carries a design point (it selects the minimum-design-moment clause applied to that point; a curve with no design point is identical for every member type).

The editor always sends both fields — they are chosen from fixed lists — so this affects direct API and MCP payload callers only. The id-addressed derived reads (/design-options/{id}/...) resolve both from the persisted section and refuse by name if either is unset. :::

:::note[An unrecognised stressModel now refuses the whole run — August 2026 (#4802)] An unrecognised stressModel value is refused once, up front, for every load combination. Previously the refusal depended on the combination: one carrying applied moments returned a 400, while one without them returned 200 with every capacity — flexural, interaction, biaxial, stress distribution, moment-curvature — left null beside a warning naming the unknown model.

Both now return 400. A constitutive law that cannot be constructed invalidates every fibre and polygon-clip check at once, so there is no combination for which continuing is meaningful, and which branch a combination happens to enter is not something the engineer can see.

This affects direct API and MCP callers only — the editor and the typed client choose from fixed lists, so an unrecognised value cannot reach the runner from them. The admissible values are listed above. Note that model names are case-sensitive: "Hognestad" is refused, "hognestad" is accepted. :::

:::note[Unbuildable stress model now refused explicitly — August 2026 (#5054)] A stress model that is recognised by name but cannot be constructed for the current section geometry or design code is now refused at the runner’s front door with a clear diagnostic. Previously such a configuration could produce a silent incorrect result. If you encounter this refusal, either change the stress model in the Materials panel to one that is compatible with your section, or adjust the section geometry or design code to match your chosen model. :::

:::note[Material properties now resolve from catalogue snapshot — August 2026 (#4986)] fcf'_c, fyf_y, and EsE_s now resolve exclusively from the MaterialSnapshot stored at the time the material was picked. Previously fcf'_c was read from a denormalised column that was not refreshed after a catalogue correction — so after a catalogue edit and a Recalculate, the panel cleared but capacity continued computing on the pick-time fcf'_c. EsE_s was sharper: no picker ever wrote it, so any design on a rebar product declaring a non-standard modulus (for example 170 000 MPa) computed serviceability stresses, crack widths, and deflections against 200 000 MPa regardless of the catalogue value.

CalculationVersions.ConcreteMaterialisation was bumped 1.2 → 1.3, evicting cached results for:

  • Designs where a catalogue material’s strength was corrected after the pick
  • Every design on a rebar product whose declared Es200000E_s \neq 200\,000 MPa

New designs now start linked to the jurisdiction’s default catalogue material rather than mounting with untraceable fc=32f'_c = 32 / fy=500f_y = 500 / Es=200000E_s = 200\,000 literals. If a fresh design showed those exact values before you selected a material, re-select the material to record the snapshot. :::

:::note[Analysis panel correctly disabled when entitlement is absent — August 2026 (#4947)] The analysis panel now shows a “not available on your plan” state rather than an error when the account’s concrete-designer access entitlement is inactive. Previously, the useAnalysis hook could attempt to run analysis regardless of the entitlement gate under certain states — for example, immediately after a session that had entitlement — producing a request error visible to the user. The hook now holds the request back and clears any stale results when the entitlement is absent. No analysis logic changed; only the gate behaviour was corrected. :::

:::note[Physics-selecting control defaults are now persisted — September 2026 (#5287)] Five controls that displayed a default value but did not write it on save have been corrected: the creep environment class (Time-Dependent panel), the fire support condition (Fire panel), and three further design-code-dependent selectors. Each control’s visible default is now written into the section record when you save, so the analysis always runs against what you saw on screen. Before this fix, a section saved without explicitly changing one of these controls held null in the database while showing the default — re-saving without editing would produce a different analytical result (§874). :::

Applied loads

Open the Applied Loads panel to define design actions. Select the member type to control which load fields are visible:

Member typeVisible loads
BeamMxM^*_x, VxV^*_x, VyV^*_y
ColumnNN^*, MxM^*_x, MyM^*_y
Beam-ColumnNN^*, MxM^*_x, MyM^*_y, VxV^*_x, VyV^*_y, TT^*

The Member Type input carries an inline scope note listing the behaviours it governs (#4212). The member type affects 11 separate behaviours across ULS, SLS, and AS 3600 clause selection — including the ductility check, the kuk_u/εt\varepsilon_t limit, the mandatory-transverse-reinforcement depth gate, minimum design moments (Cl. 10.1.2), the shear-method availability, the ADEQUATE gate in the summary report, the member-type advisory in the Design Summary, and several others. The note is visible at input time so the scope is clear before you run the analysis.

Sign conventions

ACS follows the platform-wide canonical:

  • Positive NN^* = compression (the section is being pushed together).
  • Positive MxM^*_x = sagging about the xx-axis = compression at the top face (ymaxy_\mathrm{max}). Tension at the bottom face.
  • Positive MyM^*_y = bending about the yy-axis with compression at the left face (xminx_\mathrm{min}). Tension at the right face.
  • Combined positive Mx+MyM^*_x + M^*_y → peak compressive stress lands in the top-left quadrant.
  • Concrete and steel stresses reported by ACS use σ > 0 = compression (the concrete-design convention).
  • Neutral axis depth cc (or dnd_n) is always measured from the compression face — for positive MxM^*_x that is the top face downward.

Hover the Mx or My label in the Applied Loads panel to see the per-field tooltip, or look at the Y↑ X→ axis indicator in the bottom-left of the canvas.

For the full canonical (strain field, curvature signs, transcribing from external sources) see Platform — Sign and axis conventions.

Load combinations

ACS supports multiple load combinations, each tagged with a limit state:

Limit statePurposeExample
ULSUltimate strength checks (flexure, shear, interaction)1.2G + 1.5Q
SLSServiceability checks (stress, crack width, deflection)G + 0.7Q
FireFire-rated capacity checks at elevated temperatureG + 0.4Q (fire)

Type directly into the ghost row at the bottom of each limit-state table to add a new combination. Entering a value in any ghost-row cell immediately materialises a real row, seeded with that value, and keeps focus in the same cell so you can continue editing without interruption.

Within a row, Tab moves to the next cell (wrapping to the next row at the end), Shift+Tab moves back, and Enter commits the current cell and advances focus downward. The ghost row at the bottom is always available — pressing Tab through the last real row lands on it.

Each combination also has an active/inactive toggle. Unchecking a combination excludes it from the design entirely: no check runs against it, it governs nothing, and it cannot fail the ULS or SLS badge or appear in the Design Summary (#5957). It stays in the table, greyed, so you can check it again at any time.

The calculation report lists excluded combinations rather than omitting them, marked EXCLUDED in the Multi-Combination Summary table and named in the report’s warnings. A combination silently absent from a report reads as one that was verified, which is exactly as misleading as one that was checked against your wishes — so the report states which combinations carry the verdict and which do not.

:::caution[Results change for sections with mixed active/inactive combinations — September 2026 (#5967)] Prior to the September 2026 release, unchecked (inactive) load combinations were not consistently excluded from every result surface. The ULS utilisation badge, the Design Summary totals, and the generated report could include results from combinations that were inactive in the editor.

If your section has a mix of checked and unchecked load combinations, re-run the analysis and regenerate any saved reports. Results will change to reflect only the active combinations. Sections where all combinations are checked, or all are unchecked, are unaffected. :::

AS 3600 Cl. 10.1.2 minimum design moments appear as a read-only row in the ULS actions grid for Column member types (#4194). The row is auto-generated from the section dimensions and cannot be edited directly — it represents the minimum eccentricity demand the clause imposes on short columns: Mmin=N0.05DM^*_{\min} = N^* \cdot 0.05 D (where DD is the dimension in the direction of bending).

The row appears only when the clause actually raises one of your entered moments (#4312). If both MxM^*_x and MyM^*_y already exceed their minimums, nothing was substituted and no row is shown — the combination you entered is the combination that was checked. When the row does appear, a min marker sits against each axis that was raised, and hovering the row explains both axes, including the floor the clearing axis cleared.

This row is scoped to Column and Wall member types only (#4181). AS 3600 Cl. 10.1.2 is a column clause; beams and slabs do not receive a minimum design moment row. If a member previously declared as Beam or Slab was receiving minimum moments, re-run the analysis — the result will change.

The governing combination for each check type is identified automatically in the Design Summary.

k_φ — capacity reduction modifier (AS 3600 Amendment 2:2021)

When the AS 3600 design code is selected, each ULS load combination has a compact k_φ inline dropdown in the trailing column of the load table:

k_φ valueFactorWhen to use
Full1.0The column is short (Cl. 10.3) and Q/G0.25Q/G \geq 0.25
Reduced12/13 ≈ 0.923All other cases (default)

The k_φ class modifies the compression-controlled capacity reduction factor: ϕo=0.65kϕ\phi_o = 0.65 \cdot k_\phi.

This input gives you direct control over the Amendment 2:2021 capacity class per load combination, independently for each combination. For short columns under predominantly live load (Q/G0.25Q/G \geq 0.25), use Full; for long columns or gravity-dominated loads, use Reduced.

Applied Loads panel — inline k_φ and SLS sub-state dropdowns in each load combination row (AS 3600)
Applied Loads panel — inline k_φ and SLS sub-state dropdowns in each load combination row (AS 3600)

SLS sub-state — limit-state type per combination (AS 3600)

Each SLS load combination carries a sub-state inline dropdown in the trailing column of the SLS table. The sub-state controls whether long-term time-dependent behaviour is activated for that combination:

Sub-stateBehaviour
SLSShort-term checks. Creep and shrinkage terms are not applied.
QP (quasi-permanent)Long-term checks. Triggers φcc\varphi_{cc} and εcs\varepsilon_{cs} terms in crack-width and deflection calculations.

Selecting QP expands a second row beneath the combination for time-dependent inputs: the concrete age at loading t0t_0, an optional φcc\varphi_{cc} override, and the derived final design creep factor. Short-term (SLS) rows collapse to a single line.

The ACI 318 and EN 1992 equivalents are LT (long-term) and Char / Freq / QP respectively. All sub-states use the same inline-dropdown pattern regardless of design code.

:::note[Explicit zero creep and shrinkage overrides are now honoured — September 2026 (#5388)] An explicit creepCoefficient or shrinkageStrain override of 0.0 on a time-dependent combination is now treated as a declared zero rather than as “not set”. Previously a zero value resolved to the same code path as an absent one, so a deliberately zero long-term factor — for example, a section in a controlled-humidity environment where neither creep nor shrinkage develops — was silently replaced with the material model’s computed estimate. Supply 0.0 to declare the factor is genuinely zero; leave the field absent to have the engine compute it from the section’s material and age inputs.

This complements the PT-loss fix (#5315) that applied the same correction to long-term prestress-loss coefficients. :::

Ultimate limit state (ULS)

:::note[ULS panels migrated to by-id reads — September 2026 (#5554)] Five ULS result panels — flexure, shear, crack width, minimum reinforcement, and ductility — are now served via by-id derived reads rather than the retired payload POST compute routes. For users working in the section editor, the panel results are identical — the same analysis engine runs against the persisted section record. API and MCP callers using the retired POST /api/v1/concrete/... payload routes will receive a 404; switch to the GET /api/v1/concrete/design-options/{designOptionId}/... endpoints, which resolve all inputs — geometry, materials, reinforcement, combinations, and kϕk_\phi class — from the persisted section. :::

:::note[ULS results now available for tendon-only sections — September 2026 (#5601)] ACS now produces ULS capacity results for sections that contain prestressing tendons but no conventional longitudinal reinforcing bars. Previously, the ULS panel remained disabled for tendon-only post-tensioned sections with no explanation — the precondition gate checked only whether conventional bars were present. The gate has been extended: a section is treated as steel-bearing when it contains at least one bar or at least one tendon. Engineers designing post-tensioned members without conventional longitudinal steel — hollow-core slabs, prestressed piles, some post-tensioned beams — can now access the full ULS capacity surface. :::

:::note[Result panels wait for the save, rather than reporting an error — September 2026 (#5909)] Every result panel is computed from the saved section record, not from the canvas in front of you. Immediately after you draw a section for the first time, or in the moment after you switch between design options, the saved record has not yet caught up with the screen — and the panels used to report an error naming a section or load combination you could plainly see.

They now wait instead, showing the usual “updating” affordance until the autosave lands (about a second) and then computing normally. Nothing is discarded and no result is approximated: this only changes what you see during the gap. :::

:::note[By-id reads return a clear refusal when no persisted row exists — September 2026 (#5920)] A derived read (flexure, interaction, shear, sls-stress-field, batch-design-check, and the rest) addresses the section by designOptionId. If that ID does not yet have a persisted row in the section store — for example, immediately after a design option is created before any section geometry has been saved — the endpoint now returns 404 with code: no_persisted_row rather than the generic not-found shape it previously returned for all 404 cases. API and MCP callers can now distinguish “this design option does not exist” (design_option_not_found) from “the design option exists but has no section data yet” (no_persisted_row), and handle the two cases appropriately. :::

:::note[Bar areas now come from the product table, not from the diameter — September 2026 (#5982)] Where a bar or fitment names a catalogue size, every capacity is computed on that size’s published nominal area. Where it does not — a diameter you typed, or any section saved before the size catalogue shipped — the area is the circular idealisation πd2/4\pi d^2/4, exactly as before. No saved design moves unless you pick a catalogue size for it.

The distinction matters because a published nominal area is an independently rounded figure and is not πd2/4\pi d^2/4, and the gap is much wider on some tables than others:

Bar tableLargest disagreement with πd2/4\pi d^2/4Where
AS/NZS 46710.05 %N10
EN 100800.09 %6 mm
ASTM A6151.83 %#4 (13M) — 129.0 mm² against 126.68 mm²

ASTM A615 is the one to know about. Its published areas are not close to the circular values: as well as #4’s +1.83 %, #6 (19M) sits 0.88 % below πd2/4\pi d^2/4, so deriving that bar’s area from its diameter over-states the steel. An ACI 318 beam with six #4 bars moves from 760.1 mm² to 774.0 mm² of tension steel when you select the catalogue size — +1.83 % straight into ϕMu\phi M_u.

The published diameter, area and mass are three separate numbers and ACS never recomputes one from another.

Nominal diameter still drives everything the Standard expresses in dbd_b — cover and axis distance, bar positions and lever arms, fitment spacing 15db15 d_b, mandrel and bend radii, development and lap lengths, and the crack-spacing bond terms. A declared area says nothing about a bar’s surface, so no bond or perimeter term changed.

The report’s Bar Size Basis table states, per bar family, which of the two applied: the catalogue code and designation, or “dimensional input — no catalogue identity”. :::

Flexure

The flexure panel reports uniaxial bending capacity about the major (xx) and minor (yy) axes.

Capacity results

Key results:

OutputSymbolUnitsDescription
Pure-bending capacity (nominal)MuoM_{uo}kN·mMoment capacity at zero axial load
Pure-bending capacity (design)ϕMuo\phi M_{uo}kN·mDesign capacity at N=0N = 0, after ϕ\phi reduction
Capacity at NN^* (nominal)MuM_ukN·mMoment at which the section reaches ultimate strain at the applied axial
Capacity at NN^* (design)ϕMu\phi M_ukN·mReduced capacity after applying ϕ\phi at the applied axial
UtilisationM/ϕMuM^* / \phi M_uMust be 1.0\leq 1.0
Neutral axis depthccmmDepth of compression zone from the compression face
Ductility parameterkuk_u or εt\varepsilon_tCode-dependent ductility measure
Ductility statusPass/fail against code limit
Axial boundsϕNu0\phi N_{u0} / ϕNu,tens\phi N_{u,tens}kNSquash load and tension capacity — the axial-force range of the interaction surface; null when the section has no reinforcement (#5167), or when bounds cannot otherwise be computed — withheld rather than returned as a (0, 0, 0, 0) sentinel (#5296)

ACS reports both MuoM_{uo} / ϕMuo\phi M_{uo} (pure bending, N=0N = 0) and MuM_u / ϕMu\phi M_u (at the actual applied axial NN^*) for each load combination. This lets you read the full design curve directly: the design point (NN^*, MM^*) is checked against ϕMu\phi M_u at that specific NN^* level rather than the single-axis ϕMuo\phi M_{uo} value.

ULS results panel showing flexural capacity, capacity reduction factors, and ductility check
ULS results panel showing flexural capacity, capacity reduction factors, and ductility check

Ductility applicability

The ductility checks below apply to a member declared as Beam or Slab in the General tab. A member declared Column or Wall does not get a Ductility status verdict — the panel instead shows an informational note, because reduced ductility for a compression member is carried by the capacity-reduction factor ϕ\phi (Table 2.2.2) and the M–N interaction check, not the beam ductility limit.

The declared member type — not the axial load level reached by any combination — is what selects the check. When a declared Beam/Slab’s worst-case combination reaches column-level axial compression (N0.10fcAgN^* \geq 0.10 f'_c A_g, AS 3600 Cl. 10.3.2), or a declared Column/Wall never reaches it, ACS surfaces the disagreement as an advisory mismatch warning rather than silently switching which check runs — see Design Summary § Member type classification advisory.

Ductility checks by code:

CodeParameterLimitReference
AS 3600kuo=dn/dok_{uo} = d_n/d_o0.36\leq 0.36 (without compression steel)Cl. 8.1.5
ACI 318εt\varepsilon_t (steel strain)0.005\geq 0.005Cl. 21.2.2
EN 1992x/dx/d0.45\leq 0.45 (typical)Cl. 5.5

dod_o is the depth to the centroid of the outermost layer of tensile reinforcement or tendons (Cl. 1.7) — not the area-weighted centroid of the tension group — and dnd_n is the pure-bending neutral-axis depth, so kuok_{uo} does not move with the applied axial force. On a prestressed section the tendon counts: where it lies outside the outermost bar, or where there is no passive steel at the station, the tendon is what sets dod_o.

:::caution[Results may change — dod_o correction for tendon-only PT sections (#5049)] Prior to the August 2026 release, dod_o was not correctly resolved for sections that carry tendons but no bonded reinforcement. Such sections received a degenerate kuok_{uo} result. If your section has tendons but no conventional rebar, re-run the ductility check — the reported kuok_{uo} and ductility status will now be correct. :::

Compression-controlled classification

When the flexural ductility check fails — or when the neutral axis depth indicates a compression-controlled failure mode — ACS classifies the section explicitly:

ClassificationMeaning
Tension-controlledDuctility satisfies the code limit; the full ϕ\phi applies
Compression-controlledNeutral axis depth exceeds the code ductility limit; ϕ\phi is reduced (ACI 318) or the section is disallowed (AS 3600 Cl. 8.1.5)

The classification is reported alongside the ductility parameter and status in the flexure panel.

Over-reinforced gate (AS 3600 Cl. 8.1.5)

When a section would be over-reinforced (i.e., ku>0.36k_u > 0.36 with no compression steel, or the beam fails the conditional-use check), ACS enforces AS 3600 Cl. 8.1.5: the standard disallows use of the section unless compression reinforcement is added to satisfy the ductility limit. In this case:

  • The flexure check reports a ductility failure, not a utilisation ratio.
  • The ϕMu\phi M_u result is disabled — displaying a capacity for an unconditional-use section would misrepresent the standard’s intent.
  • Add compression bars to lower kuk_u below the Cl. 8.1.5 limit.

This gate is scoped to a member declared as Beam or Slab (see Ductility applicability above); a declared Column or Wall is governed by Section 10 and the M–N interaction check instead, and never triggers the Cl. 8.1.5 use restriction.

Minimum bending strength (prestressed sections, AS 3600 Cl. 8.1.6.1(1))

For prestressed sections, ACS additionally checks that the pure-bending capacity MuoM_{uo} is at least the minimum strength Muo,minM_{uo,\min} per AS 3600 Cl. 8.1.6.1(1). This check ensures the section has adequate residual strength after prestress-induced cracking.

Minimum flexural reinforcement As,minA_{s,\min}

The section-level minimum reinforcement check uses the canonical flexural effective depth dd — the same dd value used by the per-combination flexural capacity analysis (distance from the extreme compression fibre to the centroid of the tension reinforcement). This ensures the minimum-steel check and the capacity result are always consistent, even for sections with mixed or non-standard bar layouts.

Min Reo panel

The Min Reo panel in the ULS results reports the minimum reinforcement check as a standalone result, separate from the flexural capacity utilisation:

OutputDescription
Required As,minA_{s,\min}Minimum area required by the governing code clause
Provided AsA_sTotal tension reinforcement area
UtilisationAs,min/AsA_{s,\min} / A_s — must be 1.0\leq 1.0 for the check to pass
StatusPass when provided area meets or exceeds the minimum

Reporting minimum reinforcement as a dedicated panel ensures the failure is correctly attributed: a section that satisfies the flexural capacity check but provides insufficient reinforcement shows Min Reo: FAIL rather than attributing the failure to the flexure check. The flexural capacity result and the minimum reinforcement result are independent.

Column minimum longitudinal steel (AS 3600 Cl. 10.7.1(a))

For sections declared as Column, ACS additionally checks the AS 3600 Cl. 10.7.1(a) floor: the total longitudinal bar area AscA_{sc} must be at least 1 % of the gross cross-sectional area AgA_g, unless the “oversized column” exception applies (Ascfsy>0.15NA_{sc} f_{sy} > 0.15 N^*).

The check appears as a dedicated Min Steel row in the ULS panel — separate from the flexural Ast,minA_{st,\min} row and from the interaction utilisation. A column under-reinforced below 1 % that passes every capacity check will show Min Steel: FAIL in the ULS panel and in the Design Summary, and the generated PDF will be marked INADEQUATE.

Fitment fsyf_{sy} is clamped at the Cl. 1.1.2(d) ceiling (600 MPa) for the per-fitment minimum stirrup area formula, consistent with how the transverse reinforcement check applies the ceiling everywhere else in the analysis.

SENSE 600 columns. When the section’s reinforcement grade is the InfraBuild SENSE 600® catalogue and CM30154 condition 1.1 applies, the area factor is reduced from 0.01 to 0.0083 per that certificate’s detailing exception, and the Min Steel row names the governing certificate reference rather than the bare Cl. 10.7.1(a) cite. If the certificate conditions are not met — for example, the declared detailing basis does not resolve — the check falls back to 0.01 and the panel states the reason. SENSE 600 materials can be selected directly in the reinforcement library; see Reinforcement § SENSE 600 product sizes.

This check is AS 3600 only and column member type only. ACI 318 and EN 1992 state their own column minimum-area floors and are not folded into this path.

:::note[Column minimum steel check added to the ULS panel — September 2026 (#6054)] The AS 3600 Cl. 10.7.1(a) column minimum longitudinal reinforcement check (Asc0.01AgA_{sc} \geq 0.01 A_g) is now evaluated and shown as a dedicated row in the ULS panel for sections declared as Column. Previously, this floor was not enforced anywhere in ACS — a column with less than 1 % longitudinal steel received a green ULS verdict on its N–M utilisation alone, with no minimum-area check. Results change for column sections where the longitudinal steel ratio is below 1 % of the gross area and the oversized-column exception does not apply.

The fitment yield strength is clamped at the Cl. 1.1.2(d) ceiling of 600 MPa consistently across all transverse minimum-area calculations. For SENSE 600 columns, the CM30154 cond-1.1 reduced factor (0.0083) applies where that certificate is in force.

:::note[A_st,min basis and crack-control limit now disclosed — September 2026 (#6085)] A_st,min basis and governing crack-control limit are now disclosed in the flexure panel and in the PDF report. The panel shows the code clause, the effective depth dd, and whether the flexural minimum or the crack-control limit governs the As,minA_{s,\min} requirement. If the minimum reinforcement requirement governs over the flexural capacity, the report names it as the controlling limit rather than attributing the design to the capacity check.

CalculationVersions was bumped; cached results are automatically evicted for affected sections. ::: :::

N-M interaction

For members under combined axial force and bending, the interaction diagram shows the full capacity envelope.

Uniaxial interaction plots the NN-MxM_x curve with key points:

  • Squash load: Pure compression capacity (M=0M = 0)
  • Balanced point: Simultaneous concrete crushing and steel yielding
  • Pure bending (MuoM_{uo}): Moment capacity at zero axial load
  • Pure tension: Tensile capacity (reinforcement only)

Your design point (N,MN^*, M^*) is plotted on the diagram. If it falls inside the envelope, the section is adequate. The ϕMuo\phi M_{uo} and ϕMu\phi M_u at NN^* values shown in the flexure panel correspond to the y-intercept and the design-point projection on the interaction surface respectively.

The interaction diagram reads ϕMu\phi M_u directly from the design curve at the applied NN^*, per AS 3600 Interpretation B — not from the uniaxial ϕMuo\phi M_{uo} value. This approach is consistent with how engineers read real interaction charts.

Biaxial interaction generates a 3D NN-MxM_x-MyM_y surface and checks the design point using:

  • Rigorous method: 3D surface interpolation
  • Bresler reciprocal (AS 3600 Cl. 10.6.4): 1/Nu=1/Nux+1/Nuy1/Nu01/N_u = 1/N_{ux} + 1/N_{uy} - 1/N_{u0}
  • Bresler load contour (ACI 318): (Mx/Mux)α+(My/Muy)α1.0(M_x/M_{ux})^\alpha + (M_y/M_{uy})^\alpha \leq 1.0

The biaxial check refuses axial demands that lie outside the squash-to-decompression range of the interaction surface. Providing a NN^* beyond the squash point triggers a clear error — ACS does not extrapolate capacity outside the envelope.

Biaxial utilisation now includes the axial component (#4183). Utilisation for in-envelope demands was previously computed in the MxM_xMyM_y plane only; the axial leg is now included, so the reported utilisation correctly reflects all three demand components when NN^* is non-zero.

The interaction read serves one utilisation for the envelope: designActions[].utilisation on the addressed combination, the rigorous interpolation off the biaxial surface — the MxM_xMyM_y contour extracted at NN^* and rayed along the true demand direction. It is the number the canvas Interaction tab displays, and the one the Design Summary’s Flexure row carries.

:::note[Biaxial surface built for uniaxial combinations — September 2026 (#5569)] The interaction by-id read now builds the biaxial N-MxM_x-MyM_y surface for every reinforced ULS combination, including those whose floored MyM^*_y is zero. The retired payload POST always built the surface unconditionally; the by-id path was incorrectly gating on the runner’s internal uniaxial-check shortcut — which skips the check for in-plane-only demands — applying it to the surface build too. Users with uniaxial-only combinations can now read the full 3D surface and the 2D NN-MxM_x curve from the by-id endpoint; callers that want only a uniaxial capacity can still use flexure (lower API cost — 40 vs 110). :::

:::caution[utilisationRatio removed from the interaction response (#5571)] The interaction read used to carry a second field, utilisationRatio, described here as a radial read-off against the design point (NN^*, MxM_x^*, MyM_y^*). That description was wrong: the field was computed against the uniaxial NNMxM_x curve and MyM_y^* was never one of its inputs, so it did not move at all when out-of-plane moment was added. On a reference section under My=30M_y^* = 30 kN·m it returned 0.536 beside a rigorous 0.647 — 16.9% apart, and the lower of the two.

The field has been removed rather than renamed or redefined; the panel row that showed it is gone with it. Two utilisations for one envelope, one of them blind to half the demand, is not something a label can make safe. If you read utilisationRatio from /api/v1/concrete/design-options/{id}/interaction or its MCP twin, switch to designActions[].utilisation on the entry with solved: true — that value has always been present on the same response, and it is the conservative one. The same quantity also left /analyze, where it appeared as combinations[].interactionUtilisation; read combinations[].biaxialRigorousUtilisation there. Nothing else changes: no remaining number moves. :::

:::caution[The fibre M-κ surface now applies the Table 2.2.2 axial-compression φ (#5543)] Prior to the September 2026 release, the fibre M–κ\kappa interaction surface — the mk-interaction read, and the overlay the Interaction Surface tab draws over the rectangular-block curve — applied AS 3600 Table 2.2.2 item (b), bending without axial compression, at every axial level it swept. One ϕ\phi per angle slice, held at the pure-bending value from the tension cap all the way to 0.85Nu00.85 N_{u0}, against a squash end-cap that already carried item (a)(ii)‘s ϕ=0.65\phi = 0.65. Item (d), the bending with axial compression interpolation down to ϕo=0.65kϕ\phi_o = 0.65 k_\phi, was never reached — which is also why the surface did not respond to the kϕk_\phi class at all.

Table 2.2.2 selects its row from the action combination, not from the integration scheme, so a fibre-integrated capacity under compression is the same design situation as a rectangular-block one. The old ϕ\phi was unconservative, and the two surfaces the tab draws together disagreed by that margin. On a 400×400 column with 8-N24 and fc=40f'_c = 40: at N=2436N = 2436 kN, ϕ\phi goes 0.850 → 0.654 and the design point moves from (2071 kN, 407 kN·m) to (1594, 314) — −23% for kϕk_\phi = full, −29% for reduced. Because the design axial is ϕN\phi N, the whole compression half of the surface relocates, not just its ϕ\phi column. The two analytic end-caps, every level at or below zero axial, and every ACI 318 or Eurocode section are unchanged.

Re-run any column checked against the M–κ\kappa interaction surface before this release — a utilisation read off it was low. Cached results are invalidated automatically. AS 3600 sections must now carry a saved kϕk_\phi class on the addressed ULS combination, as interaction has always required; see k_phi_not_set. :::

:::note[Bresler checks withheld for pure-axial demand — September 2026 (#5586)] Both Bresler checks — reciprocal and load contour — are now withheld when Mx=0M^*_x = 0 and My=0M^*_y = 0 simultaneously. Previously they returned 0.000 PASS, which is physically meaningless: the Bresler formulas are biaxial moment checks, and applying them to a moment-free demand produces a utilisation that carries no design content. §874. For pure-axial demands, the capacity check is axial: compare NN^* against ϕNu0\phi N_{u0} (compression) or ϕNu,tens\phi N_{u,\mathrm{tens}} (tension) from the flexure panel.

:::

:::caution[N-M interaction end-caps for PT sections (#4167)] Prior to the August 2026 release, the analytic end-caps on the /mk-interaction surface (squash point and decompression point) for prestressed sections were computed at zero effective prestress — tendon prestrain terms were missing. The corrected end-caps carry the full prestrain contribution, so the squash load and the decompression axial force now agree with the PT panel. Re-run any N-M interaction surface for a prestressed section to confirm results are unchanged — the curves between the end-caps may also shift where the analytic-to-numerical handoff occurs near those points. :::

The interaction diagram can also be viewed as a 3D surface in the canvas Interaction tab. The tab is only shown once a surface has been computed — if no interaction surface has been requested yet, the tab does not appear in the canvas tab row. This prevents the tab from advertising a result that does not exist (#5803). Click Run interaction in the panel to compute the surface and reveal the tab.

2D interaction curve — the Interaction Surface tab includes a 2D/3D toggle (#4186). In 2D mode, the surface collapses to a single N vs MRM_R curve for the selected load combination’s resultant-moment plane, where MR=Mx2+My2M_R = \sqrt{M_x^{*2} + M_y^{*2}}. Origin axes (#4209) mark the compression/tension boundary at the squash and decompression points. A snap-to-curve hover readout shows the N and MRM_R values anywhere along the curve — useful for reading off the capacity at an intermediate axial level without expanding the full 3D surface.

Minimum design moments on the interaction surface. The 2D interaction curve and the Interaction Surface tab apply the same code minimum design moment floors as the Design Summary — AS 3600 Cl. 10.1.2 for column-type members (Mmin=N×0.05DM^*_{\min} = N^* \times 0.05D) — before building the curve and computing utilisation. Prior to the 2026-08 release, the interactive diagram checked the raw entered moments while the batch path checked the floored ones; the two now use the same floored demand. A pure-axial column-type member no longer triggers a “no moment plane defined” refusal on the 2D curve.

Unrecognised member type is refused, not defaulted (#4911). Because the member type selects which code provisions run, an unrecognised value is rejected with a 400 rather than quietly treated as a beam. This affects direct API and MCP callers only — in the editor the member type is chosen from a list, so it is always one of beam, column, slab or wall. Omitting it is refused too, separately (#4928): an undeclared member type used to take a beam default, which changed which checks ran for an engineer who had declared nothing. The two refusals stay distinct because they need different remedies — “that is not a member type” and “you did not give me a member type”. Previously a typo such as Column was read as a beam, which silently dropped the Cl. 10.1.2 floor and returned a utilisation computed under the wrong check family. The same refusal applies to the bendingAxis parameter on the flexure endpoint, where an unrecognised value previously returned the x-axis capacity.

The kϕk_\phi class is required where it moves a number, and refused nowhere else (#4813). The Load Combinations panel shows a kϕk_\phi cell on every AS 3600 ULS combination and defaults it to the conservative reduced (12/13). That displayed default is now written into the saved design rather than only on an edit, so the value you read in the grid is the value the record carries and the value every surface computes with. For direct API and MCP callers this makes the parameter conditionally required, per quantity: GET .../design-options/{designOptionId}/interaction and its fibre sibling …/mk-interaction refuse an AS 3600 section without it, whatever the applied axial, because an interaction envelope is a section-level surface whose whole compression half is capped at ϕo=0.65kϕ\phi_o = 0.65 k_\phi; the …/flexure read refuses only when N>0N^* > 0, because ϕo\phi_o is a bending with axial compression provision that a pure-bending or tensile combination never reaches. (Both were payload POST routes until September 2026; the rule and its per-quantity split are unchanged, but the class is now read off the saved combination rather than sent on a body.) ACI 318 and Eurocode requests are never refused for it — they have no Table 2.2.2 class to declare. The refusal carries code: "k_phi_not_set"; see API error codes.

Report generation refuses on the same terms. A PDF that rendered where the panels refuse would read as the authoritative artefact for a section they decline to answer for, and a report built at a substituted ϕo=0.60\phi_o = 0.60 carries that substitution into every compression-controlled capacity on the page. The report takes the unconditional form of the rule — any AS 3600 ULS combination, whatever its NN^* — because it renders the interaction envelope. A design option holding applied actions and no load combinations has nowhere to record a class, so it is refused under AS 3600 until load combinations are saved; opening the design option in the section editor performs that migration for you.

The Design Summary follows the same rule per ULS design action (#5003): an omitted class resolved silently to ϕo=0.60\phi_o = 0.60 across every ULS verdict in the response while the by-id peers refused the identical section. (The payload route this rule originally closed the gap on, POST /concrete/batch-design-check, has since been retired in favour of its by-id peer, GET .../design-options/{designOptionId}/batch-design-check — the same disposition POST /concrete/analyze, POST /concrete/flexure and POST /concrete/interaction had, each retired in favour of its GET .../design-options/{designOptionId}/… peer, which carries the same kϕk_\phi refusal by design rather than as a patched-on fix.) Serviceability and fire combinations are never refused for it. In the same #5003 change the three payload MCP tools stopped refusing where kϕk_\phi is unreadable: CalculateConcreteFlexure, CalculateInteractionDiagram and CalculateBiaxialInteraction had required the parameter unconditionally, which rejected ACI 318 and Eurocode sections with advice — “set the Q/GQ/G class” — that cannot be acted on under those codes. Those three tools were themselves removed in September 2026 with the payload routes they wrapped; the rule survives on their id-addressed peers.

Degenerate-case refusal. Above roughly half the squash load, an asymmetrically reinforced section’s constant-NN contour in the MxM_xMyM_y plane can stop enclosing the origin. This occurs because Nu0N_{u0} is defined as zero eccentricity about the plastic centroid (AS 3600:2018 Cl. 10.6.2.2) while the surface reports moments about the gross centroid — the frame in which MM^* is entered. When the contour does not enclose the origin, no ray from the origin reaches the contour in the demand direction, and there is no capacity to report. ACS refuses to fabricate one: the 2D curve omits those axial levels, and the Interaction Surface tab shows a refusal rather than a spurious utilisation.

The same test governs the pure-tension end of the curve, where every neutral-axis orientation reaches the same single state and the contour collapses to one point. On a symmetric section that point is the origin: M=0M = 0 is genuinely attainable there, and the curve closes at it as an NNMM chart normally does. On an asymmetric section — one reinforced or prestressed off-centre — it sits at M0M \neq 0, so there is no zero-moment state at that axial level at all, and the level is omitted rather than plotted at M=0M = 0. A plotted zero would read as a computed capacity where the check itself refuses.

:::note[Demand ray vertex crossing corrected — September 2026 (#5585)] A ray-intersection edge case where the demand ray passed exactly through a contour vertex could cause that crossing to be counted twice, returning a wrong (typically low) utilisation for the affected combination. The crossing count is now deduplicated at vertex intersections. Results change only where the demand ray fell exactly on a contour vertex — a geometric coincidence that depends on the discrete contour spacing and the demand direction. :::

:::note[Demand ray vertex zero-crossing corrected — September 2026 (#5573)] A symmetric but opposite edge case: when the demand ray fell exactly on a contour vertex on a symmetric section — as it does on the principal axes (0°/90°/180°/270°) where demand aligns with the reinforcement symmetry — the previous half-open edge test s ∈ [0, 1) excluded the vertex from both the incoming and outgoing edge, returning zero crossings and treating the demand as unreachable. The resulting refusal sentinel was returned rather than a utilisation. The fix replaces the half-open test with a sign-of-side comparison: an edge is skipped only when both endpoints lie strictly on the same side of the ray, so a vertex on the ray is counted exactly once. Results change only for symmetric sections with principal-axis demand directions. :::

The Interaction Surface tab also shows the conservative envelope and Note-2-free overlays described on the interaction theory page.

:::note[Apex positioning — pure-axial point carries its true eccentricity (#4355)] The interaction surface’s pure-axial apex (ϕNu0\phi N_{u0}) is placed at its true gross-centroid moment, not at M=0M = 0. For a symmetrically reinforced section the apex falls on the M=0M = 0 axis because the plastic centroid coincides with the geometric centroid. For an asymmetric bar layout the pure-compression neutral state carries an eccentricity — the net moment of the bar stress resultants about the gross centroid — so the apex is offset from M=0M = 0 by that amount. On the Interaction Surface tab the apex marker therefore appears off-centre for asymmetric sections; this is correct behaviour. See the interaction theory page for the derivation. :::

:::note[φNu₀ marker on the 2D interaction curve (#4358)] The φNu₀ marker on the 2D N vs MRM_R curve is placed at the apex’s own resultant moment. Prior to the 2026-08 release the marker was always drawn at MR=0M_R = 0, even when the apex carries a gross-centroid eccentricity. The marker now moves with the apex. :::

:::note[Squash-point steel stress note — September 2026 (#6092)] When the design yield strength fsyf_{sy} of a bar grade exceeds the squash-point stress — the concrete compressive stress at the pure-compression state (N=Nu0N^* = N_{u0}, M=0M = 0) — an informational note now appears on the Interaction Surface tab and in the PDF interaction diagram. At the squash point all bars are in uniform compression, and AS 3600:2018 Cl. 10.6.2.2(b) sets the bar stress as Esεc,maxE_s \cdot \varepsilon_{c,\max} rather than fsyf_{sy}, because the limiting strain is reached before yield. The note identifies which bar group is affected and states the applied stress. No capacity values change; the note is a disclosure of which clause governs at that single point on the envelope. :::

Section editor showing reinforcement layout used as input to the N-M interaction analysis
Section editor showing reinforcement layout used as input to the N-M interaction analysis

Shear (AS 3600 Amendment 2:2021)

ACS implements the AS 3600:2018 Amendment 2:2021 shear model — the simplified MCFT method (Cl. 8.2.4.3) as the default path, with the general method (Cl. 8.2.4.2) available when conditions require it. This reconciliation was completed in the 2026 release wave and supersedes the pre-amendment implementation.

Shear capacity

Vu=Vuc+VusVu,maxV_u = V_{uc} + V_{us} \leq V_{u,\max}

Where:

  • VucV_{uc} = concrete contribution, per the general method (Cl. 8.2.4.2) or simplified method (Cl. 8.2.4.3)
  • VusV_{us} = steel contribution, Asvfsycotθv/sA_{sv} \cdot f_{sy} \cdot \cot\theta_v / s
  • Vu,maxV_{u,\max} = web-crushing limit (Cl. 8.2.6), limiting the strut force

Method selection (AS 3600 Cl. 8.2.4.1)

ACS selects the shear method automatically:

  • Simplified method (Cl. 8.2.4.3): θv=36°\theta_v = 36°, kv=0.15k_v = 0.15. Applicable when all of the following hold:
    • No significant axial tension or torsion
    • Concrete strength fc65f'_c \leq 65 MPa
    • Longitudinal reinforcement yield strength fsy500f_{sy} \leq 500 MPa
    • Aggregate size dg10d_g \geq 10 mm
  • General method (Cl. 8.2.4.2): Variable θv\theta_v and kvk_v derived from the longitudinal strain εx\varepsilon_x (Cl. 8.2.4.2.3). Used when any simplified-method condition above is not met, or when the member is subject to axial tension (N<0N^* < 0) or significant torsion.

When a combination includes a net tensile NN^* (positive = compression), or when the section material exceeds the concrete or steel strength limits, ACS switches to the general method automatically. A note in the shear results panel identifies which method is active for each combination.

ULS shear results showing V_uc, V_us, φV_u, utilisation ratio, and method indicator (simplified or general)
ULS shear results showing V_uc, V_us, φV_u, utilisation ratio, and method indicator (simplified or general)

Stirrup orientation and effective shear leg area

The Asv/sA_{sv}/s ratio used in the steel shear contribution VusV_{us} counts only the legs that are physically effective for the shear direction being checked. ACS resolves each stirrup’s contribution on a per-direction basis rather than using a simple leg count:

Stirrup kindV*y (crossing a horizontal shear plane)V*x (crossing a vertical shear plane)
Rectangular hoop / perimeter2 legs2 legs
Crossties$2\cos\beta
DiamondExtent-averaged crossing count, area-weighted by inclinationSame, transposed to the horizontal direction
Helical / circular2 legs (rotation-invariant)2 legs

A perfectly horizontal crosstie (β=90°\beta = 90°) contributes zero effective area to VusV_{us} for the VyV^*_y check — a horizontal bar cannot cross a horizontal shear crack. The same bar contributes its full leg area to the VxV^*_x check. A diagonal crosstie contributes a partial area equal to its inclination projection to each direction.

The leg area each fitment contributes is its catalogue size’s published nominal area where it names one, and πd2/4\pi d^2/4 otherwise — the same rule the longitudinal bars follow (see Bar areas above). The leg counts and projections in the table are geometry and are unaffected by it.

Effective web width bvb_v

The effective web width bvb_v accounts for voided webs per AS 3600 Cl. 8.2.1.4. For hollow-core or box sections, ACS performs a horizontal scan to find the minimum solid material width at each web level. The scan is restricted to the flexural chord band — the material within the effective shear depth dvd_v — so that a solid wedge or taper whose narrowest point lies outside dvd_v is not credited with a vanishing bvb_v. Restricting the scan can only raise the minimum, so the band relaxes an otherwise over-conservative full-extent value; for a prismatic web the two coincide exactly.

For prestressed sections, duct diameters are additionally deducted per AS 3600 Cl. 8.2.1.5. The deduction is evaluated per level, coupled to the width scan rather than applied to its result:

bv=minL[bw(L)kddd(L)]b_v = \min_{L} \left[ b_w(L) - k_d \sum d_d(L) \right]

Where bw(L)b_w(L) is the solid width at level LL, dd(L)\sum d_d(L) is the sum of prestressing duct diameters crossing that level, and kdk_d is a deduction factor dependent on duct type. ACS applies the conservative ungrouted value kd=1.2k_d = 1.2. The deduction applies at a level only when dd(L)bw/8\sum d_d(L) \geq b_w / 8.

Coupling the deduction to the level at which it occurs is the strict clause reading. It agrees exactly with the simpler decoupled form — minimum width, less the largest single-plane duct deduction — whenever the web is prismatic over the duct’s depth, which covers every prismatic ducted section. The two diverge only for a non-prismatic ducted web, where the narrowest level and the level carrying the largest dd\sum d_d are not the same: there, the decoupled form would subtract a deduction that never coincides with the true minimum width.

The same bvb_v is threaded to both shear and torsion checks for consistency.

Aggregate size factor kdgk_{dg} (general method)

The general method’s kvk_v formula incorporates an aggregate size factor kdgk_{dg} per Cl. 8.2.4.2(3)/(4):

kdg=3216+dg0.8(fc65 MPa, normal-weight)k_{dg} = \frac{32}{16 + d_g} \geq 0.8 \quad (f'_c \leq 65\ \text{MPa, normal-weight}) kdg=2.0(fc>65 MPa or lightweight concrete)k_{dg} = 2.0 \quad (f'_c > 65\ \text{MPa or lightweight concrete})

When dg16d_g \geq 16 mm the formula gives kdg=1.0k_{dg} = 1.0 exactly; for smaller aggregates kdgk_{dg} increases (enlarging the denominator → reducing kvk_v conservatively). For high-strength or lightweight concrete, the fixed value kdg=2.0k_{dg} = 2.0 similarly reduces kvk_v. When no aggregate size is specified, ACS defaults to dg=16d_g = 16 mm.

Reinforcement yield strength in ULS design models

AS 3600 Cl. 1.1.2(d) extends the Standard to reinforcing steel grades above the Table 3.2.1 listed 500 MPa — “higher reinforcing steel grades >500 MPa to 800 MPa meeting the requirements of Table 3.2.1” — and sets a design ceiling on their use: “For ultimate limit states the strength of the reinforcement in design models shall not be taken as greater than 600 MPa unless noted otherwise.”

ACS applies that ceiling, 600 MPa, to every AS 3600 ultimate-limit-state surface: ϕMuo\phi M_{uo}, the interaction endpoints and the neutral-axis sweep, moment–curvature, the stress-distribution equilibria, Ast,minA_{st,\min}, and the Cl. 8.2.7 / 8.2.8 longitudinal chord and fitment capacities. A grade at or below 500 MPa — every catalogued grade — is unaffected.

Three things it is not:

  • Not a serviceability limit. Cl. 1.1.2(d) is scoped to ultimate limit states, so SLS checks use the full characteristic fsyf_{sy} (see Stress check).
  • Not the squash endpoint. Cl. 10.6.2.2(b) assumes a maximum reinforcement strain of 0.0025 at the squash load, i.e. σsEs×0.0025=500\sigma_s \leq E_s \times 0.0025 = 500 MPa, so NuoN_{uo} gains nothing from a higher grade while ϕMuo\phi M_{uo} rises. The interaction curve changes shape non-uniformly — that is the Standard’s arithmetic, not an error. ACS states this on the result, beside the NuoN_{uo} it produced, whenever the cap actually binds: see Why the squash load does not rise with the grade below.
  • Not shear-method eligibility. Cl. 8.2.4.1 permits the simplified Cl. 8.2.4.3 method only where the specified yield strength does not exceed 500 MPa, so a higher grade is correctly forced onto the general method of Cl. 8.2.4.2. That 500 MPa is a separate threshold and ACS does not apply the design ceiling to it.

A grade above 500 MPa is admissible only on declared evidence — ductility class N or E, uniform elongation εsu0.05\varepsilon_{su} \geq 0.05 and a tensile-to-yield ratio Rm/Re1.08R_m/R_e \geq 1.08, recorded on the grade. Without it, or above 800 MPa, ACS refuses the analysis rather than designing on assumed ductility.

Why the squash load does not rise with the grade

Specify a qualified 600 MPa cage in place of a 500 and ϕMuo\phi M_{uo} rises — but the squash load NuoN_{uo} does not move at all. That is correct, and it is the one place a higher grade buys nothing, so ACS says so rather than leaving you to find it.

AS 3600 Cl. 10.6.2.2(b) assumes a maximum strain in the reinforcement of 0.0025 when calculating NuoN_{uo}. The steel stress at that endpoint is therefore bounded by the strain, not by the grade:

σsEs×0.0025=500 MPa(Es=200000 MPa)\sigma_s \leq E_s \times 0.0025 = 500 \text{ MPa} \quad (E_s = 200\,000 \text{ MPa})

A 500, a 600 and a 700 MPa bar all develop exactly 500 MPa there. Everywhere else on the interaction curve the higher grade does raise the capacity, so the curve changes shape non-uniformly between the two sections — it is not a scaled copy.

Whenever the cap actually binds, the interaction panel and the PDF’s Key Points table both carry a line, from one server-computed string, naming the clause, the strain limit, the stress the endpoint used and the grade it did not develop. At or below the cap there is no line: a conventional-grade section develops what it declares and has nothing to explain.

The threshold is Es×0.0025E_s \times 0.0025, not a fixed 500 MPa. A material declaring a non-standard modulus caps somewhere else, and the line quotes that number instead.

This is a third, separate limit — not a restatement of the ULS ceiling above:

LimitValueApplies to
Cl. 1.1.2(d) ULS design ceiling600 MPaevery AS 3600 ultimate-limit-state surface
Cl. 10.6.2.2(b) squash strainEs×0.0025E_s \times 0.0025 (500 MPa)the NuoN_{uo} endpoint only
Characteristic fsyf_{sy} — uncappedas declaredserviceability checks

The three compose rather than override one another, and there is no single “effective strength” for a grade above 500 MPa. Reading any one of them as the others is the specific mistake this table exists to prevent.

ACI 318-19 Cl. 22.4.2.2 applies no squash strain cap — PoP_o uses the full fyf_y. EN 1992-1-1 caps differently again, at min(fyd, Esεc2)\min(f_{yd},\ E_s \varepsilon_{c2}); ACS does not yet carry this disclosure on the EN path.

Column detailing on a manufacturer certificate

Some reinforcement products hold a CodeMark certificate that modifies named AS 3600 clauses for that product. ACS can design a column on one — but only when the engineer says so.

Selecting the product is not the opt-in. A column reinforced with certified bars is checked against AS 3600 as published until a certificate is explicitly recorded on the design. That separation is deliberate: a relaxation granted by product identity alone would lower a code minimum by 17 % with the verdict still reading Pass and nothing on the result naming a certificate.

The one certificate ACS holds conditions for is CodeMark CM30154 Rev0 (InfraBuild SENSE 600 longitudinal column bars, expiring 8 December 2026). It modifies two clauses:

ClauseAs publishedOn the certificate
Cl. 10.7.1(a) — minimum longitudinal areaAsc0.01AgA_{sc} \geq 0.01 A_gAsc0.0083AgA_{sc} \geq 0.0083 A_g
Cl. 10.7.4.3(b)(i) — single-bar fitment spacingmin(b, 15db)\min(b,\ 15 d_b)min(Dc, 15600/500db)\min(D_c,\ 15\sqrt{600/500}\, d_b)

Both sides of the spacing row move: the certificate replaces the section width bb with DcD_c (the smaller cross-sectional dimension, or the diameter if circular) as well as widening the bar multiple, and its dbd_b is the smallest SENSE 600 longitudinal bar in the column.

Everything else is unchanged and explicitly retained by the certificate: Cl. 10.7.1(b)‘s 0.04Ag0.04 A_g ceiling, the oversized-column exception Ascfsy>0.15NA_{sc} f_{sy} > 0.15 N^*, the four-bars-per-bundle limitation, and Cl. 10.7.4.3(b)(ii)‘s bundled-bar spacing. The 0.00830.0083 is the number the certificate states, not 0.01×500/600=0.0083330.01 \times 500/600 = 0.008333 computed from the grade — ACS applies the certified figure, and does not generalise it to any other 600 MPa steel. The 15600/50015\sqrt{600/500} is likewise applied as the formula, not as the certificate’s own rounded ”≈ 16.4”, which is 0.19 % tighter and would disagree with your hand check.

Note that the Table 10.7.4.3 500/fsy.f\sqrt{500/f_{sy.f}} reduction on the fitment diameter is a different modification, on a different quantity, already in AS 3600 itself and not part of this certificate. The two are easy to conflate and ACS keeps them apart.

Every one of these must hold, or the certificate does not apply:

  • The design code is AS 3600, and the declared member type is column.
  • The analysis date is on or before the certificate’s expiry. An expired certificate is not weaker evidence — it stops being evidence.
  • Every longitudinal bar names a catalogue size whose designation, published diameter and published area all match the certificate’s Table 1. A mixed cage is refused rather than part-credited, and a designation absent from Table 1 is outside the certificate, not a value to interpolate.
  • The declared characteristic fsyf_{sy} is the certified 600 MPa. The size table and the grade are two separate choices, and both are part of the product identity.

When a condition fails, ACS does not silently fall back. It applies unmodified AS 3600 and states on the check which condition was not met — for example “CodeMark Australia CM30154 Rev0 expired on 2026-12-08 and is not evidence for a design checked on 2027-01-15. The column is checked against unmodified AS 3600.” A design record that names a certificate the check did not use is exactly the thing the engineer has to be told.

Where it is set. The opt-in is the saved design’s columnDetailingCertificate field, written through the API or an MCP client. There is no control for it in the editor yet, so a design created in the browser is always on unmodified AS 3600. The editor preserves a value an API caller set rather than clearing it on the next auto-save.

CM30136 (SENSE 600 column fitments) is not a certificate basis in ACS. Its Table 1 substitution presupposes a conforming 500 MPa fitment design, and ACS has no way to establish that such a design exists. Where a fitment declares fsy>500f_{sy} > 500 MPa the Table 10.7.4.3 reduction is applied under AS 3600 itself and the result carries a note saying so — confirm the 500 MPa design before treating a SENSE fitment as a substitution.

Transverse reinforcement limits

The minimum transverse reinforcement per AS 3600 Cl. 8.2.1.7 is:

Asv,min=0.08fcbvs/fsy.fA_{sv,\min} = 0.08\sqrt{f'_c} \cdot b_v \cdot s / f_{sy.f}

fsy.ff_{sy.f} is the fitment’s characteristic yield strength, at the Cl. 1.1.2(d) ultimate-limit-state ceiling of 600 MPa, resolved from the reinforcement material that fitment is placed under. The same rule governs the Table 10.7.4.3 minimum-fitment-diameter reduction below and, since September 2026 (#6057), the transverse capacities ϕVus\phi V_{us} and ϕTus\phi T_{us} — which had been designing on the longitudinal grade and were overstated by the ratio of the two grades.

A fitment that names no material is designed at the section’s reinforcement grade only where its recorded grade label already names that grade. Otherwise ACS holds no strength it can attribute to that fitment: it computes the minimum at no more than 500 MPa and says so on the check, rather than designing the fitment on the longitudinal steel’s grade. That is the case an older section reaches when the per-fitment grade picker recorded, say, R250N ligatures under a D500N section — designing those at 500 MPa is un-conservative, and picking a reinforcement material for them is the repair.

Cl. 8.2.1.7 takes a single fsy.ff_{sy.f} for the section, and so do the Cl. 8.2.4.3 kvk_v branch, its ϕ\phi, ϕVus\phi V_{us} and ϕTus\phi T_{us}. Where the fitments do not all share one grade, ACS computes all of them at the lowest grade present and says so on the report. That is the conservative value for every one of those clauses — Asv,minA_{sv,\min} rises as fsy.ff_{sy.f} falls, and the capacity credited falls with it — so no fitment is ever credited above the weakest grade in the cage.

:::note[Per-element reinforcement grades — September 2026 (#6120)] Every longitudinal bar and every fitment is now analysed at the yield strength, elastic modulus and ductility class of the reinforcement material it is placed under, rather than at one section-wide grade. Grade 250N plain round ties with D500N longitudinal bars — ordinary Australian detailing — is now expressible, and the ties are designed at 250 MPa.

The AS 3600 Cl. 1.1.2(d) admissibility check for grades above 500 MPa runs per grade present: a section mixing R250N fitments with a qualified S600N longitudinal grade qualifies the 600 and leaves the 250 alone.

A bar or fitment that declares a material is designed on it. One that declares none keeps the behaviour it has always had — the section’s grade — except where its recorded grade label disagrees with the section’s, which is the disclosed case above.

The materials used are frozen with the design, so a later catalogue edit cannot move a saved section’s numbers — the drift banner reports the change and Recalculate takes it. A bar or fitment whose material records no yield strength is refused by name, not quietly designed at the section’s grade.

Sections where every bar and fitment shares the section’s material — which is every design saved before this change — produce exactly the numbers they did before. The report’s Design Summary gains a Reinforcement Grades in This Section table whenever more than one grade is in use. :::

The kvk_v factor (general method) keys off the actual Asv/sA_{sv}/s ratio compared to this Asv,minA_{sv,\min}, not a proxy value. The transverse-reo trigger applies the Cl. 8.2.1.6(1) depth factor ksk_s when member depth exceeds the transition threshold.

Mandatory transverse reinforcement at D ≥ 750 mm (Cl. 8.2.1.6(3)): For beams with an overall section depth D750D \geq 750 mm, AS 3600 requires transverse reinforcement meeting Cl. 8.2.1.7 minimum regardless of the computed shear demand. ACS checks this geometric threshold at the section level and flags the mandatory requirement in the shear results, independently of whether the applied VV^* would otherwise require stirrups.

The clause is scoped to beams and one-way slabs: this is selected by the declared Member Type in the General tab, the same declared-type basis as Ductility applicability above — not by the axial load level. A declared Column or Wall never triggers the mandatory requirement, regardless of section depth.

ACS reports:

ResultDescription
Asv/sA_{sv}/s requiredStirrup area per unit length to satisfy ϕVus=VϕVuc\phi V_{us} = V^* - \phi V_{uc}
Asv,min/sA_{sv,\min}/sMinimum per Cl. 8.2.1.7
D ≥ 750 mm mandatoryCl. 8.2.1.6(3) requirement (section-level, geometric trigger)
Governing requirementMax of the above
Pass/failWhether the specified stirrups meet the governing requirement
Minimum shear reinforcement verdictPass/fail against the governing minimum requirement, reported independently of the VV^*-driven demand check — a section can satisfy the shear capacity requirement while still failing the minimum area floor, or vice versa (#5193)

When a shear check cannot run for a given combination — for example when VV^* is zero, when the combination type excludes shear, or when a prerequisite condition is not met — ACS marks the result as skipped and shows the exact reason in the results panel. The stated reason is accurate and derives from the same condition checks that determine the skip; if you see an unexpected skip, the reason text identifies which condition is not satisfied.

Reversal of loads (AS 3600 Cl 8.2.4.5)

AS 3600 Cl 8.2.4.5 states that where loading cases produce load reversal — causing flexural cracking in a zone that is usually in compression — VucV_{uc} may not apply and shall be assessed or taken as zero. The VucV_{uc} model assumes an intact compression zone and available aggregate interlock across diagonal cracks; load reversal degrades both mechanisms.

ACS evaluates the Cl 8.2.4.5 condition across the complete set of shear-carrying ULS combinations:

  1. Per-combination face cracking — a sagging moment cracks the bottom fibre when MxMcr,sagM^*_x \geq M_{cr,\text{sag}}; a hogging moment cracks the top fibre when MxMcr,hog|M^*_x| \geq M_{cr,\text{hog}}. Cracking moments are axial-aware (McrM_{cr} rises under net compression), so a prestressed zone that never actually cracks under the reversing moment retains its VucV_{uc}.
  2. Cross-combination detection — a combination is load-reversal affected when it cracks one face AND at least one other shear-carrying combination in the set cracks the opposite face. This both-faces requirement is faithful to the clause’s “usually in compression” criterion: if both faces are cracked across the set, whichever is usually in compression must have been cracked by the reversal.
  3. Conservative lower bound — for affected combinations, ACS sets Vuc=0V_{uc} = 0 so the capacity becomes ϕVu=ϕVus\phi V_u = \phi V_{us} only. The VusV_{us} term continues to reflect any stirrups provided.

The check applies per shear axis: M*x combinations govern the V*y check; M*y combinations govern the V*x check.

A “Cl 8.2.4.5 reversal” note in the shear results panel identifies each affected combination and explains why VucV_{uc} was set to zero.

Biaxial shear (VxV^*_x and VyV^*_y)

:::note[V*x carried on applied-actions synthetic combinations — September 2026 (#5317)] When ACS creates a synthetic ULS combination from the Applied Actions row (the legacy single-combination path used by direct API and MCP callers), it now includes VxV^*_x alongside the other demand components. Previously VxV^*_x was dropped from the synthetic pair, understating horizontal shear demand (§874). Sections whose load combinations were entered through the Load Combinations grid are unaffected — those always carried VxV^*_x. :::

ACS checks shear separately on each principal axis. Enter VxV^*_x (horizontal shear, crossing vertical planes) and VyV^*_y (vertical shear, crossing horizontal planes) independently in the Applied Loads panel. Both axes are checked against the capacity computed for that direction; the governing axis controls the design.

Per-axis stirrup demand: Asv/sA_{sv}/s is computed independently for the VyV^*_y and VxV^*_x checks using the directional leg areas described in Stirrup orientation and effective shear leg area above. The overall governing requirement is the maximum of the two axis demands (and the Asv,minA_{sv,\min} minimum).

Arc-section and curved-outline netting: For sections with curved outlines (circular, oval, arch), the net effective width bvb_v at any scan level subtracts the displaced-concrete area attributable to curved boundaries using the same polygon-of-chords algorithm as the section property solver. Consequently, bvb_v is always derived from the actual material extent at each level — not from a bounding-box approximation — which is conservative for thin-walled curved sections.

Combined capacity threshold: When both VxV^*_x and VyV^*_y are non-zero, ACS checks the vector resultant V=(Vx)2+(Vy)2V^* = \sqrt{(V^*_x)^2 + (V^*_y)^2} against ϕVu\phi V_u to confirm the total demand does not exceed total capacity even when the individual axis utilisation ratios both appear moderate.

Asv,minA_{sv,\min} on both axes: The Cl. 8.2.1.7 minimum applies on each axis independently. A beam with significant VxV^*_x must satisfy the minimum in the horizontal direction, even if VyV^*_y is small.

Layered MCFT shear model

:::caution[Not available — this model computes nothing in ACS today] A layered Modified Compression Field Theory solver exists in the analysis engine, but it is not exposed on any ACS surface. No shear result you can obtain today — result panel, report, or API — is computed with it, there is no setting that selects it, and no stored analysis has ever used it. Every shear capacity ACS reports comes from the code-simplified methods described above.

Exposing the model as a user-selectable rigorous analysis (Cl. 2.2.6) mode is tracked in #3514. The rest of this section documents the solver’s theory ahead of that work — it describes engine internals, not product behaviour. :::

MCFT was originally developed by Vecchio & Collins (1986) and was subsequently codified in CSA A23.3. The layered variant divides the section into a stack of horizontal layers and applies MCFT equilibrium and compatibility at each layer independently, accounting for the actual transverse reinforcement content and concrete properties at every level.

How it works

  1. Section discretisation — the cross-section is divided into thin horizontal layers (40 by default). Each layer carries its local concrete area, any reinforcement crossing that layer, and the applied axial strain from the global N-MM state.
  2. Per-layer MCFT — within each layer, the MCFT compatibility equations (principal strain directions) and equilibrium equations (stress resultants) are solved iteratively. The principal compressive stress direction θ\theta is free to vary between layers, so it is not forced to match the global truss-angle assumption.
  3. Transverse reinforcement content — the effective transverse reinforcement ratio ρz\rho_z is resolved per layer from the stirrup cross-section area present at that level. For uniform stirrup layouts the per-layer ρz\rho_z equals the global Asv/bvsA_{sv}/b_v s; for non-uniform or bundled transverse steel it differs layer by layer.
  4. Aggregate — the per-layer shear stress contributions are integrated across the section depth to produce the total concrete shear capacity VcV_c and the required transverse steel demand.

Compression base curve

The MCFT compression stress-strain law used for each layer’s principal compressive direction is chosen by the solver’s base curve parameter. It is an engine parameter with no user control — the Popovics curve is always used. Two curves are implemented:

CurveFormulaNotes
Popovics (engine default)Thorenfeldt–Collins–Mitchell per Bentz thesis §5: empirical Ec=3320fc+6900E_c = 3320\sqrt{f'_c} + 6900 MPa; peak strain εc=fc/(Ecn/(n1))\varepsilon'_c = -f'_c / (E_c \cdot n/(n-1)); shape factor n=0.8+fc/17n = 0.8 + f'_c/17; post-peak decay k=0.67+fc/62k = 0.67 + f'_c/62Recommended by Bentz (Response-2000). No finite crush strain — the march terminates when V(γ0)V(\gamma_0) turns over.
ParabolicVecchio & Collins 1986: fc2=fc2max[2rr2]f_{c2} = f_{c2\max}[2r - r^2], r=ε2/εcr = \varepsilon_2/\varepsilon'_c, εc=0.002\varepsilon'_c = -0.002 fixedExhausts at 2εc2\varepsilon'_c (crush exit).

Compression softening (Vecchio & Collins 1986 β=1/(0.8+170ε1)\beta = 1/(0.8 + 170\varepsilon_1)) is orthogonal to the base curve choice and applied to both.

Self-consistency criterion

After the capacity march finds a candidate peak, the solver verifies that the accepted inner state is a genuine fixed point of the MCFT equations, not the collapsed zero-support absorbing state (a spurious self-reproducing solution that can produce V ≈ 0).

The criterion is the maximum shear-stress profile mismatch between the last shape-function iteration (LSM) and the MCFT back-calculation:

Δτmax=maxlayersτLSMτMCFT\Delta\tau_{\max} = \max_\text{layers} |\tau_\text{LSM} - \tau_\text{MCFT}|

A state is accepted only when Δτmax0.08 MPa\Delta\tau_{\max} \leq 0.08\ \text{MPa}. The collapsed attractor produces mismatches of 2.4–11.4 MPa — well above the threshold — so it is reliably excluded. A consistent branch solution sits at Δτmax0.02 MPa\Delta\tau_{\max} \leq 0.02\ \text{MPa}.

The march diagnostics record PeakTauMismatchMPa for the accepted peak. Values above 0.08 MPa indicate a non-convergent state; the solver returns no capacity for that load step rather than a result that fails the criterion.

Correctness improvements (2026)

Five defects were found and fixed in the solver during development. None of them ever affected a result ACS reported, because the model has never been wired to a user surface — they are recorded here as the solver’s development history.

  • Cracking-transition solver rework — the iterative solver previously used a fixed cracking-moment threshold that did not account for axial force when determining which layers had transitioned from uncracked to cracked. The reworked solver evaluates the cracking condition per-layer using the axial-aware Mcr(N)M_{cr}(N) formula, eliminating false-cracked and missed-cracked layers under combined N+M.
  • Per-layer ρz\rho_z resolution — the transverse reinforcement ratio was previously computed once at the centroidal level and applied uniformly to all layers. The solver now resolves ρz\rho_z individually for each layer from the stirrup geometry intersected at that height. This changes computed capacity for sections with non-uniform transverse reinforcement (tapered stirrups, variable-spacing zones, bundled links).
  • Collapsed-attractor fixed-point guard (#3521) — a zero-support absorbing state that self-reproduced through the corroboration certificate (producing spurious near-zero capacities on high-utilisation sections near mechanism) was identified and closed by the self-consistency criterion above. Sections that had solved to an abnormally low or zero MCFT capacity are corrected upward.
  • ρ=0 transverse reinforcement bracket degeneracy (#3553) — when no transverse reinforcement was present (ρz=0\rho_z = 0), the root-finding bracket degenerated to a zero-width interval and convergence failed. The bracket lower bound is now seeded from the concrete shear contribution alone, giving the solver a non-degenerate starting interval for unreinforced sections.
  • Branch-jump guard (#3559) — the capacity march’s peak-detection step previously accepted candidates located on a different V(γ0)V(\gamma_0) solution branch than the one traced during the ascending sweep, producing a discontinuous jump in reported capacity at branch crossings. A continuity check now rejects off-branch candidates; the march progresses on the original branch and accepts only peaks reached by monotone progression along that branch.

:::note[No action is required of you] Earlier revisions of this page asked you to re-run shear analyses and compare, on the basis that these fixes changed previously computed results. That advice was wrong and has been removed: the layered model has never been reachable from ACS, so no analysis you have run — and no design submission — has ever contained a layered-MCFT capacity. The switch from the Parabolic to the Popovics base curve on 2026-07-17 likewise changed only engine defaults. :::

:::note For sections with uniform transverse reinforcement — constant-diameter, constant-spacing stirrups running the full section depth — the per-layer ρz\rho_z and the global Asv/bvsA_{sv}/b_v s are identical and numerical results are unchanged by that specific fix. :::

Where the layered model is expected to help

Once it is available, the layered MCFT should be most useful when:

  • Transverse reinforcement varies over the section depth (e.g. additional horizontal bars in the web, tapered-leg stirrups, or multiple stirrup sizes).
  • The section has a non-rectangular profile (T-beams, I-sections) where the effective width bvb_v changes significantly with height.
  • A research-grade or peer-review deliverable requires a more theoretically rigorous shear model than the code-simplified approach.

For routine AS 3600 design the Amendment 2 general method described above is the governing code check, and it is what ACS reports today. The layered MCFT is planned as a secondary output alongside that check, never a replacement for it.

Shear (EN 1992-1-1:2004)

For sections designed to EN 1992-1-1, ACS implements the variable-strut-angle model from Cl. 6.2.2 and Cl. 6.2.3.

Concrete contribution VRd,cV_{Rd,c} (Cl. 6.2.2)

For members without shear reinforcement:

VRd,c=[CRd,ck(100ρlfck)1/3+k1σcp]bwdV_{Rd,c} = \left[C_{Rd,c}\,k\,(100\,\rho_l\,f_{ck})^{1/3} + k_1\,\sigma_{cp}\right] b_w\,d

Where:

  • k=1+200/d2.0k = 1 + \sqrt{200/d} \leq 2.0 (size effect factor, dd in mm)
  • ρl=Asl/(bwd)0.02\rho_l = A_{sl}/(b_w d) \leq 0.02 (longitudinal tension reinforcement ratio)
  • σcp=NEd/Ac0.2fcd\sigma_{cp} = N_{Ed}/A_c \leq 0.2 f_{cd} (average axial stress; positive = compression)
  • CRd,c=0.18/γcC_{Rd,c} = 0.18/\gamma_c, k1=0.15k_1 = 0.15 (recommended values from the National Annex)

VRd,cV_{Rd,c} has a minimum: VRd,c,min=(vmin+k1σcp)bwdV_{Rd,c,\min} = (v_{\min} + k_1\,\sigma_{cp})\,b_w\,d where vmin=0.035k3/2fck1/2v_{\min} = 0.035\,k^{3/2}\,f_{ck}^{1/2}.

Steel contribution VRd,sV_{Rd,s} (Cl. 6.2.3)

For members with shear reinforcement (variable-strut-angle truss):

VRd,s=AswszfywdcotθV_{Rd,s} = \frac{A_{sw}}{s}\,z\,f_{ywd}\,\cot\theta VRd,max=αcwbwzν1fcdcotθ+cotα1+cot2θV_{Rd,\max} = \alpha_{cw}\,b_w\,z\,\nu_1\,f_{cd} \cdot \frac{\cot\theta + \cot\alpha}{1 + \cot^2\theta}

Where:

  • θ\theta = strut angle, constrained to 21.8°θ45°21.8° \leq \theta \leq 45° (i.e. 1cotθ2.51 \leq \cot\theta \leq 2.5)
  • αcw\alpha_{cw} = axial-force coefficient: 1.01.0 for non-prestressed; rises to 1+σcp/fcd1 + \sigma_{cp}/f_{cd} for 0<σcp0.25fcd0 < \sigma_{cp} \leq 0.25 f_{cd}; peaks at 1.251.25 for 0.25fcd<σcp0.5fcd0.25 f_{cd} < \sigma_{cp} \leq 0.5 f_{cd}; reduces to 2.5(1σcp/fcd)2.5(1 - \sigma_{cp}/f_{cd}) for 0.5fcd<σcpfcd0.5 f_{cd} < \sigma_{cp} \leq f_{cd}
  • ν1\nu_1 = strength reduction factor for concrete cracked in shear (ν1=0.6(1fck/250)\nu_1 = 0.6(1 - f_{ck}/250))
  • z0.9dz \approx 0.9d (lever arm; ACS uses the exact computed value)

Strut-angle crossover: The optimal θ\theta (minimising Asw/sA_{sw}/s) is found from the point at which VRd,sV_{Rd,s} and VRd,maxV_{Rd,\max} are both exactly equal to VEdV_{Ed}. ACS solves this crossover analytically so the strut angle is never under- or over-optimised.

Axial tension (σcp<0\sigma_{cp} < 0): The VRd,cV_{Rd,c} term with k1σcpk_1\,\sigma_{cp} reduces VRd,cV_{Rd,c}; αcw\alpha_{cw} drops below 1.0 proportionally, reducing VRd,maxV_{Rd,\max}.

Torsion

For members with applied torsion TT^*, the combined shear-torsion check follows AS 3600 Cl. 8.2.5.3. The transverse-steel demand from shear and torsion is summed directly, and the section must satisfy the combined requirement simultaneously.

The same effective web width bvb_v and strut angle θv\theta_v used for shear are applied to the torsion checks, keeping the two checks in lockstep.

Longitudinal chord check (AS 3600 Cl. 8.2.7.1(2))

For members resisting shear without torsion, AS 3600 Cl. 8.2.7.1(2) requires that longitudinal bars be checked against the additional tensile (or compressive) chord force induced by the shear truss mechanism:

ΔFtd=0.5(VγpPv+ϕVuc)cotθv\Delta F_{td} = 0.5 \cdot (V^* - \gamma_p P_v + \phi V_{uc}) \cdot \cot\theta_v

Where:

  • γpPv\gamma_p P_v = vertical component of prestress force (zero for non-prestressed sections)
  • θv\theta_v = strut angle from the governing shear check

ACS reports the chord force ratio for each face — the governing ratio (tension or compression side) must be ≤ 1.0 for the check to pass. This check sits alongside the flexure utilisation, so total longitudinal bar demand is the sum of bending plus chord tension.

Stress distribution across the section at the governing ULS condition
Stress distribution across the section at the governing ULS condition

:::note[Longitudinal chord check is now displayed in the ULS panel — September 2026 (#5918)] The longitudinal chord check (AS 3600 Cl. 8.2.7.1(2)) was computed in all prior releases but its result was only accessible via the API response — the ULS panel showed no corresponding row. The chord force ratio is now displayed as a dedicated row in the Shear section of the ULS panel, alongside the transverse reinforcement utilisation. The underlying computation is unchanged; this is a display-only addition. :::

ULS Stress Map

The Stress Map tab in the canvas visualises the computed stress field across the section at the selected ULS design point (N,Mx,MyN^*, M^*_x, M^*_y). The fibre solver locates the neutral-axis position that equilibrates the applied actions, then evaluates the stress at each integration point; a continuous colour gradient maps this over the section outline. The biaxial stress-distribution grid is clipped to the section polygon — fibres outside the concrete boundary are excluded — so the visualisation accurately represents the stress state within the material.

Convergence gate: The Stress Map renders only when the fibre solver successfully converges to the target design point. When convergence fails — for example, an action beyond what the section can carry at any curvature — ACS shows an error state rather than displaying a non-equilibrium stress overlay. This prevents incorrect data from reaching the user when a valid result cannot be computed.

A negative equilibrium curvature is not a convergence failure. On a prestressed section the prestress holds the section in sagging at zero curvature, so where the applied moment sits below the section’s decompression moment the equilibrium curvature is negative — an ordinary, physical state that the solver searches for and finds. Before the 2026-09 release the curvature search ran over positive curvature only, so that entire band — the normal working range of a well-designed post-tensioned member under modest load — was refused, and refused with a message blaming section capacity the section plainly had. A refusal on a post-tensioned section now means what it means on a reinforced one.

The top of the moment range is reachable. The curvature search brackets the equilibrium curvature by expanding a trial bracket until the moment it produces exceeds the target, then detecting the peak of the section’s moment-curvature response so it stays on the ascending branch. Until the 2026-09 release that expansion stepped by a factor of three and took the last step below the peak as its ceiling — which put the ceiling up to a factor of three below the actual peak curvature. Measured on a 400×400 column with 8-N24 at N=2500N^* = 2500 kN, the moment-curvature curve peaks at 463 kN·m while the Stress Map stopped converging at 343; on a 400×800 post-tensioned beam at σp,ef=1200\sigma_{p,ef} = 1200 MPa the figures were 2013 and 1622. The top 19–26 % of each section’s moment range — the 80–95 % utilisation band that is the normal object of a design check — was therefore reported as beyond capacity on a section whose own moment-curvature curve plots it. The search now refines that bracket before giving up on it, and the whole ascending branch is reachable. As always, a refusal that remains is a statement about the section, not about the solver.

One residual: within a fraction of a percent of a prestressed section’s peak moment, the strain solve can land on more than one equilibrium state, and an individual target in that sliver may still be refused while a slightly larger one converges. Such a refusal is honest — no stress field is drawn — but at that utilisation the governing number is the flexural capacity check, not the stress field.

Wholly-compressed sections: When the section carries a net compressive force large enough that no tension zone exists at the equilibrium state, the Stress Map does not draw a neutral-axis line. A neutral-axis depth is only meaningful when there is a tension zone; reporting a fabricated value — or placing the line outside the section boundary — would be incorrect data. The stress field itself still renders in full, showing the gradient of compression across the section, so the visualisation remains useful.

Pure-axial combinations and minimum design moments. A ULS combination with axial force and no applied moment now renders its stress field — a uniform compression state — rather than the “No stress data available. Apply a bending moment” message it showed before the 2026-09 release. That message named M=0M^* = 0 as the cause of an empty map when the section in fact has a perfectly well-defined stress state, so it sent you to change a load that was never the problem.

Where a code minimum design moment applies — AS 3600 Cl. 10.1.2 for column and wall member types, EN 1992-1-1 Cl. 6.1(4) for any member in compression — the Stress Map is drawn at the floored design moments, the same demand the Design Summary, the per-axis flexure card and both interaction surfaces are checked against. Previously it was the last ULS surface still reading the moments you typed, so a column with no applied moment showed an empty map beside a Design Summary reporting a utilisation. When a floor governs, the tab states the substitution above the map — ”MxM^*_x taken as 60.0 kN·m, MyM^*_y taken as 30.0 kN·m — minimum design moment per AS 3600 Cl 10.1.2” — in the same words the Design Summary uses. ACI 318 imposes no such floor (the Pn,max=0.80PoP_{n,\max} = 0.80 P_o cap is its calibrated analogue), so an ACI pure-axial column gets the uniform map and no note.

Both axes floor together into one biaxial design point, which is the literal “about each principal axis” reading of Cl. 10.1.2 and is conservative relative to a per-axis workflow. SLS combinations are never floored — both clauses are ULS bending requirements — so the SLS Stress Field always shows the service actions as entered.

:::tip[New: the Stress Map can now be zoomed] The Stress Map previously rendered at a fixed fit-to-window scale with no way to get closer. It is now a full viewport: scroll to zoom, middle-drag or Ctrl (⌘) + left-drag to pan, and the house icon in the bottom-left corner to reframe the whole section.

Use it to inspect stress concentrations near individual bars or at section corners. The neutral-axis line, bar markers and labels are vectors and stay sharp at any zoom; the stress field itself is redrawn at full resolution a moment after you stop zooming. :::

The full control set, which is shared with every other canvas in the platform, is in Canvas navigation.

Hover tooltip: Hovering anywhere on the Stress Map shows a tooltip with the stress value (MPa, positive = compression) and the point’s engineer Y-up coordinate — the yy value is measured upward from the section’s geometric reference, not from the top of the canvas viewport. The tooltip works for both uniaxial and biaxial load cases. The peak stress annotation is placed at the actual peak-stress fibre location within the section, not at the bounding-box edge — so on an asymmetric or L-shaped section the annotation correctly identifies the governing fibre.

Integration grid overlay

The Show Integration grid toggle overlays the quadrature lattice that the fibre solver uses for numerical integration. This is a grid of weighted sample points — not a finite-element mesh — chosen to evaluate the stress field efficiently at each solver iteration. The overlay is clipped to the section polygon, so only points within the concrete boundary appear.

For biaxial loading (MxM^*_x and MyM^*_y both non-zero), the solver uses a two-dimensional column-and-row lattice; the overlay shows the column lines of that lattice. For uniaxial loading, the integration collapses to fibre strips running perpendicular to the bending axis, and the column lines are aligned accordingly.

The toggle was previously labelled Show Mesh; it was renamed to distinguish the integration lattice from a finite-element mesh — ACS does not use FEA for section-level stress analysis.

Curved sections

The Stress Map applies to curved outlines — circular and hollow-circular columns included. The section boundary, the clip applied to the stress field and the integration lattice all follow the true arc, not a chord approximation of it: the outline is faceted for display using the same tolerance rule the solver integrates over, so the drawn boundary and the computed field describe the same geometry.

ULS Stress Map on a circular column. The stress field and its clip follow the true circular boundary rather than a chord polygon.
ULS Stress Map on a circular column. The stress field and its clip follow the true circular boundary rather than a chord polygon.

Restraint adequacy (AS 3600 Cl. 10.7.4)

For Column member types under AS 3600, ACS checks whether the cog arrangement and tie spacing provide adequate lateral restraint of the longitudinal bars, per AS 3600:2018 Cl. 10.7.4. The verdict appears in the Design Summary’s ULS accordion as a dedicated check row. The check does not run for Beam, Slab, or Wall declarations — and is suppressed entirely for ACI 318 and Eurocode sections, which carry no equivalent clause.

:::note[Cl 10.7.4 N* gate basis for prestressed sections (#5685)] The Cl 10.7.4 axial gates — which determine whether the all-bars escalation (Cl 10.7.4.1(a)(ii)) and the 90° cog credit restrictions (Cl 10.7.4.2(a)(iv)(D)) apply — are evaluated on the applied design axial force alone. For prestressed columns, the tendon precompression is not added to NN^* in that comparison.

When this basis was load-bearing for the verdict, the result discloses it explicitly: the disclosure states the NN^* value compared, the 0.3Agfc0.3 A_g f'_c threshold, the effective prestress σp,ef\sigma_{p,ef}, and that the precompression was not added — along with a prompt to verify the clause reading. The disclosure is carried in sectionWarnings on the response envelope and printed in the report alongside the Restraint Adequacy row.

This is a disclosure, not a workaround. The applied-axial basis reflects the most natural reading of Cl. 10.7.4, which refers to the factored design axial force NN^*; the clause does not define NN^* as including the tendon reaction. Verify this basis against your own reading of the clause when the precompression is large relative to NN^*. :::

Serviceability limit state (SLS)

SLS checks use the first active SLS load combination.

:::note[SLS and fibre panels migrated to by-id reads — September 2026 (#5595)] Seven concrete SLS and fibre panels — stress, crack width, deflection parameters, moment-curvature, fibre stress field, SLS interaction, and time-dependent effects — are now served via by-id derived reads rather than the retired payload POST compute routes. For users working in the section editor, the panel results are identical — the same analysis engine runs against the persisted section record. API and MCP callers using the retired POST /api/v1/concrete/... payload routes will receive a 404; switch to the GET /api/v1/concrete/design-options/{designOptionId}/... endpoints, which resolve all inputs from the persisted section. Moment-curvature and time-dependent analyses are withheld until the persisted section record is current — save any edits before clicking Run. :::

When a required prerequisite is missing — for example, no SLS combinations are defined — ACS marks the check as refused rather than returning a pass. A refused SLS check propagates to the Category Rollup badge in the Design Summary as refused, not as the least-critical result across active combinations. This ensures the rollup accurately reflects gaps in the design definition.

Stress check

Verifies that concrete and steel stresses under service loads remain within allowable limits:

CheckLimit (AS 3600)Limit (ACI 318)Limit (EN 1992)
Concrete compression0.45fc0.45 f'_c0.45fc0.45 f'_c0.6fck0.6 f_{ck}
Steel tension0.8fy0.8 f_y0.6fy0.6 f_y0.8fyk0.8 f_{yk}

The AS 3600 steel stress limit is 0.8fsy0.8 f_{sy} on the characteristic yield strength, uncapped. Cl. 8.6.1 names fsyf_{sy}, the material property, and the 600 MPa ceiling of Cl. 1.1.2(d) is scoped to ultimate limit states only — so a qualified 600 MPa grade gives 0.8×600=4800.8 \times 600 = 480 MPa here, not 400.

:::note[ACS takes the calculated crack-width route, not the deemed-to-comply tables] AS 3600 offers two routes to crack control in Cl. 8.6.2, and you pick one. Cl. 8.6.2.3, crack control by calculation of crack widths, computes the crack width and limits it to the characteristic maximum wmaxw'_{max} you selected. Cl. 8.6.2.2, crack control without direct calculation of crack widths, instead limits bar size and spacing via Tables 8.6.2.2(A) and (B).

ACS takes the calculated route. The governing serviceability criterion is wwmaxw \le w'_{max}, and Cl. 8.6.1’s σscr.10.8fsy\sigma_{scr.1} \le 0.8 f_{sy} is applied alongside it — a crack-width result passes only when both hold. Tables 8.6.2.2(A) and (B) index the alternative route and are deliberately not applied on top of a calculated width: doing so would fail sections the Standard permits.

That also means the tables are not a hidden backstop for the uncapped 0.8fsy0.8 f_{sy} limit at grades above 500 MPa. What bounds crack control at any grade is the calculated width against your selected wmaxw'_{max} — check that you have selected the right one for the exposure. :::

An SLS Stress Field tab in the canvas visualises the computed stress distribution at service load, using the same biaxial fibre integration approach as the ULS Stress Map. Its grid is likewise clipped to the section polygon so that only fibres within the concrete boundary contribute to the colour field. As with the ULS Stress Map, the neutral-axis line is omitted when the section is wholly in compression — no tension zone means no neutral axis, and displaying a fabricated one would be incorrect data.

:::caution[Results may differ — SLS Stress Field analyses before August 2026] Prior to the August 2026 release, ACS reported a neutral-axis depth even when the section carried no tension zone (a wholly-compressed prestressed or axially-loaded section). The value was either meaningless or placed outside the section boundary. Re-open any SLS Stress Field result saved before this update to see the corrected display — the neutral-axis line will no longer appear for wholly-compressed cases. Existing cached SLS Stress Field analyses were automatically invalidated (CalculationVersions.ConcreteSlsStressField advanced from 1.9 to 1.10); the corrected result is computed on first open. :::

Crack width

Computes the characteristic crack width wkw_k and compares it against the allowable width for the exposure class:

wk=sr,max(εsmεcm)w_k = s_{r,\max} \cdot (\varepsilon_{sm} - \varepsilon_{cm})

Where:

  • sr,maxs_{r,\max} = maximum crack spacing
  • εsm\varepsilon_{sm} = mean steel strain
  • εcm\varepsilon_{cm} = mean concrete strain between cracks

AS 3600 strain term (Cl. 8.6.2.3(2)): Uses a fixed 0.6 tension-stiffening coefficient, mean axial tensile strength fct=1.4×0.36fcf_{ct} = 1.4 \times 0.36\sqrt{f'_c}, effective modular ratio ne=(1+φcc)Es/Ecn_e = (1+\varphi_{cc})E_s/E_c, and — on long-term SLS combinations — the final design shrinkage strain εcs\varepsilon_{cs}. Long-term crack widths are therefore substantially larger than short-term ones. The steel crack-inducing stress is capped at 0.8fsy0.8 f_{sy} per Cl. 8.6.1 — this prevents the crack-width result from being under-stated when the bar stress approaches yield.

EN 1992-1-1 strain term: ktk_t-parametrised (0.4 long-term / 0.6 short-term, no shrinkage term). EN 1992 crack widths do not grow significantly with duration beyond the ktk_t adjustment.

Typical limits: 0.3 mm for sheltered environments, 0.2 mm for exposed, 0.1 mm for water-retaining.

:::caution[Results may change — crack-width now uses actual per-edge cover (#5595)] Prior to the September 2026 release, the SLS crack-width solver read cover from a uniform fallback default shared with the retired payload routes, rather than from the per-edge values saved in the Durability panel. Crack-width results for sections with non-uniform edge cover — for example, increased soffit cover on a beam in a more-exposed environment, or different side cover for a wall section — were therefore computed as if uniform cover applied to all faces, understating the width on the governing edge.

If your section has non-uniform edge cover, re-run the crack-width analysis. Results will change to reflect the actual cover on the governing tension face. Sections with uniform cover across all edges are unaffected. §874. :::

:::note[Code-Based cover — exposure class defaults to A1 — September 2026 (#5253)] When you switch a section to Code-Based cover mode, the exposure class selector is now pre-filled with A1 — AS 3600 Section 4’s most common inland (residential and light industrial) environment — rather than left blank. An engineer who leaves the field unchanged and saves is explicitly selecting A1, not leaving the classification unset. The pre-fill is visible in the Durability panel and is persisted on save; the AS 3600 Section 4 cover derivation then runs against it. Change the class to A2, B1, B2, C1, or C2 before saving to use a different limit.

See Durability cover for the full Code-Based cover workflow and the clause table that maps each exposure class to a minimum cover. :::

:::caution[Crack width on wholly-compressed sections (#4160)] Prior to the August 2026 release, the crack-width calculation could proceed for sections that had no tension zone — dividing by zero ρp,eff\rho_{p,\text{eff}} (the effective reinforcement ratio, which is undefined when there is no tension zone) and producing a meaningless or infinite sr,maxs_{r,\max}. The calculation now correctly detects when no tension zone exists and omits sr,maxs_{r,\max} rather than computing it. If a previous crack-width result was returned for a wholly-compressed section, treat it as invalid — re-run the analysis. :::

EN 1992-1-1 crack control for prestressed members (Cl. 7.3.1, Table 7.1N)

For sections with prestressing tendons, EN 1992-1-1 applies tighter crack control requirements than for ordinary reinforced concrete. ACS implements the full Cl. 7.3.1(6) framework:

Exposure-class limits (Table 7.1N):

Exposure classPrestressed members — recommended wmaxw_\mathrm{max}
X0, XC10.2 mm (under quasi-permanent loads)
XC2, XC3, XC40.2 mm (under quasi-permanent loads)
XD1, XD2, XS1, XS2, XS3Decompression check (no cracking under quasi-permanent loads)

For the XD/XS exposure classes, decompression is the limit state — every fibre in the cross-section must remain in compression (or at least at zero stress) under the quasi-permanent combination. ACS performs the decompression check for bonded tendons within 100 mm of the exposed surface, as specified in Cl. 7.3.1(6).

Mechanism A — stress increment Δσp\Delta\sigma_p (Cl. 7.3.4):

For bonded post-tensioned sections that are designed to remain uncracked (decompression governs), ACS verifies the tendon stress increment between the decompression load level and the characteristic load combination:

Δσp=EpΔεp\Delta\sigma_p = E_p \cdot \Delta\varepsilon_p

Where Δεp\Delta\varepsilon_p is the additional strain in the prestressing steel above the decompression state. EN 1992-1-1 limits ΔσpΔσp,max\Delta\sigma_p \leq \Delta\sigma_{p,\max} (nationally determined parameter; default 200 MPa for post-tensioned, 150 MPa for pre-tensioned) to guard against fatigue at the decompression cycle under traffic or variable loading.

Scope note: Crack width calculation for cracked prestressed sections under EN 1992-1-1 (i.e. when the cross-section is in tension under the quasi-permanent combination and Table 7.1N’s wkw_k limit applies) uses the same sr,maxs_{r,\max} and (εsmεcm)(\varepsilon_{sm}-\varepsilon_{cm}) expressions as for reinforced concrete with the contributing bonded tendon area added to AsA_s. Support for combined bonded-tendon-plus-bar crack width in the cracked regime is pending — see Prestressing for current scope.

Deflection parameters

Computes the effective moment of inertia IefI_{ef} for deflection calculation:

Ief=Icr+(IgIcr)(McrMs)3I_{ef} = I_{cr} + (I_g - I_{cr}) \left(\frac{M_{cr}}{M_s}\right)^3

Where:

  • IgI_g = gross moment of inertia
  • IcrI_{cr} = cracked moment of inertia
  • McrM_{cr} = cracking moment
  • MsM_s = service moment

Long-term factors account for creep and shrinkage effects.

:::note[Deflection non-convergence surfaces as an explicit refusal — September 2026 (#5802)] When the deflection solver fails to converge — for example, on a section whose cracked moment of inertia IcrI_{cr} cannot be bounded from the effective IefI_{ef} iteration — the analysis now refuses with an explicit error rather than retrying silently and returning a result that may not be meaningful.

The refusal appears as an error in the SLS results panel for the affected load combination. It is not a convergence failure that can be resolved by changing tolerances — it means the deflection model cannot produce a physically consistent result for the current combination and section configuration. Common causes:

  • A serviceability moment MsM_s that lies below the cracking moment McrM_{cr}, making IefI_{ef} undefined.
  • A section with no tensile reinforcement where the cracked section is undefined.

Where the deflection check is not meaningful for the applied loading, the row shows a refusal notice rather than a blank or a fabricated figure (§874). :::

:::note[Deflection non-convergence surfaced on both SLS summary paths — September 2026 (#5807)] The deflection non-convergence refusal is now surfaced on both SLS summary paths: the full SLS check panel and the Design Summary rollup. Previously, a non-converging deflection calculation was surfaced as an error in the SLS check panel but was silently omitted from the Design Summary rollup — the rollup showed no row rather than a refused one, which could allow an engineer reviewing the summary to miss the convergence problem entirely.

Both paths now consistently show the refusal. In the Design Summary, a non-converging deflection check renders as a refused row in the SLS accordion, matching the full panel’s behaviour. The Category Rollup badge reflects the refused state rather than treating the absence as a pass (§874). :::

Prestressing

See the dedicated Prestressing page for the full workflow. A summary of the key checks:

For sections with tendons, the PT tab provides:

Prestress losses

All loss components are computed individually:

Loss typeCategoryReference
Elastic shorteningImmediateAS 3600 Cl. 3.4.2.3
FrictionImmediateAS 3600 Cl. 3.4.2.4
Anchorage draw-inImmediateCollins & Mitchell Ch. 3.6
CreepLong-termAS 3600 Cl. 3.4.3.3
ShrinkageLong-termAS 3600 Cl. 3.4.3.2
RelaxationLong-termEN 1992-1-1 Cl. 3.3.2(7)

Friction and anchorage draw-in are computed only when their inputs are supplied — see Prestress losses for what to enter and what the results show when you do not.

:::note[Explicit zero PT-loss coefficients are honoured — September 2026 (#5315)] An explicit creepCoefficient or shrinkageStrain of 0.0 in the PT-loss configuration is now treated as a declared zero rather than as “not set” (#5159). Previously a zero value resolved to the same code path as an absent one, so a deliberately zero long-term loss coefficient — for example, a section in a controlled-humidity environment — was silently replaced with the material model’s computed estimate. Set 0.0 to declare that the loss is genuinely zero; leave the field absent to have the engine compute it. :::

The effective prestress fpef_{pe} after all losses is used for subsequent capacity and stress checks.

Transfer and service stresses

Concrete stresses are checked at two stages:

  • Transfer: immediately after prestressing (using fcif_{ci}, the concrete strength at transfer)
  • Service: long-term under sustained loads (using fcf'_c)

Extreme-fibre distances and section moduli used in the fibre stress calculation are measured from the transformed centroid — the centroid of the composite transformed section including the modular-ratio contributions of all steel and tendon areas. This correctly accounts for the shift in neutral axis from gross to transformed geometry for PT sections.

PT ultimate capacity

The moment capacity of the prestressed section accounts for tendon stress increase beyond the effective prestress. PT ultimate capacity uses the effective (post-loss) prestress fpef_{pe} as the starting point — not the jacking stress — ensuring the analysis matches the actual in-situ tendon state:

fps=fpe+Epεpsf_{ps} = f_{pe} + E_p \cdot \varepsilon_{ps}

Where εps\varepsilon_{ps} is the additional strain at the tendon level at ultimate, capped at fpuf_{pu}.

:::note[Tendon-only PT sections — September 2026 (#5432)] For tendon-only PT sections — sections that contain prestressing tendons but no passive reinforcing bars — the axial capacity bounds (NminN_{min}, NmaxN_{max}) reported in the N-M interaction panel now reflect the tendon contribution correctly. Previously, tendon-only sections used the same bounds path as sections with passive rebar, which could report null bounds when no rebar was present even though the section did have load-carrying capacity through its tendons. The bounds are now computed from the tendon area and effective prestress, consistent with the rest of the interaction diagram. :::

Fire design

See the dedicated Fire design page for detailed documentation.

Moment-curvature analysis

The Moment-curvature tab traces the full nonlinear response of the section:

  1. Uncracked elastic phase
  2. Cracking (concrete tensile strength exceeded)
  3. Post-cracking (tension stiffening)
  4. Steel yielding
  5. Ultimate (concrete crushing or steel rupture)

The M-κ\kappa curve shows ductility capacity and energy absorption. You can run curves at multiple axial load levels and view the results overlaid on the same plot.

The M-κ\kappa interaction surface (triggered by button) generates a 3D surface by sweeping the bending angle from 0° to 360° at multiple axial load levels. This provides a rigorous biaxial interaction check based on the full nonlinear material response.

:::note[M-κ surface now uses the correct unbonded σpu item for L/D selection — September 2026 (#5630)] For sections with unbonded tendons, AS 3600 Cl. 8.1.8 selects between two σpu\sigma_{pu} expressions based on the span-to-depth ratio: Item (a) applies when L/D35L/D \leq 35 (beams and one-way slabs), Item (b) when L/D>35L/D > 35 (two-way slabs and flat plates). Item (b) is the lower, more conservative value.

Prior to this release, the pure-bending anchor point on the M-κ interaction surface was always evaluated at Item (a), while the rectangular-block surface, the flexure read, and the PDF report all applied Item (b) for L/D>35L/D > 35. A section with unbonded tendons and L/D>35L/D > 35 therefore showed two different capacities for the same physical section — disagreeing surfaces on the Interaction Surface tab, and a tab result that did not match the flexure panel (§874: UI and reports must agree).

The M-κ surface now receives the same spanOverDepth value as the rectangular-block surface and the flexure path, resolving the disagreement. Re-run any M-κ interaction surface for a section with unbonded tendons if the last capture predates this release — the pure-bending end of the surface and the kuok_{uo} / NubN_{ub} anchor points it feeds may shift where Item (a) and Item (b) differ.

Note that the per-level fibre runs used to build the M-κ curve (as opposed to the surface’s pure-bending anchor) are not affected: the curve’s fibre solver builds its unbonded tendon states from a separate prestrain path that does not consult the L/D ratio, and this is deliberate. What that costs is now stated on both surfaces — see the note below. :::

:::note[The M-κ curve states its unbonded tendon law — September 2026 (#5687, #5866)] An unbonded tendon’s stress is governed by its elongation over the whole member, not by the strain at one cross-section. That is why AS 3600 Cl. 8.1.8 (and ACI 318-19 Cl. 20.3.2.4.1) give an empirical σpu\sigma_{pu} calibrated at ultimate rather than a stress-versus-curvature law: a cross-section model has no access to the member’s deflected shape, so it cannot evaluate the tendon force at an arbitrary curvature.

The fibre M-κ solver therefore holds an unbonded tendon at the effective prestress σp.ef\sigma_{p.ef} for the whole curve, including its ultimate point, while the flexure read, the rectangular-block interaction surface and the PDF report all resolve the same tendon at σpu\sigma_{pu}. On a 400 ×\times 600 section with one 900 mm² unbonded tendon (fcf'_c 40, σp.ef\sigma_{p.ef} = 1100 MPa) that is 1100 MPa against σpu\sigma_{pu} = 1262 MPa, carrying the M-κ ultimate moment about 7 % below the flexural MuoM_{uo}.

The M-κ ultimate point is therefore conservative for an unbonded post-tensioned section — take the ULS bending capacity from the flexure panel (ϕMuo\phi M_{uo}) or the interaction surface, not from the end of the M-κ curve. The M-κ panel and the M-κ interaction surface now both say so on screen, and the unbondedTendonLaw field carries the same statement on the API and MCP responses. The gap is not closed, because closing it would mean inventing a σp(κ)\sigma_p(\kappa) law no design standard defines; it is stated instead, so it is never read as agreement.

#5866 confirmed the disclosure is active on the fibre M-κ path. The unbondedTendonLaw disclosure now appears on both the M-κ curve response and the M-κ interaction surface response. Previously, the disclosure was present on the surface but absent from the per-level fibre runs used to build the M-κ curve — those curve responses lacked the unbondedTendonLaw field. Both paths now carry the disclosure consistently.

Reinforced sections and bonded tendons are unaffected — a bonded tendon takes full strain compatibility on both paths — and the field is absent from their responses. :::

Moment-curvature diagram showing elastic, cracking, post-cracking, and yielding phases. The curve is plotted for every active combination; Key Results below the chart report the one named in the Show profile for selector — the first active combination until you choose another.
Moment-curvature diagram showing elastic, cracking, post-cracking, and yielding phases. The curve is plotted for every active combination; Key Results below the chart report the one named in the Show profile for selector — the first active combination until you choose another.

:::note[M-κ now runs from the persisted selected load combination — September 2026 (#5595)] The M-κ derived read now runs against the persisted selected load combination on the section record. The manual and custom M-κ input modes that previously allowed sending an inline payload have been retired — these inputs no longer appear in the section editor, and the corresponding API routes return 404. To run M-κ: select the target ULS or SLS combination from the Show profile for selector in the panel, save the section, and click Run M-κ. Fire combinations are excluded from M-κ — the panel withholds the Run button and the by-id read refuses with not_applicable_for_combination. A fire-rated section is analysed at elevated temperature through its own constitutive law; running an ambient-temperature M-κ curve on a fire combination would silently produce a non-conservative result (§874). See the note below for the full usable-model rules by limit state. :::

:::note[Active profile selection and chart animation — August 2026 (#5104)] The active profile displayed in Key Results below the chart is now pinned to the named combination for the lifetime of the tab. In earlier builds the selection could reset to the first active combination on re-render, even when you had explicitly chosen a different one from the selector. That choice is now preserved.

Chart animation has been frozen — the curve is drawn once and held static rather than replaying the interpolated reveal each time the tab re-mounts. To trigger the animation again, click Run M-κ. :::

:::note[M-κ solved at the combination’s demand bending plane — September 2026 (#5316)] When ?plane=demand is passed (or selected in the panel), the M-κ solver integrates along the combination’s actual signed MxM^*_x/MyM^*_y resultant plane rather than defaulting to θ = 0 (the major axis). The bending plane resolved is disclosed in the generated PDF report beside the M-κ plot, so every curve is traceable to the plane it was integrated on. :::

:::note[Moment-curvature requires a usable concrete stress model — September 2026 (#5256)] The M-κ derived read gates on whether the section’s concrete stress model is usable for the combination addressed, not on the combination’s limit-state label:

  • Fire combinations: always refused. FireCapacityAnalysis integrates a temperature-reduced constitutive law against the heated section; this endpoint integrates the ambient-temperature section. A curve produced here for a fire combination would be the ambient-temperature one under a fire label — the silent substitution §874 forbids.
  • SLS combinations: always eligible. SLS uses the code’s linear-elastic cracked-transformed law (AS 3600 Cl. 8.6 / EN 1992 Cl. 7.2 / ACI 318 Cl. 24.5), resolved from the section’s SLS tension-stiffening setting. The ULS stressModel selection is not read for SLS, so a section with a rectangular ULS model still produces SLS curves correctly.
  • ULS combinations with a rectangular stress block: refused with not_applicable_for_combination. The rectangular stress block is a polygon-clip ULS capacity simplification and carries no strain history; it cannot produce a moment-curvature response. Switch to a fibre model (Hognestad, Mander, Kent–Park, Popovics, parabolic-rectangular, bilinear, or fib MC2010) on the Materials tab and save.

This replaces the earlier LimitState == ULS gate, which incorrectly refused all SLS combinations while allowing through ULS combinations whose stress model could not produce a curve. :::

:::note[Linear-creep validity is withheld, not defaulted — September 2026 (#5270)] A long-term SLS curve is integrated on Ec,eff=Ec/(1+φcc)E_{c,\text{eff}} = E_c / (1 + \varphi_{cc}) and reports that resolution back to you, including linearCreepStressExceeded — whether the peak compressive stress on the curve exceeds 0.45fc0.45 f'_c, above which the linear-creep assumption is invalid (AS 3600 Cl. 3.1.8.4 / EN 1992-1-1 Cl. 3.1.4(4)).

That flag is now null when the comparison could not be made — a solve that returned no curve points has no peak strain to measure. It previously reported false there, which is indistinguishable from a measurement that found the assumption held, for a curve that was never integrated at all. null is not a pass: false means measured and within the linear range, null means unchecked. :::

:::note[ε₀ scan precision improved for compression-controlled and dead-zone combinations — September 2026 (#5868)] The M-κ solver’s axial strain (ε0\varepsilon_0) scan uses a bisection search to find the strain at the section centroid that equilibrates the applied axial force NN^* at each curvature step. For compression-controlled combinations — where the neutral axis is deep and most fibres are in compression — and for dead-zone combinations near pure compression where MM^* is small relative to NN^* — the scan’s initial bracket was sometimes too narrow to contain the equilibrium root, causing the solver to miss the equilibrium state and report convergence failure. The bracket is now widened adaptively before each bisection. No change to any result that previously converged; previously-refused combinations that fall within the section’s capacity now solve and return a curve. :::

Design summary

:::note[Design Summary served via by-id read — September 2026 (#5531)] The Design Summary is now fetched via the GET /api/v1/concrete/design-options/{designOptionId}/batch-design-check by-id read, retiring the payload POST /concrete/batch-design-check route. For editor users, the panel looks and behaves identically — the same kϕk_\phi sweep and selector checks run. API and MCP callers on the retired payload route will receive a 404; switch to the by-id endpoint, which resolves all inputs from the persisted section record and applies the same rules as the other id-addressed reads. :::

:::note[Design Summary refuses with a clear error when no load combinations are saved — September 2026 (#5965)] The Design Summary derived read now returns a 400 with code: combination_not_found when it cannot find any combinations to analyse, and the error message distinguishes two separate conditions so you can act on the right one:

  • “Every load combination on this design option is unchecked” — at least one combination is saved but all are inactive on the Applied Loads tab. Check at least one combination and save.
  • “This design option has no load combinations and no applied actions saved” — no load combinations exist at all for this section. Add at least one combination in the Applied Loads panel and save before requesting the Design Summary.

Previously the endpoint appeared to run against an empty set, producing zero or null results without explanation. The editor panel now shows the appropriate “no loads defined” state rather than stale results. :::

:::note[sectionWarnings field on every by-id derived read] Every by-id derived read (flexure, interaction, mk-interaction, batch-design-check, properties, sls-stress-field, durability-cover, and the rest) carries a sectionWarnings string array on its response envelope. Warnings in this field qualify the section as a whole — they apply to every result in the response, not to one specific check — and are printed in the PDF report and displayed at the top of the Design Summary above the per-check results. The array is empty when no section-level assumption or disclosure applies; it is never absent.

The advisory band in the Design Summary is now sourced exclusively from SectionAssumptions (#5781). Previously, every runner-level warning string entered the band — including failure diagnostics from individual checks that threw. Those check failures now render as did-not-compute rows in the Design Summary (see below) rather than as section-level warnings, so the advisory band reflects only genuine section-level assumptions, not analysis errors.

Current sources of section-level warnings:

  • Undeclared bond — tendons saved before September 2026 carry no bond declaration and are analysed as bonded (grouted); see Bond type on saved sections for the full disclosure and what to do.
  • Cl 10.7.4 N* gate basis — for prestressed columns where the applied-axial basis was load-bearing for the restraint adequacy verdict; see Restraint adequacy above.

API callers reading designActions[].utilisation or any other result field should also check sectionWarnings — a result may be numerically valid while a warning qualifies the assumptions it was computed under. :::

:::note[did-not-compute check row state — September 2026 (#5799)] A Design Summary check row now has four possible states:

StateVisualMeaning
PassGreen tickCheck ran and the utilisation is ≤ 1.0
FailRed crossCheck ran and the utilisation is > 1.0
Not applicableMuted dash (—)Check does not apply to this combination or section configuration
Did not computeAmber circle-slashThe check encountered an error during analysis

The did-not-compute state replaces silent omission: before this change, a check that threw during analysis produced a null result that was indistinguishable from “not applicable” and was therefore suppressed. The row now appears in the Design Summary’s accordion with an amber icon and the error message as the row title, so you can see that the check was attempted and what went wrong. The section-level sectionWarnings field also carries the failure prose, so the PDF report’s Warnings appendix remains byte-identical.

A did-not-compute row is not the same as a fail. Nothing was measured to exceed a limit — it means the measurement could not be taken. The Category Rollup badge and the overall verdict are withheld (shown as N/A), not reddened, when the only result in a group is a did-not-compute row; a genuine failure still governs if one also exists.

API callers: the batch-design-check response now carries a checkFailures array alongside the existing check fields. Each entry names the check key, the results tab that owns it, and the error message. A null result field that previously meant “not applicable” now only means “not applicable” — a thrown check appears in checkFailures, not as a null field. :::

:::note[ACS derived-read error messages now name the true reason — September 2026 (#6153)] When a by-id derived read cannot be evaluated, the error message now names the actual reason rather than attributing the failure to the matched combination. Previously the message could identify a combination as the cause even when the combination was correctly defined — the real barrier was something else, such as an unsupported section configuration or a prerequisite not met. The message is now accurate so you can act on the right thing. :::

The Summary tab collects all ULS, SLS, and fire check results into a collapsible accordion panel. Each accordion group covers one check category and shows a Category Rollup badge — the worst utilisation ratio across all load combinations in that group — so you can scan the full design status without expanding every section. Groups are collapsed by default.

The View All Combinations section at the bottom expands to a matrix table of every load combination against every check type, making it easy to spot combinations that govern multiple checks simultaneously.

Material quantities (concrete volume, reinforcement mass per unit length) appear below the check results. If the section geometry contains a NaN or infinity coordinate, the quantities panel shows an explanatory error rather than propagating meaningless values — see Design Summary § Non-finite coordinate guard.

The ULS group may also carry a member type classification advisory — a note disclosing when the declared Member Type disagrees with the load level reached across the ULS envelope (see Ductility applicability above and Design Summary § Member type classification advisory).

Report variants — the icon-only Report button in the canvas tab row opens a Full report / Summary report dropdown menu. Select Full report for the complete calculation — formulas, clause references, and derivation steps for every check — or Summary report for a concise grouped-by-limit-state overview that names the governing combination for each check group, with no working detail. The downloaded files are named Concrete_Report_{name}_{date}.pdf (full) and Concrete_Summary_Report_{name}_{date}.pdf (summary), so a saved summary is identifiable from its filename alone.

The same variants are available programmatically: GET /api/v1/concrete/design-options/{designOptionId}/report?variant=summary (#4185) or ?variant=full (the default when the parameter is omitted). The GenerateConcreteReport MCP tool takes the same optional variant argument ("full" | "summary"), parsed by the same code path as the query parameter — so the two surfaces accept and reject exactly the same values (#4226). An unrecognised value returns { "error": … } carrying the same message the REST endpoint’s 400 does, never a fallback document. The returned fileName tells you which variant you received, and the API cost is 110 for both — the variant changes what is rendered, not how much analysis runs.

ADEQUATE gate corrected — prior to the August 2026 release, the PDF report printed ADEQUATE over sections that were failing the ductility check (kuok_{uo}) or the minimum reinforcement check (As,minA_{s,\min}) (#4187). The gate now correctly gates on all three: flexural capacity, ductility, and minimum reinforcement. Re-generate any PDF report for sections that were near the ductility limit — the cover-page verdict may change from ADEQUATE to INADEQUATE.

:::note[Cover provenance in the PDF report — September 2026 (#5257)] Every generated concrete report now includes a cover provenance statement that describes how the section’s nominal cover was determined:

  • Manual: the cover was entered directly in the Durability panel; no code-based derivation was applied.
  • Code-Based (AS 3600): the cover was derived from the AS 3600 Section 4 durability requirements for the saved exposure class (e.g. A1, B2). The exposure class is named in the report so the derivation is auditable — an exposure class the engineer did not intend is visible in the document rather than folded into the number.
  • Code-Based (non-AS 3600 design standard): Code-Based cover is selected, but the AS 3600 Section 4 derivation applies only to AS 3600 designs. The report states the value was entered by hand and that the derivation did not run for this design standard.

A report for a Code-Based AS 3600 section with no exposure class saved is refused (cover_method_incomplete). Set an exposure class in the Durability panel — it defaults to A1 since September 2026 (#5253) — or switch the cover mode back to Manual. :::

:::note[Report presentation changes — September 2026 (#6154)] Three changes to the generated PDF report shipped together:

  • Assumptions disclosed inline — section-level assumptions are now disclosed as explanatory text within the body of the report rather than surfaced as a blocking red toast in the editor. The assumption text is unchanged; its location has moved from a transient UI alert to a permanent record in the document.
  • Page-1 liability panel removed — the disclaimer panel that previously appeared on the first page of the report has been removed. The underlying terms of use are unchanged.
  • Unassessed fire requirement shown as N/A — when a fire rating requirement has not been assessed, the report now shows N/A in the fire section rather than omitting the row, making the gap explicit. :::

See the Design Summary page for full documentation of the panel layout, accordion groups, View All Combinations matrix, and material quantities.

SLS results panel — concrete and steel service stresses, crack width and deflection checks for the governing serviceability combination.
SLS results panel — concrete and steel service stresses, crack width and deflection checks for the governing serviceability combination.

Time-dependent effects

See the dedicated Time-dependent effects page for creep and shrinkage analysis using the age-adjusted effective modulus method (AEMM).

:::note[phi-V_us and phi-T_us designed on the fitment grade — September 2026 (#6146)] The transverse steel capacity terms ϕVus\phi V_{us} and ϕTus\phi T_{us} are now designed on the fitment’s own grade — the minimum fsy.ff_{sy.f} across all fitments — rather than the longitudinal bar grade. Previously, both terms used the longitudinal grade, which overstated the transverse capacity in sections where the fitment grade is lower than the longitudinal grade. Results change for sections where the two grades differ; the shear and torsion result rows name the grade that governs. Where the fitments carry a mixed cage, the conservative minimum applies and the report says so. :::

:::note[Unrecognised design code refused, not silently substituted — September 2026 (#6147)] ACS now returns an explicit error when a section carries a designCode value the analysis engine does not recognise, instead of falling back to AS 3600 analysis. Previously, an unrecognised code caused the analysis to run as AS 3600 without disclosure — incorrect data rather than no data (§874). The error code is design_code_unrecognised. The recognised design codes are AS 3600, ACI 318, and EN 1992. A section with no design code set is refused separately with design_code_not_set. :::

:::note[Ductility class now carried through to fire analysis — September 2026 (#6150)] The ductility class of each longitudinal bar is now propagated onto the fire analysis wire. Previously, the ductility class declared on a bar — for example, Class L for D500L mesh reinforcement — was not forwarded to the fire solver, so every bar arrived as Class N regardless of its declared ductility. The Cl. 5.6.3(1) ambient load-level section and the fire-reduced section are both built from the same mapping, so neither can drop the field independently. Fire capacity results change for sections where low-ductility (Class L or E) reinforcement is in use. :::