Overview

The strengthening module evaluates how much a strengthening intervention increases the flexural capacity of an existing beam. It follows a transform-then-delegate pattern: the strengthening elements (steel plates) are converted into equivalent rebar areas, the effective depths are recomputed, and the capacity math is delegated to rectBeamMomentCapacity from the rc module rather than reimplemented.

ℹ️ Results come in a before / after pair, so the capacity gain from the intervention can be read directly from one call.
ℹ️ All inputs and outputs use SI units implicitly: MPa for stresses, mm / mm² for geometry, kN·m for moments. Each result object states its unit in the unit field.

A jacket is only effective if the plates are actually attached, so the module also sizes the interface bolting between the concrete and each plate: the interface shear flow q = V·Q/I from an elastic transformed section, the design shear strength of one anchor bolt, and the resulting bolt pitch and count.

Plates bolted to the sides of the web strengthen the beam in shear instead, and are handled by their own pair of functions. ACI 318-19 has no provisions for steel side plates, so the module offers two independent models — plate web yielding after AISC 360 G2.1, and a tension tie adapted from the FRP provisions of ACI 440.2R-17 §11.4 — and a comparison helper that reports the lower of the two. Both are engineering adaptations rather than code calculations.

ℹ️ Each plate is independently optional. A plate counts as present only when both its width and thickness are positive, so a bottom-only jacket may omit the top plate fields entirely. Interface results are returned per plate, with null where a plate is absent.
Input Types
RectBeamSection
The original beam section (singly or doubly reinforced) — same type consumed by the rc module.
SteelJacketedProps
Plate material (Es, fy) and the optional width / thickness of the top and bottom plates.
PlateShearFlowInput
Section, plates, factored shear V (kN) and the sectionState used for the transformed section.
BoltProps
Anchor steel area, strengths and optional diameter — or a direct phiVboltOverride.
PlateInterfaceBoltInput
A PlateShearFlowInput plus the bolt, the bolts per row, and the transfer length.
StirrupShearSection
The original beam in shear terms (fc_, bw, d, Av, fyt, s) — same type consumed by the rc module's shear functions.
SidePlateShearProps
Side plate material, thickness, engaged depth, layout ('continuous' or 'strips') and optional anchorage.
SidePlateAnchorage
The bolt group holding the side plates on: a BoltProps, the bolts per vertical row, and the row spacing along the span.
Type Guards
hasTopPlate(props)
True when topSteelWidth and topSteelThickness are both positive.
hasBottomPlate(props)
True when bottomSteelWidth and bottomSteelThickness are both positive.
hasSidePlate(props)
True when a SidePlateShearProps has both a positive thickness and a positive depth.
Calculation Flow
1
Baseline capacity
The original section is run through rectBeamMomentCapacity unchanged — this becomes the before result.
2
Convert plates to equivalent rebar
Plate areas are scaled by the strength ratio n = fy,plate / fy,rebar so they can be treated as additional reinforcement of the rebar's grade.
3
Recompute effective depths
d (and d_ whenever compression steel or a top plate is present) are replaced by the area-weighted centroids of the combined rebar + plate steel, still measured from the extreme concrete compression fibre. The bottom plate sits below the soffit; a top plate sits above the datum and so takes a negative depth.
4
Delegate
The modified section is run through rectBeamMomentCapacity again — this becomes the after result, with warnings merged.
Steel Plate Jacketing rc-beam-steel-plate-jacketing.ts
FN calculateSteelJacketedBeamMomentCapacity(section, jacketedProperties) Public API

Calculates the design moment capacity of an RC beam before and after strengthening with top and bottom steel plates. The bottom plate contributes to the tension steel; the top plate contributes to the compression steel — including on an originally singly reinforced section, which a top plate turns into a doubly reinforced one.

