Resources Numerical accuracy Calculation policy

Steel member resistance to EN 1993-1-1

The design resistances of a rolled I or H section: classification, tension, bending, shear, buckling, lateral-torsional buckling and the combined checks.

How the precision is kept

Each resistance is a closed-form 64-bit expression with the standard's own coefficients and the partial factors of the project's National Annex table. The accuracy of a result is that of the standard's formulas and of the first-order analysis behind the forces. The fillet centroid constant is written to four digits.

Open item. Replace the fillet centroid constant 0.2234 by the expression (5 ÷ 6 − π ÷ 4) ÷ (1 − π ÷ 4).

Calculations under this policy

11 calculations in 1 source file. The code is read from the released app when this page loads. It is the calculation people run, not a copy kept for this page.

frame/frame-design-en.js CadCraft 0.8.2 64-bit 11 calculations Reviewed

Tests bin/test-frame-design.mjs

Section properties for the checks

64-bit

Plastic and elastic moduli, shear areas, the warping constant and radii of gyration of an I or H section.

Wpl,y = b tf (h − tf) + tw hc² ÷ 4 + 4 A_f (hc ÷ 2 − 0.2234 r); Avz = A − 2 b tf + (tw + 2r) tf; Iw = Iz (h − tf)² ÷ 4

Closed-form expressions. The fillet term uses the constant 0.2234, which carries four digits of the exact 0.22336793894575233. The shear area is a difference of areas, floored at 0.

  • frame/frame-design-en.js
  • lines 32 to 44
  • CadCraft 0.8.2
export function props(shape, sec) {
  const { d: h, bf: b, tw, tf } = shape, r = shape.r || 0;
  const hw = h - 2 * tf, c = h - 2 * tf - 2 * r;                       // hw: between the flanges; c: clear of the fillets
  const A = sec.A, Af = FILLET(r);
  const hc = h - 2 * tf;
  const Wply = b * tf * (h - tf) + tw * hc * hc / 4 + 4 * Af * (hc / 2 - 0.2234 * r);
  const Wplz = tf * b * b / 2 + hc * tw * tw / 4 + 4 * Af * (tw / 2 + 0.2234 * r);
  const Wely = sec.Iy / (h / 2), Welz = sec.Iz / (b / 2);
  const Iw = sec.Iz * (h - tf) * (h - tf) / 4;
  const Avz = Math.max(A - 2 * b * tf + (tw + 2 * r) * tf, 0);          // 6.2.6(3)(a), rolled I and H, load parallel to the web
  const Avy = A - hw * tw;                                              // 6.2.6(3)(c), load parallel to the flanges
  return { h, b, tw, tf, r, hw, c, A, Iy: sec.Iy, Iz: sec.Iz, It: sec.J, Iw, Wply, Wplz, Wely, Welz, Avz, Avy, iy: Math.sqrt(sec.Iy / A), iz: Math.sqrt(sec.Iz / A), cf: (b - tw - 2 * r) / 2, hb: h / b };
}

Cross-section class

64-bit

The class of the flange and web in compression and in bending.

ε = √(235 ÷ fy); flange c ÷ t ≤ 9ε, 10ε, 14ε; web ≤ 72ε, 83ε, 124ε (bending) or 33ε, 38ε, 42ε (compression)

Plain comparisons with no tolerance: a ratio exactly at a limit takes the better class.

  • frame/frame-design-en.js
  • lines 47 to 55
  • CadCraft 0.8.2
/** Table 5.2: rolled I, parts in compression (flange) / bending and compression (web). */
export function classify(p, fy) {
  const eps = Math.sqrt(235 / fy);
  const cls = (v, a, b, c) => (v <= a * eps ? 1 : v <= b * eps ? 2 : v <= c * eps ? 3 : 4);
  const flange = cls(p.cf / p.tf, 9, 10, 14);
  const webBend = cls(p.c / p.tw, 72, 83, 124);
  const webComp = cls(p.c / p.tw, 33, 38, 42);
  return { flange, webBend, webComp, bending: Math.max(flange, webBend), compression: Math.max(flange, webComp), epsilon: eps };
}

Tension resistance

64-bit

The design tension resistance of the gross section, and of the net section when one is given.

Nt,Rd = min(A fy ÷ γM0, 0.9 A_net fu ÷ γM2)

Two products and a minimum. Without a net area only the gross section is checked.

  • frame/frame-design-en.js
  • lines 57 to 61
  • CadCraft 0.8.2
export function tension(p, fy, fu, na, Anet = null) {
  const Npl = p.A * fy / na.gammaM0;                                    // (6.6)
  const Nu = Anet ? 0.9 * Anet * fu / na.gammaM2 : Infinity;            // (6.7)
  return { NtRd: Math.min(Npl, Nu), clause: Nu < Npl ? '6.2.3(2)b' : '6.2.3(2)a' };
}

