# Strength of materials ## Microsim ### Live player <div class="microsim-player"> <iframe src="https://editor.p5js.org/sciencenibber/full/ePuZ3ndUn" width="100%" height="620" frameborder="0" sandbox="allow-scripts allow-same-origin"></iframe> </div> <div class="microsim-fallback"> <img src="Microsims/thumbs/Strength_of_materials.png" alt="Strength_of_materials microsim poster" style="width:100%;border:1px solid #4445;border-radius:6px;"> <p><em>Live microsim (desktop) · <a href="https://editor.p5js.org/sciencenibber/sketches/ePuZ3ndUn">open sketch in the p5.js editor</a></em></p> </div> **Editor URL:** https://editor.p5js.org/sciencenibber/sketches/ePuZ3ndUn **Description (100 words):** A prismatic axial-tension specimen is gripped at the top and pulled by load P. Three controls — P (kN), cross-section A (mm²), and material ([[Steel]] | Aluminium | [[Copper]]) — drive the engineering normal stress σ = P/A and, through Hooke's law ε = σ/E, the corresponding strain. The specimen elongates visually as δ = PL/(AE), tinting from grey toward red as σ approaches ultimate. The right panel plots an idealised four-segment material curve (elastic → yield → ultimate → necking) with the live operating point overlaid. A regime banner (ELASTIC / YIELDED / NECKING / FRACTURED) and an ASCII equation footer make every stage of the strength-of-materials story visible in one screen. ```js // ===================================================================== // Strength_of_materials.js — Wikitube microsim // Article: Strength of materials // Wikitube URL: en.wikitube.io/wiki/Strength_of_materials // Room: Engineering Pattern: A reskin (Statics / FBD) // --------------------------------------------------------------------- // Idea: a prismatic axial-tension specimen, gripped at the top, pulled // downward by a load P. The reader drives three sliders: // // P (load, kN) 0 .. 120 // A (cross-section, mm^2) 20 .. 400 // mat (material select) Steel | Aluminium | Copper // // The microsim renders four things in lockstep, all from the same P,A,E: // // 1. A geometric specimen that elongates by delta = P*L / (A*E) // where L is the gauge length. The grip blocks slide apart and // the gauge section visually stretches. // 2. A stress-strain plot in the right panel. The current // (epsilon, sigma) point is drawn over an idealised material // curve with elastic (Hooke), yield, hardening, and necking // regimes. The curve depends on the selected material. // 3. Live readouts in the bottom-left corner: P, A, sigma, epsilon, // delta, and the current regime label (elastic / yielded / // necking / fractured). // 4. An ASCII equation footer in the bottom-right that updates with // the current numerical values: // sigma = P/A, epsilon = sigma/E, delta = PL/(AE) // // The classical strength-of-materials formulas come straight from // Timoshenko, Elements of Strength of Materials (chapter on tension / // compression). Conventions: tension is positive, units are SI. // // Color codes (Engineering room palette, P5_JS_EDITOR section 12): // STRUCT grey : grip blocks, machine frame // LOAD red : applied load arrows, ultimate-stress markers // REACT blue : reaction arrows (top grip is fixed) // TENSION red : positive normal stress visualisation on the bar // COMP green : (unused for tensile test, kept for room-palette // consistency) // // All non-ASCII (Greek letters, multiplication dots, arrows) lives in // COMMENTS ONLY — the editor preview pipeline mangles non-ASCII inside // string literals (see Skills/.../pitfalls.md, 2026-04-30 entry). // ===================================================================== const ARTICLE = "Strength_of_materials"; p5.disableFriendlyErrors = true; // ---- Sliders & UI handles ------------------------------------------- let pSlider; // applied load P in kN let aSlider; // cross-section A in mm^2 let matSelect; // material picker (E and yield/ultimate stresses) // ---- Engineering-room palette --------------------------------------- const BG = 248; // off-white blueprint background const FG = 24; // near-black ink const STRUCT = [80, 90, 110]; // grips and frame const LOAD = [220, 60, 60]; // applied force arrows const REACT = [60, 130, 220]; // reaction arrow at fixed grip const TENSION = [220, 60, 60]; // positive normal stress const COMP = [60, 180, 90]; // negative normal stress (unused) const SCRATCH = [120, 120, 120, 80]; // construction / dim guides const CURVE = [40, 60, 140]; // material stress-strain curve const POINT = [220, 130, 40]; // current operating point // ---- Material library: E, yield, ultimate, and necking strain -------- // E in GPa // sig_y yield stress in MPa // sig_u ultimate stress in MPa // eps_y yield strain (auto = sig_y / E /1000 since E is GPa) // eps_u strain at ultimate stress // eps_f strain at fracture const MATERIALS = { "Steel": { E: 200, sig_y: 250, sig_u: 400, eps_u: 0.18, eps_f: 0.30 }, "Aluminium": { E: 69, sig_y: 280, sig_u: 310, eps_u: 0.10, eps_f: 0.16 }, "Copper": { E: 117, sig_y: 70, sig_u: 220, eps_u: 0.40, eps_f: 0.55 } }; // ---- Layout constants (set in setup() once width/height are known) --- let LEFT_PANEL_W; // pixels; left half holds the specimen drawing let CHART_X, CHART_Y; // top-left of the stress-strain chart let CHART_W, CHART_H; // chart dimensions // ---- Specimen geometry (independent of P; only the rendered length // and bar tint vary with the load) --------------------------------- const L_GAUGE_PX = 220; // pixel length of the gauge section const BAR_W_BASE = 28; // baseline pixel width of the bar const GRIP_H = 30; // grip block height in px const GRIP_W = 90; // grip block width in px const MAX_DRAW_DELTA = 80; // cap visual elongation for readability function setup() { // 720 x 520 is the room standard. pixelDensity 2 for crisp text. createCanvas(720, 520); pixelDensity(2); textFont("system-ui"); LEFT_PANEL_W = 320; CHART_X = LEFT_PANEL_W + 40; CHART_Y = 80; CHART_W = width - CHART_X - 30; CHART_H = 270; // Sliders live in a horizontal strip below the specimen; readouts // sit to their left so the slider thumb never overlaps the readout // text (pitfalls.md, 2026-04-30 "slider overlap"). pSlider = createSlider(0, 120, 35, 1); pSlider.position(20, height - 85); pSlider.style("width", "240px"); aSlider = createSlider(20, 400, 150, 5); aSlider.position(20, height - 55); aSlider.style("width", "240px"); matSelect = createSelect(); matSelect.position(20, height - 25); matSelect.option("Steel"); matSelect.option("Aluminium"); matSelect.option("Copper"); matSelect.selected("Steel"); } function draw() { background(BG); // ----- Read all controls once at the top of draw() ------------------ const P_kN = pSlider.value(); // load in kN const A_mm2 = aSlider.value(); // cross-section in mm^2 const matKey = matSelect.value(); const M = MATERIALS[matKey]; // ----- Compute strength-of-materials primaries (SI) ----------------- // sigma = P / A. P in N (kN * 1000), A in m^2 (mm^2 * 1e-6). // -> sigma in Pa. Convert to MPa for the chart and readouts. const P_N = P_kN * 1000; const A_m2 = A_mm2 * 1e-6; const sigma_Pa = P_N / A_m2; const sigma_MPa = sigma_Pa / 1e6; // Material curve evaluated at the current sigma -> derived strain. // The curve is piecewise: linear (Hooke) -> plateau-ish hardening // up to ultimate -> negative slope into necking -> fracture. const eps = strainForStress(sigma_MPa, M); const regime = classifyRegime(sigma_MPa, eps, M); // Visual specimen elongation. Real engineering strains are tiny in // the elastic regime (0.1 percent for steel at yield); the visual // exaggerates by mapping eps to up to MAX_DRAW_DELTA px so the // reader can see something happen below yield. const drawDelta = constrain(map(eps, 0, M.eps_f, 0, MAX_DRAW_DELTA), 0, MAX_DRAW_DELTA); // ----- Left panel: tensile-test specimen ---------------------------- drawSpecimen(P_kN, sigma_MPa, M, drawDelta, regime); // ----- Right panel: stress-strain curve + operating point ----------- drawChart(M, sigma_MPa, eps, regime); // ----- HUD overlay layers ------------------------------------------ drawTitleBlock(); drawControlHints(); drawReadouts(P_kN, A_mm2, sigma_MPa, eps, M, regime); drawEquationFooter(sigma_MPa, eps, M); drawSliderLabels(); } // --------------------------------------------------------------------- // Material model: piecewise stress-strain // --------------------------------------------------------------------- // // Region 1 (elastic): sigma = E * eps, 0 <= sigma <= sig_y // Region 2 (hardening): linear from (eps_y, sig_y) -> (eps_u, sig_u) // Region 3 (necking): linear from (eps_u, sig_u) -> (eps_f, 0.7*sig_u) // Above sig_u the bar has fractured: sigma is reported as 0 and the // regime label flips to "fractured". // // We invert this to get strain from a given stress. // --------------------------------------------------------------------- function strainForStress(sigma_MPa, M) { const eps_y = M.sig_y / (M.E * 1000); // E in GPa -> divide MPa by 1000*GPa if (sigma_MPa <= M.sig_y) { // Hooke: eps = sigma / E. E in GPa, sigma in MPa -> ratio /1000. return sigma_MPa / (M.E * 1000); } if (sigma_MPa <= M.sig_u) { // Linear hardening between yield and ultimate. const t = (sigma_MPa - M.sig_y) / (M.sig_u - M.sig_y); return lerp(eps_y, M.eps_u, t); } // Beyond ultimate: we are on the necking branch where sigma falls. // For the reader we cap the strain at eps_f to avoid pathological values. return M.eps_f; } function classifyRegime(sigma_MPa, eps, M) { if (sigma_MPa < 1) return "unloaded"; if (sigma_MPa < M.sig_y) return "elastic"; if (sigma_MPa < M.sig_u) return "yielded"; if (eps < M.eps_f) return "necking"; return "fractured"; } // --------------------------------------------------------------------- // Left panel: tensile specimen drawing // --------------------------------------------------------------------- function drawSpecimen(P_kN, sigma_MPa, M, drawDelta, regime) { // Centre line of the specimen sits at x = LEFT_PANEL_W / 2. const cx = LEFT_PANEL_W / 2; const top_y = 90; // top grip baseline const bar_y = top_y + GRIP_H; // top of the gauge section const bot_y = bar_y + L_GAUGE_PX + drawDelta; // bottom of stretched bar const grip_b_y = bot_y; // top of the bottom grip (which slides) // ----- Top grip (fixed to the imaginary frame) -------------------- noStroke(); fill(...STRUCT); rect(cx - GRIP_W / 2, top_y, GRIP_W, GRIP_H, 4); // Frame brackets above the top grip stroke(...STRUCT); strokeWeight(3); noFill(); line(cx - GRIP_W / 2, top_y, cx - GRIP_W / 2 - 12, top_y - 12); line(cx + GRIP_W / 2, top_y, cx + GRIP_W / 2 + 12, top_y - 12); // ----- Bar body (the gauge section) ------------------------------- // Tint from STRUCT-grey toward TENSION-red as sigma climbs from 0 to // ultimate stress. Past ultimate the bar darkens to indicate damage. const t = constrain(sigma_MPa / M.sig_u, 0, 1.0); const tr = lerp(STRUCT[0], TENSION[0], t); const tg = lerp(STRUCT[1], TENSION[1], t); const tb = lerp(STRUCT[2], TENSION[2], t); noStroke(); fill(tr, tg, tb); rect(cx - BAR_W_BASE / 2, bar_y, BAR_W_BASE, L_GAUGE_PX + drawDelta, 2); // Gauge length annotation (always equals the original L, not L+delta) stroke(...SCRATCH); strokeWeight(1); line(cx - BAR_W_BASE / 2 - 18, bar_y, cx - BAR_W_BASE / 2 - 18, bar_y + L_GAUGE_PX); line(cx - BAR_W_BASE / 2 - 22, bar_y, cx - BAR_W_BASE / 2 - 14, bar_y); line(cx - BAR_W_BASE / 2 - 22, bar_y + L_GAUGE_PX, cx - BAR_W_BASE / 2 - 14, bar_y + L_GAUGE_PX); noStroke(); fill(80); textSize(10); textAlign(RIGHT, CENTER); text("L", cx - BAR_W_BASE / 2 - 24, bar_y + L_GAUGE_PX / 2); // Elongation annotation (delta) on the right side of the bar. if (drawDelta > 2) { stroke(...SCRATCH); strokeWeight(1); line(cx + BAR_W_BASE / 2 + 18, bar_y + L_GAUGE_PX, cx + BAR_W_BASE / 2 + 18, bot_y); line(cx + BAR_W_BASE / 2 + 14, bar_y + L_GAUGE_PX, cx + BAR_W_BASE / 2 + 22, bar_y + L_GAUGE_PX); line(cx + BAR_W_BASE / 2 + 14, bot_y, cx + BAR_W_BASE / 2 + 22, bot_y); noStroke(); fill(80); textSize(10); textAlign(LEFT, CENTER); text("dL", cx + BAR_W_BASE / 2 + 24, (bar_y + L_GAUGE_PX + bot_y) / 2); } // ----- Bottom grip (slides downward as the bar stretches) --------- noStroke(); fill(...STRUCT); rect(cx - GRIP_W / 2, grip_b_y, GRIP_W, GRIP_H, 4); // Applied load arrow pointing downward from the bottom grip. drawArrow(cx, grip_b_y + GRIP_H, 0, 50, LOAD, "P = " + nf(P_kN, 1, 1) + " kN"); // Reaction arrow pointing upward from above the top grip. drawArrow(cx, top_y - 14, 0, -34, REACT, "R"); // ----- Regime banner under the specimen --------------------------- const banner_y = grip_b_y + GRIP_H + 70; noStroke(); if (regime === "elastic") fill(60, 130, 220, 200); else if (regime === "yielded") fill(220, 130, 40, 220); else if (regime === "necking") fill(200, 60, 60, 220); else if (regime === "fractured") fill(120, 0, 0, 240); else fill(120); rect(cx - 80, banner_y, 160, 22, 6); fill(255); textSize(12); textAlign(CENTER, CENTER); text(regime.toUpperCase(), cx, banner_y + 11); } // Arrow helper: draws shaft + arrowhead from (x, y) along (dx, dy). function drawArrow(x, y, dx, dy, col, label) { push(); stroke(...col); strokeWeight(3); fill(...col); line(x, y, x + dx, y + dy); translate(x + dx, y + dy); rotate(atan2(dy, dx)); triangle(0, 0, -8, -4, -8, 4); pop(); if (label) { noStroke(); fill(...col); textSize(11); textAlign(LEFT, CENTER); text(label, x + dx + 8, y + dy); } } // --------------------------------------------------------------------- // Right panel: stress-strain curve and live operating point // --------------------------------------------------------------------- function drawChart(M, sigma_MPa, eps, regime) { const x0 = CHART_X; const y0 = CHART_Y; const w = CHART_W; const h = CHART_H; // Chart frame noFill(); stroke(60); strokeWeight(1); rect(x0, y0, w, h); // Axes noStroke(); fill(60); textSize(11); textAlign(CENTER, TOP); text("strain eps", x0 + w / 2, y0 + h + 18); push(); translate(x0 - 26, y0 + h / 2); rotate(-PI / 2); textAlign(CENTER, BOTTOM); text("stress sigma (MPa)", 0, 0); pop(); // Map strain -> x in chart, stress -> y in chart. const xMax = M.eps_f * 1.05; const yMax = M.sig_u * 1.10; // Gridlines (labelled at major ticks) stroke(220); strokeWeight(1); for (let g = 0.05; g < xMax; g += 0.05) { const xg = x0 + (g / xMax) * w; line(xg, y0, xg, y0 + h); } for (let g = 50; g < yMax; g += 50) { const yg = y0 + h - (g / yMax) * h; line(x0, yg, x0 + w, yg); } noStroke(); fill(110); textSize(9); textAlign(CENTER, TOP); for (let g = 0.05; g < xMax; g += 0.05) { const xg = x0 + (g / xMax) * w; text(nf(g, 1, 2), xg, y0 + h + 2); } textAlign(RIGHT, CENTER); for (let g = 50; g < yMax; g += 50) { const yg = y0 + h - (g / yMax) * h; text(g, x0 - 4, yg); } // The idealised material curve, drawn from key points. const eps_y = M.sig_y / (M.E * 1000); const sig_neck = M.sig_u * 0.7; noFill(); stroke(...CURVE); strokeWeight(2); beginShape(); vertex(x0, y0 + h); // origin vertex(x0 + (eps_y / xMax) * w, y0 + h - (M.sig_y / yMax) * h); // yield vertex(x0 + (M.eps_u / xMax) * w, y0 + h - (M.sig_u / yMax) * h); // ultimate vertex(x0 + (M.eps_f / xMax) * w, y0 + h - (sig_neck / yMax) * h); // fracture endShape(); // Reference markers for sig_y and sig_u as horizontal dashed lines. drawDashedHLine(x0, x0 + w, y0 + h - (M.sig_y / yMax) * h, [60, 130, 220, 180]); drawDashedHLine(x0, x0 + w, y0 + h - (M.sig_u / yMax) * h, [220, 60, 60, 180]); noStroke(); fill(60, 130, 220); textSize(10); textAlign(LEFT, BOTTOM); text("sigma_y = " + M.sig_y + " MPa", x0 + 6, y0 + h - (M.sig_y / yMax) * h - 2); fill(220, 60, 60); text("sigma_u = " + M.sig_u + " MPa", x0 + 6, y0 + h - (M.sig_u / yMax) * h - 2); // Current operating point. const opx = x0 + constrain(eps / xMax, 0, 1) * w; const opy = y0 + h - constrain(sigma_MPa / yMax, 0, 1) * h; noStroke(); fill(...POINT); ellipse(opx, opy, 9, 9); // Drop-down lines from operating point to axes. stroke(...POINT); strokeWeight(1); line(opx, opy, opx, y0 + h); line(opx, opy, x0, opy); // Material name + E in a small caption. noStroke(); fill(40); textSize(11); textAlign(LEFT, TOP); text(matSelect.value() + " E = " + M.E + " GPa", x0 + 6, y0 + 4); } function drawDashedHLine(x1, x2, y, col) { stroke(...col); strokeWeight(1); const dash = 6, gap = 4; let x = x1; while (x < x2) { line(x, y, min(x + dash, x2), y); x += dash + gap; } } // --------------------------------------------------------------------- // HUD layers (drawn last so they sit above the canvas) // --------------------------------------------------------------------- function drawTitleBlock() { noStroke(); fill(20); textSize(20); textFont("system-ui"); textAlign(LEFT, TOP); text("Strength of materials", 16, 14); fill(110); textSize(12); text("Wikitube microsim - en.wikitube.io/wiki/" + ARTICLE, 16, 38); } function drawControlHints() { noStroke(); fill(110); textSize(11); textAlign(RIGHT, TOP); text("sliders: P (load, kN), A (area, mm^2)", width - 16, 14); text("select: material -> E, sigma_y, sigma_u", width - 16, 30); text("formulas: sigma = P/A, eps = sigma/E", width - 16, 46); } function drawReadouts(P_kN, A_mm2, sigma_MPa, eps, M, regime) { noStroke(); fill(40); textSize(12); textAlign(LEFT, BOTTOM); const x = 16; let y = height - 105; const dy = 14; text("P = " + nf(P_kN, 1, 1) + " kN", x, y); y += dy; text("A = " + A_mm2 + " mm^2", x, y); y += dy; // sigma in two steps so the long string never exceeds the slider strip. text("sigma = " + nf(sigma_MPa, 1, 1) + " MPa", x, y); y += dy; text("eps = " + nf(eps * 100, 1, 3) + " %", x, y); } function drawEquationFooter(sigma_MPa, eps, M) { noStroke(); fill(80); textSize(11); textAlign(RIGHT, BOTTOM); const eqn = "sigma = P/A = " + nf(sigma_MPa, 1, 1) + " MPa eps = sigma/E = " + nf(eps * 100, 1, 3) + " %"; text(eqn, width - 16, height - 10); } function drawSliderLabels() { noStroke(); fill(60); textSize(12); textAlign(LEFT, CENTER); text("P (load, kN)", 280, height - 80); text("A (area, mm^2)", 280, height - 50); text("material", 280, height - 20); } ``` ## Links (Wikipedia order) <!-- injected from _registry/childlinks/Strength_of_materials.json (2026-07-30T02:09:12Z) --> `Alan_Arnold_Griffith` · `Aluminium_alloy` · `Amplitude` · `Buckling` · `Bulk_modulus` · `Compression_(physics)` · `Compression_member` · `Compressive_strength` · `Compressive_stress` · `Creep_(deformation)` · `Deflection_(engineering)` · `Deformation_(engineering)` · [[Dynamics_(mechanics)]] · `Elastic_energy` · `Elasticity_(physics)` · `Factor_of_safety` · [[Fatigue_(material)]] · [[Forensic_engineering]] · [[Fracture_mechanics]] · `Fracture_toughness` · `Grain_boundary_strengthening` · `Imperial_units` · `International_System_of_Units` · `List_of_materials_properties` · `Material_failure_theory` · `Material_selection` · [[Materials_science]] · `Microstructure` · `Molecular_diffusion` · `P-wave_modulus` · `Physical_quantity` · `Plasticity_(physics)` · `Poisson's_ratio` · `Precipitation_hardening` · `Range_(statistics)` · `Shear_modulus` · `Shear_strength` · `Shear_stress` · `Solid_solution_strengthening` · `Specific_strength` · `Statics` · `Stephen_Timoshenko` · `Stress_concentration` · `Stress–strain_curve` · [[Tensor]] · `Thermal_expansion` · `Torsion_(mechanics)` · `Transverse_plane` · `United_States_customary_units` · `Von_Mises_yield_criterion` · `Work_hardening` · `Yield_(engineering)` · `Young's_modulus` ## From the Real GENERATIVE library ![Strength of materials](https://upload.wikimedia.org/wikipedia/commons/thumb/f/f5/Compressive_tensile_shear_loading.svg/220px-Compressive_tensile_shear_loading.svg.png) *Strength of materials — placed from the Real G.E.N.E.R.A.T.I.V.E. course library (Engineering room). Source: Wikimedia Commons (via Wikipedia article media). [Details & license](https://commons.wikimedia.org/wiki/File:Compressive_tensile_shear_loading.svg).* > The field of strength of materials (also called mechanics of materials) typically refers to various methods of calculating the stresses and strains in structural members, such as beams, columns, and shafts. The methods employed to predict the response of a structure under loading and its susceptibility to various failure modes takes into account the properti ([Wikipedia](https://en.wikipedia.org/wiki/Strength_of_materials)) <!-- REAL-GENERATIVE-MEDIA:END --> <!-- LOCAL-MEDIA-PASS:START --> ## From the vault media library !Strength of materials thumb.png *Strength Of Materials — from the vault's own media holdings, placed 2026-07-09. MTN / Wikitube.io original · CC BY-SA 4.0.* <!-- LOCAL-MEDIA-PASS:END --> > **Room:** [[Engineering]] · **Status:** ✅ shipped ## Overview **Strength of materials** — also called *mechanics of materials* — is the engineering [[Science|science]] that predicts how solid bodies of finite size deform, store strain [[Energy|energy]], and ultimately fail under combined axial, shear, bending, and torsional loads. Codified by Galileo in 1638 (*Two New Sciences*) and matured by Navier, Saint-Venant, and Timoshenko, the discipline reduces a continuum problem to a tractable set of stress-resultant formulas tied to a member's cross-section and material constants. Its three foundational quantities — engineering stress σ = P/A, engineering strain ε = δ/L, and Young's modulus E = σ/ε in the linear-elastic regime — together yield Hooke's-law deflection δ = PL/(AE) for a prismatic bar in uniaxial tension. Beyond elastic limits the stress-strain curve bends through yield (σ_y), strain hardens to ultimate strength (σ_u), then necks to fracture, with each region governed by a different constitutive law. Strength of materials supplies the formulas that size every column, beam, shaft, bolt, and pressure-vessel wall in modern practice; its limit-state extensions — buckling, fatigue, [[Fracture_mechanics|fracture mechanics]], plastic collapse — define the safety factors built into every structural code from AISC to Eurocode 3. ## See also - Room hub: [[Engineering]] - p5.js Editor conventions: P5 JS EDITOR - Wiki root: MAIN --- *Scaffolded by `generative-microsim` from row 0 of the Engineering sheet on 2026-04-30T17:14:56Z.* Letters: flow · mined_science · energy · mined_system · rotation · greek_in_science · kanji_radicals · mined_electron <!-- REAL-GENERATIVE-MEDIA:START --> <!-- CRAFT-LINK:START g12 --> *Built to the [[WT!P5_js_Microsim_Master_Class|p5.js Master Class]].* <!-- CRAFT-LINK:END --> ## Wikipedia : Wikitube **Strict pair:** [Wikipedia](https://en.wikipedia.org/wiki/Strength_of_materials) : [Wikitube](https://en.wikitube.io/wiki/Strength_of_materials) ## Previous hub tags Tree parent: [[Reliability_engineering]]. Legacy hubs: `GENERATIVE`. *Legacy media (later editing), kept in place under `Wikitube - Collision And Promoted Articles/Strength_of_materials/`: `Strength_of_materials Books` (4) · `Strength_of_materials History` (1) · `Strength_of_materials Systems` (1)* --- *Sources: 2 legacy notes. Minted wave 1, 2026-07-30 (v1.6 order).*