Parameters — section: RectBeamSection
ParamTypeUnitRequired?Description
EsnumberMPaRequiredElastic modulus of reinforcing steel
fc_numberMPaRequiredSpecified compressive strength of concrete f′c
fynumberMPaRequiredYield strength of the existing rebar
Asnumbermm²RequiredArea of existing tension reinforcement
bnumbermmRequiredSection width
hnumbermmRequiredOverall section height
dnumbermmRequiredEffective depth to the existing tension steel
As_numbermm²OptionalArea of existing compression reinforcement (doubly reinforced only)
d_numbermmOptionalDepth to the existing compression steel centroid
Parameters — jacketedProperties: SteelJacketedProps
ParamTypeUnitRequired?Description
EsnumberMPaRequiredElastic modulus of the steel plates
fynumberMPaRequiredYield strength of the steel plates
topSteelWidthnumbermmOptionalWidth of the top plate — omit or set to 0 for no top plate
topSteelThicknessnumbermmOptionalThickness of the top plate
bottomSteelWidthnumbermmOptionalWidth of the bottom plate — omit or set to 0 for no bottom plate
bottomSteelThicknessnumbermmOptionalThickness of the bottom plate
Example
TypeScript
import { calculateSteelJacketedBeamMomentCapacity } from '@theerapat-s28/ts-structural-eng-tools/strengthening';

const result = calculateSteelJacketedBeamMomentCapacity(
  {
    Es: 200000,   // MPa
    fc_: 28,      // MPa
    fy: 390,      // MPa
    As: 1472.6,   // mm² (3-DB25)
    b: 300,       // mm
    h: 500,       // mm
    d: 440,       // mm
  },
  {
    Es: 200000,             // MPa
    fy: 245,                // MPa (SS400 plate)
    topSteelWidth: 300,     // mm
    topSteelThickness: 6,   // mm
    bottomSteelWidth: 300,  // mm
    bottomSteelThickness: 6 // mm
  },
);
Returns
Result
{
  before: {                      // original section
    phiMn: 206.64,
    calculationDetails: {
      c: 94.63, a: 80.44, beta1: 0.85,
      d: 440, As: 1472.6, ro: 0.011156
    },
    unit: 'kN-m',
    warnings: []
  },
  after: {                       // jacketed section
    phiMn: 407.47,               // +97% capacity in this example
    calculationDetails: {
      c: 94.63,                  // mm, neutral axis from the concrete face
      a: 80.44,                  // mm, stress block depth — concrete only
      beta1: 0.85,
      d: 467.364,                // mm, rebar + bottom plate centroid
      d_: -3,                     // mm, top plate centroid — above the concrete face
      As: 2603.37,               // mm², rebar + bottom plate
      As_: 1130.77,              // mm², top plate as compression steel
      fs_: 390,                    // MPa, capped at fy — the top plate yields
      ro: 0.018568,
      ro_: 0.008065
    },
    unit: 'kN-m',
    warnings: []
  }
}

Both entries have the same shape as a rectBeamMomentCapacity result. The after warnings are the merged set from the jacketed-section run.

ℹ️ Because the capacity math is delegated, all warnings and errors of rectBeamMomentCapacity apply to both the before and after runs — see the rc module reference for the full list.
ℹ️ Depths are measured from the extreme concrete compression fibre — the top face of the concrete — so the equivalent rectangular stress block covers concrete only. A top plate therefore has a negative d_ (half its thickness above that face), and d is unchanged by adding one. Note this differs from the datum used by the interface-bolting functions below.
⚠️ Propagates RCDesignError 102 from rectBeamMomentCapacity: the added plate steel can push a section out of the tension-controlled region even when the original section was fine. Because before and after are computed in one call, a throw from either leg loses both results.
Plate Interface Bolting rc-beam-plate-interface-bolts.ts

Horizontal shear must be transferred across the concrete-to-plate interface for the jacket to act compositely. These functions compute that demand from an elastic transformed section and size the bolt group that resists it.

ℹ️ Shear flow is per interface, not per beam. Q at a cut is the first moment of the area beyond it — the plate alone — while ybar and Itr come from a single solve that includes every plate present. Adding a top plate therefore changes the bottom interface result too, so the two cannot be computed independently.
FN plateInterfaceShearFlow(input) Public API

Calculates q = V·Q/I at each concrete-to-plate interface using an elastic transformed section. Rebar is transformed with (n−1) because it displaces concrete already counted in the section; the plates sit outside the concrete and take the full n. Both moduli use Ec = 4700√f′c.

Parameters — input: PlateShearFlowInput
ParamTypeUnitRequired?Description
sectionRectBeamSection—RequiredThe original beam section (singly or doubly reinforced)
platesSteelJacketedProps—RequiredPlate material and dimensions; at least one plate must be present
VnumberkNRequiredFactored shear force at the section under consideration
sectionState'cracked' | 'uncracked'—OptionalTransformed section basis (default: 'cracked')
Example
TypeScript
import { plateInterfaceShearFlow } from '@theerapat-s28/ts-structural-eng-tools/strengthening';