Shear resistance along the web

64-bit

The plastic shear resistance, and the shear buckling resistance of a slender web.

Vpl,Rd = Av fy ÷ (√3 γM0); λ̄w = hw ÷ (86.4 tw ε); χw = η or 0.83 ÷ λ̄w

√3 is computed, not typed. The constant 86.4 is the one the standard prints for a web without stiffeners. Only the web's contribution is counted beyond the buckling limit.

  • frame/frame-design-en.js
  • lines 67 to 79
  • CadCraft 0.8.2
export function shearMajor(p, fy, na) {
  const Av = Math.max(p.Avz, na.eta * p.hw * p.tw);                     // 6.2.6(3)(a)
  const eps = Math.sqrt(235 / fy);
  const VplRd = Av * fy / (Math.sqrt(3) * na.gammaM0);                  // (6.18)
  const buckling = p.hw / p.tw > 72 * eps / na.eta;                     // 6.2.6(6)
  if (!buckling) return { VplRd, Av, buckling, VRd: VplRd };
  // EN 1993-1-5 §5.2: web contribution only (the flanges' share is left out), no intermediate stiffeners (kτ = 5.34),
  // non-rigid end post: χw = η for λ̄w < 0.83/η, else 0.83/λ̄w; the cap is η fy hw tw / (√3 γM1)
  const lamW = p.hw / (86.4 * p.tw * eps);                              // (5.6) with kτ = 5.34
  const chiW = lamW < 0.83 / na.eta ? na.eta : 0.83 / lamW;             // Table 5.1
  const VbRd = Math.min(chiW * fy * p.hw * p.tw / (Math.sqrt(3) * na.gammaM1), na.eta * fy * p.hw * p.tw / (Math.sqrt(3) * na.gammaM1));   // (5.2), (5.1)
  return { VplRd, Av, buckling, lamW, chiW, VbRd, VRd: VbRd };
}

Bending resistance with high shear

64-bit

The major-axis bending resistance reduced when the shear exceeds half the plastic shear resistance.

ρ = (2 V_Ed ÷ Vpl,Rd − 1)²; W = Wpl,y − ρ Aw² ÷ (4 tw)

Applied to class 1 and 2 sections; a class 3 section is left unreduced, as the code's comment says.

  • frame/frame-design-en.js
  • lines 84 to 92
  • CadCraft 0.8.2
/** 6.2.8: major-axis bending resistance with high shear (V > 0.5 Vpl): fy reduced in the shear area by (1 − ρ). */
export function bendingWithShear(p, fy, na, cls, VEd, VplRd) {
  const base = bendingMajor(p, fy, na, cls).McRd;
  if (VEd <= 0.5 * VplRd) return { McRd: base, rho: 0 };
  const rho = Math.pow(2 * VEd / VplRd - 1, 2);                          // (6.20)
  const Aw = p.hw * p.tw;
  const W = cls <= 2 ? p.Wply - rho * Aw * Aw / (4 * p.tw) : p.Wely;     // (6.30) for class 1–2 I-sections; class 3 is left unreduced
  return { McRd: Math.min(base, W * fy / na.gammaM0), rho };
}

Bending and axial force on the cross-section

64-bit

The utilization of the cross-section under axial force and bending about both axes.

class 1–2: (My ÷ M_N,y)² + (Mz ÷ M_N,z)^β, β = max(5n, 1); class 3: σ ÷ (fy ÷ γM0)

The reduced moments divide by (1 − 0.5a) and (1 − a), which are positive because a is capped at 0.5. An axial force at or above the plastic resistance returns an infinite ratio.

  • frame/frame-design-en.js
  • lines 94 to 108
  • CadCraft 0.8.2
/** 6.2.9.1: class 1–2 bending + axial force (6.36 / 6.38 / 6.39 / 6.41); class 3: stress check (6.42). Returns the largest ratio. */
export function momentAxial(p, fy, na, cls, NEd, My, Mz) {
  const Npl = p.A * fy / na.gammaM0;
  if (cls === 3) {
    const sig = Math.abs(NEd) / p.A + Math.abs(My) / p.Wely + Math.abs(Mz) / p.Welz;
    return { ratio: sig / (fy / na.gammaM0), eq: '6.42' };
  }
  const n = Math.abs(NEd) / Npl, a = Math.min((p.A - 2 * p.b * p.tf) / p.A, 0.5);
  const Mply = p.Wply * fy / na.gammaM0, Mplz = p.Wplz * fy / na.gammaM0;
  const MNy = Math.min(Mply * (1 - n) / (1 - 0.5 * a), Mply);            // (6.36)
  const MNz = n <= a ? Mplz : Mplz * (1 - Math.pow((n - a) / (1 - a), 2));   // (6.38), (6.39)
  if (n >= 1) return { ratio: Infinity, eq: '6.41' };
  const beta = Math.max(5 * n, 1);
  return { ratio: Math.pow(Math.abs(My) / MNy, 2) + Math.pow(Math.abs(Mz) / MNz, beta), eq: '6.41' };   // (6.41), α = 2
}

