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.

ℹ️ 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.
Type Guards
hasTopPlate(props)
True when topSteelWidth and topSteelThickness are both positive.
hasBottomPlate(props)
True when bottomSteelWidth and bottomSteelThickness are both positive.
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
sectionRectBeamSectionRequiredThe original beam section (singly or doubly reinforced)
platesSteelJacketedPropsRequiredPlate 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
shearPlanesnumberOptionalShear 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
sectionRectBeamSectionRequiredThe original beam section
platesSteelJacketedPropsRequiredPlate material and dimensions
VnumberkNRequiredFactored shear force at the section
sectionState'cracked' | 'uncracked'OptionalTransformed section basis (default: 'cracked')
boltBoltPropsRequiredAnchor properties, passed to boltShearCapacity
boltsPerRownumberRequiredBolts 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.
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