const flow = plateInterfaceShearFlow({
  section: {
    Es: 200000, fc_: 28, fy: 400,
    As: 1200, b: 300, h: 500, d: 440,
  },
  plates: {
    Es: 200000,
    fy: 250,
    bottomSteelWidth: 200,      // mm — bottom plate only
    bottomSteelThickness: 10,   // mm
  },
  V: 150,                        // kN
});
Returns
Result
{
  top: null,                        // no top plate in this example
  bottom: {
    q: 247.71,                    // N/mm of shear flow to transfer
    Q: 4681782,                   // mm³, first moment of the plate about the NA
    leverArm: 291.09              // mm, plate centroid to neutral axis
  },
  calculationDetails: {
    Ec: 24870.06,                 // MPa
    ns: 8.042,                    // Es,rebar / Ec
    np: 8.042,                    // Es,plate / Ec
    ybar: 213.91,                 // mm, neutral axis from the datum
    Itr: 2835033974,              // mm⁴
    sectionState: 'cracked'
  },
  unit: 'N/mm',
  warnings: []
}

Depths here are measured from a datum at the top face of the top plate (the concrete top face when there is no top plate), which is what ybar and every y in the transformed section refer to. This is not the datum used by calculateSteelJacketedBeamMomentCapacity, which measures from the extreme concrete compression fibre so that its stress block covers concrete only. Each function is internally consistent; only compare depths within one of them.

ℹ️ The 'cracked' default suits a strengthened beam under service load and gives the higher, conservative q. Use 'uncracked' only when the beam is known to stay below its cracking moment.
⚠️ Warns (ACI318-19, 22.2.2.1) when compression reinforcement falls below the cracked neutral axis — it is then transformed as tension steel — or when a top plate centroid lies below the neutral axis, which means the assumed compression-face behaviour does not apply.
⚠️ Throws RCDesignError 201 (V not positive, or no plate present), 203 (inconsistent geometry), or 204 (no cracked neutral axis within the concrete depth).
FN boltShearCapacity(bolt) Public API

Design shear strength of a single anchor bolt from the steel strength per ACI 318-19 17.7.1.2b, Vsa = 0.6·Ase,V·futa, with φ = 0.65 (Table 17.5.3) and the futa cap of 17.6.1.2.

Parameters — bolt: BoltProps
ParamTypeUnitRequired?Description
Asenumbermm²RequiredEffective cross-sectional area of the anchor in shear
futanumberMPaRequiredSpecified tensile strength of the anchor steel
fyanumberMPaOptionalSpecified yield strength; enables the 1.9·fya part of the cap
diameternumbermmOptionalAnchor diameter; enables the ACI 17.9.2 minimum spacing check in plateInterfaceBoltRequirement
shearPlanesnumber—OptionalShear planes per bolt (default: 1)
phiVboltOverridenumberkNOptionalBypasses the computed steel strength — use for post-installed anchors with an ESR value
Example
TypeScript
import { boltShearCapacity } from '@theerapat-s28/ts-structural-eng-tools/strengthening';

const bolt = boltShearCapacity({
  Ase: 157,        // mm² (M16)
  futa: 400,       // MPa
  fya: 240,        // MPa
  diameter: 16,    // mm
});
Returns
Result
{
  phiVbolt: 24.49,                // kN, 0.65 * 37.68
  calculationDetails: {
    source: 'ACI318-19, 17.7.1.2b',
    Vsa: 37.68,                   // kN, 0.6 * 157 * 400
    futaEffective: 400,           // MPa, below min(1.9*fya, 860)
    shearPlanes: 1
  },
  unit: 'kN',
  warnings: [
    {
      reference: 'ACI318-19, 17.7.2',
      message: 'Only anchor steel strength in shear is evaluated; ...'
    }
  ]
}
⚠️ Concrete breakout (17.7.2) and pryout (17.7.3) are not evaluated — they depend on edge distances, anchor spacing and embedment depth. A warning citing ACI318-19, 17.7.2 is returned on every call, including when phiVboltOverride is used, and these limit states must be checked separately.
⚠️ Warns (ACI318-19, 17.6.1.2) when futa exceeds min(1.9·fya, 860 MPa) and is capped.
⚠️ Throws RCDesignError 202 when the resolved capacity is not positive.
FN plateInterfaceBoltRequirement(input) Public API