Buckling reduction factor

64-bit

The reduction factor χ for a slenderness and a buckling curve.

Φ = 0.5 (1 + α (λ̄ − 0.2) + λ̄²); χ = 1 ÷ (Φ + √(Φ² − λ̄²)) ≤ 1

For a slenderness above 0.2, Φ is at least λ̄, so the value under the square root is not negative. χ is 1 at or below the plateau slenderness.

  • frame/frame-design-en.js
  • lines 110 to 114
  • CadCraft 0.8.2
export function chiOf(lam, alpha, lam0 = 0.2) {
  if (lam <= lam0) return 1;
  const phi = 0.5 * (1 + alpha * (lam - 0.2) + lam * lam);
  return Math.min(1, 1 / (phi + Math.sqrt(phi * phi - lam * lam)));       // (6.49)
}

Buckling resistance in compression

64-bit

The design buckling resistance for flexural buckling about both axes and torsional buckling.

Ncr = π² E I ÷ L²; λ̄ = √(A fy ÷ Ncr); Nb,Rd = χ A fy ÷ γM1

The lowest of the three reduction factors governs. The divisions by the buckling lengths are not guarded in this function.

  • frame/frame-design-en.js
  • line 71
  • CadCraft 0.8.2
const buckling = p.hw / p.tw > 72 * eps / na.eta;                     // 6.2.6(6)

Lateral-torsional buckling resistance

64-bit

The design bending resistance of an unrestrained segment.

Mcr = C1 (π² E Iz ÷ L²) √(Iw ÷ Iz + L² G It ÷ (π² E Iz)); λ̄LT = √(W fy ÷ Mcr); Mb,Rd = χLT W fy ÷ γM1

The critical moment is the closed form for a load at the shear center and end warping free. A zero moment diagram gives C1 = 1 from the engine, so Mcr is not zero.

  • frame/frame-design-en.js
  • lines 137 to 145
  • CadCraft 0.8.2
/** 6.3.2.2 (general case, Table 6.4). C1 = the moment-gradient factor of the segment's diagram. */
export function ltb(p, fy, E, G, Lb, C1, cls, na) {
  const W = cls <= 2 ? p.Wply : p.Wely;
  const Mcr = C1 * Math.PI * Math.PI * E * p.Iz / (Lb * Lb) * Math.sqrt(p.Iw / p.Iz + Lb * Lb * G * p.It / (Math.PI * Math.PI * E * p.Iz));   // zg = 0
  const lam = Math.sqrt(W * fy / Mcr);
  const curve = p.h / p.b <= 2 ? 'a' : 'b';                                                // Table 6.4
  const chi = chiOf(lam, ALPHA[curve], 0.2);
  return { MbRd: chi * W * fy / na.gammaM1, chiLT: chi, lamLT: lam, Mcr, curve };
}

Bending and compression on the member

64-bit

The left sides of the two member interaction equations (6.61) and (6.62).

N ÷ (χy N_Rk ÷ γM1) + kyy My ÷ (χLT My,Rk ÷ γM1) + kyz Mz ÷ (Mz,Rk ÷ γM1), and the same with χz, kzy, kzz

The factors k follow Annex B method 2. The factor kzy divides by (Cm,LT − 0.25); Cm is never below 0.4, so the divisor is at least 0.15.

  • frame/frame-design-en.js
  • lines 147 to 172
  • CadCraft 0.8.2
/**
 * Annex B, method 2, for one station and one segment. All forces absolute, N compression.
 *   n = { NEd, My, Mz }, R = { NRk, MyRk, MzRk }, b = buckling(), l = ltb(), cm = { y, z, LT }
 *   cls 1–2: Table B.1 plastic; cls 3: elastic. kzy is taken from Table B.2 (members susceptible to torsional deformation)
 *   unless `braced` says the member cannot twist (then Table B.1's 0.6 kyy).
 * Returns { r1, r2 } = the left sides of (6.61) and (6.62).
 */