Determines the bolts required at every plate present. For each interface the required pitch follows from the shear flow, s = n·φVbolt / q, and the bolt count is the larger of that pitch over the transfer length and the count needed to develop the full plate yield force, Ap·fy / φVbolt. governedBy reports which one controls.

Parameters — input: PlateInterfaceBoltInput
ParamTypeUnitRequired?Description
sectionRectBeamSection—RequiredThe original beam section
platesSteelJacketedProps—RequiredPlate material and dimensions
VnumberkNRequiredFactored shear force at the section
sectionState'cracked' | 'uncracked'—OptionalTransformed section basis (default: 'cracked')
boltBoltProps—RequiredAnchor properties, passed to boltShearCapacity
boltsPerRownumber—RequiredBolts across the plate width at each pitch location
transferLengthnumbermmRequiredLength over which the plate force is transferred (typically zero moment to maximum moment)
Example — top and bottom plates
TypeScript
import { plateInterfaceBoltRequirement } from '@theerapat-s28/ts-structural-eng-tools/strengthening';

const bolts = plateInterfaceBoltRequirement({
  section: {
    Es: 200000, fc_: 28, fy: 400,
    As: 1200, b: 300, h: 500, d: 440,
    As_: 600, d_: 50,
  },
  plates: {
    Es: 200000,
    fy: 250,
    topSteelWidth: 200,    // mm
    topSteelThickness: 10,  // mm
    bottomSteelWidth: 200,
    bottomSteelThickness: 10,
  },
  V: 150,                      // kN
  bolt: { Ase: 157, futa: 400, fya: 240, diameter: 16 },
  boltsPerRow: 2,
  transferLength: 2000,        // mm
});
Returns
Result
{
  top: {
    q: 121.2, Q: 2870171, leverArm: 178.45,
    requiredSpacing: 300,          // mm, capped at the detailing limit
    boltCount: 21,
    governedBy: 'plateForce',     // near the compression face, q is low
    calculationDetails: {
      spacingFromShearFlow: 404.1,
      rows: 8,
      boltCountFromShearFlow: 16,
      boltCountFromPlateForce: 21,
      plateForce: 500                // kN, Ap * fy
    }
  },
  bottom: {
    q: 225.17, Q: 5332462, leverArm: 331.55,
    requiredSpacing: 217.5,
    boltCount: 22,
    governedBy: 'shearFlow',
    calculationDetails: {
      spacingFromShearFlow: 217.5,
      rows: 11,
      boltCountFromShearFlow: 22,
      boltCountFromPlateForce: 21,
      plateForce: 500
    }
  },
  calculationDetails: {
    Ec: 24870.06, ns: 8.042, np: 8.042,
    ybar: 183.45, Itr: 3552281591,
    sectionState: 'cracked',
    phiVbolt: 24.49,
    boltsPerRow: 2,
    transferLength: 2000
  },
  unit: 'kN',
  warnings: [ /* breakout notice + top plate pitch cap */ ]
}

rows is ceil(transferLength / requiredSpacing) + 1, so both ends of the transfer length carry a row, and boltCount is rows × boltsPerRow unless the plate force governs.

ℹ️ A top plate typically comes out governedBy: 'plateForce' — it sits near the compression face, so its lever arm to the neutral axis is short and q is low, but the plate still has to develop its force somewhere. A bottom plate is usually governed by shear flow.
⚠️ The pitch is capped at a detailing limit of 300 mm so the plate is restrained between fasteners; a warning is returned when that cap governs. A separate warning citing ACI318-19, 17.9.2 is returned when the required pitch falls below the minimum anchor spacing of 4·da (only checked when diameter is supplied).
⚠️ Propagates RCDesignError 201 / 202 / 204 from the two functions it calls, and throws 203 when boltsPerRow or transferLength is not positive.
Side Plate Shear Strengthening rc-beam-side-plate-shear.ts

Steel plates bolted to the faces of the web add a shear-resisting path alongside the stirrups. Both functions below return the same before / after pair — before is φVc + φVs delegated to the rc module, and after adds the plate contribution φVp — and both accept the same two arguments. They differ only in how Vp is derived.

⚠️ ACI 318-19 has no provisions for steel side plates in shear. The plate term φVp is not a code-sanctioned calculation — it comes from AISC 360 G2.1 (web yielding) or ACI 440.2R-17 §11.4 (tension tie), neither of which was written for steel plates bolted to a concrete web. Every result carries a warning saying so. Run both and take the lower value — compareSidePlateShearCapacity does exactly that.
What is code-based, and what is not
QuantityBasisStandingNotes
φVcACI 318-19, 22.5.5.1CodeDelegated to concreteShearCapacity
φVsACI 318-19, 22.5.10.5.3CodeDelegated to stirrupShearCapacity
φ = 0.75ACI 318-19, 21.2.1CodeApplied to the plate term as well
Vs + Vp capACI 318-19, 22.5.1.2CodeTruncates Vp to the web's remaining headroom; mirrored by ACI 440.2R-17, 11.4.3 Eq. (11.4.3) at the same 0.66 coefficient
Strip pitch limitACI 318-19, 9.7.6.2.2CodeWarning only; tightens to min(d/4, 300) once Vs + Vp passes 0.33·√f′c·bw·d. ACI 440.2R-17, 11.4.2 defers to this same limit
Minimum anchor spacingACI 318-19, 17.9.2CodeWarning only, on rowSpacing when the bolt diameter is given
φVanchorageACI 318-19, 17.7.1.2bCodeAnchor steel in shear only; breakout and pryout not evaluated
φVp — web yieldingAISC 360 G2.1AdaptationWritten for the web of a steel beam, not a plate bolted to concrete
φVp — tension tieACI 440.2R-17 §11.4AdaptationAn ACI guide, not part of ACI 318, and calibrated for FRP — ψf = 0.85 and the 0.004 strain cap come from FRP test data
⚠️ Neither model captures partial interaction — slip between plate and concrete at the bolts. Tests on bolted side-plated beams consistently show the plate reaching less strain than a rigid-engagement model predicts, so both figures are non-conservative in a way no φ factor here covers. A spread between the two results is a measure of that model uncertainty; confirm the chosen value against test data or a specialist review before relying on it.
ℹ️ On citation provenance. Every ACI 318-19 and AISC 360 reference on this page is verified against those documents. Two ACI 440.2R-17 subsections have since been verified as well: 11.4.2 Spacing, which defers to the ACI 318 limits for internal steel shear reinforcement and measures strip spacing centreline to centreline, and 11.4.3 Reinforcement limits, Eq. (11.4.3), which sets Vs + Vf ≤ 0.66·√f′c·bw·d. The remaining two — the subsections carrying the 0.004 strain cap and the ψf = 0.85 factor — are still cited at §11.4 only. The wf + d/4 strip pitch rule of ACI 440.2R-08 is deliberately not applied: it did not survive into the 2017 edition, which defers to ACI 318 instead.
ℹ️ A continuous plate is the limiting case of strips with width = spacing, so one expression covers both layouts through the coverage ratio wp / s reported as coverageRatio.
Shear calculation flow
1
Baseline capacity
concreteShearCapacity and stirrupShearCapacity from the rc module give φVc + φVs, unchanged — this becomes the before result. A section with Av: 0 contributes φVs = 0 rather than dividing by a zero spacing.
2
Plate contribution
The chosen model produces a nominal Vp from the plate geometry, reported as Vp. Both models reduce to the coverage ratio wp / s, which is 1 for a continuous plate.
3
Web crushing cap
Vp is truncated to the headroom left under 0.66·√f′c·bw·d — ACI 318-19 22.5.1.2, mirrored by ACI 440.2R-17 11.4.3 — giving VpEffective. A section with no headroom at all throws 206 instead.
4
Anchorage limit
When anchorage is supplied, φVpPlate = 0.75·VpEffective is compared against φVanchorage from boltShearCapacity, and the lower wins. governedBy names whichever of the three limits set the result.
5
Assemble
after.phiVn = φVc + φVs + φVp, with every intermediate value in calculationDetails and every warning of steps 1–4 merged into after.warnings.
ℹ️ before.warnings carries only what the baseline calculation raised, so it is usually empty; after.warnings carries those plus every side plate warning. Read after.warnings — it is the complete set.
⚠️ Propagated from the baseline: a warning citing ACI318-19, 22.5.3.1 when √f′c exceeds the 8.3 MPa limit used for Vc, i.e. f′c > 68.9 MPa. It appears in both before.warnings and after.warnings.
FN sidePlateShearCapacityByWebYielding(section, plates) Public API AISC 360 G2.1