export function interaction(f, R, b, l, cm, cls, na, braced = false) {
  const ny = f.NEd / (b.chiY * R.NRk / na.gammaM1), nz = f.NEd / (b.chiZ * R.NRk / na.gammaM1);
  let kyy, kzz, kyz, kzy;
  const lY = b.lamY, lZ = b.lamZ;
  if (cls <= 2) {
    kyy = Math.min(cm.y * (1 + (lY - 0.2) * ny), cm.y * (1 + 0.8 * ny));
    kzz = Math.min(cm.z * (1 + (2 * lZ - 0.6) * nz), cm.z * (1 + 1.4 * nz));
    kyz = 0.6 * kzz;
  } else {
    kyy = Math.min(cm.y * (1 + 0.6 * lY * ny), cm.y * (1 + 0.6 * ny));
    kzz = Math.min(cm.z * (1 + 0.6 * lZ * nz), cm.z * (1 + 0.6 * nz));
    kyz = kzz;
  }
  if (braced) kzy = 0.6 * kyy;
  else if (cls <= 2) kzy = Math.max(1 - 0.1 * lZ / (cm.LT - 0.25) * nz, 1 - 0.1 / (cm.LT - 0.25) * nz);
  else kzy = Math.max(1 - 0.05 * lZ / (cm.LT - 0.25) * nz, 1 - 0.05 / (cm.LT - 0.25) * nz);
  const My = f.My / (l.chiLT * R.MyRk / na.gammaM1), Mz = f.Mz / (R.MzRk / na.gammaM1);
  return { r1: f.NEd / (b.chiY * R.NRk / na.gammaM1) + kyy * My + kyz * Mz, r2: f.NEd / (b.chiZ * R.NRk / na.gammaM1) + kzy * My + kzz * Mz, kyy, kzz, kyz, kzy };
}

Equivalent uniform moment factor

64-bit

The factor Cm of Table B.3 read from a segment's moment diagram.

straight diagram: max(0.6 + 0.4 ψ, 0.4); loaded span: 0.95 + 0.05 αh or 0.90 + 0.10 αh

The diagram counts as straight when no station is further than 2 % of the peak from the line between the end moments. The 1e-9 N·mm limits that guard the ratios are absolute.

  • frame/frame-design-en.js
  • lines 174 to 195
  • CadCraft 0.8.2
/**
 * Equivalent uniform moment factor Cm of Table B.3 from a segment's moment series (signed, x in mm).
 * Linear diagram: 0.6 + 0.4ψ ≥ 0.4 (ψ = M_small / M_large of the end moments). A diagram with a load between the ends:
 * 0.95 + 0.05 αh (uniform load) or 0.90 + 0.10 αh (point load), αh = hogging end moment / sagging maximum, 0 when the
 * ends are not hogging. This is the table's two common shapes read by the diagram; other shapes → the same linear rule.
 */
export function cm(x, M, hasPointLoad) {
  const n = M.length - 1, M0 = M[0], M1 = M[n];
  const big = Math.max(Math.abs(M0), Math.abs(M1));
  if (big < 1e-9 && Math.max(...M.map(Math.abs)) < 1e-9) return 1;
  let dev = 0;
  for (let k = 0; k <= n; k++) dev = Math.max(dev, Math.abs(M[k] - (M0 + (M1 - M0) * x[k] / x[n])));
  const peak = Math.max(...M.map(Math.abs));
  if (dev <= 0.02 * peak) {
    const lo = Math.abs(M0) <= Math.abs(M1) ? M0 : M1, hi = Math.abs(M0) <= Math.abs(M1) ? M1 : M0;
    const psi = hi === 0 ? 1 : lo / hi;
    return Math.max(0.6 + 0.4 * psi, 0.4);
  }
  const Ms = Math.max(...M), Mh = Math.max(0, -Math.min(M0, M1));
  const ah = Ms > 1e-9 ? Math.min(Mh / Ms, 1) : 0;
  return hasPointLoad ? 0.90 + 0.10 * ah : 0.95 + 0.05 * ah;
}

In detail

Method
EN 1993-1-1:2005+A1:2014: Table 5.2, 6.2.3 to 6.2.9, 6.3.1, 6.3.2.2, Annex B method 2; EN 1993-1-5 §5 for a web beyond the shear buckling limit. Each function names its clause in the code.
Number types
64-bit numbers. Units mm, N, MPa, N·mm.
Tolerances
The moment factor Cm treats a diagram as a straight line when it leaves the line between its ends by at most 2 % of its peak, and as zero when every moment is below 1e-9 N·mm (absolute).
Limits
Class 4 sections, welded sections, torsion and second-order effects are not built. The factor C1 for the critical moment is taken from the quarter-point expression of AISC F1-1 by the engine.

Approach: 64-bit, stated limit

The arithmetic is 64-bit, but the method or the data sets the accuracy: a solver tolerance, a mesh, a step size, a datum shift, a table. The limit is stated where the result is shown.

Every policy that takes this approach