Treats each side plate as a supplementary web resisting in-plane shear at the von Mises shear yield stress 0.6·fy (AISC 360 G2.1, a steel code written for the web of a steel beam — not an ACI 318-19 provision): Vp = nSides · 0.6·fy · tp · dp · wp / s, with wp / s = 1 for a continuous plate. Strips are handled as that fraction of a continuous web, which is an approximation — a discrete strip acts more as a tie, which is what sidePlateShearCapacityByTensionTie models.

Parameters — section: StirrupShearSection
ParamTypeUnitRequired?Description
fc_numberMPaRequiredSpecified compressive strength of concrete f′c
bwnumbermmRequiredWeb width
dnumbermmRequiredEffective depth
Avnumbermm²RequiredExisting stirrup area within spacing s (both legs); pass 0 for a beam with no stirrups
fytnumberMPaRequiredYield strength of the existing stirrups
snumbermmRequiredExisting stirrup spacing; 0 alongside Av: 0
lambdanumber—OptionalLightweight concrete factor (default: 1.0)
Parameters — plates: SidePlateShearProps
ParamTypeUnitRequired?Description
fynumberMPaRequiredYield strength of the side plate
thicknessnumbermmRequiredPlate thickness tp
depthnumbermmRequiredEngaged vertical depth dp; must not exceed d
configuration'continuous' | 'strips'—RequiredLayout along the span
widthnumbermmOptionalStrip width wp — required when configuration: 'strips'
spacingnumbermmOptionalStrip pitch s, centreline to centreline per ACI 440.2R-17 11.4.2 — required when configuration: 'strips'; must be ≥ width
anglenumberdegreesOptionalStrip inclination from the beam axis, in (0, 90] (default: 90); used by the tension tie model only
EsnumberMPaOptionalPlate elastic modulus (default: 200000)
sides1 | 2—OptionalFaces plated (default: 2)
anchorageSidePlateAnchorage—OptionalBolt group; omit to report the fully developed plate capacity
Parameters — plates.anchorage: SidePlateAnchorage
ParamTypeUnitRequired?Description
boltBoltProps—RequiredAnchor properties, passed to boltShearCapacity
boltsPerRownumber—RequiredBolts in one vertical row, on one face
rowSpacingnumbermmRequiredHorizontal pitch of the bolt rows along the span
Example — 6 mm strips at 250 mm pitch, both faces
TypeScript
import { sidePlateShearCapacityByWebYielding } from '@theerapat-s28/ts-structural-eng-tools/strengthening';

const result = sidePlateShearCapacityByWebYielding(
  {
    fc_: 35,      // MPa
    bw: 400,      // mm
    d: 550,       // mm
    Av: 157,      // mm², existing stirrups
    fyt: 400,     // MPa
    s: 250,       // mm
  },
  {
    fy: 250,             // MPa
    thickness: 6,        // mm
    depth: 500,         // mm
    configuration: 'strips',
    width: 100,         // mm
    spacing: 250,       // mm
    anchorage: {
      bolt: { Ase: 157, futa: 400, fya: 240, diameter: 16 },
      boltsPerRow: 3,
      rowSpacing: 250,  // mm
    },
  },
);
Returns
Result
{
  method: 'webYielding',
  before: {
    phiVn: 269.57,
    calculationDetails: { phiVc: 165.95, phiVs: 103.62, Vc: 221.26, Vs: 138.16 },
    unit: 'kN',
    warnings: []
  },
  after: {
    phiVn: 539.57,
    phiVp: 270,
    governedBy: 'plateCapacity',
    calculationDetails: {
      phiVc: 165.95, phiVs: 103.62,
      Vp: 360,                // kN, 2 * 0.6*250 * 6 * 500 * 0.4
      VpEffective: 360,       // kN, after the web crushing cap
      maxVs: 859.01,          // kN, 0.66*sqrt(fc')*bw*d
      headroom: 720.85,       // kN, maxVs - Vs
      phiVpPlate: 270,
      phiVanchorage: 293.88,  // kN, 2 faces * 2 rows * 3 bolts * 24.49
      anchorageRows: 2,
      phiVbolt: 24.49,
      sides: 2,
      coverageRatio: 0.4,
      tauY: 150,               // MPa, 0.6 * fy
      slenderness: 83.3,       // dp / tp
      slendernessLimit: 63.4   // 2.24 * sqrt(Es / fy)
    },
    unit: 'kN',
    warnings: [ /* model notice, partial depth, slenderness, breakout */ ]
  }
}
Returns — after
FieldTypeUnitDescription
phiVnnumberkNStrengthened design shear capacity, φVc + φVs + φVp
phiVpnumberkNDesign contribution of the side plates, after every limit below
governedBy'plateCapacity' | 'anchorage' | 'webCrushing'—Which limit set phiVp
calculationDetailsobjectkN / MPaEvery intermediate quantity, including both competing limits
ℹ️ The plate contribution is the lowest of three limits: the plate's own capacity, the bolt group's phiVanchorage (which already carries the anchor φ of 0.65 from boltShearCapacity), and the web crushing headroom. Omitting anchorage skips the second, and a warning says the plate was assumed fully developed.
ℹ️ Anchorage counts the rows crossing an assumed 45° crack, floor(dp / rowSpacing) and at least one — the same dfv / sf counting ACI 440.2R uses for bonded shear reinforcement. A rowSpacing wider than dp falls back to one row, with a warning.
⚠️ Truncates Vp to the remaining web capacity and warns when Vs + Vp would pass 0.66·√f′c·bw·d — ACI318-19, 22.5.1.2. A continuous plate reaches this on almost any realistic thickness, so governedBy: 'webCrushing' is common there.
⚠️ Warns when the plate slenderness dp/tp exceeds 2.24·√(Es/fy), beyond which shear buckling may precede yielding — AISC360-22, G2.1. It stays a warning because the concrete restrains the inner face.
⚠️ Warns when the strip pitch exceeds the maximum shear reinforcement spacing — ACI318-19, 9.7.6.2.2. The limit is min(d/2, 600 mm), tightening to min(d/4, 300 mm) once Vs + Vp passes 0.33·√f′c·bw·d. It keys off Vs + Vp, not Vs alone, because the plate is usually what pushes a section into that range. This is the only pitch check applied: ACI440.2R-17, 11.4.2 defers to the ACI 318 limits for internal steel shear reinforcement rather than imposing its own, so one check satisfies both documents.
⚠️ Warns when sides: 1 is used: a plate on one face only loads the section eccentrically, and the resulting torsion and out-of-plane twist are outside this in-plane shear model.
⚠️ Warns when rowSpacing falls below the minimum anchor spacing of 4·da — ACI318-19, 17.9.2, the same check plateInterfaceBoltRequirement applies, and only active when the bolt's diameter is supplied. Also warns when depth is less than d, and propagates the anchor breakout notice of ACI318-19, 17.7.2.
⚠️ Throws RCDesignError 205 when the plate geometry is inconsistent — non-positive thickness, depth or fy, a depth past d, sides outside 1–2, strips missing a width or spacing, a strip wider than its pitch, an angle outside (0, 90], or an anchorage with no bolts.
⚠️ Throws RCDesignError 206 when the existing Vs already reaches 0.66·√f′c·bw·d: the web crushes before any added plate force can be developed, so no side plate helps. Propagates 202 from boltShearCapacity when the anchor properties are invalid.
FN sidePlateShearCapacityByTensionTie(section, plates) Public API ACI 440.2R-17 §11.4

Treats each side plate as a tension tie crossing the diagonal crack, following the bonded shear reinforcement model of ACI 440.2R-17 §11.4 — an ACI guide for externally bonded FRP, not part of ACI 318-19 — with steel in place of FRP: Vp = ψf · nSides · tp · wp · ffe · (sin α + cos α) · dp / s, with ffe = min(fy, Es·0.004) and ψf = 0.85. Takes exactly the same two arguments as sidePlateShearCapacityByWebYielding.

ℹ️ For structural steel Es·0.004 = 800 MPa sits above any normal fy, so the 0.004 strain cap does not bind and the tie reaches yield. This model therefore usually returns a higher capacity than the web yielding model, whose 0.6·fy is the more conservative figure.
Example — same section and plates as above
TypeScript
import { sidePlateShearCapacityByTensionTie } from '@theerapat-s28/ts-structural-eng-tools/strengthening';

const result = sidePlateShearCapacityByTensionTie(section, plates);
Returns
Result
{
  method: 'tensionTie',
  before: { phiVn: 269.57, /* … as above … */ },
  after: {
    phiVn: 563.45,
    phiVp: 293.88,
    governedBy: 'anchorage',   // the bolts, not the plate, set the limit
    calculationDetails: {
      phiVc: 165.95, phiVs: 103.62,
      Vp: 510,                // kN, 0.85 * 2 * 6 * 250 * 500 * 0.4
      VpEffective: 510,
      maxVs: 859.01, headroom: 720.85,
      phiVpPlate: 382.5,       // kN, before the anchorage limit bites
      phiVanchorage: 293.88,
      anchorageRows: 2, phiVbolt: 24.49,
      sides: 2, coverageRatio: 0.4,
      ffe: 250,                // MPa, min(fy, Es * 0.004)
      strainLimitedStress: 800, // MPa, Es * 0.004
      orientation: 1,          // sin(alpha) + cos(alpha)
      psi: 0.85
    },
    unit: 'kN',
    warnings: [ /* model notice, partial depth, breakout */ ]
  }
}
Example — continuous plate hitting the web crushing cap
Result
const result = sidePlateShearCapacityByTensionTie(section, {
  fy: 250, thickness: 4, depth: 500,
  configuration: 'continuous',
});

// result.after
{
  phiVn: 810.21,
  phiVp: 540.64,
  governedBy: 'webCrushing',
  calculationDetails: {
    Vp: 850,                  // kN, what the plate could deliver
    VpEffective: 720.85,      // kN, truncated to the headroom
    maxVs: 859.01, headroom: 720.85,
    coverageRatio: 1, ffe: 250, psi: 0.85
    /* … */
  }
}
⚠️ Warns when the 0.004 effective strain cap holds the plate below yield, i.e. fy > Es·0.004 — ACI440.2R-17, 11.4. Only reachable with a very high strength plate.
⚠️ Carries every other warning of the web yielding model: the ACI318-19, 22.5.1.2 truncation, the ACI318-19, 9.7.6.2.2 strip pitch limit (with the same Vs + Vp switch), the one-sided eccentricity note, and the ACI318-19, 17.9.2 and 17.7.2 anchor checks. The AISC slenderness check is not applied — buckling of a web panel is not the mechanism this model assumes.
⚠️ Throws the same RCDesignError 205 / 206 / 202 as sidePlateShearCapacityByWebYielding.
FN compareSidePlateShearCapacity(section, plates) Public API both models

Runs both models on the same section and reports the lower φVn as governing. This is the intended entry point when selecting a conservative design capacity, since neither model is code-sanctioned for steel side plates.

Example
TypeScript
import { compareSidePlateShearCapacity } from '@theerapat-s28/ts-structural-eng-tools/strengthening';

const comparison = compareSidePlateShearCapacity(section, plates);
Returns
Result
{
  webYielding: { method: 'webYielding', before: { /* … */ }, after: { phiVn: 539.57, /* … */ } },
  tensionTie:  { method: 'tensionTie',  before: { /* … */ }, after: { phiVn: 563.45, /* … */ } },
  governing: {
    method: 'webYielding',
    phiVn: 539.57,           // kN, the lower of the two
    phiVp: 270,
    governedBy: 'plateCapacity'
  }
}
Returns — governing
FieldTypeUnitDescription
method'webYielding' | 'tensionTie'—Which model produced the lower capacity
phiVnnumberkNThe lower strengthened design shear capacity
phiVpnumberkNIts plate contribution
governedBy'plateCapacity' | 'anchorage' | 'webCrushing'—Which limit set that phiVp
ℹ️ The full result of each model is returned alongside governing, so the warnings and every intermediate value stay available for the report.
⚠️ Throws whatever either model throws — RCDesignError 205 / 206 / 202.
Export Summary
KindExportReturnsDescription
FN calculateSteelJacketedBeamMomentCapacity { before, after } Moment capacity of an RC beam before and after steel plate jacketing
FN plateInterfaceShearFlow { top, bottom, calculationDetails, unit, warnings } Shear flow q = V·Q/I at each concrete-to-plate interface
FN boltShearCapacity { phiVbolt, calculationDetails, unit, warnings } Design shear strength of one anchor bolt from the steel strength
FN plateInterfaceBoltRequirement { top, bottom, calculationDetails, unit, warnings } Required bolt pitch and count at each interface, with the governing requirement
FN sidePlateShearCapacityByWebYielding { method, before, after } Shear capacity with side plates taken as supplementary webs yielding at 0.6·fy — AISC 360 G2.1, not ACI 318-19
FN sidePlateShearCapacityByTensionTie { method, before, after } Shear capacity with side plates taken as ties crossing the crack — ACI 440.2R-17 §11.4, a guide for FRP, not ACI 318-19
FN compareSidePlateShearCapacity { webYielding, tensionTie, governing } Both side plate shear models with the lower result reported as governing — neither is ACI 318-19