Theory

Every relation this app uses, the assumptions behind it, how it is solved, and where it stops being valid. One section per module, grouped by subject in the order the app presents them.

Everything here is generated from the same specification file the app reads at launch, so a relation shown here is the relation the app evaluates. Every unit printed in this manual is a base SI one — metres, newtons, pascals, radians — because that is what the relations are evaluated in; the millimetres, kilonewtons and megapascals a screen offers are a display choice applied once at the edge, and they never reach the relations below. 52 of the 53 relations written up here have a screen in this release; the other one is marked as such at the head of its own entry, with the reason. The two implementations are held to 6,770 shared reference values, compared to the last bit by the conformance run.

Download this manual as a PDF — the same text, set for paper.

Contents

Scope, and how to read this manual

This manual states, for every calculation the app performs, what relation is being evaluated, what principle it rests on, how the working form was reached from that principle, what it assumes, how it is solved, and where it stops being trustworthy. It is written to be consulted rather than read start to finish: each module is self-contained, and nothing later depends on anything earlier except the conventions fixed in the next two chapters.

It is not a textbook. It does not teach mechanics of materials from first principles, it does not set exercises, and it assumes a reader who has met the subject before and wants to know precisely what this particular program does with it. Where a derivation is given, it is given to fix the assumptions behind the app's own working relation, not to instruct in the subject.

Every module entry has the same shape, sections skipped where they do not apply rather than reordered:

Basis names the principle the relation rests on — an equilibrium statement, a compatibility condition, an energy theorem, a definition. Derivation shows how the app's working relation follows from that principle, including the steps where a choice was made, a substitution was convenient rather than necessary, or an expression was rewritten to survive floating-point arithmetic. Assumptions lists what must be true of the physical situation for the result to mean anything, each stated so its failure is recognisable rather than as a textbook caveat. Takes and Gives tabulate the symbols with their units and their meanings. Choices you have to make appears where a relation has more than one branch and the app shows every branch rather than picking one silently — a plate can fail in shear, in bearing, or by tearing, and the app is not going to guess which for you. What must always be true here lists the invariants and the monotone trends — every one of them is a property executed by the test suite over swept ranges of input, not a remark added to the prose afterward. Where it stops gives the limits and the singular points, and what the app does at each. Solution method says how the number is actually produced: closed form, a bracketed root search, a summation over segments. Limitations says what the result does not cover, including where a screen's scope is narrower than the underlying relation could support. Reading the result is about interpretation, and is where the mistakes this subject is known for are named plainly.

Every entry's heading carries a one-word badge, core or extended, and the two words mean something narrower than they sound. Core marks a relation that a first course in this subject treats as part of its own spine — the flexure formula, the torsion formula, Euler buckling — and extended marks one that such a course reaches only in a later chapter, an appendix or a design elective: curved beams, rotating discs, elastoplastic bending. The badge says nothing about how carefully a relation is implemented or verified; both kinds are held to the same reference values and the same identities, and both are equally likely to be the one a reader actually needs. It is there so that a reader scanning a chapter can tell which entries restate something they almost certainly already know and which introduce something they may not.

A note at the head of an entry saying it has no screen in this release means exactly that and nothing more: the relation is implemented, verified and documented here, but this version of the app provides no way to put a problem of that shape in front of it. The note gives the reason in each case.

The formulas, symbols, units, branching, invariants, boundaries and applicability guards printed in each entry are generated directly from the same specification file the application itself reads at launch. A relation printed here is therefore the relation the app evaluates, not a description of it that could quietly fall out of step. The surrounding prose — basis, derivation, method, limitations, reading — is written by hand and checked against the code: every module names the functions it describes, and the build refuses to run if one of those names no longer resolves to anything.

Notation, sign conventions and units

Most disagreements between two calculations that are each internally correct turn out to be disagreements about convention rather than about mechanics. This chapter fixes the ones this app uses, and says outright where this subject does not agree with itself.

Direct stress and strain. Tension positive, extension positive, throughout. A negative normal stress is compressive; nothing on this app's screens switches that around, unlike the sign convention some soil-mechanics and some concrete-design texts prefer.

Shear force and bending moment along a beam. Internally, one convention governs every beam calculation this app performs: a load is positive downward, a reaction is positive upward, an applied couple is positive clockwise, and a bending moment is positive when it sags the beam — tension on the underside. That single, fixed convention is what lets the identities tying the diagrams together (the moment is the integral of the shear, the shear the negative integral of the load) hold in one consistent form throughout the app rather than needing a sign correction chosen case by case. What is not fixed is how a reader sees it: two long-standing textbook traditions draw the shear diagram as mirror images of each other, and the screen that draws these diagrams offers that choice openly, mapping the same underlying, internally consistent numbers onto whichever drawn convention is selected. A diagram that looks upside down against a reader's memory of the subject is almost always this display choice, not an error in the numbers underneath it.

Angles. Radians internally, always; degrees are a display-edge convenience, converted on the way in and never carried past it. Rotations and moments follow the right-hand rule about the axis named, so a positive moment about an out-of-plane axis turns the first in-plane axis toward the second.

Section properties. Second moments of area are about centroidal axes unless a symbol says otherwise, and a hole removed from a section is subtracted as a negative area rather than typed in as one — the sign lives in how a piece is combined, not in a parameter a reader could get backwards. Where a section has no axis of symmetry, the app reports a full stress state rather than the single number a symmetric section would need, because collapsing the two would silently assume the section is not what the reader built.

Units: metres, newtons, pascals and radians inside; a choice of two practical systems on screen. Every kernel relation is evaluated in base SI — metres, newtons, pascals, radians — and every screen lets the reader work in either SI engineering units (millimetres, kilonewtons, megapascals) or US customary ones (inches, kips, ksi). The conversion happens once, at the boundary where a value crosses from the interface into the calculation or back, and nowhere else: nothing in the kernel, the composition layer or the solver carries any notion of which unit a reader prefers, and nothing converts a value twice or relabels it without converting it at all. Switching the displayed system therefore always changes the number shown, never merely the letters beside it — a field that kept showing the same digits under a different unit label would be reporting something false, and the boundary is built so that failure mode cannot occur by construction rather than by discipline.

Material and section data. Where the app carries reference numbers of its own — elastic constants, yield strengths, standard section geometry — the source is a public-domain government reference, not a textbook's own appendix table, and is named where it is used. A number attributed to no source on screen is one the app computed from what was typed in, not one it looked up.

Solution methods used throughout

Most of what this app computes is closed form: a relation with a known solution, evaluated directly from the inputs. Where that is not possible, one of a small number of numerical methods is used, described once here rather than separately in every module that depends on it.

Direct evaluation. The default, and the overwhelming majority of what the app does. Nothing iterates and nothing is approximated beyond the floating- point arithmetic itself. Where the textbook form of an expression is a difference of two nearly equal quantities at exactly the input a reader is likely to try — a bar whose two end widths approach each other, a Poisson's ratio approaching the incompressible limit, an impact factor at a vanishing drop height, a true strain at a small engineering strain — the app does not evaluate that form. It evaluates an algebraically equivalent one built around a logarithm-of-one-plus or a difference-quotient identity that has nothing to cancel, and returns the ordinary closed-form answer exactly at the point the textbook form would have divided zero by zero. The high-precision layer of verification exists partly to confirm that a rewritten expression still computes the same quantity as the one it replaced, at precision the rewrite itself could not check on its own.

Bracketed root-finding. Every inversion and every peak search in this app is bracketed, and there is no bare Newton iteration anywhere. The hardest case is the one that fixes the rule: an eccentrically loaded column's secant formula is the one place where the unknown load appears inside a secant of itself, no rearrangement removes it, and the relation has a pole at the column's own critical load — so an iteration starting from a guess can walk past that pole and return a number from the wrong branch, which is worse than a refusal because it looks like an answer. A bracket is taken from the physics instead: two loads known to sit either side of the answer, with the critical load as a hard, provable upper limit. The same discipline is applied wherever else a position or a depth has to be found rather than evaluated — a hollow shaft's diameter against an allowable stress, the neutral axis of a cracked reinforced-concrete section, the level that halves a section's area, the stations where a beam's shear force or its slope pass through zero — not because those relations are transcendental, most are not, but because a bracket taken from the geometry is what makes the answer deterministic: the method cannot converge to a different root, because the problem guarantees no other root lies inside the bracket. Inside the bracket the root is found by Brent's method, which accelerates on a well-behaved function and falls back to bisection whenever the fast step would leave the bracket or stop shrinking it — the fallback is what makes the bracket a guarantee rather than a hope.

Summation over segments. A stepped shaft, a bar of several prismatic pieces, a beam carrying several loads: none of these need a new relation, only the same one applied piece by piece and added. The addition is where mistakes live, not the relation, so it is performed by a summation ordered to keep its own arithmetic honest rather than by adding terms in the order a caller happened to list them — a short stiff segment next to a long soft one puts terms many orders of magnitude apart into the same total, and naive left-to-right addition can quietly lose the smaller one.

Singularity functions. A beam's shear force and bending moment, as a function of position, are built from Macaulay's bracket notation — a family of functions that switch on at the position of each load and stay on beyond it — rather than written as a separate polynomial on each span with matching conditions at every join. The two describe the same function; the bracket form is the one that a computer can evaluate at an arbitrary position without first working out which span that position falls in.

Small linear systems, solved without a linear-algebra library. A handful of modules reduce to a system of two or three linear equations — two redundant forces in a composite bar, three strain-gauge readings resolved into a full plane strain state — and these are solved by explicit elimination or Cramer's rule written out by hand, not by calling a general solver. The kernel this app shares with its two front ends imports nothing beyond the standard mathematics library, by design, so that the same arithmetic can be read and re-implemented line for line in either language without a matrix library existing on both sides of the boundary.

Guard values, not exceptions -- and refusals, which are neither. No function in the computational kernel raises an error for a bad input; it returns a value chosen for what it means, and lets that value propagate visibly to the screen rather than stopping the calculation. Separate from that, and deliberately kept separate, the layer that assembles those functions into whole sections and whole beams does refuse some inputs outright and says which one is the problem -- a description that removes more material than it adds is not a section, a beam with more supports than equilibrium can resolve is not a determinate beam, and a shear distribution cannot be taken through a rotated primitive. A refusal of that kind is a correct answer to a question that has none, and reporting it as a refusal rather than as a number is the point of distinguishing the two. A quantity with no physical reading at all — a negative area, an elastic modulus of zero used as a divisor, a Poisson's ratio outside the range any material can have — returns a signalling not-a-number. A quantity approaching a genuine physical limit rather than an invalid state — a column loaded at exactly its own critical load, a bulk modulus as a material approaches incompressibility — is allowed to grow toward the infinity that the mathematics actually produces there, because that is what the physics is doing, not a defect in the arithmetic. What every one of these choices has in common is that it is deliberate and stated once, here, rather than decided differently in each module: an invalid input and a limiting one are different things, and only one of them is a mistake.

How the results were verified

Results are checked in five ways, and the independence is the point of the arrangement: each layer is capable of catching a class of error that the other four cannot, so agreement across several of them means something that agreement with any one alone would not. The five do not each cover every module, and it would be misleading to say they did -- the printed-table and symbolic layers exist only where there is a printed table to check against or an implicit equation to prove a closed form solves, which is a minority of modules; the high-precision layer and the property tests cover every module. Where two layers happen to draw on the same published document, that overlap is recorded alongside the fixtures rather than counted twice: they are then independent of this app's arithmetic but not of each other.

Printed reference values. Worked examples and tabulated results, transcribed at the precision the source prints them — usually three or four significant figures. This layer is independent of nothing about the app's own arithmetic; it exists to catch a relation transcribed wrongly in the first place, or a quantity computed in the wrong unit, and it catches those reliably because it asks the simplest possible question: does the app reach the number the reference reaches.

High-precision recomputation. The same relations evaluated again from their defining equations, independently of the app's own code, using arbitrary-precision arithmetic — typically sixty significant figures, fewer where the calculation involves an integral expensive enough that sixty digits of it would not be affordable to generate. The generating scripts do not import this app's package, for the obvious reason that a reference value produced by the program under test would agree with it forever and prove nothing. This layer catches conditioning and cancellation: the cases where an algebraically correct expression, evaluated as printed rather than rewritten, would quietly lose its significant digits.

Symbolic proof. Wherever this app's working relation is a closed-form expression claimed to solve an equation that is normally left implicit — a neutral radius defined by an integral, a thick-walled cylinder's stress field defined by an equilibrium equation rather than by a formula — a symbolic algebra system proves that the closed form actually satisfies that equation, rather than merely producing numbers that look plausible at a handful of points. Each such proof is itself tested by deliberately corrupting the relation it is proving and confirming the proof then fails; a proof that cannot fail is not verifying anything.

Property tests. The invariants and the monotone trends named under each module, checked by an automated search over swept ranges of input rather than at a handful of chosen points. This is the layer that catches the error hiding between the points a person would have thought to try by hand — a sign that is wrong only when two particular inputs have the same sign, a branch that is chosen correctly everywhere except at the one boundary between two cases.

Independent public-domain sources. Values published in two US government engineering references — the Air Force Flight Dynamics Laboratory's Stress Analysis Manual and NASA's Astronautic Structures Manual — compared against this app's own results from the same inputs. This is the only layer independent of the textbooks the rest of the app was built from, and so the only one able to catch a misreading of them rather than merely a miscalculation from them.

On the reliability of published sources. This layer has, more than once, found the published value to be the one at fault rather than the app's. Chasing one such disagreement to the bottom found a worked example whose own printed steps contradict each other on the same page — a beam's bending calculation and its shear calculation use two different values for the same half-depth, and only one of them is consistent with the shape being analysed. Another turned out to carry a torsion constant printed exactly one power of the section's own side length short of the unit it is supposed to have, an error visible from the units alone without touching this app's result at all. A third had swapped which of two nearly equal radii belongs in which position of a fraction. Each of those is recorded and adjudicated in writing, on grounds that do not depend on this app's own implementation, rather than resolved by quietly adjusting the app until it matched the printed page. Where this manual states that a published figure is wrong, it is because a disagreement was chased to a cause outside this app and written down, not because the app disagreed and was assumed to be right.

Beyond the five: two languages, one specification. Every relation in this app is implemented twice, once for each of its two front ends, and two separate checks hold the pair together. The first is exhaustive and asks only about existence: every public name in each of the five layers of the computational core is required to be present on both sides, so a relation that exists in one language and simply does not exist in the other fails the build. That is the failure no fixture can catch, because a fixture nobody wrote compares nothing. The second asks about values: a shared body of reference cases is evaluated by both implementations and compared to the last bit either can represent. It covers the areas that reference set names rather than every relation one by one — so it is the first check that guarantees nothing is missing, and the second that guarantees the two agree wherever they are compared. Both implementations read the same specification file at launch and check that they were handed the same one by comparing its hash — so an update that changes what the app computes cannot reach only one of the two ends of it.

Foundations and Axially Loaded Members

M01   Axial Stress and Strain core

One force over one area. Every later screen reduces to this at the last step.

σ=P/A τ_avg=V/A ε=δ/L n=σ_fail/σ_allow

Basis

A prismatic bar carrying a force along its own axis is in equilibrium: cut it anywhere and the internal force at the cut must balance whatever is applied beyond the cut. Saint-Venant's principle is what lets that internal force be treated as a stress smeared evenly over the whole cross-section rather than concentrated near wherever the load is actually attached -- true away from the ends and away from any hole or step, and stated as a limitation below rather than assumed silently.

Derivation

Divide the internal force by the area it acts on and the result is the mean normal stress on that cut. There is no more derivation than that for the tension and compression case: it is the definition of stress applied to a free body with only one internal force to resolve. Strain follows the same pattern one level down -- a change in length divided by the length it happened over -- and neither definition knows yet whether the bar is elastic, so neither one is limited to it.

Shear across a fastener is the same division with a different area, and it is where the module earns its place rather than being a restatement of the axial case: a bolt or a pin can be cut by the joint on one plane or on two, depending on how the plates around it are arranged, and the two arrangements put the same load through either one cross-sectional area or two. The function takes which case applies as an explicit argument rather than asking a caller to halve the answer afterwards, because that halving is exactly the step a reader forgets.

Bearing stress is a third division again, and a different physical quantity from either of the other two even though it has the same units: it is not a stress transmitted through a section at all, but a contact pressure between a pin and the wall of the hole it sits in, spread -- by convention, not by an exact elasticity solution -- over the flat projected area of the hole rather than its curved surface. Factor of safety and required area are the same division read in the two directions a designer needs: how much margin an actual stress leaves, and how much area an allowable stress demands.

τ=V/A (single shear) τ=V/(2A) (double shear)
σ_b=P/A_b

Assumptions

Takes

SymbolUnitMeaning
PNForce applied along the member axis, or the single load in a standard case.
Am^2Cross-sectional area actually carrying the load.
VNInternal shear force at the cut.
A_bm^2Projected contact area over which one part presses on another.
LmLength of the member along its axis.
deltamChange in length of the member.
sigma_failPaStress at which the part is taken to have failed.
sigma_allowPaHighest normal stress permitted in service.

Gives

SymbolUnitMeaning
sigmaPaForce per unit area acting square to the cut.
tau_avgPaShear force spread evenly over the area it crosses.
sigma_bPaPressure between two parts pressed together.
epsilon1Change in length divided by the original length.
n_safety1How many times the applied action could be increased before failure.
A_reqm^2Smallest area that keeps the stress at or below what is allowed.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation throughout; nothing here iterates. Every quantity is one division, guarded so that a non-positive area returns a signalling not-a-number rather than the infinity the arithmetic alone would produce -- the two read the same to a human glancing at a screen, but only one of them is a value a later calculation can be trusted to propagate correctly. Factor of safety treats a working stress of exactly zero as an infinite margin rather than a division failure, since a member carrying no stress at all is, trivially, safe against any failure stress.

Limitations

Reading the result

The single-versus-double shear choice is the one place this simple a module still catches people, because the two answers differ by a factor of two and both look equally plausible on the screen. Double shear applies whenever the member being checked is sandwiched so that the load has two planes to cross -- a bolt through the middle plate of a three-plate lap joint is the standard picture -- and single shear whenever it has only one. The bearing stress reported alongside is a different quantity again, checking a different failure mode (crushing the hole wall) from either shear case (cutting the fastener), and a joint is only as strong as whichever of the modes its weakest dimension governs.

Implemented by kernel.axial.normal_stress, kernel.axial.average_shear_stress, kernel.axial.bearing_stress, kernel.axial.normal_strain, kernel.axial.factor_of_safety, kernel.axial.required_area.

M02   Elastic Constants core

Any two of E, G, K and nu fix the other two. Six inversion paths that must all agree.

G=E/(2(1+ν)) K=E/(3(1-2ν)) e_v=((1-2ν)/E)(σ_x+σ_y+σ_z)

Basis

An isotropic linear-elastic material has exactly two independent elastic constants, not four. Young's modulus, the shear modulus, the bulk modulus and Poisson's ratio are four names in common use, but any two of them fix the other two, because all four are different combinations of the same underlying pair (equivalently, the two Lame parameters). The module exists to carry that fact through arithmetic rather than to state it: whichever two a reader has to hand, the other two follow, and asking the same question a second way -- ten more different two-constant starting points, in principle -- has to land back on the same third and fourth constant every time.

Derivation

The shear modulus and bulk modulus each follow from Young's modulus and Poisson's ratio by the standard isotropic relations, and the reverse directions -- Poisson's ratio from Young's modulus and the shear modulus, Young's modulus from the bulk and shear moduli -- invert those same two relations rather than approximating them. Because six ordered pairs can be chosen from four constants, this module exposes six such paths rather than one, and the closing identity that matters is not any single formula but that every path which should reach the same third constant does: compute the shear modulus from Young's modulus and Poisson's ratio, then recover Poisson's ratio from Young's modulus and that shear modulus, and the original input must come back unchanged.

The bulk modulus is where this module's real content lives, because its formula divides by 1 - 2*nu and that quantity is small exactly at the input a reader is most likely to try: an incompressible or nearly incompressible material, such as rubber near nu = 0.5. The division itself is not the problem -- a bulk modulus that grows without bound as a material becomes incompressible is the correct physical answer, since an incompressible material needs infinite pressure to change its volume by any amount at all. The problem is arithmetic: recovering 1 - 2*nu by subtracting 2*nu from one, when nu is itself a value like 0.4999 entered by a reader, throws away digits before the division that uses it even begins. The dilatation (fractional volume change under a general three-axis stress state) carries the same factor for the same reason, since it is built from the same compressibility term multiplying the sum of the three normal stresses.

λ=Eν/((1+ν)(1-2ν))
e_v=(1-2ν) (σ_x+σ_y+σ_z)/E

Assumptions

Takes

SymbolUnitMeaning
EPaStiffness in simple tension: stress divided by strain while the response is still straight.
nu1How much the material narrows sideways per unit of stretch along the pull.
GPaStiffness in shear: shear stress divided by the angle change it produces.
K_bulkPaResistance to uniform squeezing: pressure divided by fractional volume change.
sigma_xPaNormal stress on the face whose outward normal points along the first axis.
sigma_yPaNormal stress on the face whose normal points along the second axis.
sigma_zPaNormal stress on the face whose normal points along the third axis.

Gives

SymbolUnitMeaning
GPaStiffness in shear: shear stress divided by the angle change it produces.
K_bulkPaResistance to uniform squeezing: pressure divided by fractional volume change.
nu1How much the material narrows sideways per unit of stretch along the pull.
EPaStiffness in simple tension: stress divided by strain while the response is still straight.
e_vol1Fractional change in volume.
lambda_lamePaFirst of the two elastic parameters that state the three-dimensional relations most compactly.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Closed form throughout, but with one quantity treated as a first-class citizen rather than recomputed at every step: wherever a caller already has 1 - 2*nu to hand -- most usefully, computed once at higher precision than the nu it came from -- the bulk-modulus relation accepts it directly instead of subtracting it back out of a rounded Poisson's ratio a second time. The convenience form that takes nu alone still exists and pays the digits that subtraction costs; a warning appears above nu = 0.49, chosen so that the compressibility term still carries roughly eleven significant digits at that threshold and has visibly fewer beyond it.

Limitations

Reading the result

The identity worth checking by hand, because it is also the fastest way to catch a mistyped constant, is that all six routes through this module from any two starting constants land on the same other two -- there is no route that is more authoritative than another, so a discrepancy always means an input, not a formula, is wrong. A bulk modulus that reads as very large, or a warning about the incompressible limit, is telling a reader their Poisson's ratio is close to one half; it is not telling them anything is broken.

Warning. Approaching incompressibility: the bulk modulus is ill-conditioned and volumetric results lose precision.

Implemented by kernel.elastic.shear_modulus, kernel.elastic.bulk_modulus, kernel.elastic.compressibility_factor, kernel.elastic.bulk_modulus_from_compressibility, kernel.elastic.poisson_from_young_and_shear, kernel.elastic.young_from_bulk_and_shear, kernel.elastic.lame_first_parameter, kernel.elastic.dilatation.

M03   Stress-Strain Curve Reduction extended

Reduce a measured tensile curve to the numbers a designer quotes.

Not on a screen in this release. Every other relation in this manual takes a handful of numbers a reader can type or drag; this one takes a whole measured curve -- a file of stress and strain readings off a testing machine -- so the app would first need a way to read a reader's own data file, and reading files is the one input route this release does not have. That route is held back to a later version together with the rest of the file-handling work, and a screen that could only reduce curves the app had invented for itself would be worse than no screen at all. The relation, its kernel and its verification are complete and held to the same standard as everything else here, which is why it is written up in full rather than left out: what is missing is the way in, not the mechanics.
σₜᵣᵤₑ=σ(1+ε) εₜᵣᵤₑ= ln (1+ε) Uᵣ=σₚₗ²/(2E)

Basis

A tensile test produces a list of stress and strain readings, not a formula, and every quantity a designer eventually quotes from it -- a yield strength, a modulus, a measure of ductility -- is a specific way of reading that list rather than a fresh law of mechanics. This module is unlike every other one in this chapter in that its input is data rather than dimensions, and its answers can genuinely depend on how densely the test was sampled; that dependence is reported rather than hidden.

Derivation

Most of the quantities here are direct readings: the peak stress reached is the ultimate stress; the percentage change in gauge length or in cross- sectional area between the start and the end of the test are the elongation and reduction-of-area ductility measures; the modulus of resilience is the area under the straight part of the curve up to the proportional limit, which for a linear response reduces to the closed form sigma_pl^2 / (2E); the modulus of toughness is the area under the whole curve, found by the trapezium rule over the measured points because the curve between two readings is not otherwise known, and inventing a smoother shape for it would report a precision the test itself does not have.

Two quantities need more than a reading. The offset yield strength -- the stress at which a specified permanent set, conventionally 0.2 per cent, has accumulated -- is found by walking the recorded points for the interval where the curve first crosses a line of slope E offset along the strain axis by that amount, then interpolating linearly inside that interval, rather than by any closed form: there is no continuous function to search for a root of, only a table of measurements, and treating it as continuous would again overstate the test's own precision. The two elastic-modulus readings serve different purposes and are computed differently for that reason: the secant modulus is stress over strain at one point, useful anywhere on the curve including well past yield, while the initial Young's modulus is fitted by least squares, through the origin and restricted to the lower part of the curve, to the straight portion alone -- fitting through the knee would drag the reported stiffness down, and fitting with a free intercept would let the line absorb whatever small seating error the test rig itself introduced rather than reporting the material's own stiffness.

True stress and true strain restate the same test against the instantaneous area and instantaneous gauge length rather than the original ones. True strain in particular is not an approximation of engineering strain but its exact logarithmic counterpart, and the two must agree closely for the small strains most structural analysis actually uses.

σₜᵣᵤₑ=σ(1+ε) εₜᵣᵤₑ= ln (1+ε)
Uₜ=∫ σ dε (trapezium rule over the measured points)

Assumptions

Takes

SymbolUnitMeaning
curve_sigmaPaOrdered stress readings taken from one tensile test.
curve_epsilon1Strain readings matching those stresses.
offset1Permanent strain used to define yield when the curve has no distinct knee.
EPaStiffness in simple tension: stress divided by strain while the response is still straight.
sigma_plPaHighest stress for which stress and strain are still proportional.

Gives

SymbolUnitMeaning
sigma_y_offsetPaYield stress defined by offsetting a straight line of slope E along the strain axis.
U_rJ/m^3Work stored per unit volume up to the proportional limit; recovered fully on unloading.
U_tJ/m^3Total work per unit volume absorbed up to fracture.
sigma_truePaForce divided by the area at that instant rather than the original area.
epsilon_true1Strain accumulated by adding each increment against the current length.
pct_elong1Fraction of its gauge length the specimen stretched before breaking.
pct_area_red1Fraction of its area the specimen lost at the neck.
E_secantPaStress divided by strain at a point past the straight part of the curve.
E_tangentPaLocal slope of the stress-strain curve at a point past the straight part.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation and simple numerical procedures throughout: a trapezium- rule integral for the toughness, a least-squares line through the origin for the initial modulus restricted to points below a fraction of the peak stress, a straddling-interval search followed by linear interpolation for the offset yield. True strain is evaluated through log1p of the engineering strain rather than as log(1 + strain): at the small strains a stiff material reaches before yield -- a few parts in ten thousand -- the second form has already lost several digits of agreement with the engineering strain it is supposed to be a close cousin of.

Limitations

Reading the result

A modulus read off this module and a modulus quoted from a materials handbook can legitimately differ, because this one is a fit to whatever curve was actually supplied, sampled however densely that particular test happened to sample it, while a handbook value is usually itself an average over many specimens. The offset yield strength is not "the" yield strength in any absolute sense either; it is the strength at a chosen permanent-set convention, and changing the convention changes the number without either number being wrong.

Implemented by kernel.curve.true_stress, kernel.curve.true_strain, kernel.curve.percent_elongation, kernel.curve.percent_reduction_of_area, kernel.curve.modulus_of_resilience, kernel.curve.modulus_of_toughness, kernel.curve.secant_modulus, kernel.curve.tangent_modulus, kernel.curve.offset_yield, kernel.curve.young_modulus_from_curve.

M04   Stresses on an Inclined Section core

A bar pulled along one axis still carries shear on every other plane. The bridge to the transformation screens.

σ_θ=σ_x cos²θ τ_θ=-(1/2)σ_x sin 2θ

Basis

A bar loaded along its own axis is only simple to describe on the cross- section perpendicular to that axis. Cut it on any other plane and the same internal force has to be resolved into components normal and tangential to the new, inclined cut, and both components now carry stress -- including a shear stress on a member that, cut the obvious way, appeared to carry none at all.

Derivation

This is not a separate physical law from the general two-dimensional stress transformation used elsewhere in this app; it is that same transformation with the second normal stress and the shear stress on the reference face both set to zero, because a bar loaded only along its axis has nothing else to enter. The app computes it exactly that way -- by calling the general transformation kernel with those two terms zero -- rather than maintaining a second, superficially simpler formula that could drift out of step with the first. Writing the general result out for this special case gives a normal stress that varies as the cosine squared of the cut angle and a shear stress that varies as the sine of twice that angle, each scaled by the one nonzero input stress.

σ_θ=σ_x cos²θ
τ_θ=-(1/2)σ_x sin 2θ

Assumptions

Takes

SymbolUnitMeaning
sigma_xPaNormal stress on the face whose outward normal points along the first axis.
thetaradAngle through which an element or a cutting plane has been rotated.

Gives

SymbolUnitMeaning
sigma_thetaPaNormal stress on a plane cut at an angle across a bar in simple tension.
tau_thetaPaShear stress on a plane cut at an angle across a bar in simple tension.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation, and literally the same two functions the general plane- stress transformation module uses, called with the second normal stress and the shear stress both zero.

Limitations

Reading the result

The two identities worth checking by eye are also the two most useful facts about this screen: the normal stresses on any pair of cuts a quarter turn apart always add back up to the original axial stress, and the shear stress is largest -- and equal to exactly half the axial stress -- at forty-five degrees, which is why a ductile bar pulled in tension tends to slip along a cone at roughly that angle rather than pulling straight apart. Because this screen is mathematically nested inside the general plane-stress transformation elsewhere in the app, every number it shows can be cross-checked there by entering the same axial stress as the first normal stress and zero for the other two inputs.

Implemented by kernel.transform.normal_stress, kernel.transform.shear_stress.

M05   Strain Energy, Sudden and Impact Loading core

The same weight applied three ways gives three different stresses. Which way is a choice the user must make.

U=P²L/(2AE) nᵢₘₚ=1+√(1+2h/δₛₜ)

Basis

Work done on an elastic bar is stored, not lost, and for a linear-elastic member that stored energy is exactly the area under its own load-deflection line -- a triangle, so one half of load times deflection, which is the same statement as one half of stress times strain per unit volume. That single fact is enough to compare three different ways of applying the same final load, because energy conservation, not a separate formula for each case, is what connects them.

Derivation

For a load increased gradually from zero, the stored energy is the usual triangular area, and this is the baseline case: no amplification at all.

For the same load lowered onto the bar already at full value and then released -- applied suddenly rather than gradually -- the external work done as the bar stretches to its final deflection is the full load times that whole deflection, a rectangle rather than a triangle, twice the area of the gradual case for the same final deflection. Since the stored energy is still one half times stiffness times deflection squared regardless of how the load arrived, equating twice the gradual work to the same stored-energy formula forces the deflection under a suddenly applied load to be exactly twice the gradual, static deflection -- and because stress and deflection are both proportional to the same linear response, the stress doubles along with it. That factor of two is :func:sudden_load_factor, and it is a constant, not a computation: it follows from the ratio of a rectangle to a triangle of the same base and height, not from anything particular to the bar.

For a weight dropped from some height above the bar and caught by it, the same energy balance is extended one step further: the falling weight arrives with kinetic energy from the drop in addition to the work its own weight does over the final static deflection, and setting the sum of both equal to the stored elastic energy at the (now larger) peak deflection gives a quadratic in the deflection whose physically meaningful root is the closed form 1 + sqrt(1 + 2h/delta_static). Setting the drop height to zero in that closed form must recover the suddenly applied factor of exactly two, and does: the two derivations are two special cases of the same energy balance, and that limiting agreement is one of this module's own checked identities, not a coincidence stated after the fact.

U=P² L/(2AE) u=σ²/(2E)
nᵢₘₚ=1+√(1+2h/δₛₜ)

Assumptions

Takes

SymbolUnitMeaning
PNForce applied along the member axis, or the single load in a standard case.
LmLength of the member along its axis.
Am^2Cross-sectional area actually carrying the load.
EPaStiffness in simple tension: stress divided by strain while the response is still straight.
h_dropmHeight a weight falls through before it strikes.
delta_stmDeflection the same load would cause if it were lowered gently into place.

Gives

SymbolUnitMeaning
U_axialJWork stored in a bar stretched along its axis.
u_densityJ/m^3Work stored per unit volume.
n_impact1How many times larger the effect is than the same load applied gently.
sigma_impactPaPeak stress reached under a suddenly applied or dropped load.
delta_impactmPeak deflection reached under a suddenly applied or dropped load.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Closed form throughout, but the impact factor is evaluated as 1 plus a separately computed excess term rather than as the textbook expression written directly, because the interesting behaviour near a small drop height is in that excess and the textbook form loses it. sqrt(1 + x) - 1 cancels catastrophically as x (twice the drop height over the static deflection) approaches zero -- at x values small enough to matter, the naive subtraction can lose most or all of its significant digits, worse the smaller x gets. Rewritten as x / (sqrt(1+x) + 1), nothing is subtracted and nothing cancels, and the excess comes back accurate to full precision at any drop height, including zero. The peak deflection and peak stress under impact are then built from twice the static value plus that same excess term, with the factor of two written explicitly rather than recovered by subtracting one from a factor of two computed some other way -- getting that leading constant wrong is invisible at a large drop height and wrong by a factor of two at a zero drop, which is the case most likely to be tried first.

Limitations

Reading the result

The single fact worth remembering about this module is the ordering: a gradually applied load produces the least stress, an suddenly applied one exactly double that, and a dropped weight more still, growing without bound as the drop height grows -- so the everyday habit of estimating an impact load by simply doubling the static case is only exactly right at zero drop height, and increasingly unconservative as the height grows from there. The screen shows all three side by side for exactly this reason: the point is the comparison, not any one of the three numbers alone.

Implemented by kernel.axial.strain_energy_axial, kernel.axial.strain_energy_density, kernel.axial.impact_factor, kernel.axial.impact_factor_excess, kernel.axial.sudden_load_factor, kernel.axial.impact_deflection, kernel.axial.impact_stress.

M06   Elongation of Axially Loaded Members core

Four shapes of the same integral. Each degenerates into the prismatic case, and the degeneracy is where the arithmetic breaks.

δ=PL/(AE) δ_cone=4PL/(π E d_1 d_2) δ_wedge=PL ln (b_2/b_1)/(E t (b_2-b_1)) δ_self=γ L²/(2E)

Basis

The stretch of a prismatic bar under a constant axial force is the integral of strain over its length, and for a linear-elastic bar of constant section that integral collapses to the familiar PL/(AE). Every other case this module covers -- a bar that tapers, a bar hanging under its own weight, a bar built of several prismatic pieces end to end -- is the same integral carried out for a section, or a force, or both, that vary along the length, and each one is built to fall back onto the constant-section result the moment its own variation vanishes.

Derivation

A circular bar tapering linearly between two end diameters has an area that varies as the square of a linear function of position; carrying out integral of P dx / (A(x) E) for that area gives a closed form built from the product of the two end diameters, with no subtraction anywhere in it. A flat bar of constant thickness tapering linearly in width instead gives an area linear in position, and that integral produces a logarithm of the ratio of the two end widths -- which is exactly zero, divided by exactly zero, the moment the two widths are equal, since a prismatic bar is the untapered special case of the same integral.

A bar hanging under nothing but its own weight carries a force that varies linearly with position -- greatest at the point of support, zero at the free end -- rather than a constant force in a constant section, and integrating that varying internal force over the length in place of a constant one produces a stretch proportional to the square of the length rather than linear in it, with the material's own weight density standing in for an externally applied load.

A bar built of several prismatic segments end to end needs no new formula at all: each segment stretches by its own PL/(AE), using whatever force and section that particular segment carries, and the total stretch is the sum of the segments' individual stretches. The composition layer is what assembles that sum; the underlying relation is unchanged from the single-segment case.

δ_cone=4PL/(π E d_1 d_2)
δ_wedge=PL ln (b_2/b_1)/(E t (b_2-b_1))
δ_self=γ L²/(2E)

Assumptions

Takes

SymbolUnitMeaning
PNForce applied along the member axis, or the single load in a standard case.
LmLength of the member along its axis.
Am^2Cross-sectional area actually carrying the load.
EPaStiffness in simple tension: stress divided by strain while the response is still straight.
d1mDiameter at one end of a round bar that tapers.
d2mDiameter at the other end of a round bar that tapers.
b1mWidth at one end of a bar that tapers in width.
b2mWidth at the other end of a bar that tapers in width.
t_thkmConstant thickness of a flat bar that tapers only in width.
gamma_wtN/m^3Weight of the material per unit volume.
segments1List of prismatic pieces making up a stepped member.

Gives

SymbolUnitMeaning
deltamChange in length of the member.
delta_conemStretch of a bar whose round section tapers along its length.
delta_wedgemStretch of a flat bar whose width tapers along its length.
delta_selfmStretch a hanging bar suffers under nothing but its own weight.
k_axialN/mForce needed per unit stretch.
delta_steppedmTotal stretch of a bar made of several prismatic pieces.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Closed form for a single member of any of the four shapes; a plain summation for a bar of several segments, using the same summation the rest of this app uses for order-independent totals so that the stretch of a stepped bar does not depend on which order its segments happen to be listed in. The tapered- width formula is evaluated through log1p of the ratio of the difference in end widths to the smaller of the two, not as ln(b2/b1) directly: at widths close enough together to be worth calling "the same," the direct form divides a number near zero by another number near zero, while the rewritten form has a well-behaved limit and returns the exact prismatic result the moment the two widths agree exactly, rather than a numerically noisy near-answer approaching it. The tapered-diameter formula needs no equivalent rewrite: written as a product of the two diameters rather than as a difference of anything, it has nothing to cancel and reduces to the prismatic case continuously on its own.

Limitations

Reading the result

Every closed-form shape in this module is built to converge on the same plain PL/(AE) as its taper vanishes, and that is the fastest sanity check available on screen: setting the two end dimensions equal on either tapered case should reproduce the prismatic answer computed from the same load, length, end area and modulus, to within the last few digits a floating-point division can hold. A result that does not close that loop signals a typo in the inputs -- most often the two end dimensions swapped -- well before it signals anything wrong with the module itself.

Implemented by kernel.axial.elongation_uniform, kernel.axial.elongation_tapered_circular, kernel.axial.elongation_tapered_rectangular, kernel.axial.elongation_self_weight, kernel.axial.axial_stiffness, composition.axial.elongation_stepped.

M07   Statically Indeterminate Axial Members core

Equilibrium alone is not enough; compatibility supplies the missing equation.

δ₁=δ₂ and P₁+P₂=P ⟹ σ₁/E₁=σ₂/E₂, σ₁A₁+σ₂A₂=P

Basis

Two members that are constrained to stretch by exactly the same amount -- because they are fastened together at both ends, or because one is a rod running through the axis of a tube of a different material -- cannot each be found from equilibrium alone. Equilibrium supplies one equation (the two member forces sum to the applied load); compatibility supplies the second (the two members share a single, common elongation), and it is compatibility that turns an otherwise indeterminate problem into a determinate one.

Derivation

Writing each member's stretch as its own force times its own length over its own area and modulus, and setting the two stretches equal, gives a proportion between the two forces that depends only on each member's axial stiffness -- area times modulus over length. Combined with the equilibrium condition that the two forces sum to the applied load, that proportion gives each member's share of the load directly, in closed form, as that member's own stiffness over the combined stiffness of both: the stiffer member simply takes the larger fraction of the load, in exact proportion to how much stiffer it is.

This is a different combination from two members joined end to end (chained in series, covered by the equivalent stiffness elsewhere in this chapter, where flexibilities add) -- here the members act side by side and share one displacement, so stiffnesses add instead. The distinction is not a fine point: for one worked configuration the two combination rules differ by a factor of six and a half on the same numbers, and this module's own history includes a period where the specification pointed at the wrong one of the two before an interface had to actually display a number and the disagreement became visible. The self-check that tells the two apart is to verify, for whichever combined stiffness is used, that the whole assembly shortens by the applied load over that stiffness, and that each member's own share divided by its own stiffness reproduces that same shortening -- only the side-by-side, stiffness-adding combination satisfies that for both members simultaneously.

Stress in either member follows immediately once its share of the load is known, divided by that member's own area; the module computes it directly from the stiffness ratio rather than from the load share divided by the area a second time, so that a small area appears once in the calculation rather than twice.

δ₁=δ₂, P₁+P₂=P
P₁/P=A₁E₁/(A₁E₁+A₂E₂)

Assumptions

Takes

SymbolUnitMeaning
PNForce applied along the member axis, or the single load in a standard case.
A1m^2Area of the first element in a two-element assembly.
A2m^2Area of the second element in a two-element assembly.
E1_matPaStiffness of the first material in a two-material assembly.
E2_matPaStiffness of the second material.
LmLength of the member along its axis.

Gives

SymbolUnitMeaning
P1NShare of the load carried by the first element.
P2NShare carried by the second element.
sigma_1mPaStress in the first material of a composite member.
sigma_2mPaStress in the second material of a composite member.
k_axialN/mForce needed per unit stretch.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Closed form: a single division for each member's load share, and one further division for its stress. No root-finding or iteration is involved, unlike the indeterminate-beam case elsewhere in this app, because the two governing equations here are already linear in the two unknown forces.

Limitations

Reading the result

The one identity that catches almost every mistake in this module by hand is that the two reported forces must sum back to the applied load, with the residual at the level of floating-point noise rather than a visible fraction of the load -- if they do not, an input was typed into the wrong member's field. The physically intuitive check beside it is that the stiffer of the two members -- larger area, larger modulus, or both -- always takes the larger share, never the smaller: a rigid core surrounded by a soft sleeve carries nearly all of the load, not nearly none of it.

Implemented by kernel.axial.composite_share, kernel.axial.composite_bar_stress, kernel.axial.parallel_stiffness.

M08   Thermal Stress and Misfit core

A bar that cannot expand carries stress with no load on it at all.

δ_T=α Δ T L σ_restrained=-E α Δ T σ_gap=-E(αΔ T L-g)/L

Basis

A temperature change produces a strain in an unrestrained bar with no stress attached to it at all -- the bar simply gets longer or shorter, freely, and carries no internal force while it does. Stress appears only once something stops that free change from happening, and how much stress appears depends entirely on how completely the change is stopped.

Derivation

An unrestrained bar's thermal strain is the material's coefficient of expansion times the temperature change, by definition, and its elongation is that strain times the original length -- carrying no load, so this much needs no elasticity at all.

A bar fully restrained at both ends cannot elongate; whatever length change the temperature would otherwise have produced must instead appear as compressive or tensile strain held in by the restraint, and by Hooke's law that strain corresponds to a stress of -E times the coefficient of expansion times the temperature change -- carrying the load a real restraint would have to supply, but with no external force having been applied at all.

A bar restrained only after crossing a clearance gap combines both pictures in sequence: the bar is free until its unrestrained thermal elongation would exceed the gap, at which point it touches its restraint and only the excess beyond the gap is prevented, so the fully restrained formula applies to that excess elongation rather than to the whole of it. Setting the gap to zero must recover the fully restrained case exactly, and does, because a zero gap is the fully restrained case with no free travel subtracted from it first.

ε_T=α Δ T σ_restrained=-E α Δ T
σ_gap=-E(αΔ T L-g)/L once the gap has closed

Assumptions

Takes

SymbolUnitMeaning
alpha_th1/KFractional change in length per degree of temperature change.
dTKTemperature change, taken as positive for heating.
LmLength of the member along its axis.
EPaStiffness in simple tension: stress divided by strain while the response is still straight.
gapmFree clearance a bar can take up before it meets its restraint.

Gives

SymbolUnitMeaning
epsilon_th1Strain the material would take up freely on a temperature change.
delta_thmFree length change a temperature change would produce if nothing resisted it.
sigma_thPaStress caused purely by preventing free thermal movement.
sigma_th_gapPaThermal stress once the bar has closed a clearance and met its restraint.
gap_closed1Whether the bar has taken up its clearance and begun to carry stress.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation for all three cases, with the gap case implemented as a single continuous function of the free (unrestrained) elongation compared against the gap: below the gap the function returns exactly zero stress, not an asymptotically small one, because a bar that has not yet touched its restraint genuinely carries none. A companion function reports the temperature change at which the gap closes exactly, and a decision function in the interface layer states in words which of the three regimes -- free, approaching the gap, or restrained -- currently applies, so that the case governing a given input is never left for the reader to infer silently from a number alone.

Limitations

Reading the result

The detail most worth watching on this screen is the gap, because it is the one place a continuously varying input produces a genuinely discontinuous change in behaviour: below the closing temperature the stress reads exactly zero no matter how close the bar is to touching, and above it the stress begins climbing at the full restrained rate with no transition in between. Reading a small but nonzero stress just below the closing point is a sign of an input error, not of the restraint beginning to engage gradually -- this module has no partial-engagement regime.

Implemented by kernel.axial.thermal_strain, kernel.axial.thermal_elongation, kernel.axial.thermal_stress_restrained, kernel.axial.thermal_stress_with_gap, kernel.axial.gap_closes_at, ui.decisions.thermal_gap_state.

M09   Stress Concentration Factors core

A geometric discontinuity multiplies the nominal stress. Two shapes have exact closed forms; the chart families do not, and are not guessed at.

σ_θ(a,θ)=σ(1-2 cos 2θ) K_t=3 K_t=1+2a/b=1+2√(a/ρ)

Basis

A hole in an otherwise uniformly stressed plate disturbs the stress field around it, and for two particular hole shapes under uniaxial tension that disturbed field has an exact closed-form solution rather than needing a numerical or experimental answer: a circular hole (Kirsch's solution) and, more generally, an elliptical one of any aspect ratio (Inglis's extension of it), of which the circle is the special case where the two axes are equal.

Derivation

Kirsch's solution gives the complete stress field around a circular hole in a wide plate under uniaxial tension; evaluated on the edge of the hole itself it collapses to a function of the single angle measured from the loading direction. That edge function is the primitive this module actually implements, rather than the peak concentration factor of three being written down as a constant on its own: reading the function's maximum, which occurs across the load direction, is what produces the familiar factor of three, and reading it along the load direction instead produces minus one -- a compressive stress on the same hole edge, in a plate that is nominally all tension, which is why a hole in a tension field can start a crack running perpendicular to what intuition would suggest. Deriving the factor of three from the field rather than stating it separately means the two numbers can never disagree with each other, because they are one function read at two angles.

The elliptical case (Inglis) generalises the same picture to a hole stretched either across or along the load, with a peak factor at the ends of the axis across the load equal to one plus twice the ratio of that across-axis semi-length to the along-axis one. An equal-length special case of that ratio is exactly one, giving back Kirsch's factor of three, so the elliptical and circular results meet exactly where the ellipse becomes a circle. The same factor can equivalently be written using the radius of curvature at the tip of the ellipse instead of the two semi-axis lengths directly -- a natural substitution because a very elongated ellipse behaves, near its tip, like a notch with that tip radius -- and the module offers both forms because different problems supply different starting information, checking that the two forms of the same factor agree being one of its own tests.

σ_θ(a,θ)=σ (1-2 cos 2θ)
Kₜ=1+2a/b=1+2√(a/ρ)

Assumptions

Takes

SymbolUnitMeaning
sigma_nomPaStress worked out ignoring the local geometric disturbance.
thetaradAngle through which an element or a cutting plane has been rotated.
a_ellmHalf-width of an elliptical hole measured across the load direction.
b_ellmHalf-width of an elliptical hole measured along the load direction.
rho_tipmTip radius of an elliptical hole: how sharply the hole turns at the end of the axis across the load. A crack is this radius going to zero.

Gives

SymbolUnitMeaning
K_t_hole1Concentration factor for a small round hole in a wide plate.
K_t_min1The smallest hoop stress on a hole's edge, as a multiple of the applied tension. It is negative: the edge is in compression along the load even though the plate is pulled.
K_t_ellipse1Concentration factor for an elliptical hole, sharper as the ellipse flattens.
K_t1How many times the local stress exceeds the nominal stress at a geometric disturbance.
rho_tipmTip radius of an elliptical hole: how sharply the hole turns at the end of the axis across the load. A crack is this radius going to zero.
sigma_maxPaLargest normal stress present.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Closed form throughout, evaluated directly with no iteration. The peak-stress function refuses a concentration factor below one, because a factor that reduces the nominal stress is not a stress concentration and the ordinary way to produce one by mistake is to enter the two elliptical semi-axes in the wrong order -- swapping which one is measured across the load and which along it turns a stress raiser into an apparent stress reliever, and the guard catches that rather than reporting the swapped answer as though it were legitimate.

Limitations

Reading the result

The comparison worth making on this screen is between the two hole shapes at equal area rather than at equal size in one direction: a hole elongated across the load direction concentrates stress far more than a round hole of the same area, while one elongated along the load concentrates it less -- which is exactly why a slot is normally oriented running along a loaded member rather than across it, and why the same elliptical hole rotated ninety degrees is a materially different design decision rather than a cosmetic one.

Implemented by kernel.concentration.hole_edge_hoop_stress, kernel.concentration.circular_hole_factor, kernel.concentration.circular_hole_minimum_factor, kernel.concentration.elliptical_hole_factor, kernel.concentration.elliptical_hole_factor_from_tip, kernel.concentration.ellipse_tip_radius, kernel.concentration.peak_stress.

Torsion and Springs

M10   Torsion of Circular Shafts core

Shear grows linearly from the axis. Everything else on this screen follows from that one fact.

τ=Tρ/J J_solid=π c⁴/2 J_tube=(π/2)(c_o⁴-c_i⁴) φ=TL/(JG)

Basis

A circular shaft is the one cross-section for which the assumption behind elementary torsion theory -- that a plane section stays plane and merely rotates rigidly about the shaft's axis -- is exactly true rather than approximately so, because the circular symmetry of the section matches the circular symmetry of the twist. Every other shape in this chapter warps out of its own plane under torque; the circle alone does not, and that is the entire reason its shear stress is linear in radius while every other shape needs either a series or an approximation.

Derivation

Because a radius stays straight and merely rotates, the shear strain at any point is directly proportional to its distance from the axis -- twice as far out, twice the strain -- and for a linear-elastic material the shear stress follows the same proportion. Requiring that the moment of this stress distribution about the axis equal the applied torque fixes the constant of proportionality: the stress at any radius is the torque times that radius, divided by the polar second moment of area, which is the same integral that turns the assumed linear distribution back into a moment. The angle of twist per unit length follows from the same shear-strain proportionality read the other way, integrated along the shaft's length under a constant torque.

A hollow shaft needs no new derivation, only the same integral carried out over an annulus instead of a full disc, which is why its polar second moment is the solid value for the outer radius less the solid value for the bore -- one subtraction, and the two closed forms share the same underlying function.

J_solid=π c⁴/2 J_tube=(π/2)(c_o⁴-c_i⁴)
φ=TL/(JG)

Assumptions

Takes

SymbolUnitMeaning
T_torqueN*mTwisting moment about the member axis.
rho_radmRadius of the particular point being examined.
c_outmOuter radius of a shaft.
c_inmInner radius of a hollow shaft.
LmLength of the member along its axis.
GPaStiffness in shear: shear stress divided by the angle change it produces.
tau_allowPaHighest shear stress permitted in service.

Gives

SymbolUnitMeaning
J_polarm^4Polar second moment of a round section; sets both twist and shear stress.
tau_torsionPaShear stress produced by twisting.
phi_twistradAngle one end of a shaft rotates relative to the other.
Zpm^3Polar section modulus: polar second moment divided by the outer radius.
GJN*m^2Torsional rigidity: the torque needed per unit twist per unit length.
T_allowN*mLargest torque the shaft may carry at the allowable shear stress.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation throughout, entirely closed form. The polar second moment is computed once and reused by every other function that needs it, so the same quantity is never recovered from raw dimensions twice with two chances to disagree. The stress at an arbitrary radius, not merely at the outer surface, is a first-class input: for a hollow shaft the bore does not carry zero stress, and a reader who only sees the peak value could easily assume otherwise.

Limitations

Reading the result

The two checks worth making by eye are that the stress is exactly zero on the axis of a solid shaft -- the one place a circular shaft carries no shear at all -- and, for a hollow one, that the bore stress is not zero: it scales with the bore radius exactly the way the outer-surface stress scales with the outer radius, from the same linear distribution. As the bore approaches the outer radius, the same shaft is approaching the thin tube treated elsewhere in this chapter, and the two results have to meet in that limit -- a solid check that the general shaft formula and the thin-wall approximation are not two disconnected ideas but one physical picture seen two ways.

Implemented by kernel.torsion.polar_second_moment_solid, kernel.torsion.polar_second_moment_hollow, kernel.torsion.shear_stress, kernel.torsion.angle_of_twist, kernel.torsion.polar_section_modulus, kernel.torsion.torsional_rigidity, kernel.torsion.allowable_torque.

M11   Power Transmission and Shaft Sizing core

Rated power and speed give the torque; the allowable shear gives the diameter.

P_w=Tω=2π f T d=(16T/(πτ_allow))^(1/3)

Basis

Power is the rate of doing work, and for a rotating shaft that rate is torque times angular speed. A shaft delivering a specified power at a specified speed is therefore carrying a torque fixed by that one relation, and once the torque is known, sizing the shaft is an ordinary allowable-stress design problem read backwards through the circular-shaft formula elsewhere in this chapter.

Derivation

Power equals torque times angular speed, and angular speed is two pi times the rotational frequency, so the torque a shaft carries is the power divided by two pi times the frequency -- a direct rearrangement, not a separate physical law from the power-torque relation itself.

Sizing a solid shaft against an allowable shear stress inverts the ordinary circular-shaft stress formula: since the maximum stress on a solid shaft is sixteen times the torque over pi times the diameter cubed, solving that relation for the diameter gives a required diameter as the cube root of sixteen torque over pi times the allowable stress. A hollow shaft with a fixed ratio between its bore and its outer diameter needs the same inversion, but the polar section modulus now carries a factor that depends on that fixed ratio rather than being an unknown cubed on its own; the result is the same cube-root form multiplied by a correction that reduces to one, and to the solid-shaft diameter, exactly when the bore ratio is zero.

T=P_w/ω=P_w/(2π f)
d=(16T/(πτ_allow))^(1/3)

Assumptions

Takes

SymbolUnitMeaning
power_wWRate at which the shaft transmits work.
freq_hzHzRotations per second.
omegarad/sRotation rate in radians per second.
tau_allowPaHighest shear stress permitted in service.
bore_ratio1Bore diameter divided by outer diameter.

Gives

SymbolUnitMeaning
T_torqueN*mTwisting moment about the member axis.
power_wWRate at which the shaft transmits work.
d_reqmSmallest diameter that satisfies the governing allowable stress.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Closed form throughout; sizing a shaft is a single cube root, not a search, because the underlying stress relation is a direct proportionality that inverts cleanly. Torque is rejected as undefined at zero rotational speed rather than reported as an infinite value, because a shaft "delivering power at standstill" is not a state a finite torque can describe.

Limitations

Reading the result

The self-consistency check available on this screen is to size a shaft against an allowable stress and then feed that diameter back into the circular-shaft stress formula: the resulting stress must land exactly on the allowable value used to size it, because sizing is that same formula solved for the one dimension left unknown, run in reverse. Required diameter grows only as the cube root of the torque, which is why a shaft carrying twice the torque of another needs a diameter only about twenty-six per cent larger, not twice as large -- a detail worth having in mind before doubling a shaft's size out of caution.

Implemented by kernel.torsion.torque_from_power, kernel.torsion.power_from_torque, kernel.torsion.required_diameter_solid, kernel.torsion.required_diameter_hollow.

M12   Nonuniform and Indeterminate Torsion core

Shafts in series share the torque; shafts in parallel share the angle.

φ=Σᵢ Tᵢ Lᵢ/(Jᵢ Gᵢ) series: T common parallel: φ common

Basis

Three distinct situations share this module because they share one method: none of them needs a new relation for the torque-twist behaviour of a single prismatic length, only a decision about how several such lengths are combined -- end to end and each carrying whatever torque equilibrium assigns it, side by side and forced to twist together, or built in at both ends so that compatibility, not equilibrium alone, decides how the torque splits.

Derivation

Shafts in series -- a stepped shaft, or several distinct lengths keyed together end to end -- each twist by their own TL/(GJ) under whatever torque is applied to that particular length, and the twists simply add, because the far end's rotation is the sum of every span's individual contribution ahead of it. Where a span is driven in the opposite sense to its neighbour, its contribution to the sum carries the opposite sign, so a shaft that is twisted one way over part of its length and the other way over the rest can end with a smaller total twist than either part alone would show -- exactly the case a naive magnitude-only sum would get wrong.

Shafts in parallel -- two tubes on a common axis, keyed together at both ends so they are forced to twist through the same angle -- divide the applied torque in proportion to their torsional rigidities, by the same compatibility argument used for two axially loaded members sharing one elongation elsewhere in this app: equal twist plus torques summing to the total gives each shaft's share as its own rigidity over the combined rigidity of both.

A shaft built in at both ends with a single torque applied somewhere along its length is statically indeterminate: equilibrium supplies one equation relating the two end reactions to the applied torque, and compatibility supplies the second, because the two portions either side of where the torque is applied must twist by the same angle in opposite senses to keep both ends fixed. Solving those two conditions together gives each end's reaction torque in proportion to the stiffness of the portion nearer the other end, not simply in proportion to distance -- with equal rigidity on both portions this reduces to the torque splitting in proportion to the two lengths, but a step in the shaft's diameter partway along changes that split by more than a passing glance at the geometry would suggest.

φ=Σᵢ Tᵢ Lᵢ/(Jᵢ Gᵢ) (series, torque in each span given)
T_a/T=(GJ)_a/((GJ)_a+(GJ)_b) (parallel, common twist)

Assumptions

Takes

SymbolUnitMeaning
segments1List of prismatic pieces making up a stepped member.
T_torqueN*mTwisting moment about the member axis.
LmLength of the member along its axis.

Gives

SymbolUnitMeaning
phi_twistradAngle one end of a shaft rotates relative to the other.
T_splitN*mShare of the torque taken by one shaft of a parallel pair.
T_reactionN*mTorque supplied by a fixed end.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

The series case is a plain summation across spans, ordered the same magnitude-stable way this app sums every other multi-segment quantity, so the total twist does not depend on which end a list of spans happens to start from. The parallel split and the fixed-fixed reactions are both closed-form ratios of stiffnesses rather than anything iterative -- two linear equations in two unknowns, solved directly rather than searched for. Both solve-layer functions signal an impossible configuration -- a torque applied outside the shaft's own span, or a portion with no rigidity at all -- by refusing outright rather than returning a number with no physical reading, which is a different discipline from the kernel layer immediately below: refusing outright is appropriate here because a caller that asked for the reactions of a shaft that cannot exist has made a request with no answer, not merely supplied an input at the edge of a valid range.

Limitations

Reading the result

The fixed-fixed reactions are the case most likely to surprise a reader who expects the split to follow the geometry alone: with a step in the shaft's rigidity between the two portions, the reaction at the stiffer side's own end is larger, in the same way that the stiffer of two axially loaded members takes the larger share of a shared load elsewhere in this app -- the governing quantity is stiffness, not distance, and the two coincide only when the shaft's rigidity happens to be the same on both sides of the applied torque.

Implemented by composition.torsion.angle_of_twist_stepped, solve.torsion.parallel_torque_split, solve.torsion.fixed_fixed_reactions.

M13   Torsion of Noncircular Prismatic Shafts core

Plane sections no longer stay plane. Two tabulated coefficients carry all the geometry.

τₘₐₓ=T/(α a b²) φ=TL/(β a b³ G) α,β=f(a/b)

Basis

Away from a circular cross-section, a plane section under torsion does not stay plane: it warps out of its own plane, and the amount of warping varies across the section, which is why the polar second moment that governs a circular shaft has no counterpart with an equally simple definition here. Saint-Venant's warping solution for the rectangle is exact -- an infinite series, not an approximation -- and two closed forms (the ellipse and the equilateral triangle) solve the same warping problem for shapes simple enough that the series collapses to elementary functions.

Derivation

The rectangle's twist coefficient and stress coefficient both come from the same warping-function series, expressed as a correction to the narrow-strip result that governs as the rectangle becomes very long and thin: the twist coefficient starts at one third for an infinitely long thin strip and is reduced by a term built from a rapidly converging sum over odd harmonics of a hyperbolic tangent, and the stress coefficient is that same twist coefficient divided by a related correction built from a hyperbolic secant sum. Both sums are evaluated directly rather than looked up, because the values printed in any table are three or four significant figures read off this same series at a handful of aspect ratios -- the series is the source, and a table is a compressed, lossy copy of it that also cannot answer for an aspect ratio between the tabulated ones.

Two shapes need no series at all because their warping function has a closed elementary form: the ellipse and the equilateral triangle. The ellipse's closed form is worth stating alongside the rectangle because, taken to the limit of equal axes, it reduces exactly to the ordinary circular-shaft torsion constant -- the one place in this chapter that an exact noncircular result and the elementary circular one are required to meet exactly rather than merely approximately, since a circle is an ellipse with equal axes and nothing about the physics changes at that special ratio.

τₘₐₓ=T/(α a b²) φ=TL/(β a b³ G)
J_ellipse=π a³b³/(a²+b²) J_triangle=\sqrt3/80 a⁴

Assumptions

Takes

SymbolUnitMeaning
T_torqueN*mTwisting moment about the member axis.
a_longmLonger side of a rectangular shaft section.
b_shortmShorter side of a rectangular shaft section.
LmLength of the member along its axis.
GPaStiffness in shear: shear stress divided by the angle change it produces.

Gives

SymbolUnitMeaning
alpha_rect1Tabulated coefficient fixing the peak shear stress in a rectangular shaft.
beta_rect1Tabulated coefficient fixing the twist of a rectangular shaft.
tau_torsionPaShear stress produced by twisting.
phi_twistradAngle one end of a shaft rotates relative to the other.
J_effm^4Effective torsion constant of a solid non-circular section.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

The rectangle's two coefficients are evaluated by direct summation of the two convergent warping series to double-precision accuracy, term by term, stopping once a term no longer changes the running total -- typically well under the two hundred terms allotted, since both series converge rapidly. Each series is rewritten around its own limiting behaviour rather than summed as printed: the twist-coefficient series is summed on the complement of its hyperbolic tangent term, because the tangent itself tends to one and summing the raw series would need thousands of terms to reach the same precision that summing its complement -- which decays exponentially rather than as an inverse fifth power -- reaches in a handful. A related precision detail governs how the series' own constants are computed: pi to the fifth power is formed by repeated multiplication rather than by a general power function, because the two are not guaranteed to agree in their last bit across languages, and this app's cross-language conformance checking compares every value to the bit. The ellipse and triangle need no series at all and are evaluated as the closed forms they are.

Limitations

Reading the result

The habit most worth unlearning on this screen is looking for the peak stress at a corner: for every shape this module covers, the corners carry no shear stress at all, and the maximum sits at the middle of the longest straight edge instead. The two tabulated coefficients converge to the same one-third limit as the rectangle becomes a long thin strip, which is also where this module's exact series meets the approximate open-thin-wall formula used for built-up sections elsewhere in this chapter -- a long, narrow rectangle is the shared limit both approaches are built around, from two different directions.

Warning. Outside the tabulated aspect-ratio range; no extrapolation is performed.

Implemented by kernel.noncircular.rectangle_beta, kernel.noncircular.rectangle_alpha, kernel.noncircular.rectangle_torsion_constant, kernel.noncircular.rectangle_max_shear, kernel.noncircular.rectangle_twist, kernel.noncircular.ellipse_torsion_constant, kernel.noncircular.ellipse_max_shear, kernel.noncircular.equilateral_triangle_torsion_constant, kernel.noncircular.equilateral_triangle_max_shear.

M14   Thin-Walled Closed Tubes core

Shear flow is constant around a closed loop, whatever the wall does.

τ=T/(2tAₘ) q=τ t=T/(2Aₘ) φ=(TL/(4Aₘ²G))∮ds/t

Basis

For a thin-walled tube closed all the way around, equilibrium alone -- without needing to know anything about how the material deforms -- requires the shear flow (shear stress times wall thickness) to be the same at every station around the loop: cut a short length of wall out at two stations and the difference between the shear flowing in at one and out at the other would have to be balanced by a stress gradient along the tube's axis that a uniform torque does not supply. Bredt's formula is that equilibrium statement, not a separate assumption about the material.

Derivation

Because the shear flow is constant around the loop, the torque it produces about any convenient point is that constant flow times twice the area enclosed by the wall's own mid-line -- a geometric fact about a closed curve, independent of the curve's shape -- which inverts directly to give the shear flow, and hence the shear stress at any station, as the torque over twice the enclosed area times that station's own local thickness. Where the wall's thickness varies around the loop, the stress varies inversely with it at each station even though the flow itself does not.

The angle of twist follows from equating the strain energy stored in the twisted tube to the work the torque does over that twist, using the shear-stress distribution just derived: carrying out that energy balance produces a formula built from a line integral of the reciprocal wall thickness around the whole loop, which collapses to a plain ratio of perimeter to thickness for a tube of constant wall thickness.

τ=T/(2tAₘ) q=τ t=T/(2Aₘ)
φ=(TL/(4Aₘ²G))∮ds/t

Assumptions

Takes

SymbolUnitMeaning
T_torqueN*mTwisting moment about the member axis.
t_wallmWall thickness of a tube or shell.
A_medianm^2Area enclosed by the line running along the middle of a tube wall.
perimeter_mmLength once around the mid-line of a tube wall.
LmLength of the member along its axis.
GPaStiffness in shear: shear stress divided by the angle change it produces.

Gives

SymbolUnitMeaning
tau_torsionPaShear stress produced by twisting.
q_flowN/mShear force transferred per unit length along the member.
phi_twistradAngle one end of a shaft rotates relative to the other.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation, closed form. The one place this module's own applicable range is worth stating out loud rather than assumed is the thin-wall limit itself: as the wall thickness grows relative to the tube's radius, the mid-line area becomes a worse and worse stand-in for the true enclosed region, and the applicability guard on this module's screen exists for exactly that reason -- flagged, not blocked, because the calculation is still well-defined past that point, only decreasingly accurate.

Limitations

Reading the result

The two facts worth checking against each other on this screen are that a thin circular tube evaluated here has to agree, to first order in the ratio of wall thickness to radius, with the exact solid or hollow circular-shaft result elsewhere in this chapter -- two derivations that share essentially no algebra, meeting at the same answer in the limit where both apply, which is one of the sturdiest checks available anywhere in this app precisely because the two paths to it are so different. The other is the shear flow itself, which by construction is identical at every station around the loop regardless of how the wall's thickness varies -- so a wall that thins out on one side does not carry less shear flow there, it carries a higher shear stress at the same flow, concentrated exactly where the material is thinnest.

Warning. The constant-shear-flow assumption degrades once the wall is this thick relative to the radius.

Implemented by kernel.torsion.bredt_shear_stress, kernel.torsion.bredt_shear_flow, kernel.torsion.bredt_angle_of_twist.

M15   Thin-Walled Open Sections in Torsion core

One slit along the length removes almost all the torsional stiffness. The comparison is the lesson.

J≈(1/3)Σᵢ bᵢ tᵢ³ τₘₐₓ=3T/(Σ bᵢ tᵢ²)

Basis

A thin-walled open section -- the same tube as the previous module, but slit along its entire length, or any section built from thin flat strips meeting along their edges rather than closed into a loop -- carries torque almost entirely by warping rather than by the closed-loop shear flow that governs a closed section, because a slit tube has nowhere for a continuous flow to run uninterrupted around. Its torsional stiffness is built up as a sum of narrow rectangular strips, each contributing the same one-third coefficient that governs an isolated long thin rectangle.

Derivation

Each strip of the open section is treated as a very long, thin rectangle in its own right, for which the exact Saint-Venant series elsewhere in this chapter has already been shown to converge to a torsion constant of one third of the strip's own length times its thickness cubed as the strip becomes long and thin -- exactly the regime every wall segment of an open thin-walled section is in. Summing that one-third contribution over every strip making up the section gives the whole section's torsion constant, and the peak shear stress follows by the same reasoning applied to whichever strip is thickest, since stress in this approximation scales with thickness while the constant scales with its cube.

J≈(1/3)Σᵢ bᵢ tᵢ³ τₘₐₓ=3T/(Σᵢ bᵢ tᵢ²)

Assumptions

Takes

SymbolUnitMeaning
T_torqueN*mTwisting moment about the member axis.
strips1List of narrow rectangular walls making up an open thin-walled section.
LmLength of the member along its axis.
GPaStiffness in shear: shear stress divided by the angle change it produces.

Gives

SymbolUnitMeaning
J_openm^4Effective torsion constant of an open thin-walled section.
tau_torsionPaShear stress produced by twisting.
phi_twistradAngle one end of a shaft rotates relative to the other.
stiffness_ratio1How many times stiffer a closed section is than the same section slit open.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct summation over the supplied strips, no iteration. The comparison this module exists to make explicit -- an open section's torsion constant against the closed section of the same wall and the same enclosed area -- is computed directly from the two already-derived constants as a plain ratio, rather than left for a reader to divide by hand.

Limitations

Reading the result

This module exists as much to be compared against the closed-section module beside it as to stand alone: the same wall, the same enclosed area, slit open along its length, loses the overwhelming majority of its torsional stiffness -- commonly two or three orders of magnitude -- while its bending stiffness barely changes at all, because bending resistance comes from how far material sits from the bending axis and a slit does not move any material anywhere. That asymmetry is the entire reason open thin-walled shapes such as channels and angles are avoided for anything that twists, and a side-by-side reading of this module against the closed-tube one is the fastest way to see the size of the effect on a section a reader actually cares about, rather than take the claim on faith.

Implemented by kernel.torsion.open_section_torsion_constant, kernel.torsion.open_section_max_shear, kernel.torsion.angle_of_twist, kernel.torsion.open_to_closed_ratio.

M16   Helical Springs extended

A spring is a bar in torsion wrapped into a helix. The correction factor is where tight coils bite.

δ=8PD³n/(Gd⁴) k=Gd⁴/(8D³n) K_w=(4C-1)/(4C-4)+0.615/C, C=D/d

Basis

A close-coiled helical spring is, mechanically, a long circular bar in torsion, wound into a helix so that an axial load on the spring becomes a torque on the wire. Almost every quantity this module reports -- the deflection, the stiffness, the nominal shear stress -- follows directly from the plain circular-shaft relations elsewhere in this chapter applied to that wire; only the correction for how tightly the coil is wound is new physics, because a coil wound tightly enough stops behaving like a straight bar.

Derivation

Treating the coiled wire as an equivalent straight circular bar in torsion and applying the ordinary shaft twist relation, then converting the wire's angle of twist into the corresponding axial movement of the coil's free end through the coil's own geometry, produces the standard deflection formula in terms of the load, the coil diameter, the wire diameter, the number of active coils and the shear modulus; inverting it gives the spring rate -- load per unit deflection -- directly.

The nominal shear stress on the wire follows the same straight-bar torsion formula applied to the wire's own circular cross-section, but a real coil is curved, not straight, and curvature concentrates additional stress on the inside of the coil beyond what the straight-bar formula predicts -- more so as the coil is wound more tightly relative to the wire's own thickness. The Wahl correction captures that concentration as a multiplying factor on the straight-bar stress, built so that it approaches exactly one as the coil opens out and the spring index (the ratio of coil diameter to wire diameter) grows large -- the straight-bar approximation becoming exact in the limit where the coil's own curvature stops mattering, which is the check that the Wahl factor is a correction to the straight-bar result and not an unrelated formula that happens to look similar.

Combining several springs is a direct extension of the same series-and- parallel language used for shafts elsewhere in this chapter: springs end to end share the same load and their deflections add, so their flexibilities (reciprocal rates) add; springs side by side share the same deflection and their loads add, so their rates add directly.

δ=8PD³n/(Gd⁴) k=Gd⁴/(8D³n)
K_w=(4C-1)/(4C-4)+0.615/C, C=D/d

Assumptions

Takes

SymbolUnitMeaning
PNForce applied along the member axis, or the single load in a standard case.
D_coilmMean diameter of a spring coil, measured to the wire centre.
d_wiremDiameter of the wire a spring is wound from.
n_coils1Number of spring coils that actually deflect.
GPaStiffness in shear: shear stress divided by the angle change it produces.

Gives

SymbolUnitMeaning
delta_springmDistance a spring closes up under its load.
k_springN/mForce needed per unit closure of a spring.
C_index1Coil diameter divided by wire diameter; small values mean a tightly wound spring.
K_wahl1Correction that raises the spring stress because the inner side of the coil is more sharply curved.
tau_springPaShear stress in the spring wire, including the correction for coil curvature.
U_springJWork stored in a compressed or extended spring.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation, closed form throughout. The curvature correction is an explicit argument to the stress function rather than something a caller must remember to apply afterwards, because for a tightly wound spring the correction is roughly a third of the answer -- omitting it is not a rounding error, it is a materially different, unsafe result. Below a spring index of one the correction's own denominator vanishes and the function returns a signalling not-a-number rather than the large or infinite value the raw arithmetic would otherwise produce, and the applicability guard warns well before that point, at an index of three, where the derivation behind the correction itself stops being trustworthy even though the arithmetic is still finite.

Limitations

Reading the result

The Wahl factor is the number to watch on this screen, because it is the whole reason this module exists rather than a straight-bar torsion calculation being sufficient on its own: for a loosely wound coil it sits close to one and barely changes the stress, but as the spring index falls toward the guarded lower limit, the correction grows quickly and stops being a minor adjustment. A spring rate that seems too soft or too stiff is usually a wire-diameter error rather than a coil-diameter one, because the deflection depends on the wire diameter to the fourth power against only the third power for the coil diameter -- the single most sensitive dimension in the whole module.

Warning. The curvature correction diverges for very tightly wound springs.

Implemented by kernel.spring.spring_index, kernel.spring.wahl_factor, kernel.spring.deflection, kernel.spring.rate, kernel.spring.shear_stress, kernel.spring.strain_energy, kernel.spring.springs_in_series, kernel.spring.springs_in_parallel.

Section Properties

M17   Composite Section Properties core

Build a section from a palette of primitives, add or subtract each, and read off every property the rest of the app needs.

A=Σ A_i ȳ=Σ A_i y_i/(Σ A_i) I=Ī+Ad² I_p=I_x+I_y r=√(I/A) S=I/c

Basis

Every property of a composite section -- however many pieces it is built from, and however many of those pieces are holes rather than material -- follows from three facts about integrals: an integral over a union of non-overlapping regions is the sum of the integrals over each region, a hole subtracts because removing material is integrating over the same region with a negative sign, and any second moment can be moved from one axis to a parallel one by the parallel-axis theorem once, given the primitive's own centroidal value. Nothing about assembling a real section needs a new principle beyond those three; it needs them applied correctly and consistently, which is where nearly all of the difficulty in this module actually lives.

Derivation

Each primitive shape in the app's palette -- rectangle, circle, hollow circle, right triangle, semicircle, quarter circle, ellipse, trapezoid, thin ring -- is a closed-form integral evaluated once and for all in its own natural frame, reporting its area, the location of its own centroid in that frame, and its second moments about its own centroid, never about the frame's origin. That last discipline is what keeps the parallel-axis shift from being applied twice, or not at all, by accident: because every primitive always reports a centroidal value, the composition layer that assembles a real section can apply the shift exactly once, in exactly one place, for every part regardless of shape.

Assembling a section from placed, and possibly rotated, primitives proceeds in three passes over the list of parts. First, each part's own area (carrying a plus or minus sign depending on whether it adds material or cuts a hole) is summed to get the total area, and each part's area times its own placed centroid location is summed and divided by the total area to locate the whole section's centroid -- ordinary composite-centroid bookkeeping, except that a "hole" is a negative area contributing a negative moment rather than a separate kind of object needing separate rules. Second, each part's own second moments are rotated about its own centroid to account for however it was turned when it was placed, shifted by the parallel-axis theorem from that part's centroid out to the whole section's centroid (not to the placement origin), and summed with the same sign convention. Third, the polar second moment, radius of gyration and section modulus follow directly from the assembled ix, iy and area. This screen also reports the first moment, about the assembled centroidal axis, of the area lying beyond a chosen level -- the quantity a transverse-shear check needs, taken here because it is a property of the section rather than of the loading, and described in full in the transverse-shear module.

The rotation step is worth its own remark because getting the sign wrong there is exactly the kind of mistake that can hide for a long time: the textbook transformation for a second moment is written for rotating the axes, and turning a shape by a positive angle is the same as turning the axes by the negative of that angle. A version of this code once carried the textbook's signs applied to the shape's own rotation directly, and it was wrong by as much as half the answer for a rotated right triangle -- wrong, and yet invisible on every square-on placement, because the sign only enters through a term that is exactly zero at zero and ninety degrees, and invisible again for any primitive whose own product of inertia happens to be zero (a rectangle, a circle, an ellipse), because only the product of inertia was affected, not the two second moments themselves. It surfaced only once a shape with a genuinely nonzero product of inertia, rotated by something other than a right angle, was checked against an independently integrated boundary rather than against another copy of the same formula.

A=Σᵢ signᵢ Aᵢ ȳ=Σᵢ signᵢ Aᵢ yᵢ/A
I=Ī+Ad² I_p=I_x+I_y

Assumptions

Takes

SymbolUnitMeaning
parts1Ordered list of primitive shapes that together make up the section.
shape1Which primitive from the palette this part is.
x_placemHorizontal position of a part relative to the section origin.
y_placemVertical position of a part relative to the section origin.
rotradRotation of a part about its own centroid.
part_sign1Whether this part adds material or cuts a hole.
y_fibremDistance from the neutral axis to the fibre whose stress is wanted.

Gives

SymbolUnitMeaning
Am^2Cross-sectional area actually carrying the load.
y_barmDistance from a chosen reference line to the centroid of the whole section.
I_xm^4Second moment of area about the horizontal centroidal axis; how the material is spread vertically.
I_ym^4Second moment of area about the vertical centroidal axis.
I_xym^4Product of inertia; zero whenever either reference axis is an axis of symmetry.
I_pm^4Polar second moment about the centroid; the sum of the two in-plane values.
r_gyrmRadius of gyration; the distance at which all the area could sit and give the same second moment.
S_modm^3Section modulus; second moment divided by the distance to the extreme fibre.
Q_firstm^3First moment about the neutral axis of the area lying beyond the level being examined.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Every summation in this module -- the total area, both centroid moments, and all three assembled second moments -- goes through the same order-stable summation the rest of the app uses for any total built from terms that can differ by many orders of magnitude, specifically so that reassembling the same section with its parts listed in a different order reproduces every property to the bit rather than merely to a tolerance. That is not a cosmetic guarantee: the product of inertia of an asymmetric built-up section is often a small difference of much larger terms, where a plain running total can lose several digits depending on summation order alone, and a reader who reorders the parts of their own section and sees the numbers move has been shown something false about a shape that has not actually changed.

A second, independent path computes the same area, centroid and second moments by integrating around the section's own drawn boundary (a polygon, with each hole a second loop wound the opposite way) rather than by summing tabulated closed forms at all -- the same boundary-integration idea behind Green's theorem, carried out on the actual outline the screen draws. The two paths share essentially no code and no algebra, and requiring them to agree is the strongest check this module has: a section is drawn correctly and sums correctly by two routes that could fail independently, not simply computed once and trusted.

Limitations

Reading the result

Three checks are worth making on any section built here, and all three are genuine tests this app runs continuously rather than folklore: the second moment about any axis parallel to the centroidal one is never smaller than the centroidal value itself, so a reported second moment smaller than what the same section gives about its own centroid signals an error in the section, not a legitimate result; the sum of the two second moments about any pair of perpendicular axes through the same point equals the polar second moment about that point, regardless of how the axes are oriented; and reordering the list of parts describing a section must never change any reported property, because a section is the shapes it is made of, not the sequence they happened to be typed in. A section whose reported area is implausibly small after a hole is added is worth checking for a hole entered with the wrong sign rather than the wrong size -- the two mistakes produce numbers of similar magnitude but very different meaning.

Implemented by kernel.section.parallel_axis_i, kernel.section.parallel_axis_ixy, kernel.section.polar_second_moment, kernel.section.radius_of_gyration, kernel.section.section_modulus, composition.section.properties, composition.profile.first_moment_above.

M18   Principal Axes and Principal Second Moments core

Rotate the axes until the product term vanishes. Structurally the same mathematics as the stress circle, deliberately written twice.

I_(1,2)=(I_x+I_y)/2±√(((I_x-I_y)/2)²+I_xy²) tan 2θ_p=(-2I_xy)/(I_x-I_y)

Basis

The second moments of area about a pair of axes through a point change as those axes are rotated, exactly the way the components of a plane stress state change as the cutting plane is rotated -- both are second-rank tensors in two dimensions, and the same rotation mathematics governs both, even though one describes a shape and the other a state of internal force. Rotating the axes until the product of inertia vanishes identifies a particular pair of perpendicular directions -- the principal axes -- about which the section's bending stiffness is, respectively, at its largest and its smallest.

Derivation

Writing the second moments about an axis pair rotated by an angle from the reference frame in terms of the reference frame's own ix, iy and ixy produces an expression built from the average of ix and iy, half their difference, and the product term, combined with the cosine and sine of twice the rotation angle. Setting the product-of-inertia expression to zero and solving for the angle gives the principal direction directly; evaluating the two second-moment expressions at that same angle -- or, equivalently, reading off the extremes of the rotated-axis expression directly -- gives the two principal second moments as the average of ix and iy plus or minus a term built from the same half-difference and product-of-inertia quantities that located the angle in the first place. This is the same algebraic structure as the plane-stress transformation used for the stress-and-strain chapter of this app, deliberately implemented as its own separate code rather than shared with it, because the two carry opposite sign conventions on their cross term -- one carries the product of inertia with a leading minus sign, the other carries twice the shear stress with a leading plus -- and a single shared implementation would need that sign passed in as a parameter, which is exactly the kind of parameter that gets passed incorrectly. Two independent implementations of the same mathematics, cross-checked against each other by a property test, cost less than one implementation and a sign convention nobody can be relied on to remember correctly at the call site.

I_(1,2)=(I_x+I_y)/2±√(((I_x-I_y)/2)²+I_xy²)
tan 2θ_p=(-2I_xy)/(I_x-I_y)

Assumptions

Takes

SymbolUnitMeaning
I_xm^4Second moment of area about the horizontal centroidal axis; how the material is spread vertically.
I_ym^4Second moment of area about the vertical centroidal axis.
I_xym^4Product of inertia; zero whenever either reference axis is an axis of symmetry.
thetaradAngle through which an element or a cutting plane has been rotated.

Gives

SymbolUnitMeaning
I_1m^4Larger of the two principal second moments.
I_2m^4Smaller of the two principal second moments.
theta_p_IradAngle to the axis about which the second moment is greatest.
I_x_rotm^4Second moment about an axis rotated away from the reference axis.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Closed form throughout. The principal angle is found from a two-argument arctangent of the product-of-inertia and second-moment-difference terms rather than a plain arctangent of their ratio, because the ratio alone loses which quadrant the angle belongs in. Where the reference second moments are equal and the product of inertia is exactly zero -- a square, a circle, a regular polygon, any section with more than one axis of symmetry through the same point -- every axis through that point is equally principal, and the angle genuinely does not exist rather than being merely difficult to compute; the module detects that condition against a tolerance scaled by the size of the second moments themselves, and returns zero together with an explicit statement that the direction is indeterminate, rather than either a not-a-number or a zero that looks like an ordinary, meaningful answer.

Limitations

Reading the result

The two identities worth checking on this screen at any rotation angle are that the two principal second moments sum to the same total as the original ix plus iy, and that their product equals ix times iy minus the product of inertia squared -- both true at every angle, not only at the principal one, because they are properties of the whole tensor and not of any particular axis choice. Because this module shares its mathematical structure with the plane-stress transformation used elsewhere in this app, a reader already comfortable reading a Mohr's circle for stress can read this module's principal values the same way, keeping firmly in mind that the sign convention on the cross term is not the same between the two.

Implemented by kernel.section.transform_second_moment, kernel.section.principal_second_moment_major, kernel.section.principal_second_moment_minor, kernel.section.principal_direction_is_defined, kernel.section.principal_axis_angle.

M19   Plastic Section Modulus and Shape Factor extended

The fully plastic section splits at the equal-area axis, not the centroid.

Z=Σ |A_i ȳ_i| f=Z/S M_p=σ_Y Z

Basis

Once a section's most extreme fibre reaches yield, an elastic bending analysis has nothing further to say: the section is not exhausted at that point, because the material closer to the neutral axis has not yielded yet and continues to carry an increasing share of the moment as loading continues. The reserve between that first-yield moment and the moment at which the entire section has yielded is a purely geometric quantity, fixed by the shape alone and independent of the yield stress -- the shape factor.

Derivation

At full plasticity every fibre on one side of the neutral axis carries the material's yield stress in one sense and every fibre on the other side carries it in the opposite sense, so the internal force resultant is zero only if the two sides carry equal area -- which is why the fully plastic neutral axis is the axis that splits the section into two halves of equal area, not the centroidal axis a linear-elastic analysis uses, and the two coincide only for a section symmetric about that axis. The fully plastic moment is then the yield stress times the plastic section modulus, where the plastic section modulus is the sum of each half-area's own area times the distance from that half's own centroid to the equal-area axis -- the first moment of area of each half about the split, added together. For a rectangle, carrying that construction through gives a plastic modulus of one quarter of the breadth times the depth squared, against an elastic section modulus of one sixth of the same product, and their ratio -- the shape factor -- comes to exactly three halves: independent of the actual breadth, depth or yield stress, a fact that follows purely from the rectangle's shape and is one of the few numbers in this subject worth simply memorising and checking an implementation against, alongside a solid circular section's shape factor of sixteen over three pi.

Between first yield and full plasticity, a partly-plastic rectangular section has an elastic core -- a band about the neutral axis that has not yet yielded -- whose half-depth can be recovered directly from the applied moment in closed form, because for a rectangle the moment-versus-core-depth relation is a simple quadratic that inverts without a search: no root-finder is needed, and no root-finder means no bracket that could be set up wrong.

Z=Σ_i |A_i ȳ_i| f=Z/S M_p=σ_Y Z

Assumptions

Takes

SymbolUnitMeaning
parts1Ordered list of primitive shapes that together make up the section.
sigma_YPaStress at which the material stops behaving elastically.
S_modm^3Section modulus; second moment divided by the distance to the extreme fibre.

Gives

SymbolUnitMeaning
y_pnamPosition of the axis that divides the section into two equal areas.
Z_plasticm^3Plastic section modulus; the first moment of the two halves about the equal-area axis.
f_shape1Ratio of plastic to elastic section modulus; how much reserve the shape has past first yield.
M_pN*mMoment at which the whole section has yielded.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Closed form for the two shapes this module covers exactly, with the elastic-core depth recovered from a given moment by directly inverting the governing quadratic rather than by any iterative search -- an elastic core depth that would otherwise come out imaginary (the section already demanding more moment than it can carry, even fully plastic) is reported as a fully plastic condition, at the elastic core depth of zero, rather than as a not-a-number.

Limitations

Reading the result

The shape factor is the single number worth carrying away from this module: it says how much moment capacity remains in a section after the extreme fibre first yields, purely as a consequence of the section's shape, and nothing about the material. A rectangle's shape factor of exactly one and a half means a rectangular beam can carry fifty per cent more moment past first yield before the whole section is exhausted; an efficient section shaped to put most of its material at the extreme fibres, such as a thin-flanged I-beam, has a shape factor much closer to one, because there is very little material left near the neutral axis to keep yielding after the flanges already have.

Implemented by kernel.plastic.rectangle_plastic_modulus, kernel.plastic.shape_factor, kernel.plastic.plastic_moment, kernel.plastic.rectangle_elastic_core.

Beams: Internal Forces and Stresses

M20   Reactions, Shear Force and Bending Moment core

Set the supports, list the loads, read the two diagrams. The flagship screen.

dV/(dx)=-w(x) dM/(dx)=V(x) V(x)=Σᵢ cᵢ ⟨ x-aᵢ⟩^nᵢ

Basis

A beam's reactions follow from the two equilibrium equations available to any rigid body in a plane: the sum of forces vanishes and the sum of moments about any point vanishes. Once the reactions are known, the internal shear force and bending moment at any cut follow from equilibrium of the piece of beam on either side of that cut -- and because every load this app accepts is built from a small set of standard pieces (a point force, a couple, a uniform strip, a linearly varying strip), the internal-force functions along the whole span can be written once, in closed form, rather than solved freshly at every position asked for.

Derivation

The reactions of a determinate beam -- one support pinned and the other a roller, or a single built-in end -- come directly from the two equilibrium equations applied to the whole beam and every one of its loads, each resolved to its own total force and the position that total effectively acts through (a distributed load's resultant sits at its own centroid, not at an endpoint). A structure needing a second compatibility condition beyond those two equations -- a propped or a fully built-in beam with too many supports for equilibrium alone to resolve -- is refused outright by name here, rather than quietly solved as if it were determinate, because the module that actually has the missing compatibility condition is a different one.

The internal shear and moment are then built from Macaulay's singularity functions -- a family of terms that switch on only past the position of whatever load contributes them, so that one closed-form expression describes the whole beam without needing a different formula on every span between loads. Every standard load type contributes its own known combination of singularity terms: a point force contributes one term to the shear, a uniformly distributed load contributes a term that switches on at its start and an equal, opposite one that switches off at its end (so that a strip covering only part of the span does not go on contributing beyond where it stops), and a linearly varying load needs one further term beyond that to capture the way its intensity itself changes along its length. The two diagrams were originally built from one shared piece of code parameterised by the load's own order, which is the version that dropped a factor of two on the shear contributed by a linearly varying load -- correctly getting both the reactions and the moment right while the shear alone was wrong, which is exactly the kind of error a shared, clever abstraction hides and writing the shear and moment terms out separately, one load type at a time, cannot.

⟨ x-a⟩ⁿ=0 (x<a), (x-a)ⁿ (x≥ a), ⟨ x-a⟩⁰=1 (x≥ a)
dV/(dx)=-w(x) dM/(dx)=V(x)

Assumptions

Takes

SymbolUnitMeaning
span_LmLength of the beam from end to end, tails included. The same number as the distance between the supports only when the supports are at the two ends.
support_type1Which support arrangement the beam has.
support_amWhere the left-hand support sits, measured from the left end of the beam.
support_bmWhere the right-hand support sits, measured from the left end of the beam.
loads1List of the loads acting on the beam, each with its type, magnitude and position.
a_posmPosition where a load starts.
b_posmPosition where a distributed load ends.
PNForce applied along the member axis, or the single load in a standard case.
M_coupleN*mCouple applied directly to the beam at a point.
w_intN/mLoad carried per unit length of beam.
x_stationmPosition along the beam at which a result is wanted.

Gives

SymbolUnitMeaning
R_aNReaction at the left support.
R_bNReaction at the right support.
V_xNInternal shear force at the chosen position along the beam.
M_xN*mInternal bending moment at the cut.
V_maxNLargest internal shear force anywhere along the beam.
M_maxN*mLargest internal bending moment anywhere along the beam.
x_at_MmaxmPosition along the beam where the bending moment is greatest.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Every quantity is closed form, built from the sum of singularity terms described above and evaluated by direct substitution -- nothing here iterates to find a shear or a moment at a given position. Finding the peak moment is the one place a search genuinely happens, and it does not search for a single condition: the candidate set is the union of every zero of the shear (each bracketed within one smooth interval and found there, because a stationary point can only occur where the shear itself is continuous), every station where a load starts, ends or is applied, and both ends of the beam -- because a bending moment can peak exactly at a jump in the shear, under a concentrated load, and a search that only looks for a stationary point walks straight past that case, which is also the single commonest loading there is. Two further details keep that search honest: a stretch of beam where the shear is identically zero across an entire interval (the middle span of four-point bending, the standard way of producing pure bending) is recognised as having no isolated zero to report there rather than inventing one, and at every jump the diagram is evaluated from both sides, because the two values genuinely differ and averaging them, or picking one, reports a number that exists nowhere on the real beam.

Limitations

Reading the result

The two checks worth running on any result from this screen are also two of its own tested identities: numerically differentiating the moment diagram must reproduce the shear diagram away from any jump, and integrating the shear across the whole span must reproduce the total change in moment between the two ends. A shear or moment diagram that does not visibly return to zero at a free end, or whose reactions do not sum to the total applied load, signals a load entered outside the span or with the wrong sign well before it signals anything wrong with the diagrams themselves. Reading a value exactly at a support, a load or a couple needs the two one-sided values this module reports rather than a single number, because the true answer at that exact station is genuinely two different numbers depending on which side of the cut is being asked about.

Implemented by composition.beam.Beam, composition.beam.Reactions, kernel.singularity.bracket, kernel.singularity.bracket_left_limit, solve.beam.max_shear, solve.beam.max_moment, solve.beam.shear_zeros, solve.beam.candidate_positions.

M21   Propped and Fixed Beams core

One redundant reaction, one compatibility condition. Solve it two ways and the answers must match.

M_(fix, udl)=wL²/12 M_mid=wL²/24 M_settle=6EIδ/L²

Basis

A propped cantilever or a beam built in at both ends has more reactions than the two equilibrium equations can resolve; the extra reaction (or, for a beam fixed at both ends, the extra two) is a redundant, and finding it needs a compatibility statement about how the beam actually deforms, not merely about the forces on it. The method used throughout this module -- the force method -- removes a redundant restraint, works out how far the released point moves under the real loads and under a unit value of whatever was released, and scales the unit case to cancel the real movement, restoring the condition the removed restraint was actually enforcing.

Derivation

Releasing the prop of a propped cantilever leaves a plain cantilever, which this app's determinate beam machinery already solves completely; that released cantilever deflects at the (former) prop location under the real loads, and deflects by some other amount there under a unit upward force applied at the same point. Because the prop's own real job is to hold that point at zero deflection, the actual prop reaction is whatever multiple of the unit force cancels the real-load deflection exactly -- a single division, not a search, because both deflections come from the same linear, already-solved determinate structure.

Releasing the restraint the other way -- removing the fixing moment instead of the prop -- leaves a simply supported beam with an unknown end moment still to be found, using the same idea applied to a rotation instead of a deflection: the released beam rotates at the built-in end under the real loads and under a unit end couple, and the actual fixing moment is whatever multiple of that unit couple cancels the real rotation. Both routes solve the same physical beam through two different intermediate determinate structures, and they are required to agree exactly -- a check that is genuinely independent of either route alone, because it is not merely running the same calculation twice, it is running two different calculations that both have to reach the same physical beam.

A beam built in at both ends carries the same idea one step further, with two redundants -- the two end moments -- released together, leaving a simply supported span, and two compatibility conditions (neither end may rotate) solved as a two-by-two linear system built from superposing the rotations a unit couple at each end produces on top of the real-load rotations. The familiar closed forms for a uniformly loaded, or a single point-loaded, fully built-in span are not a separate calculation from this general solver; they are kept alongside it specifically so that the general force-method solution and the closed form can be checked against each other on the cases where both exist.

M_(fix, udl)=wL²/12 M_mid=wL²/24
Mₛₑₜₜₗₑ=6EIδ/L²

Assumptions

Takes

SymbolUnitMeaning
span_LmLength of the beam from end to end, tails included. The same number as the distance between the supports only when the supports are at the two ends.
loads1List of the loads acting on the beam, each with its type, magnitude and position.
EPaStiffness in simple tension: stress divided by strain while the response is still straight.
I_xm^4Second moment of area about the horizontal centroidal axis; how the material is spread vertically.
delta_settlemPrescribed downward movement of a support.
redundant_choice1Which restraint is released to make the structure determinate.

Gives

SymbolUnitMeaning
R_aNReaction at the left support.
M_fix_aN*mMoment the left support must supply to keep the end from rotating.
M_fix_bN*mMoment the right support must supply to keep the end from rotating.
M_xN*mInternal bending moment at the cut.
V_xNInternal shear force at the chosen position along the beam.
M_settleN*mMoment a built-in end carries because the two ends finished at different levels, before any load is applied.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

The redundant force or moment is found in closed form from a ratio of two deflections (or two rotations), both obtained from this app's own determinate-beam and deflection machinery rather than from any new numerical method -- nothing in this module iterates. Both release routes for the propped cantilever are implemented and can be compared directly on screen, which turns an identity the test suite checks silently into something a reader can also see for themselves: pick either release, and the reported reactions match.

Limitations

Reading the result

The most convincing check available on this screen is also the most direct: switch which restraint is released and the reported reactions must not move at all, because both releases describe the same physical beam solved through two different intermediate structures. Fixing an end always reduces the peak sagging moment within the span while introducing a hogging moment at the fixed support that a simply supported span of the same loading would not have -- the redundant restraint is doing real work, and that redistribution of moment, not merely a change in deflection, is the point of adding it.

Implemented by solve.indeterminate.propped_cantilever, solve.indeterminate.fixed_both_ends, solve.indeterminate.fixed_end_moment_uniform, solve.indeterminate.fixed_end_moment_point, solve.indeterminate.fixed_end_moment_settlement.

M22   Flexure Formula and Section Design core

Stress varies linearly from the neutral axis, which passes through the centroid because it has to.

σ=-My/I σₘₐₓ=Mc/I=M/S 1/ρ=M/(EI)

Basis

A beam segment under pure bending, where plane sections remain plane and simply rotate relative to one another, stretches fibres on one side of some axis and shortens them on the other, with the strain at any fibre proportional to its distance from that axis. For a linear-elastic material the stress is proportional to the strain, so the stress too varies linearly across the section, and the location of the axis where it is exactly zero -- the neutral axis -- is fixed by requiring the stress distribution to produce no net axial force, which places it through the section's own centroid.

Derivation

Requiring the linear stress distribution to integrate to zero net axial force over the section is what fixes the neutral axis at the centroid in the first place -- a section bent about any other axis would have a net axial force appearing from nowhere, which pure bending does not supply. Requiring that same distribution to integrate, weighted by distance from the axis, to the applied bending moment is what fixes the constant of proportionality between stress and distance: the stress at any fibre is the moment times that fibre's distance from the neutral axis, divided by the section's second moment of area about that axis, with a sign fixed once and carried in the relation itself so that a sagging moment always puts the fibres below the neutral axis into tension. The peak stress at the extreme fibre, and the section modulus needed to keep that peak within an allowable stress, follow directly by evaluating the same relation at the extreme distance rather than at an arbitrary one. Curvature -- how sharply the beam's own axis bends -- follows from the same proportionality read as a statement about the whole cross-section's stiffness rather than about one fibre: it is the moment divided by the flexural rigidity, the product of the modulus and the second moment.

σ=-My/I σₘₐₓ=Mc/I=M/S
1/ρ=M/(EI)

Assumptions

Takes

SymbolUnitMeaning
M_xN*mInternal bending moment at the cut.
y_fibremDistance from the neutral axis to the fibre whose stress is wanted.
I_xm^4Second moment of area about the horizontal centroidal axis; how the material is spread vertically.
c_extrememDistance from the neutral axis to the farthest fibre.
sigma_allowPaHighest normal stress permitted in service.
EPaStiffness in simple tension: stress divided by strain while the response is still straight.

Gives

SymbolUnitMeaning
sigma_bendPaNormal stress produced by bending.
sigma_maxPaLargest normal stress present.
S_reqm^3Smallest section modulus that keeps the bending stress within the allowable value.
kappa1/mCurvature of the bent axis: how sharply it bends per unit length.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation, entirely closed form: every quantity here is a single multiplication and division once the section's second moment and the fibre distance in question are known. No iteration or search of any kind is involved.

Limitations

Reading the result

The two integral identities this module is checked against are worth knowing even though a reader never computes them by hand on screen: summing the stress distribution over the whole section returns exactly zero net force, and summing it weighted by distance from the neutral axis returns exactly the applied moment, for any section shape and any moment -- two checks that between them catch a wrong second moment, a mislocated centroid, and a sign error, which is why they are such an effective single test even though each is individually simple. The stress is exactly zero on the neutral axis and grows linearly in both directions from it, so a beam's outer fibres are always its most heavily stressed in bending and its material near mid-depth the least, which is the geometric reasoning behind shaping an efficient beam section with most of its material away from that axis.

Warning. Shear deformation stops being negligible for stubby beams; this deflection is an underestimate.
Warning. Within one section depth of a load or support the stress distribution is not the one these formulas give.

Implemented by kernel.bending.flexure_stress, kernel.bending.max_flexure_stress, kernel.bending.section_modulus_required, kernel.bending.curvature.

M23   Unsymmetric Bending core

When the loading plane misses a principal axis the neutral axis is not perpendicular to it.

σ=-M_z y/I_z+M_y z/I_y (principal axes) tan α=I_z/I_y tan θ

Basis

The ordinary flexure formula assumes bending about a principal axis of the section; when the plane a load bends the beam in does not coincide with either principal axis, the bending response couples the two directions together, and the neutral axis is no longer perpendicular to the plane of loading. Whether that coupling can be ignored is not a matter of preference: it is decided entirely by the section's own product of inertia about the axes actually being used, which is a single quantity already available because it is one of the section-properties module's own outputs.

Derivation

Where the reference axes genuinely are the section's principal axes -- its product of inertia about them is zero -- bending about two axes at once simply superposes two independent one-axis flexure calculations, one term built from the moment and second moment about each axis, because with no product term there is no coupling between the two directions to account for. Where the reference axes are not principal, the two bending directions are coupled through the nonzero product of inertia, and resolving the stress needs the general two-axis flexure relation, built by solving the two coupled equilibrium conditions (zero net axial force, and the two moment balances) together rather than one at a time -- a relation whose determinant is exactly the same expression, second moment about one axis times the other minus the product of inertia squared, that also decides whether a section has a genuine principal direction at all in the section-properties module. Using the simpler principal-axis form on a section whose reference axes are not actually principal does not merely add a small error: because the coupling term is missing entirely, it can place the whole neutral axis in materially the wrong orientation, not merely report a stress that is somewhat off.

The angle the neutral axis makes with the horizontal follows, for the principal-axis case, from the ratio of the two bending terms scaled by their respective second moments -- and it is emphatically not simply the angle of the applied moment itself unless the two second moments happen to be equal, which is the source of the whole subject's most persistent intuition failure: a beam does not, in general, bend in the direction it is pushed.

σ=-M_z y/I_z+M_y z/I_y (principal axes)
tan α=I_z/I_y tan θ

Assumptions

Takes

SymbolUnitMeaning
M_y_momN*mBending moment component about the first bending axis.
M_z_momN*mBending moment component about the second bending axis.
I_ym^4Second moment of area about the vertical centroidal axis.
I_zm^4Second moment of area about the axis used as the bending axis in unsymmetric work.
I_yzm^4Product of inertia in the coordinate pair used for unsymmetric bending.
y_fibremDistance from the neutral axis to the fibre whose stress is wanted.
z_fibremDistance from the second bending axis to the point whose stress is wanted.
thetaradAngle through which an element or a cutting plane has been rotated.

Gives

SymbolUnitMeaning
sigma_bendPaNormal stress produced by bending.
sigma_bend_genPaBending stress from the general form that keeps the product-of-inertia term.
alpha_naradAngle the neutral axis makes with the reference axis under unsymmetric bending.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Closed form throughout; both the principal and the general forms are direct evaluations, and the general form's determinant is checked to be strictly positive before use, since a section with no positive determinant there is not a physically valid one.

Limitations

Reading the result

The identity worth holding onto here is that the general, non-principal form evaluated at coordinates rotated into the section's own principal axes must reproduce the simpler principal-axis form exactly -- the two are not two different physical statements, they are the same physics expressed in two different coordinate systems, and the general form is never wrong to use even where the simpler one would also work. The single most useful fact for reading a result off this screen is the special case where the two principal second moments happen to be equal: there, the neutral axis coincides with the loading plane for every direction that plane can take, which is a genuine physical result about sections such as a square or a circle rather than an artefact of the arithmetic, and it is the one case where the everyday intuition that a beam bends in the direction it is pushed happens to be exactly right.

Implemented by kernel.bending.unsymmetric_stress_principal, kernel.bending.unsymmetric_stress_general, kernel.bending.neutral_axis_angle.

M24   Composite and Flitched Beams core

Trade one material for an equivalent width of the other, then use the ordinary flexure result.

n=E₂/E₁ b'=n b ȳ=Σ Ãᵢ ȳᵢ/(Σ Ãᵢ) σ₁=-My/Iₜ, σ₂=-nMy/Iₜ

Basis

Two materials bonded together and bent as one beam must strain alike at their shared interface, and because stress is proportional to strain within each material's own linear-elastic range, the stiffer material carries proportionally more stress at the same strain. The transformed-section method exploits that directly: redraw one material as an equivalent width of the other, scaled by the ratio of their two elastic moduli, so that the whole beam can be analysed with the ordinary single-material flexure formula, and then convert the resulting stress back for whichever material was traded away.

Derivation

Requiring equal strain at the bonded interface and Hooke's law for each material together give the stress in the traded-away material as the transformed-section stress at that fibre multiplied by the modular ratio -- the whole method compressed into one multiplication once the transformed section's own flexure stress is known, and this is exactly the check that a transformation applied one direction and the other must agree: transforming to material one and to material two describes the same physical beam and must produce the same real stresses, even though the two transformed sections and their intermediate second moments differ by the modular ratio throughout.

The two geometries this module covers are not interchangeable, and the distinction is the heart of the module rather than a footnote to it. Two materials sitting side by side across the same depth -- a timber core faced with a steel plate on each side, the flitched joist -- transform into a single rectangle whose width is simply the sum of the real and the transformed widths, because both materials already share one depth and one neutral axis at mid-depth by symmetry. Two materials stacked one on top of the other with different depths -- a steel strap bonded under a timber plank, a slab cast onto a beam -- do not share a depth and are not symmetric, so their transformed section is two separate rectangles whose combined centroid, found the ordinary composite way from each layer's own transformed area, is generally not at mid-depth at all. Handing a stacked section's total depth to the side-by-side closed form answers for a different, symmetric beam that does not exist: on one worked timber-and- steel case doing so returns a second moment seven times too large, with every intermediate number along the way looking entirely plausible. Nothing in the side-by-side formula's own two arguments can detect that mistake, because both describe a legitimate section on their own terms; only which physical arrangement was actually meant tells the two apart, which is why the layout is an explicit, named choice on screen rather than inferred from the numbers entered.

n=E₂/E₁ b'=n b
σ₁=-My/Iₜ σ₂=-nMy/Iₜ

Assumptions

Takes

SymbolUnitMeaning
E1_matPaStiffness of the first material in a two-material assembly.
E2_matPaStiffness of the second material.
M_xN*mInternal bending moment at the cut.
y_fibremDistance from the neutral axis to the fibre whose stress is wanted.
parts1Ordered list of primitive shapes that together make up the section.
layout_composite1Which way the two materials sit: side by side across the width, both running the full depth, or one stacked on a face of the other.
d_layermDepth of the layer bonded to a face of the first one, measured the same way the beam is deep.

Gives

SymbolUnitMeaning
n_modular1Ratio of the two stiffnesses, used to trade one material for the other.
b_transformedmWidth the second material is redrawn as so the section behaves as one material.
I_transformedm^4Second moment of the section after one material has been traded for an equivalent width of the other.
sigma_1mPaStress in the first material of a composite member.
sigma_2mPaStress in the second material of a composite member.
y_na_layeredmWhere the neutral axis of a stacked two-material section falls, measured from the outer face of the first layer. Not at mid-depth, which is the whole difference from the side-by-side case.
I_layeredm^4Second moment of a stacked two-material section, once the second layer has been redrawn at the first material's stiffness.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Closed form throughout. The two geometric cases are genuinely different calculations sharing the same underlying idea, and the module offers both rather than trying to unify them behind one function that would need the geometry disambiguated some other way regardless.

Limitations

Reading the result

The check worth making before trusting a result here is the geometric one, not a numerical one: confirm which of the two arrangements actually describes the beam, because both closed forms will return a plausible, internally consistent number for an input that describes the other arrangement, and nothing downstream will flag the mismatch. Once that is settled, the two transformation directions are a free check against each other -- transform to either material and the real stresses reported for both must agree, because the physical beam does not care which material it was analysed as.

Implemented by kernel.composite.modular_ratio, kernel.composite.transformed_width, kernel.composite.stress_in_base, kernel.composite.stress_in_other, kernel.composite.interface_strain, kernel.composite.flitched_second_moment, kernel.composite.layered_neutral_axis, kernel.composite.layered_second_moment.

M25   Reinforced Concrete Beams extended

Concrete is assumed cracked below the neutral axis, so the depth of the compression block solves a quadratic.

b h'²/2=n A_st(d-h') I_cr=b h'³/3+nA_st(d-h')²

Basis

Concrete is taken to carry no tension at all -- once a fibre is calculated to be in tension, it is treated as cracked and simply absent from the section. That single assumption is what makes this module's whole method different from ordinary transformed-section bending: the extent of the effective section depends on where the neutral axis is, because the concrete above the axis counts and the concrete below it does not, so the axis cannot be found by an ordinary centroid calculation and has to be found as the root of an equation instead.

Derivation

Transforming the steel reinforcement into an equivalent area of concrete (by the modular ratio, exactly as in the general composite-beam method) and requiring the first moment of the resulting effective section -- the concrete above the trial axis, plus the transformed steel, treated as acting at the steel's own depth -- to vanish about that same axis gives a quadratic equation in the axis depth. Because the section's own extent depends on the answer being sought, this is not an ordinary centroid calculation solved by a single division; it has to be solved as a root-finding problem, though one with an exact closed-form root rather than one needing numerical search.

The quadratic has exactly one physically meaningful root: its two roots' product is always negative for physical inputs, so one root is always positive and the other always negative, and a negative depth is not a position inside the section at all -- it describes a point above the compression face, which is not a competing candidate to be discriminated against by a tolerance, it is simply not a place the axis can be. The root is therefore picked by an exact sign test rather than by comparing two positive candidates.

Getting that root arithmetically right matters more here than in most of this app's closed forms, because the ordinary textbook quadratic formula subtracts two nearly equal quantities exactly in the case of practical interest -- a heavily reinforced, comparatively shallow beam, where the transformed-steel term is large relative to the concrete geometry. Rewriting the same quadratic in the algebraically equivalent form that divides by a sum instead of subtracting removes that cancellation entirely, without changing which root is being computed.

Once the axis depth is known, the cracked second moment follows from the concrete's own contribution (a triangular stress block below the top face, contributing its rectangular second moment about the axis) plus the transformed steel's contribution at its own lever arm from that same axis -- an ordinary composite second moment, now that the effective section's extent is finally settled. Steel stress is the concrete-equivalent stress at the steel's depth, scaled back up by the modular ratio the transformation divided it down by in the first place: omitting that scaling factor is the single most consequential slip available in this module, understating the true steel stress by a factor on the order of eight to ten, always in the unconservative direction, because ordinary modular ratios for steel over concrete are themselves on that order.

b h'²/2=n Aₛₜ(d-h')
I_cr=b h'³/3+nA_st(d-h')²

Assumptions

Takes

SymbolUnitMeaning
b_widthmWidth of a rectangular section.
d_effmDepth from the compression face down to the centre of the reinforcement.
A_steelm^2Total area of the reinforcing bars.
n_modular1Ratio of the two stiffnesses, used to trade one material for the other.
M_xN*mInternal bending moment at the cut.

Gives

SymbolUnitMeaning
h_namDepth of the compression block in a cracked reinforced section.
I_crackedm^4Second moment of the transformed section once the concrete below the neutral axis is ignored.
sigma_concPaPeak compressive stress in the concrete.
sigma_steelPaTensile stress in the reinforcement.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

The neutral axis depth is found from the closed-form root of the governing quadratic, evaluated in the algebraically rearranged form that adds rather than subtracts in its own denominator, so that a heavily reinforced, comparatively shallow section does not lose precision to cancellation. No search or iteration is used anywhere in this module; the quadratic's root is genuinely closed form, only written in the numerically careful way rather than the textbook way.

Limitations

Reading the result

The two equilibrium checks worth confirming on any result from this screen are that the concrete's compressive resultant and the steel's tensile resultant are equal in magnitude (horizontal equilibrium demands it, since there is no other internal force to balance them), and that the two resultants, acting at their own lever arm apart, reproduce the applied moment. The rejected root of the governing quadratic is shown alongside the accepted one specifically so a reader can see it is not a close call being adjudicated by a tolerance: it is a depth above the top face of the beam, which was never a candidate position to begin with.

Implemented by solve.rc.cracked_neutral_axis_depth, kernel.rc.cracked_second_moment, kernel.rc.concrete_stress, kernel.rc.steel_stress, kernel.rc.steel_ratio, kernel.rc.lever_arm.

M26   Curved Beams extended

The neutral axis of a sharply curved bar sits inside the centroid, and the gap between them is where the arithmetic dies.

R=A/(∫ dA/r) R_rect=h/( ln (r_o/r_i)) σ=M(R-r)/(A r (r̄-R))

Basis

In a beam whose own unloaded axis is already sharply curved rather than straight, the ordinary flexure assumption -- that stress varies linearly with distance from the centroid -- stops holding, because fibres nearer the centre of curvature are shorter than fibres farther out even before any load is applied, so the same angular rotation of a cross-section produces a larger strain on the outer fibres than the inner ones. The neutral axis under bending is consequently not at the centroid at all; it sits slightly toward the centre of curvature, at a radius fixed by the section's own geometry through an integral of the reciprocal radius over the area.

Derivation

Requiring plane sections to remain plane (still true here, curvature alone does not violate it) while accounting for the fact that fibre length varies with radius rather than being uniform gives a stress distribution that is hyperbolic in radius, not linear, and locates the neutral radius at the section's area divided by the integral, over that same area, of the reciprocal of the radius -- a genuinely different quantity from the centroidal radius, which is the area-weighted radius itself rather than its reciprocal's weighted mean. For a rectangular section of constant width that integral collapses to the section depth divided by the natural logarithm of the ratio of the outer to the inner radius; for a circular section it collapses to a different, still closed, form built from the two radii's square roots.

Both of those closed forms are algebraically exact and numerically treacherous at the same time, because both describe an offset between two radii that are often close together relative to their own size, and the textbook forms compute that offset as an explicit subtraction. Rewriting the ratio of the two radii in terms of their fractional difference turns the logarithm into an inverse hyperbolic tangent of that small fraction, and the quantity actually needed -- the difference between that inverse hyperbolic tangent and its own argument -- is a power series in which every single term is positive. Summing that series, rather than subtracting two comparable quantities, computes the offset with nothing cancelling at any radius ratio at all; the circular section's offset is rewritten the equivalent way, turning a difference of two square roots into a quotient with the same difference in its denominator, which is the same technique applied to a different pair of nearly equal quantities. Both rewrites are checked against a reference computed independently at many-digit precision. Measured that way, and reading the ratio as the bar's mean radius against its own half-depth, the textbook subtraction has lost two of its sixteen digits by a ratio of ten, four by fifty, six by a hundred and nine by a thousand -- and a bar ten times deeper in radius than in half-depth is a curvature gentle enough to be an entirely ordinary question to ask.

A section that is not simply a rectangle or a circle -- a curved hook with a T, an I or a trapezoidal profile, which is the more common case in practice because the material that most needs to be there is at the inner fibre -- cannot be described by handing its inner and outer radii to the rectangular closed form: that closed form implicitly assumes the width does not vary between those two radii, and a section that actually does vary in width between them is a different, incorrectly described bar. This module instead builds every such section from radial bands whose width varies linearly between an inner and an outer radius -- constant width recovers the rectangle, a width that reaches zero at one end recovers a triangle, and stacking such bands recovers a T, an I, a channel or a trapezoid -- each band contributing its own closed-form area and flexibility integral, summed across the bands exactly the way primitive shapes are summed in the general composite-section module.

R=A/(∫ dA/r) R_rect=h/( ln (r_o/r_i))
σ=M(R-r)/(A r (r̄-R))

Assumptions

Takes

SymbolUnitMeaning
r_innermInner radius of a thick cylinder, curved bar or disc.
r_outermOuter radius of a thick cylinder, curved bar or disc.
h_depthmOverall depth of a section measured in the bending direction.
Am^2Cross-sectional area actually carrying the load.
M_xN*mInternal bending moment at the cut.
N_axialNInternal force acting along the member axis at the cut being examined.
rho_radmRadius of the particular point being examined.
shape_curved1Which section the curved bar has. Two of them have exact closed forms; the rest are integrated as bands of linearly varying width.
b_outermWidth of the section at its outer face, for a shape whose width is not the same at both.
b_flangemWidth of a flange measured out from the web.
d_flangemHow deep the flange reaches, measured out along the radius.

Gives

SymbolUnitMeaning
R_neutralmRadius at which the bending stress in a curved bar passes through zero.
e_offsetmSmall gap between the centroid and the neutral axis of a curved bar.
sigma_curvedPaBending stress in a sharply curved bar.
sigma_curved_axialPaStress in a curved bar carrying both bending and a force along its centre line.
R_neutral_builtupmRadius of the neutral axis of a curved section built up out of bands -- the same quantity as for a plain rectangle, for a section that has no closed form of its own.
e_builtupmHow far inside its own centroid the neutral axis of a built-up curved section sits.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Closed form throughout for every section this module covers, with the central offset quantity evaluated by the convergent, all-positive series described above rather than by any subtraction of comparable radii, at every radius ratio the module accepts. The series is summed term by term until a term no longer changes the running total, and a ratio close enough to describe a bar whose inner radius has effectively collapsed to zero -- outside where the underlying theory or the series' own convergence can be trusted -- is refused rather than answered with a truncated, plausible- looking value.

Limitations

Reading the result

The single check that says the most about whether a curved-beam implementation is trustworthy at all is its own limiting behaviour: as the ratio of the neutral radius to the section's half-depth grows, this module's stress must converge smoothly onto the ordinary straight-beam flexure result, because a very gently curved bar is, physically, nearly straight. A reader choosing between this module and the plain flexure formula for a moderately curved bar is best served by that same ratio: a low ratio (a tight curve relative to the section depth) needs this module, and the error committed by using the straight-beam formula instead grows rapidly, not gently, as that ratio falls.

Warning. Straight-beam flexure is about 15 per cent out at this curvature and worsens rapidly below it; use the curved-bar solution. The error falls roughly as one over the radius ratio, reaching 7 per cent at a ratio of ten and 0.7 per cent at a hundred.

Implemented by kernel.curved.neutral_radius_rectangular, kernel.curved.centroid_to_neutral_offset_rectangular, kernel.curved.neutral_radius_circular, kernel.curved.centroid_to_neutral_offset_circular, kernel.curved.stress, kernel.curved.stress_with_axial, kernel.curved.trapezoid_area, kernel.curved.trapezoid_flexibility, composition.curved.assemble.

M27   Transverse Shear Stress core

Shear stress is zero at the free surfaces and peaks where the first moment does.

τ=VQ/(It) τ_(max,rect)=3V/(2A) τ_(max,circ)=4V/(3A)

Basis

A beam carrying a varying bending moment along its length is also, by the same equilibrium that relates the two, carrying a shear force -- and that shear force is not spread evenly across a cross-section the way an axial force is. Isolating a small slice of beam between two nearby cross-sections and requiring horizontal equilibrium of the material above some level within it shows that the shear stress at that level is fixed by the first moment, about the neutral axis, of exactly the material lying above it.

Derivation

The change in bending stress between two cross-sections a small distance apart, integrated over the area above some chosen level, produces a net horizontal force on that slice of material that must be balanced by a horizontal shear stress acting along the level in question; carrying that balance through gives the shear stress as the shear force times the first moment of the area above the level, divided by the second moment of the whole section and the width of the section at that level. Evaluating the general relation for a rectangle -- where the first moment above any level is itself a simple quadratic in that level -- produces the familiar closed form that the peak shear stress on the neutral axis of a rectangle is one and a half times the average shear stress, exceeding the naive force-over- area estimate because the shear stress is not uniform across the depth; the same evaluation for a solid circle, where both the width and the first moment vary as the level moves away from the centre, produces a different but comparably simple factor of four-thirds. Both closed forms are required to agree exactly with the general relation evaluated on the neutral axis of the same shape, which is a check between two paths to the same number that share almost no algebra.

Where the width of a section changes abruptly at some level -- the junction between a web and a flange in a rolled or built-up shape is the everyday case -- the general relation is evaluated with two different widths at that one level, because the width immediately above the junction and immediately below it are genuinely different numbers, often differing by an order of magnitude for a typical rolled section, and the shear stress computed with each is correspondingly different. Neither value alone describes the section at that level, and their average describes nothing physical at all; the module's own functions take the width as an explicit argument for exactly this reason, so that a caller who is asking about one particular side of the step is never handed the other side's answer by default.

τ=VQ/(It)
τ_(max,rect)=3V/(2A) τ_(max,circ)=4V/(3A)

Assumptions

Takes

SymbolUnitMeaning
VNInternal shear force at the cut.
Q_firstm^3First moment about the neutral axis of the area lying beyond the level being examined.
I_xm^4Second moment of area about the horizontal centroidal axis; how the material is spread vertically.
t_at_ymWidth of the section at the level where the shear stress is being taken.
Am^2Cross-sectional area actually carrying the load.
y_fibremDistance from the neutral axis to the fibre whose stress is wanted.

Gives

SymbolUnitMeaning
tau_shearPaShear stress produced by the shear force crossing the beam.
tau_maxPaLargest shear stress present in the case at hand.
tau_pair1Which of the two shear stresses at a level where the section width steps is being read, and by what factor they differ -- the ratio of the two widths, since one first moment is divided by each of them in turn.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation from the general relation, or from one of the two closed forms (rectangle, circle) where the section is one of those shapes and the level asked about is the neutral axis specifically. A decision routine in the interface layer recognises when a requested level sits at a width discontinuity and says so in words, together with the factor between the two stresses, rather than leaving a caller to notice the step exists and ask twice. That routine reports the factor rather than the two stresses themselves, because the two widths are all it is given -- with one first moment and two widths the ratio of the stresses is exactly the ratio of the widths, and the ratio is the part a reader has to decide about. Each of the two stresses is then obtained from the general relation with the width of the side actually being asked about.

Limitations

Reading the result

Two facts are worth holding in mind when reading a result off this screen: shear stress is exactly zero at the very top and bottom of a section (there is no material above or below those levels to contribute a first moment) regardless of what shape the section is, and it very rarely peaks where the bending stress does -- the two are largest at opposite extremes of the same section, bending at the outer fibres and shear on or near the neutral axis, which is the geometric reason a beam's critical check for one action is often not at the same point as its critical check for the other. Reading a shear stress at a flange-to-web junction needs a decision about which of the two reported values is relevant to the check being made, not an average of the two.

Warning. Within one section depth of a load or support the stress distribution is not the one these formulas give.

Implemented by kernel.shear.transverse_shear_stress, kernel.shear.shear_flow, kernel.shear.max_shear_rectangular, kernel.shear.max_shear_circular, kernel.shear.rectangle_area_above, kernel.shear.circle_first_moment_above, ui.decisions.shear_at_a_width_step.

M28   Shear Flow and Fastener Spacing core

Built-up sections stay built up only if the fasteners carry the flow between the pieces.

q=VQ/I s=n_f F_allow/q

Basis

A beam built up from separate pieces -- boards nailed together, plates riveted to form a girder -- behaves as a single beam only so long as the fasteners joining the pieces can actually transmit the horizontal shear that would otherwise let one piece slide relative to its neighbour. Shear flow is that same transverse-shear relation from the previous module, restated as a force to be carried per unit length along the beam rather than as a stress spread across a width, because that is the quantity a discrete fastener actually has to resist.

Derivation

Shear flow is the transverse shear stress at a given level multiplied by the width at that same level -- equivalently, and more usefully for this module's purpose, the shear force times the first moment of the area beyond the join, divided by the whole section's second moment, with no width term at all, because a fastener joint has a specific location rather than a continuous width to spread the flow across. Given how much force each row of fasteners can individually carry, the longest spacing that keeps the flow adequately resisted follows by direct division: enough capacity per unit length has to be provided at least as often as the flow demands it.

q=VQ/I s=n_f F_allow/q

Assumptions

Takes

SymbolUnitMeaning
VNInternal shear force at the cut.
Q_firstm^3First moment about the neutral axis of the area lying beyond the level being examined.
I_xm^4Second moment of area about the horizontal centroidal axis; how the material is spread vertically.
F_fastenerNForce a single fastener may carry.
n_rows1Number of fastener rows sharing the shear flow.

Gives

SymbolUnitMeaning
q_flowN/mShear force transferred per unit length along the member.
s_spacingmLongest fastener spacing that still carries the shear flow.
F_per_fastenerNForce each fastener actually carries at the chosen spacing.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation, entirely closed form; the required spacing is the plain inverse of the required-strength-per-length calculation, with a zero flow (no shear at all at that station) reported as an unbounded permissible spacing rather than an undefined one, since there is genuinely no limit on fastener spacing where there is nothing for the fasteners to resist.

Limitations

Reading the result

The relation between this module and the transverse-shear module beside it is worth keeping explicit: shear flow is shear stress times width at the same level, so a section with a sudden change in width at the join being checked (a flange bolted to a web, say) needs the flow evaluated with that width, not the section's overall or average width. Required spacing tightens in direct proportion to the shear force, so the closest fastener spacing on a beam is needed wherever the shear force itself is largest, not necessarily wherever the bending moment is largest -- the two peaks are often at different stations along the same span.

Implemented by kernel.shear.shear_flow, kernel.shear.fastener_spacing, kernel.shear.fastener_force.

M29   Shear Centre of Thin-Walled Open Sections extended

Load a channel through its centroid and it twists. The point that avoids twist is somewhere outside the section.

e_channel=b²h²t/(4I_z) e_(I, unequal)=h I_1/(I_1+I_2) e_(I, offset)=h²t(b_2²-b_1²)/(4I_z)

Basis

A transverse load produces a shear flow around a thin-walled open section that, taken together, is statically equivalent to a single transverse force -- but that equivalent force does not, in general, act through the section's own centroid. It acts through the shear centre, and a load applied anywhere else produces a twisting moment about that point in addition to ordinary bending, whether or not the person applying the load intended any twist at all.

Derivation

Locating the shear centre means finding the one point about which the shear flow's own moment matches the moment the equivalent single force would produce if it passed through that point -- equivalently, the point about which the shear flow's net torque, summed around the whole open section, is zero. For a channel, integrating the shear flow's moment contribution around the two flanges and the web and requiring the result to match a force acting at the (unknown) offset from the web gives that offset in closed form, built from the flange width and web depth squared, the wall thickness, and the second moment of the section about the bending axis -- and because the channel is symmetric about the axis running through the mid-depth of the web, the offset is measured purely along that one axis without needing a second coordinate at all. For an unequal-flanged I-section the same idea locates the shear centre along the web, splitting it between the two flanges in proportion to their own second moments about the bending axis, so that a section with equal flanges -- where the split is exactly even -- collapses to half the web depth, which is the same location the centroid already occupies. That degenerate case is not a coincidence requiring separate confirmation: it is the one configuration where the section is doubly symmetric and the shear centre is required, on general grounds, to coincide with the centroid regardless of the details of the closed form used to reach it.

Some sections need no calculation at all, because the geometry settles the question directly: an angle or a tee section is made of narrow legs each of whose own shear flow acts along a line through that leg, so the only point every leg's line of action can pass through simultaneously is the corner (or the flange-to-stem junction) where the legs meet, independent of any dimension.

e_channel=b²h²t/(4I_z) e_(I, unequal)=h I_1/(I_1+I_2)

Assumptions

Takes

SymbolUnitMeaning
b_flangemWidth of a flange measured out from the web.
h_webmDepth of the web between flange centre lines.
t_wallmWall thickness of a tube or shell.
I_zm^4Second moment of area about the axis used as the bending axis in unsymmetric work.
I_1m^4Larger of the two principal second moments.
I_2m^4Smaller of the two principal second moments.
b_proj_shortmThe shorter of the two distances a flange reaches out sideways from the web's centre line, when the web does not sit in the middle of it.
b_proj_longmThe longer of those two distances, on the other side of the web.

Gives

SymbolUnitMeaning
e_shearmDistance from the section to the point through which load must pass to avoid twist.
e_shear_web_offsetmSideways distance from the web's centre line to the shear centre, for an I-section whose flanges match but whose web is off-centre in them.
twist_flag1Whether the load passes through the shear centre and therefore causes no twist.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Closed form for every shape this module covers; nothing here searches or iterates. A decision function in the interface layer states explicitly whether a load applied through a given point will twist the section -- comparing where the load is actually applied against where the shear centre sits -- rather than leaving a reader to notice the offset unaided on a diagram.

Limitations

Reading the result

The detail most worth carrying away from this module is that the shear centre of an open section commonly sits outside the material itself -- for a channel, some distance beyond the web, on the open side away from the flanges -- which is why a channel loaded through a bolt down the middle of its web, seemingly the most natural place to attach anything to it, twists regardless of how carefully that bolt was placed. The offset grows with how wide the flanges are relative to the web and shrinks as the web itself deepens, which is the geometric reason an open section built to resist twist is given a deep web and modest flanges rather than the reverse.

Implemented by kernel.shearcentre.channel, kernel.shearcentre.unequal_flange_i_section, kernel.shearcentre.angle_section, kernel.shearcentre.tee_section, kernel.shearcentre.is_on_the_axis_of_symmetry, ui.decisions.shear_centre_offset.

M30   Combined Axial and Bending; Core of the Section core

Move the load off the centroid far enough and one face goes into tension. The boundary is the core.

σ=P/A±Pec/I no tension while e≤r²/c rectangle: b/6×h/6

Basis

A load applied off the centroidal axis of a section is statically equivalent to the same load applied at the centroid together with a bending moment equal to the load times its own eccentricity, so the stress at any fibre is simply the direct stress from the axial load added to the bending stress the equivalent moment produces there -- ordinary superposition of two already-known relations, with nothing new in the mechanics beyond recognising that an off-centre load is a combined-loading problem.

Derivation

Superposing the uniform direct stress from the axial force and the linearly varying bending stress from the equivalent moment gives a combined stress that is still linear across the section, but no longer uniform and no longer guaranteed to keep a single sign: at a large enough eccentricity, the bending term at the fibre farthest on the far side from where the load sits can exceed the compressive direct term and put that fibre into tension. The core (or kern) of a section is the region within which the load's point of application can move while every fibre still stays in compression -- the boundary condition is that the extreme fibre's total stress just reaches zero, and setting the combined-stress relation to zero at that fibre and solving for the eccentricity gives the kern limit directly, as the square of the section's radius of gyration divided by the distance to the extreme fibre being checked.

That relation is written once, in general terms of the radius of gyration and the extreme-fibre distance, rather than as a family of separate formulas for a rectangle, a circle, and every other shape in the section library -- because the radius of gyration already encodes everything about a shape's second moment and area that the kern boundary depends on, the one general relation reduces to the familiar sixth-of-the-breadth result for a rectangular section and the eighth-of-the-diameter result for a circular one purely as arithmetic consequences of substituting each shape's own radius of gyration, rather than needing to be derived and coded independently for each shape in turn.

Where the eccentricity acts about two axes at once rather than one, the same superposition simply carries a second bending term built the same way, and the boundary of the region keeping the whole section in compression becomes a closed curve (a diamond, for a rectangle) rather than a single pair of limiting values -- traced directly from the same zero-stress condition evaluated at every point around the section's own perimeter, rather than from a separate formula for the biaxial case.

σ=P/A±Pec/I eₖₑᵣₙ=r²/c

Assumptions

Takes

SymbolUnitMeaning
PNForce applied along the member axis, or the single load in a standard case.
Am^2Cross-sectional area actually carrying the load.
e_eccmDistance from the centroid to the line of action of the load.
c_extrememDistance from the neutral axis to the farthest fibre.
I_xm^4Second moment of area about the horizontal centroidal axis; how the material is spread vertically.
r_gyrmRadius of gyration; the distance at which all the area could sit and give the same second moment.
b_widthmWidth of a rectangular section.
h_depthmOverall depth of a section measured in the bending direction.

Gives

SymbolUnitMeaning
sigma_combPaNormal stress from axial force and bending taken together.
e_kernmLargest eccentricity that leaves the whole section in compression.
kern_outlinemBoundary of the region in which the load may act without causing tension.
no_tension1Whether the whole section stays in compression under the given eccentricity.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation, entirely closed form, including the kern limit itself, which needs no shape-specific derivation beyond the one general relation already described. Whether a given eccentricity keeps the whole section in compression is reported as an explicit decision by the interface layer, stated in words, rather than left for a reader to infer from the sign of a displayed stress.

Limitations

Reading the result

The kern is best read as a design boundary rather than a strength limit: a load kept inside it guarantees the whole section stays in compression, which matters most for a material assumed unable to carry tension at all (masonry, an unreinforced footing), while a load outside it does not by itself mean the section has failed, only that part of it is computed to be in tension under the linear-elastic assumption this module makes throughout. The general kern relation converging on the familiar sixth-of-the-breadth and eighth-of-the-diameter results for a rectangle and a circle is a useful check in itself: any section's kern limit can be sanity-checked against those two familiar numbers by comparing its own radius of gyration to either shape's.

Implemented by kernel.bending.combined_axial_and_bending, kernel.bending.kern_limit, composition.combined.kern_outline, ui.decisions.no_tension.

M31   Elastoplastic Bending and Residual Stress extended

Unloading from a partly plastic state is elastic, so the difference locks in as residual stress.

M_Y=σ_Y S M_p=σ_Y Z σ_res=σ_elastoplastic-σ_unload

Basis

Between the moment at which a section's extreme fibre first yields and the moment at which the whole section has yielded, a rectangular section carries an elastic core near the neutral axis sandwiched between two fully yielded regions near the extreme fibres, and the moment the section carries at any stage in between is fixed entirely by how deep that elastic core still is. Unloading from any such partly-plastic state is itself purely elastic -- the material does not un-yield, it simply relaxes along a straight elastic line from wherever the loading left it -- and the difference between the state at peak load and the state the same section would reach unloading elastically from that peak is what remains locked into the section as residual stress once the external moment is removed.

Derivation

Integrating the stress distribution of a rectangular section with a yielded region on each side, of a stated elastic core half-depth, and a linearly varying elastic stress within that core gives the moment carried as a simple closed function of the core depth; evaluating that function at a core reaching the full half-depth (no yielding at all) reproduces the ordinary yield moment, and at a core of zero (fully plastic) reproduces the fully plastic moment already established in the section-properties chapter of this manual, so the elastoplastic relation is required to span smoothly between the two moments this app already computes independently rather than introducing either endpoint as a fresh assumption. Because the moment-versus- core-depth relation for a rectangle is a simple quadratic, it inverts in closed form to give the elastic core depth directly from a specified moment, with no root-finding needed and, therefore, no bracket that could be set up incorrectly; a moment that would require more capacity than the section has even fully plastic is recognised directly rather than handed to a search that would fail to converge.

Residual stress after unloading follows from superposing the fully loaded elastoplastic distribution with an elastic unloading distribution scaled so that the two produce the same moment (since unloading removes exactly the applied moment, elastically) -- the residual is the difference between a distribution that has partly yielded and one that has not yielded at all but carries the identical moment. That difference is required to carry precisely zero net force and precisely zero net moment of its own, which is the necessary condition for it to be a self-equilibrating stress state left behind with no external load at all still applied -- exactly what residual stress physically has to be.

M_Y=σ_Y S M_p=σ_Y Z
σ_res=σ_elastoplastic-σ_unload

Assumptions

Takes

SymbolUnitMeaning
sigma_YPaStress at which the material stops behaving elastically.
S_modm^3Section modulus; second moment divided by the distance to the extreme fibre.
Z_plasticm^3Plastic section modulus; the first moment of the two halves about the equal-area axis.
M_xN*mInternal bending moment at the cut.
c_extrememDistance from the neutral axis to the farthest fibre.

Gives

SymbolUnitMeaning
M_YN*mMoment at which the extreme fibre first reaches yield.
M_pN*mMoment at which the whole section has yielded.
y_elastic_coremHalf-depth of the region that is still elastic in a partly yielded section.
sigma_residualPaStress left locked in after loading past yield and unloading.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Closed form throughout, including the elastic-core depth, which inverts directly from the governing quadratic without any search. A core depth that would come out imaginary -- the requested moment already exceeding what even a fully plastic section can carry -- is reported as the fully plastic limiting case, at zero core depth, rather than as a not-a-number.

Limitations

Reading the result

Two identities are worth checking against independently known values when reading this module's results: the ratio of the fully plastic moment to the yield moment must equal the section's own shape factor, computed completely independently in the plastic-section-modulus module from the section's geometry alone, and the residual stress profile must integrate to zero net force and zero net moment across the whole section, because it is, by construction, a self-equilibrating stress state with no external load applied. A residual stress that does not vanish at the section's own elastic-core boundary, or that fails either equilibrium check, signals an input outside where this module's single load-unload assumption actually holds rather than an error in the arithmetic.

Implemented by kernel.plastic.yield_moment, kernel.plastic.plastic_moment, kernel.plastic.rectangle_elastoplastic_moment, kernel.plastic.rectangle_elastic_core, kernel.plastic.rectangle_residual_stress.

Stress, Strain and Failure

M32   Plane-Stress Transformation and the Stress Circle core

Drag the angle and watch the element rotate, the circle point travel, and all three components move together.

σ_x′=(σ_x+σ_y)/2+(σ_x-σ_y)/2 cos 2θ+τ_xy sin 2θ σ_(1,2)=(σ_x+σ_y)/2±√(((σ_x-σ_y)/2)²+τ_xy²)

Basis

The three components of plane stress on one pair of perpendicular faces determine the stress on every other face through the same point; rotating the cutting plane does not change the physical state of stress at that point, only which components describe it. Requiring equilibrium of a small triangular wedge cut at an arbitrary angle from the original element gives the transformation relation directly, and every other quantity on this screen -- the principal stresses, the maximum shear, the stress circle itself -- is a property of that one transformation rather than a separate fact requiring its own derivation.

Derivation

Resolving the forces on a wedge element cut at an angle from the reference faces, and dividing through by the wedge's own inclined face area, gives the normal and shear stress on that face as the half-sum and half-difference of the two reference normal stresses combined with the reference shear stress through the cosine and sine of twice the rotation angle -- the factor of two arising because a stress component returns to its original value only after a half turn of the underlying tensor, not a full one, which is also why the graphical representation of this relation is a circle traversed at twice the physical rotation angle.

The principal stresses -- the extreme values the normal-stress transformation reaches as the angle varies -- follow by recognising that the transformation traces a circle in a stress plane centred on the average of the two reference normal stresses, with a radius built from the same half-difference and shear terms; the two principal values are simply that centre plus and minus the radius, and the maximum in-plane shear is the radius itself, reached exactly forty-five degrees of element rotation away from the principal directions -- a fixed relationship between the two special angles that falls directly out of the same trigonometric structure rather than needing to be derived separately for the shear case.

The principal angle is recovered from a two-argument arctangent of the shear term and the normal-stress difference, not from their plain ratio, because the ratio alone cannot distinguish the true principal direction from the one a half-turn away, nor place it in the correct quadrant. Where the two reference normal stresses are equal and the shear term is exactly zero -- a hydrostatic state in the plane -- the circle has collapsed to a single point: every direction produces the identical stress, and asking which one is "principal" has no more of an answer than asking which radius of a point is the longest. The module recognises that condition directly, scaled against the overall magnitude of the state so the judgement means the same thing whether the stresses are pascals or megapascals, and reports the direction as explicitly indeterminate rather than returning a zero that looks like an ordinary, meaningful angle or a not-a-number that explains nothing.

σ_x′=(σ_x+σ_y)/2+(σ_x-σ_y)/2 cos 2θ+τ_xy sin 2θ
σ_(1,2)=(σ_x+σ_y)/2±√(((σ_x-σ_y)/2)²+τ_xy²)

Assumptions

Takes

SymbolUnitMeaning
sigma_xPaNormal stress on the face whose outward normal points along the first axis.
sigma_yPaNormal stress on the face whose normal points along the second axis.
tau_xyPaShear stress on the first face acting along the second axis.
thetaradAngle through which an element or a cutting plane has been rotated.

Gives

SymbolUnitMeaning
sigma_xpPaNormal stress on a face rotated away from the reference direction.
tau_xpypPaShear stress on a face rotated away from the reference direction.
sigma_1PaLargest of the principal stresses.
sigma_2PaMiddle or second principal stress.
theta_pradAngle to the plane on which the normal stress is greatest and the shear vanishes.
tau_inplane_maxPaLargest shear stress on any plane containing the third axis.
sigma_avgPaAverage of the two in-plane normal stresses; the centre of the stress circle.
theta_sradAngle to the plane carrying the greatest in-plane shear stress.
circle_RPaRadius of the stress circle; the largest in-plane shear stress.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation, entirely closed form, with the principal direction's existence checked before its angle is computed rather than after: a hydrostatic-in-plane state is detected against a tolerance scaled by the size of the stresses involved, and only once that check passes does the two-argument arctangent run at all.

Limitations

Reading the result

Two identities are worth holding in mind at any rotation angle whatsoever, not only at the principal one: the sum of the two normal stress components is unchanged by rotation, and the product of the normal stresses less the square of the shear stress is likewise unchanged -- both are properties of the underlying tensor, independent of which pair of perpendicular faces is used to describe it, and a value that drifts as the angle is dragged signals an error rather than a legitimate result. The maximum shear reported here is the largest in the plane of the element; whether a larger shear exists on some plane inclined out of that plane at all is a separate question, answered by the module immediately following this one, and the distinction between the two is not a technicality -- for two principal stresses that share a sign, the two answers differ by a full factor of two.

Implemented by kernel.transform.normal_stress, kernel.transform.shear_stress, kernel.transform.average_normal_stress, kernel.transform.circle_radius, kernel.transform.principal_major, kernel.transform.principal_minor, kernel.transform.principal_direction_is_defined, kernel.transform.principal_angle, kernel.transform.max_in_plane_shear, kernel.transform.max_shear_angle.

M33   Absolute Maximum Shear Stress core

The plane of the element is not always the plane that fails. Ordering all three principal values decides it.

τ_abs=(σ_max-σ_min)/2 over {σ_1,σ_2,σ_3=0}

Basis

A state of plane stress has three principal stresses, not two: the two in-plane ones already found by rotating within the plane, and a third, equal to zero, in the direction perpendicular to that plane. The true maximum shear stress anywhere in the material -- on any plane, not only the ones containing the original loading direction -- is fixed by the largest and smallest of all three principal values, and the out-of-plane zero participates in that ordering exactly like any other principal stress would.

Derivation

For a general three-dimensional stress state, the maximum shear stress on any plane through a point is half the difference between the largest and smallest of the three principal stresses -- a standard three-dimensional Mohr's-circle result, applied here to the specific case where one of the three principal values is already known to be exactly zero because the state started as plane stress. Which pairing actually governs then depends entirely on the signs of the two in-plane principal values relative to that fixed zero: when both in-plane principal stresses share a sign, zero sits outside the interval between them, and the largest-minus-smallest spread running from the larger in-plane value down to zero (or up to zero, if both are negative) exceeds the spread between the two in-plane values themselves -- so the plane that actually governs is inclined out of the original plane of loading entirely, and the ordinary in-plane maximum shear understates the true answer, in the unsafe direction, by as much as a factor of two when one in-plane principal stress is much larger than the other. When the two in-plane principal values instead have opposite signs, zero already lies between them, and the in-plane pairing is the widest spread available -- the two calculations agree exactly in that case, which is the check made at the boundary between the two branches.

τ_abs=(σ_max-σ_min)/2 over {σ_1,σ_2,σ_3=0}

Assumptions

Takes

SymbolUnitMeaning
sigma_1PaLargest of the principal stresses.
sigma_2PaMiddle or second principal stress.
sigma_3PaSmallest principal stress; zero for a state of plane stress.

Gives

SymbolUnitMeaning
sigma_sortedPaThe three principal stresses put in descending order.
tau_absPaLargest shear stress on any plane at all, including those out of the element plane.
governing_plane1Which plane carries the largest shear stress.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation: the three principal values (two supplied, one the fixed zero for plane stress) are sorted, and the absolute maximum shear is half the spread between the largest and the smallest of the three. No search or branching logic is hidden inside the arithmetic; which physical case applies is reported explicitly by a decision function that states, in words, whether the governing plane lies in the original plane of loading or out of it.

Limitations

Reading the result

The single fact worth carrying away from this module is that the plane carrying the greatest shear stress in a material under plane stress is not always the plane of loading, and the case where the two in-plane principal stresses share a sign -- both tension, or both compression -- is exactly the case where a reader relying on the in-plane maximum shear alone will under-predict the true answer, never over-predict it. That asymmetry is why this module's result is always at least as large as the plane-stress transformation module's own in-plane maximum, never smaller, and checking that ordering is itself one of the strongest tests this pairing of modules has.

Implemented by kernel.transform.sorted_principal, kernel.transform.absolute_max_shear, kernel.transform.out_of_plane_governs.

M34   Plane-Strain Transformation core

The same circle as for stress, provided the shear strain enters halved. That halving is the commonest error in the subject.

ε_x′=(ε_x+ε_y)/2+(ε_x-ε_y)/2 cos 2θ+γ_xy/2 sin 2θ

Basis

Strain transforms under a rotation of axes by the same mathematical structure as stress, because both are second-rank tensors in two dimensions -- but the strain tensor's off-diagonal (shear) component is conventionally reported as the full engineering shear strain, the total angle change, which is twice the tensor shear strain the transformation mathematics actually needs. That single factor of two, entered or dropped at the wrong place, is the most persistent single error in this part of the subject.

Derivation

The correct transformation is obtained, without deriving it as a separate piece of mathematics, by taking the stress-transformation relation already established and substituting the two normal strains for the two normal stresses and half the engineering shear strain for the shear stress -- this module's normal-strain and shear-strain transformations are implemented as exactly that substitution into the stress kernel, with the shear result doubled back at the very end to return to engineering strain convention. Requiring that substitution to reproduce this module's own results component for component is not an incidental check; it is the actual construction, made verifiable, and it is precisely the discipline that keeps the factor of one half from being applied twice, or not at all, in two places that could otherwise drift apart.

The principal strains and the maximum in-plane shear strain follow the same substitution, and the absolute maximum shear strain -- accounting for the out-of-plane direction exactly as the absolute-maximum-shear module does for stress -- needs no factor-of-two correction of its own, because by the point three principal strains are being compared, the engineering-versus-tensor distinction has already been resolved earlier in the calculation.

ε_x′=(ε_x+ε_y)/2+(ε_x-ε_y)/2 cos 2θ+γ_xy/2 sin 2θ

Assumptions

Takes

SymbolUnitMeaning
epsilon_x1Direct strain along the first axis.
epsilon_y1Direct strain along the second axis.
gamma_xy1Engineering shear strain: the total change in the right angle between two axes.
thetaradAngle through which an element or a cutting plane has been rotated.

Gives

SymbolUnitMeaning
epsilon_xp1Direct strain along a direction rotated away from the reference axis.
gamma_xpyp1Engineering shear strain referred to rotated axes.
epsilon_11Largest principal strain.
epsilon_21Smallest principal strain.
gamma_inplane_max1Largest shear strain among planes containing the third axis.
gamma_abs_max1Largest shear strain on any plane at all.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation, built by substitution into the stress-transformation kernel rather than as an independently written second implementation of the same trigonometry -- one piece of rotation mathematics serving both quantities, with only the entry and exit points differing.

Limitations

Reading the result

The single identity worth checking, because it is the identity that this whole module exists to get right, is that feeding the stress-transformation relation with the two normal strains and half the engineering shear strain must reproduce this module's own output component for component, with the shear result then doubled back to return to the engineering convention. A result that seems to be off by a clean factor of two from an independent hand calculation is, overwhelmingly, this exact substitution applied or omitted incorrectly somewhere in the hand calculation, not an error in the underlying transformation itself.

Implemented by kernel.transform.strain_normal, kernel.transform.strain_shear, kernel.transform.principal_strain_major, kernel.transform.principal_strain_minor, kernel.transform.max_in_plane_shear_strain, kernel.transform.absolute_max_shear_strain.

M35   Strain Rosette Reduction core

Three gauge readings go in, the full plane strain state comes out. The laboratory workflow this replaces takes five error-prone minutes.

ε_θ=ε_x cos²θ+ε_y sin²θ+γ_xy sin θ cos θ 45°: γ_xy=2ε_b-ε_a-ε_c

Basis

A single strain gauge measures one number: the direct strain along its own axis. Three gauges at three known, distinct angles at the same point measure three such numbers, and because the direct-strain transformation relation is linear in the three unknown components of the plane strain state, three independent readings are exactly enough to recover that whole state -- no more gauges are needed, and no fewer will do.

Derivation

Writing the direct-strain transformation relation once for each of the three gauges, at each gauge's own known angle, gives three linear equations in the three unknown strain components; collecting them into a three-by- three system and solving it -- by an explicit matrix inverse written out by hand, since the kernel this app shares between its two front ends imports no linear-algebra library at all -- recovers the full state from any three readings at any three distinct angles, not only the standard fixed-angle patterns. Two of the most common physical rosette layouts, gauges spaced forty-five or sixty degrees apart, have their own simpler closed forms that were long ago derived by hand for exactly those fixed angles; this module keeps both alongside the fully general solver specifically so the two can be checked against each other -- the general solver, evaluated at precisely the angles either standard layout uses, is required to reproduce that layout's own closed form exactly, which is a check between two genuinely different pieces of code arriving at the same numbers.

The system has a unique solution only when the three angles are actually distinct enough to be independent; two gauges at the same angle contribute the same equation twice, leaving only two independent equations for three unknowns, and a matrix that is singular, or too close to it, produces enormous but entirely spurious numbers if solved anyway rather than an honest absence of an answer. The determinant of the three-by-three system, normalised against its own largest entry so the judgement does not depend on the units the angles happen to be expressed in, is checked before any attempt to solve, and the whole calculation is refused -- not merely flagged -- the moment that check fails.

ε_θ=ε_x cos²θ+ε_y sin²θ+γ_xy sin θ cos θ
45°: γ_xy=2ε_b-ε_a-ε_c

Assumptions

Takes

SymbolUnitMeaning
eps_a1Reading from the first gauge of a rosette.
eps_b1Reading from the second gauge.
eps_c1Reading from the third gauge.
ang_aradAngle of the first gauge from the reference axis.
ang_bradAngle of the second gauge.
ang_cradAngle of the third gauge.

Gives

SymbolUnitMeaning
epsilon_x1Direct strain along the first axis.
epsilon_y1Direct strain along the second axis.
gamma_xy1Engineering shear strain: the total change in the right angle between two axes.
rosette_det1Determinant of the three-gauge system; near zero means the angles do not fix a unique answer.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

The general case is solved by an explicit, hand-written three-by-three matrix inverse rather than a call to any linear-algebra routine, because this app's computational core imports nothing beyond the standard mathematics library on either of its two independent language implementations, and a three-term inverse written out directly is no longer, and no less exact, than a library call would have been. A gauge configuration whose determinant falls below a scaled tolerance is refused outright, naming the problem, rather than returned as a numerically enormous but physically meaningless state.

Limitations

Reading the result

The strongest available check on a rosette reduction is the round trip: substituting the recovered strain state back through the direct-strain transformation, evaluated at each of the three original gauge angles, must return the three original readings. A recovered state that fails that round trip, or a determinant warning at the point of solving, is far more likely to indicate two gauges recorded at angles closer together than intended than any deeper fault in the reduction itself -- this is, after all, the laboratory workflow this module exists to replace, and a rosette laid out imprecisely on the actual specimen is a real and common source of exactly that near-singular condition.

Implemented by kernel.rosette.general, kernel.rosette.determinant, kernel.rosette.is_solvable, kernel.rosette.rectangular, kernel.rosette.delta, kernel.rosette.strain_along.

M36   Generalised Elastic Stress-Strain Relations core

Three normal components in, three out, plus the split of the stored energy that the distortion criterion depends on.

ε_x=(1/E)[σ_x-ν(σ_y+σ_z)] γ_xy=τ_xy/G u=u_vol+u_dist

Basis

For an isotropic linear-elastic material, each direct strain depends not only on the normal stress along its own direction but also on the two perpendicular normal stresses, through Poisson's effect -- stretching a material in one direction makes it contract sideways, so a stress applied in one direction produces strain in all three. The generalised, three- dimensional statement of Hooke's law captures that coupling directly, and the energy stored by a general three-dimensional stress state splits cleanly into a part that changes the material's volume and a part that changes its shape -- a split this chapter's failure module depends on directly.

Derivation

Each direct strain is the stress along its own axis, reduced by Poisson's ratio times the sum of the two perpendicular stresses, all divided by Young's modulus -- the ordinary uniaxial Hooke's law with the sideways contraction from the other two directions folded in as a subtraction. Shear strain, uncoupled from the normal components entirely for an isotropic material, is simply the shear stress over the shear modulus, with no Poisson term at all. Inverting these relations -- recovering stress from a known strain state -- is not merely running the same arithmetic backwards; it is built from the Lame parameters, and requiring that inverting a stress state to strain and then back to stress reproduces the original stress exactly is one of this module's own strongest checks, because the two directions use genuinely different formulas that happen to be exact inverses of each other rather than one relation solved twice.

The strain energy density stored by a general three-dimensional normal stress state splits into two physically distinct parts: a volumetric part, associated purely with the change in volume (the dilatation) and vanishing identically for any state that produces no volume change at all, and a distortion part, associated purely with the change in shape and vanishing identically for a hydrostatic state that changes volume without changing shape at all. The distortion part is written directly from the differences between pairs of principal stresses rather than as the total energy minus the volumetric part, specifically so that the identity the two are supposed to satisfy -- total energy equals the sum of the two parts -- remains a genuine, independently checkable statement about the physics rather than becoming true merely because one part was defined as whatever is left over after subtracting the other; and it is this same distortion energy, expressed as an equivalent stress, that the maximum-distortion-energy failure criterion in the next module is built on directly.

ε_x=(1/E)[σ_x-ν(σ_y+σ_z)] γ_xy=τ_xy/G
u=u_vol+u_dist

Assumptions

Takes

SymbolUnitMeaning
sigma_xPaNormal stress on the face whose outward normal points along the first axis.
sigma_yPaNormal stress on the face whose normal points along the second axis.
sigma_zPaNormal stress on the face whose normal points along the third axis.
tau_xyPaShear stress on the first face acting along the second axis.
EPaStiffness in simple tension: stress divided by strain while the response is still straight.
nu1How much the material narrows sideways per unit of stretch along the pull.
GPaStiffness in shear: shear stress divided by the angle change it produces.

Gives

SymbolUnitMeaning
epsilon_x1Direct strain along the first axis.
epsilon_y1Direct strain along the second axis.
epsilon_z1Direct strain along the third axis.
gamma_xy1Engineering shear strain: the total change in the right angle between two axes.
e_vol1Fractional change in volume.
u_totalJ/m^3Total stored work per unit volume under a three-dimensional state.
u_volJ/m^3Part of the stored work that goes into changing volume.
u_distJ/m^3Part of the stored work that goes into changing shape.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation throughout, entirely closed form. The volumetric energy term shares its numerically careful treatment of the incompressible limit with the elastic-constants module earlier in this manual, since both quantities depend on the same combination of Poisson's ratio that vanishes there.

Limitations

Reading the result

The energy split is the part of this module worth watching closely, because it is not merely a bookkeeping convenience: a hydrostatic stress state -- equal in all three directions -- stores energy entirely as volumetric energy, with the distortion part at exactly zero, which is the direct mechanical reason a material under uniform pressure from every side does not yield in the ordinary sense, however large that pressure becomes, while the same total stored energy concentrated instead as distortion is what the maximum-distortion-energy failure criterion treats as the dangerous quantity. Reading this module alongside the failure-criteria module immediately following it is the fastest way to see why a hydrostatic state is the one case where several failure criteria disagree most sharply about whether any danger exists at all.

Warning. Approaching incompressibility: the bulk modulus is ill-conditioned and volumetric results lose precision.

Implemented by kernel.elastic.strain_from_stress, kernel.elastic.stress_from_strain, kernel.elastic.shear_strain_from_stress, kernel.elastic.dilatation, kernel.elastic.strain_energy_density, kernel.elastic.volumetric_energy_density, kernel.elastic.distortion_energy_density.

M37   Criteria of Failure core

Five envelopes on one plane, with the current state as a draggable point. The static figure in every textbook, made live.

σ_v=√((1/2)[(σ_1-σ_2)²+(σ_2-σ_3)²+(σ_3-σ_1)²]) σ_max-σ_min=σ_Y

Basis

A uniaxial tension test gives a single number -- the stress at which a material yields or fractures -- but a real structural point is rarely in a simple uniaxial state. A failure criterion is a rule for reducing a general, multiaxial stress state to a single equivalent stress that can be compared directly against that one uniaxial test result, and different, individually defensible physical arguments about what actually causes failure lead to different reduction rules -- which is why this module implements five of them side by side rather than choosing one as authoritative.

Derivation

Each criterion embodies a different physical claim about the mechanism that governs failure, and each reduces to a different combination of the three principal stresses. The maximum-normal-stress criterion claims that failure is governed by whichever single principal stress is largest in magnitude, appropriate to materials (typically brittle ones) that fail by simple fracture on the plane of greatest tension. The maximum-shear-stress criterion instead claims that yielding is governed by the largest shear stress anywhere in the material -- the same spread between the largest and smallest principal stress already computed by the absolute-maximum-shear module earlier in this chapter, applied here as a failure predictor rather than merely reported as a stress. The maximum-distortion-energy criterion claims that yielding is governed specifically by the shape-changing part of the stored strain energy established in the previous module, and is built directly from the same three principal-stress differences that module's own distortion energy uses, written the same cancellation-free way so that it is exactly zero, not merely small, for a hydrostatic state. The maximum-normal-strain criterion instead applies a strain-based limit, translated back into an equivalent stress through the material's own Poisson's ratio; and the total-strain-energy criterion sets a limit on the whole stored energy, volumetric part included, rather than the distortion part alone.

Every one of the five is required to reduce to exactly the applied stress itself under a simple uniaxial state -- the cheapest possible check on all five simultaneously, since a criterion that could not reproduce the very test result it is meant to be compared against would be internally incoherent. Where the five genuinely part company is under pure shear: the maximum-shear criterion there predicts yielding at exactly half the uniaxial yield strength, while the distortion-energy criterion predicts yielding at that strength divided by the square root of three -- roughly fifty-eight per cent of it rather than fifty -- and that fifteen-per-cent gap between two criteria, both applied to identical ductile metals, is not numerical noise; it is measured directly against real test data across the history of the subject, with the distortion criterion generally the closer fit for ductile metals and the shear criterion the more conservative, simpler-to-apply choice.

Two materials with unequal tensile and compressive strength -- the ordinary case for cast iron, concrete and other brittle materials -- are not well served by any of the five symmetric criteria, because those all treat tension and compression identically. The brittle envelope handles that directly, checking a two-dimensional stress state against a strength that differs by quadrant: a state where both in-plane principal stresses are tensile compares against the tensile strength alone, one where both are compressive compares against the compressive strength alone, and a mixed state -- one principal stress tensile, the other compressive -- compares against a straight line joining the two, drawn between the two different strengths precisely because that is the one quadrant where a symmetric criterion could not distinguish a material that fails unevenly from one that does not.

σᵥ=√((1/2)[(σ₁-σ₂)²+(σ₂-σ₃)²+(σ₃-σ₁)²])
σ_max-σ_min=σ_Y

Assumptions

Takes

SymbolUnitMeaning
sigma_1PaLargest of the principal stresses.
sigma_2PaMiddle or second principal stress.
sigma_3PaSmallest principal stress; zero for a state of plane stress.
sigma_YPaStress at which the material stops behaving elastically.
nu1How much the material narrows sideways per unit of stretch along the pull.
sigma_utPaGreatest stress the material carries in tension before it breaks.
sigma_ucPaGreatest stress the material carries in compression before it breaks.

Gives

SymbolUnitMeaning
sigma_eq_max_normalPaSingle stress that the largest-normal-stress criterion treats as equivalent to the actual state.
sigma_eq_max_shearPaEquivalent stress under the largest-shear criterion.
sigma_eq_distortionPaEquivalent stress under the distortion-energy criterion.
sigma_eq_max_strainPaEquivalent stress under the largest-normal-strain criterion.
sigma_eq_total_energyPaEquivalent stress under the total-stored-energy criterion.
brittle_ratio1How far the state has gone towards the envelope built from separate tensile and compressive strengths.
n_safety1How many times the applied action could be increased before failure.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation for all five criteria and the brittle envelope; nothing here iterates. The distortion-energy criterion is deliberately written from the three pairwise differences of the principal stresses rather than from the algebraically equivalent sum-of-squares-minus-cross-terms form, because the difference form is exactly zero for a hydrostatic state by construction, while the other form would compute a hydrostatic state's distortion energy as a subtraction of large, nearly equal quantities that happens to cancel rather than a sum of terms that are each individually zero.

Limitations

Reading the result

The point of showing all five criteria together, rather than picking one, is that the disagreement between them is itself the useful information: a state that several criteria agree is safe and one flags as marginal is a different engineering situation from a state every criterion agrees is either clearly safe or clearly not, and a reader comparing a governing criterion's safety factor against the others gets a sense of how sensitive the conclusion actually is to which physical failure mechanism is assumed. A hydrostatic stress state is the sharpest illustration available: the maximum-distortion-energy and maximum-shear criteria both predict no yielding at all, however large the hydrostatic stress grows, while the maximum-normal-stress criterion predicts failure at an ordinary, finite stress -- three criteria looking at the identical state and reaching qualitatively different conclusions, which is a genuine feature of the physics the five criteria disagree about, not an inconsistency in the implementation.

Implemented by kernel.failure.max_normal_equivalent, kernel.failure.max_shear_equivalent, kernel.failure.distortion_equivalent, kernel.failure.max_strain_equivalent, kernel.failure.total_energy_equivalent, kernel.failure.safety_factor, kernel.failure.brittle_envelope_ratio.

Pressure Vessels and Thick-Walled Cylinders

M38   Thin-Walled Pressure Vessels core

In a cylinder the circumferential stress is exactly twice the longitudinal one, always.

σ_hoop=pr/t σ_long=pr/(2t) σ_sphere=pr/(2t)

Basis

Where a pressure vessel's wall is thin compared with its own radius, the stress through the thickness of the wall can be treated as uniform and the radial stress -- which must vary from the internal pressure at the bore to zero, or to the external pressure, at the outer surface -- can be neglected beside the much larger stresses acting around the vessel's own surface. That single simplification, the membrane idealisation, is what separates this module from the exact thick-walled treatment immediately following it in this chapter.

Derivation

Cutting a cylindrical vessel with a plane containing its axis and requiring equilibrium of the internal pressure acting on the projected area of one half against the hoop stress acting around the two cut edges gives the hoop (circumferential) stress directly as the pressure times the radius over the wall thickness. Cutting the same cylinder instead with a plane perpendicular to its axis and requiring equilibrium of the pressure acting on the end cap against the longitudinal stress acting around the circumference gives the longitudinal stress as exactly half the hoop stress -- the same pressure and radius, but resisted by material running around a circumference rather than along a length equal to it, which is where the extra factor of two comes from. That the hoop stress is always precisely twice the longitudinal stress in a cylinder, for any pressure, radius or wall thickness whatsoever, is a direct and unconditional consequence of those two cuts sharing the same numerator and differing only in that one factor, not an empirical observation about particular vessels.

A sphere has no distinguished axis at all, so every cutting plane through its centre gives the same equilibrium statement, and its membrane stress is the same single value in every direction -- numerically identical to a cylinder's longitudinal stress at the same pressure, radius and thickness, because a sphere's cut is geometrically the same balance of pressure against resisting material as the cylinder's end-cap cut. The dimensional changes that follow -- how much the radius grows, how much a cylinder lengthens, how much the enclosed volume changes -- come from applying the material's own elastic stress-strain relation to the (uniform, biaxial or triaxial-by- symmetry) membrane stress state just established, each combining the hoop and longitudinal (or, for a sphere, the two equal in-plane) stresses through the material's Poisson's ratio exactly as the generalised Hooke's law elsewhere in this app would for any other biaxial state.

σ_hoop=pr/t σ_long=pr/(2t) σ_sphere=pr/(2t)

Assumptions

Takes

SymbolUnitMeaning
p_intPaPressure acting on the inside surface.
r_midmMid-wall radius of a thin shell.
t_wallmWall thickness of a tube or shell.
EPaStiffness in simple tension: stress divided by strain while the response is still straight.
nu1How much the material narrows sideways per unit of stretch along the pull.
eta_joint1Strength of one pitch length divided by the strength of the same length of unbroken plate. All four quantities are per pitch, so the ratio is the same for the whole seam.

Gives

SymbolUnitMeaning
sigma_hoopPaStress running around the circumference of a shell or disc.
sigma_longPaStress running along the axis of a cylindrical shell.
sigma_spherePaMembrane stress in a spherical shell, the same in every direction.
dr_changemChange in radius of a pressurised shell.
dL_changemChange in length of a pressurised shell.
dV_ratio1Fractional change in the volume a shell encloses.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation, entirely closed form; nothing here iterates. Because the sphere's stress is algebraically identical in form to the cylinder's longitudinal stress, it is computed by the same function rather than a second, independent implementation of the identical arithmetic.

Limitations

Reading the result

The identity worth holding onto from this module, because it is exact rather than approximate and holds for every cylindrical vessel regardless of its proportions, is that the hoop stress is always precisely double the longitudinal stress -- which is also the practical reason a cylindrical pressure vessel that fails from overpressure characteristically splits along a line parallel to its own axis rather than tearing across it: the hoop stress, resisting exactly that mode of failure, is the larger of the two by a fixed and unconditional factor. As the wall thins relative to the radius, this module's results must converge on the exact thick-walled solution to first order, and that convergence -- not merely agreement at one point, but the correct rate of approach as the ratio grows -- is one of the strongest checks tying this module to the one that follows it.

Warning. Thin-wall assumption degrades below a radius-to-thickness ratio of ten; the thick-walled solution is the honest one here.

Implemented by kernel.vessel.hoop_stress, kernel.vessel.longitudinal_stress, kernel.vessel.spherical_stress, kernel.vessel.radius_change, kernel.vessel.length_change, kernel.vessel.volumetric_strain_cylinder, kernel.vessel.volumetric_strain_sphere, kernel.vessel.required_thickness.

M39   Thick Cylinders and Spheres extended

Two constants fixed by the two pressures. The equilibrium equation it satisfies is the strongest test in the whole app.

σ_r=A-B/r² σ_θ=A+B/r² σ_r(r_i)=-p_i, σ_r(r_o)=-p_o

Basis

Where a cylinder's wall is too thick for the membrane idealisation to be trusted, the radial stress can no longer be neglected, and the full elasticity solution shows that both the radial and the hoop stress at any radius are made up of a constant part and a part that varies as the inverse square of the radius -- two constants fixed entirely by the two boundary conditions at the inner and outer surfaces, where the radial stress must equal minus whatever pressure acts there.

Derivation

Solving the equilibrium equation for a thick-walled cylinder under axisymmetric pressure, together with the compatibility condition that relates radial displacement to both strains, produces a stress field with exactly this constant-plus-inverse-square form; the two constants are then found from the two boundary conditions, that the radial stress must exactly equal the negative of the internal pressure at the bore and the negative of the external pressure at the outer surface -- two linear equations in the two unknown constants, solved directly rather than searched for. The resulting hoop stress is always largest at the bore and falls monotonically outward under internal pressure alone, which is the direct reason a thick pressure vessel's material is used most efficiently near its inner surface and least efficiently near its outer one.

The single strongest test available anywhere in this module -- and, for that matter, one of the strongest in the whole app -- is that this closed form was not merely fitted to satisfy the two boundary conditions; it also has to satisfy the equilibrium equation itself at every radius in between, a differential statement the closed form was never explicitly told to obey. Differentiating the shipped stress functions numerically and substituting them back into that equilibrium equation checks the entire derivation at once, rather than only the two endpoints, which is precisely the kind of check that a closed form satisfying its boundary conditions by construction but containing an algebraic slip somewhere in the middle would fail.

A compound (shrink-fit) cylinder -- an outer sleeve heated, slipped over an inner cylinder, and allowed to cool so that it clamps down with a deliberate, controlled interference -- generates a contact pressure at the join that follows directly from requiring the two cylinders' own radial displacements, computed independently by the same thick-cylinder relations applied to each as its own separate body, to differ by exactly the interference machined in. Because that relation is linear in the interference, the reverse question -- how much interference is needed to produce a target contact pressure -- is not solved by any search either: a single evaluation at unit interference gives the proportionality constant directly, and scaling by the target pressure gives the answer, guaranteeing by construction that the forward and reverse relations can never disagree with each other, since they are the same formula evaluated twice rather than two independently derived ones.

The same governing equations, worked through for spherical rather than cylindrical symmetry, give a stress field of the same constant-plus-inverse- power form but with the inverse cube of the radius rather than the inverse square, reflecting the extra dimension of symmetry a sphere has over a cylinder.

σ_r=A-B/r² σ_θ=A+B/r²
σᵣ(rᵢ)=-pᵢ σᵣ(rₒ)=-pₒ

Assumptions

Takes

SymbolUnitMeaning
r_innermInner radius of a thick cylinder, curved bar or disc.
r_outermOuter radius of a thick cylinder, curved bar or disc.
p_intPaPressure acting on the inside surface.
p_extPaPressure acting on the outside surface.
rho_radmRadius of the particular point being examined.
EPaStiffness in simple tension: stress divided by strain while the response is still straight.
nu1How much the material narrows sideways per unit of stretch along the pull.
r_junctionmRadius at which the two parts of a compound cylinder meet.

Gives

SymbolUnitMeaning
lame_APaConstant part of the radial stress distribution in a thick cylinder.
lame_BPa*m^2Coefficient of the inverse-square part of that distribution.
sigma_rPaStress acting along the radius.
sigma_hoopPaStress running around the circumference of a shell or disc.
u_radialmOutward movement of a point in a thick cylinder.
p_contactPaPressure generated at the interface of a shrink fit.
interferencemRadial misfit built into a shrink fit before assembly.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Closed form throughout, including the shrink-fit interference, which uses the forward contact-pressure relation's own linearity to invert it by scaling rather than by any root search -- reaching for a general root-finder here would be both slower and would introduce a numerical tolerance where none is actually needed, since the exact inverse is available directly.

Limitations

Reading the result

Two checks are worth making on any result from this module, and both are genuine, executed tests rather than folklore: the radial stress evaluated exactly at each boundary must reproduce the negative of the pressure applied there, to the last few digits, and substituting the stress field back into the equilibrium equation by numerical differentiation must balance to within the precision of that differentiation at every radius checked, not merely at the boundaries. As the wall thins, this module's hoop stress must converge on the thin-wall membrane result from the previous module, and the rate of that convergence -- not merely eventual agreement -- is itself part of what ties the two modules together as one continuous physical picture rather than two unrelated approximations.

Implemented by kernel.thick.lame_constant_a, kernel.thick.lame_constant_b, kernel.thick.radial_stress, kernel.thick.hoop_stress, kernel.thick.radial_displacement, kernel.thick.sphere_radial_stress, kernel.thick.sphere_hoop_stress, kernel.thick.shrink_fit_contact_pressure, solve.thick.shrink_fit_interference.

M40   Rotating Discs, Rings and Cylinders extended

A pinhole at the centre doubles the peak stress. The limit is genuinely discontinuous, so it is offered as two cases.

σ_θ=ρω²[((3+ν)/8)(r_o²+r_i²+r_i²r_o²/r²)-((1+3ν)/8)r²] σ_(θ,ring)=ρω²r²

Basis

A disc spinning about its own axis carries hoop and radial stress generated entirely by its own inertia -- every particle of the disc requires a centre-seeking force to keep it moving in a circle, and that force is supplied by the stress in the material around and beside it, exactly the way internal pressure supplies the force needed to contain a pressurised vessel. The governing equilibrium equation has the same mathematical shape as the thick-walled cylinder's, with the centrifugal body force appearing as an additional term, and the boundary conditions -- zero radial stress at any genuinely free edge -- again fix the constants of the solution.

Derivation

Solving the disc's own equilibrium equation, now carrying the centrifugal body force proportional to the material's density and the square of the angular speed, with the boundary condition that the radial stress vanishes at a free outer edge (and, where present, at a free inner bore as well), gives closed forms for the radial and hoop stress built from the same material and geometric parameters that govern a thick cylinder, evaluated under a body-force loading rather than a boundary-pressure one. A thin ring, so slender in the radial direction that it can be treated as carrying essentially only hoop stress and no meaningful radial stress at all, is the simplest limiting case of the same physical mechanism, and its hoop stress reduces to the density times the square of both the speed and the radius -- recoverable, as a sanity check, from the general disc relation in the limit of a vanishingly thin annulus.

The single most important physical fact about this module is that the solid disc and the disc with a central hole are not the same solution taken to two different limits of one continuous parameter: as the hole in a pierced disc shrinks toward nothing, the hoop stress at the bore rises to exactly twice the stress at the centre of an equivalent solid disc, a genuinely discontinuous jump rather than a smooth approach. The mathematical reason is that a solid disc's own boundary condition -- stress finite at the centre, where there is no free surface at all -- differs fundamentally from a pierced disc's boundary condition of a free, stress-relieving inner edge, however small; a free inner edge, no matter how close to the axis, is still a free edge, and a disc with no hole has no such edge to relieve stress at all. Because the underlying boundary conditions are qualitatively different, not merely quantitatively close, the two closed forms are kept as genuinely separate functions in this app rather than as one function whose radius argument happens to include zero, and a single unified function would silently return whichever answer its author happened to code for the degenerate case -- almost certainly the wrong one, since the physically correct jump cannot be produced by any continuous formula at all.

A profile of constant strength -- a disc shaped so that the hoop stress is the same design value at every radius rather than peaking at the centre or the bore -- is not found by trial and error over a family of shapes; it follows directly from requiring the equilibrium equation to hold with the hoop stress held constant, which forces the disc's own thickness to vary exponentially with the square of the radius, thickest at the centre and thinnest at the rim.

σ_θ=ρω²[((3+ν)/8)(r_o²+r_i²+r_i²r_o²/r²)-((1+3ν)/8)r²]
σ_(θ,ring)=ρω²r²

Assumptions

Takes

SymbolUnitMeaning
rho_matkg/m^3Mass of the material per unit volume.
omegarad/sRotation rate in radians per second.
r_innermInner radius of a thick cylinder, curved bar or disc.
r_outermOuter radius of a thick cylinder, curved bar or disc.
rho_radmRadius of the particular point being examined.
nu1How much the material narrows sideways per unit of stretch along the pull.
sigma_designPaUniform stress a constant-strength profile is designed to hold everywhere.

Gives

SymbolUnitMeaning
sigma_rPaStress acting along the radius.
sigma_hoopPaStress running around the circumference of a shell or disc.
sigma_ringPaHoop stress in a thin spinning ring.
t_profilemThickness a spinning disc needs at each radius to hold one stress everywhere.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Closed form throughout, evaluated separately for the solid-disc and pierced-disc cases rather than through one function that could silently select the wrong physical case at a vanishing bore radius. The equilibrium equation is, exactly as for the thick cylinder, satisfied pointwise under numerical differentiation as an independent check on the whole derivation, and the radial stress is confirmed to vanish exactly at every genuinely free edge.

Limitations

Reading the result

The discontinuity between the solid and pierced cases is the single fact this module exists to make unmissable: a designer reasoning informally that "a very small hole can't matter much" is exactly wrong here, because the hole's mere existence as a free surface -- not its size -- is what changes the governing boundary condition and doubles the peak stress. Reading a result from this screen means first deciding, explicitly, which of the two physical cases actually describes the disc in question, since the two closed forms are not interchangeable approximations of each other at any bore size, however small.

Implemented by kernel.thick.solid_disc_hoop_stress, kernel.thick.solid_disc_radial_stress, kernel.thick.pierced_disc_hoop_stress, kernel.thick.pierced_disc_radial_stress, kernel.thick.thin_ring_hoop_stress, kernel.thick.uniform_strength_thickness.

Beam Deflection

M41   Deflection by Integration core

Integrate the moment twice with singularity terms and the boundary conditions fix the constants.

EId²v/(dx²)=M(x) ∫ ⟨ x-a⟩ⁿdx=(⟨ x-a⟩ⁿ⁺¹)/(n+1)

Basis

For a beam whose curvature is small, the curvature of its deflected shape is directly proportional to the bending moment at that point and inversely proportional to the flexural rigidity -- the same relation the flexure-stress module uses to relate moment to curvature at a cross-section, now read as a differential equation governing the whole shape of the beam's deflected axis. Integrating that equation twice, with two constants of integration fixed by the beam's own boundary conditions, gives the slope and deflection at every station along the span.

Derivation

Because the bending moment along any beam this app represents is already available as an exact sum of Macaulay singularity terms, integrating the governing curvature equation is not a numerical procedure at all: each term c <x-a>^n integrates to exactly c <x-a>^(n+1)/(n+1), with nothing approximated, so integrating the whole moment expression once gives the slope up to a constant and integrating it again gives the deflection up to two constants, both still expressed as sums of singularity terms rather than as numbers sampled on a grid. Sampling the moment diagram numerically and integrating it that way would only approximate a quantity already known exactly, and would blur precisely the discontinuities in slope and curvature that a stepped or discontinuously loaded beam genuinely has.

The two constants of integration are fixed by exactly the same information the reactions were fixed by: a simply supported beam pins the deflection to zero at both supports, giving two equations for the two constants directly, while a cantilever pins both the deflection and the slope to zero at the single built-in end. This is also why a beam needing a third support cannot be solved by this module at all -- there would be a third condition and still only two constants, exactly the same indeterminacy the reactions module refuses to resolve, for the same underlying reason.

Locating the point of maximum deflection needs a genuine search, but a simpler one than finding the peak moment: because the slope is continuous even at a concentrated load (only the curvature, one derivative further, jumps there), a stationary point of the deflection is always a genuine, single-valued zero of the slope, with no two-sided values to worry about. What still must not be dropped is the two ends of the beam, because a cantilever's largest deflection is at its free end, where the slope generally does not vanish at all -- a search that only looked for a stationary point would report zero for the single most common case in the whole subject.

EI v''=M(x) EI v'''=V(x) EI v''''=-w(x)

Assumptions

Takes

SymbolUnitMeaning
span_LmLength of the beam from end to end, tails included. The same number as the distance between the supports only when the supports are at the two ends.
loads1List of the loads acting on the beam, each with its type, magnitude and position.
EPaStiffness in simple tension: stress divided by strain while the response is still straight.
I_xm^4Second moment of area about the horizontal centroidal axis; how the material is spread vertically.
x_stationmPosition along the beam at which a result is wanted.
support_type1Which support arrangement the beam has.

Gives

SymbolUnitMeaning
v_deflmSideways movement of the beam axis at a given position.
theta_sloperadAngle the deflected beam axis makes with its original direction.
v_maxmLargest deflection anywhere along the beam.
x_at_vmaxmPosition along the beam where the deflection is greatest.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Exact symbolic integration of the singularity-term representation of the bending moment, not numerical quadrature; the two constants of integration are recovered by direct linear solution from the two boundary conditions, whether those are two deflections (simply supported) or a deflection and a slope at one point (a cantilever).

Limitations

Reading the result

Two identities anchor this module against the rest of the chapter, and both are genuinely independent checks rather than restatements of the same fact: numerically differentiating the deflection twice must reproduce the bending moment this module started from, and the closed-form standard-case table elsewhere in this chapter -- built by an entirely independent, hand-derived route for each individual load case -- must agree with this general integrator to the last few digits wherever both apply to the same loading. The single most powerful check available on this module, though, is reciprocity: introducing a unit load at one station and reading the deflection it produces at a second station must give exactly the same number as introducing that same unit load at the second station and reading the deflection at the first -- true for any linear-elastic beam whatsoever, and sensitive enough to catch nearly any error in how the integration constants were assembled.

Warning. Shear deformation stops being negligible for stubby beams; this deflection is an underestimate.

Implemented by kernel.singularity.bracket, composition.deflection.integrate, composition.deflection.slope_at, composition.deflection.deflection_at, solve.deflection.max_deflection.

M42   Standard Beam Deflection Cases core

Roughly twenty closed forms, each an independent check on the integrator and a source of printed fixtures.

cantilever, uniform strip: δ=wL⁴/(8EI) simple span, central load: δ=PL³/(48EI)

Basis

Every closed-form case in the standard-cases table is not a separate body of knowledge from the general integrator in the previous module; each one is that same integration, carried out once by hand for one particular combination of support conditions and loading, and its result printed as a formula. They earn a place of their own in this app for two reasons: they are what a printed reference table actually contains, which makes them the natural source for verifying this app's output against a page a reader could independently check, and, being derived by hand rather than by the integrator, they are a second, genuinely independent derivation route against which that integrator is tested case by case. What this screen evaluates is the integrator; the hand-derived closed forms are what it is held to.

Derivation

Each entry is obtained by the same integration the general module performs, specialised to one fixed loading and one fixed support condition, and solved by hand -- which is precisely why the two are worth keeping side by side, one derived by hand and one evaluated by the general machinery, so that each can be required to reproduce the other. For most cases that specialised integration is straightforward; the peak deflection under a triangular (linearly varying) load on a simply supported span is the one exception worth telling in detail, because locating where the slope vanishes under that loading needs solving a fourth-degree (biquadratic) equation in the position along the span, and that equation has an exact closed-form solution built from a square root of an integer rather than a decimal approximation -- the location of the peak, and the deflection there, are both irrational numbers with an exact algebraic description, evaluated once at high precision and stored as named constants rather than solved for at runtime on every call.

Getting either of those two constants right is not a formality: an earlier version of this file carried two such constants that were, in fact, invented -- plausible-looking digits that were simply wrong from the fifth significant figure onward, agreeing with nothing. The only reason that surfaced at all is that the general integrator from the previous module, asked the identical question through its own completely independent integration, disagreed with the standard-case table -- which is the whole point of carrying two routes to the same number rather than one. Any constant appearing in this app that cannot state where it came from is treated the same way as those two were once they were found: recomputed from its own derivation, or removed.

cantilever, uniform strip: δ=wL⁴/(8EI)
simple span, central load: δ=PL³/(48EI)

Assumptions

Takes

SymbolUnitMeaning
span_LmLength of the beam from end to end, tails included. The same number as the distance between the supports only when the supports are at the two ends.
PNForce applied along the member axis, or the single load in a standard case.
w_intN/mLoad carried per unit length of beam.
M_coupleN*mCouple applied directly to the beam at a point.
a_posmPosition where a load starts.
EPaStiffness in simple tension: stress divided by strain while the response is still straight.
I_xm^4Second moment of area about the horizontal centroidal axis; how the material is spread vertically.
x_stationmPosition along the beam at which a result is wanted.
case_id1Which standard configuration from the closed-form table is wanted.

Gives

SymbolUnitMeaning
v_deflmSideways movement of the beam axis at a given position.
theta_sloperadAngle the deflected beam axis makes with its original direction.
v_maxmLargest deflection anywhere along the beam.
theta_maxradLargest slope anywhere along the beam.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Each case on this screen is assembled as the beam it describes and evaluated through the same singularity-function integration the general module uses, rather than by transcribing the printed closed form a second time: two copies of one relation would double the number of places a sign can be wrong and would have to be kept in step by hand for ever. Deflection and slope at a station are therefore direct evaluations of that integrated curve. The largest deflection is found by the same bracketed search the general module uses -- the stationary points of the slope together with both ends of the span, since a cantilever's peak is at its free end where the slope does not vanish at all -- and the largest slope is read at the ends, which is exact for every case in this table. The closed forms themselves are carried separately and are what the two routes are required to agree on; the one of them needing a root of a quartic (the triangular-load peak) is pre-solved once, symbolically, into an exact irrational constant carried at high precision rather than searched for at runtime.

Limitations

Reading the result

This table is the natural place to check a hand calculation against, since its entries are exactly the closed forms a printed reference table would give -- and, precisely because two people can independently derive a PL^3/48EI mid-span deflection, it is also this app's own strongest check on its general integrator, not merely a convenience for the reader. Where a case can be produced two ways within the table itself -- an off-centre point load moved to the exact centre, a partial strip extended to cover the entire span -- both routes are required to reproduce each other's simpler, more specific closed form exactly, which is a second, independent layer of the same cross-checking discipline applied entirely within this module.

Implemented by kernel.deflection.cantilever_point_at_free_end_deflection, kernel.deflection.cantilever_point_at_free_end_slope, kernel.deflection.cantilever_point_at_distance_deflection, kernel.deflection.cantilever_uniform_deflection, kernel.deflection.cantilever_uniform_slope, kernel.deflection.cantilever_couple_deflection, kernel.deflection.cantilever_triangular_peak_at_support_deflection, kernel.deflection.simple_point_centre_deflection, kernel.deflection.simple_point_centre_end_slope, kernel.deflection.simple_point_offset_centre_deflection, kernel.deflection.simple_uniform_deflection, kernel.deflection.simple_uniform_end_slope, kernel.deflection.simple_couple_at_end_max_deflection, kernel.deflection.simple_couple_at_end_near_slope, kernel.deflection.simple_triangular_max_deflection, composition.deflection.standard_case_deflection.

M43   Deflection by Superposition core

Linear elasticity means the cases simply add. Cheap, and a free cross-check on the integrator.

v(x)=Σᵢ vᵢ(x) θ(x)=Σᵢ θᵢ(x)

Basis

For a linear-elastic beam, the deflection produced by several loads acting together is exactly the sum of the deflections each load would produce acting alone -- the same superposition principle that underlies the whole of linear structural analysis, applied here to combine standard cases from the table in the previous module into loadings that table does not cover directly.

Derivation

Superposition needs no derivation beyond the linearity of the governing differential equation itself: because the curvature relation is linear in the bending moment, and the bending moment from several loads is the sum of each load's own moment, the deflection from several loads integrates to the sum of each load's own deflection, at every station, automatically. What this module actually provides is not a new piece of mechanics but the bookkeeping that applies that fact to a beam whose loading is more elaborate than any single entry in the standard-case table -- decomposing the real loading into a set of cases the table already covers, evaluating each independently, and adding the results station by station.

v(x)=Σᵢ vᵢ(x) θ(x)=Σᵢ θᵢ(x)

Assumptions

Takes

SymbolUnitMeaning
cases1List of standard load cases to be added together.
span_LmLength of the beam from end to end, tails included. The same number as the distance between the supports only when the supports are at the two ends.
EPaStiffness in simple tension: stress divided by strain while the response is still straight.
I_xm^4Second moment of area about the horizontal centroidal axis; how the material is spread vertically.
x_stationmPosition along the beam at which a result is wanted.

Gives

SymbolUnitMeaning
v_deflmSideways movement of the beam axis at a given position.
theta_sloperadAngle the deflected beam axis makes with its original direction.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct summation of standard-case results, ordered the same magnitude-stable way the rest of this app sums any quantity built from terms that could differ significantly in size, so that the total does not depend on which order the individual cases happen to be listed in.

Limitations

Reading the result

Superposition is this chapter's cheapest possible cross-check on the general integrator: any loading built by combining standard cases can be solved both ways, by direct integration of the combined loading and by summing the separately integrated cases, and the two must agree to the same precision either route claims on its own. Because the result cannot depend on the order the individual cases are summed, reordering the list of loads being superposed and confirming the answer does not move is a useful, cheap habit whenever a combined loading is being built up by hand.

Implemented by composition.deflection.standard_case_deflection.

M44   Moment-Area and Conjugate Beam extended

The area under the curvature diagram is the change in slope; its first moment is the deviation.

θ_BA=∫_A^B(M/(EI))dx t_BA=∫_A^BM/(EI) x̄ dx

Basis

The curvature diagram along a beam -- bending moment divided by flexural rigidity, station by station -- carries geometric meaning of its own, independent of solving any differential equation directly: the area under that diagram between two stations is exactly the change in slope between them, and the first moment of that same area about a chosen station is exactly how far one point on the deflected beam sits from the tangent line drawn at another. Those two facts, the two moment-area theorems, turn a deflection calculation into a problem of areas and centroids on a diagram already available from the moment calculation.

Derivation

Both moment-area theorems follow directly from the same governing differential equation the general integrator uses, merely read geometrically rather than solved algebraically: integrating curvature between two stations gives the change in slope by the fundamental theorem of calculus, which is precisely the statement that the area under the curvature diagram between those stations equals that change; integrating curvature weighted by distance from a reference station gives the tangential deviation the same way. Because these are the same governing equation as the general integrator's, not a different piece of physics, the answer either theorem produces is required to agree with direct integration on the same beam -- a check between two constructions that share the underlying equation but essentially no code, since one solves a boundary- value problem for two constants of integration and the other accumulates areas and first moments directly.

Which of a deviation's two stations is the one "sitting at a distance from the tangent" and which is the one "the tangent is drawn at" is not a symmetric question -- swapping the two changes which theorem is actually being applied -- and it is, by the account carried in this app's own development history, the single easiest thing to get backwards in this part of the subject; the two stations are therefore named explicitly in the functions themselves (which station's deviation is being measured, and which station the tangent is drawn at) rather than left as an ordered pair whose order a caller has to remember correctly. Applying the two theorems between the two supports of a simply supported beam, and combining the resulting deviation with simple proportion along the span, gives the actual deflection at any station directly -- and the conjugate-beam method, taught separately in most courses as loading a fictitious beam with the real beam's own curvature diagram and reading its shear and moment as the real beam's slope and deflection, is, in this app, mathematically the identical construction carried out by the identical code: a different way of explaining the same two moment-area theorems, not a third independent method.

θ_BA=∫_A^B(M/(EI))dx t_BA=∫_A^BM/(EI) x̄ dx

Assumptions

Takes

SymbolUnitMeaning
span_LmLength of the beam from end to end, tails included. The same number as the distance between the supports only when the supports are at the two ends.
loads1List of the loads acting on the beam, each with its type, magnitude and position.
EPaStiffness in simple tension: stress divided by strain while the response is still straight.
I_xm^4Second moment of area about the horizontal centroidal axis; how the material is spread vertically.
x_stationmPosition along the beam at which a result is wanted.
x_refmPosition used as the reference when taking a tangential deviation.

Gives

SymbolUnitMeaning
theta_changeradChange in slope accumulated between two positions.
t_deviationmVertical distance from a point on the beam to the tangent drawn at another point.
v_deflmSideways movement of the beam axis at a given position.
theta_sloperadAngle the deflected beam axis makes with its original direction.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Both integrals -- the plain area for the slope-change theorem and the first-moment integral for tangential deviation -- are evaluated by four-point Gauss-Legendre quadrature applied piecewise between every station where the beam's own loading changes character. This is not an approximation with a hidden tolerance: between any two such stations the bending moment is a polynomial of degree at most three, so the product the tangential-deviation integral needs is of degree at most six, and four-point Gauss-Legendre integrates any polynomial up to degree seven exactly -- to the last bit double-precision arithmetic can represent, not merely to within some accepted error. Sampling the same integral on a uniform grid instead would converge only slowly across the diagram's own discontinuities and would need a stated tolerance to hide how well or poorly it was actually doing.

Limitations

Reading the result

This module's most convincing internal check is not a theorem at all, it is bookkeeping: the sign convention used inside the moment-area construction is the ordinary mathematical one, opposite to the positive-downward convention the rest of this chapter's deflections are reported in, and that flip is made exactly once, at the boundary of this module, specifically so a reader comparing this module's output against the general integrator's is comparing two numbers in the same convention rather than two numbers that happen to agree only after a sign is silently applied somewhere. A deflection from this module that appears to differ from the integrator's by a bare sign, rather than by a genuine discrepancy, is worth checking against that single flip point before concluding anything is wrong.

Implemented by composition.energy.slope_change, composition.energy.tangential_deviation, composition.energy.deflection_by_moment_area, composition.energy.deflection_by_conjugate_beam.

M45   Energy Methods for Deflection extended

Differentiate the stored energy with respect to the load whose deflection is wanted.

δᵢ=∂ U/(∂ Pᵢ)=∫(M/(EI))∂ M/(∂ Pᵢ) dx δ=ΣN n L/(AE)

Basis

Castigliano's theorem states that the deflection at the point a load is applied, in the direction of that load, is the rate at which the beam's total stored strain energy grows as that load itself grows -- differentiate the energy with respect to the load, and the result is the deflection. Carried out for a bending member, that differentiation is mathematically identical to the unit-load (virtual work) method: introduce a fictitious unit load at the point and in the direction whose deflection is wanted, and integrate the product of the real bending-moment diagram and the diagram that unit load alone would produce.

Derivation

Differentiating the strain energy stored in bending -- itself an integral of the bending moment squared, divided by twice the flexural rigidity -- with respect to one particular applied load, and carrying that differentiation inside the integral, produces an integral of the real bending moment multiplied by the rate of change of the moment with respect to that one load; and because the bending moment diagram is linear in every applied load individually, that rate of change is exactly the moment diagram a unit value of that same load, applied alone, would produce. The two named methods are consequently not two separate pieces of mechanics implemented twice in this app: they are one integral, computed by one function, reached by two different arguments for why it is the deflection being sought. The same idea extends directly to a pin-jointed frame's axial members, where the analogous integral collapses to a simple sum over the members, each contributing its own real force times the corresponding unit force, times its length, divided by its own axial stiffness -- the truss-analysis counterpart of the same virtual-work idea, with force replacing moment and a sum replacing an integral because each member carries a single, constant axial force along its whole length rather than a varying moment.

Getting the sign of that fictitious unit load right is worth stating plainly, because it is the one place the method can go quietly wrong without producing an obviously implausible number: the integral is a work, and it equals the deflection only when the unit load used to generate the second moment diagram is genuinely of unit magnitude in the assumed positive sense. A unit load entered as -1 instead of +1 produces an integral with its sign simply reversed, and nothing in the arithmetic itself signals that anything is wrong -- which is precisely why this distinction is stated directly in this module's own account of itself rather than left as an assumption a caller might not realise they were required to honour.

Where a deflection is wanted at a point carrying no real load at all -- the everyday case for finding the deflection under a bare span with the loads elsewhere -- the unit load is introduced as a genuinely fictitious addition to the real structure and the resulting integral is evaluated with the real structure's own loading, never by attempting to divide by an applied load of zero; the "dummy load" language some treatments use for this describes exactly that fictitious unit load, introduced symbolically and never actually needing to be carried to zero or divided into anything.

δᵢ=∂ U/(∂ Pᵢ)=∫(M/(EI))∂ M/(∂ Pᵢ) dx
δ=ΣN n L/(AE)

Assumptions

Takes

SymbolUnitMeaning
span_LmLength of the beam from end to end, tails included. The same number as the distance between the supports only when the supports are at the two ends.
loads1List of the loads acting on the beam, each with its type, magnitude and position.
EPaStiffness in simple tension: stress divided by strain while the response is still straight.
I_xm^4Second moment of area about the horizontal centroidal axis; how the material is spread vertically.
Am^2Cross-sectional area actually carrying the load.
GPaStiffness in shear: shear stress divided by the angle change it produces.
members1List of straight axial members with their forces, lengths and stiffnesses.
x_stationmPosition along the beam at which a result is wanted.
include_shear1Whether shear energy is counted alongside bending energy.

Gives

SymbolUnitMeaning
v_deflmSideways movement of the beam axis at a given position.
theta_sloperadAngle the deflected beam axis makes with its original direction.
U_totalJTotal work stored in the whole member.
delta_trussmMovement of a joint found by summing the stretch of every member.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

The bending integral is evaluated by the same exact, piecewise four-point Gauss-Legendre quadrature the moment-area module uses, for the same reason: the product of two moment diagrams between any two stations is a polynomial of bounded degree, and the quadrature is exact for it rather than merely accurate to a tolerance. The truss-member case needs no integration at all, only a plain, order-stable summation over the members supplied.

Limitations

Reading the result

Because this module's central integral is mathematically the same construction Maxwell-Betti reciprocity guarantees for the general integrator, the identity is available here too, in an especially direct form: computing a deflection at station B from a unit load at station A, and then computing the deflection at A from a unit load at B, must give the identical number, and the two calculations share almost no intermediate arithmetic beyond both being instances of this one function called with their arguments exchanged. A result that seems to differ from the direct integrator's or the moment-area module's own answer by a clean, exact factor of minus one is worth checking against the unit load's assumed positive sign before concluding the underlying beam has been described differently in the two calculations.

Implemented by composition.energy.virtual_work_deflection, composition.energy.strain_energy_bending, composition.energy.axial_member_sum.

Columns and Stability

M46   Buckling of Ideal Columns core

A slender column fails by going sideways long before the material yields. Which way it goes is a decision the user must see.

P_cr=π²EI/(KL)² σ_cr=π²E/(KL/r)² (KL/r)_c=√(2π²E/σ_Y)

Basis

A perfectly straight, centrally loaded, perfectly elastic column carries increasing axial load with no sideways movement at all until, at one particular load, a sideways deflected shape becomes possible in equilibrium alongside the straight one -- and below that load, the straight shape is the only equilibrium state, while at and above it, an infinitesimal sideways nudge finds no restoring tendency to return from. That load is the critical (Euler) load, and it depends on the column's bending stiffness and its length between points of zero moment, not on its material strength at all.

Derivation

Writing the equilibrium of a laterally deflected column under a compressive axial load -- the axial load acting through the sideways deflection produces a bending moment proportional to that same deflection, which is the destabilising mechanism itself -- gives a differential equation whose solution is sinusoidal, and requiring that sinusoid to satisfy the actual end conditions (zero deflection at both ends, for the simplest case) admits a nontrivial solution only at specific discrete loads, the smallest of which is the critical load: proportional to the flexural rigidity and inversely proportional to the square of the column's own length. A column free at one end and only restrained at the other reaches its own critical condition at exactly the same load as a pinned-pinned column of twice its own length, because the shape it deflects into between its restraint and an imagined mirror image beyond the free end is exactly half of the pinned-pinned column's own sinusoid -- which is the physical content behind the effective-length factor: each of the four classical end conditions is assigned a factor that expresses its own critical length as some multiple of an equivalent pinned-pinned column's length, and the critical load and critical stress are then the same formulas the ordinary pinned-pinned column uses, evaluated at that equivalent length rather than the physical one. The four classical factors' own critical loads, compared to each other at the same physical length and material, come out in the fixed ratio one to four to a little over two to one-quarter -- a purely geometric consequence of the four factors' own defining ratios, checkable independently of any column's actual dimensions.

Because the critical stress this relation predicts grows without bound as the column shortens, it eventually exceeds any real material's yield strength -- a physically meaningless prediction, since a short column crushes or yields long before an infinite stress could be reached. The slenderness ratio at which the ideal critical stress exactly equals the yield stress marks the boundary of where this module's own idealisation remains applicable at all; below that slenderness, the column's true behaviour has departed from the elastic (Euler) curve and belongs instead to the inelastic column module immediately following this one in the chapter.

Where a column is braced differently about its two principal axes -- lateral support along one axis that the other axis does not share, the ordinary case for a column braced by girts or sheeting running one way only -- the axis that actually governs is not necessarily the one with the smaller second moment of area; it is whichever axis gives the smaller critical load, and because the two axes can have different effective lengths as well as different second moments, that comparison has to be made explicitly, axis by axis, rather than assumed from the second moments alone. Comparing only the two second moments and picking the smaller is correct only when both axes share the same effective length, and is wrong in the unsafe direction -- overstating the column's true capacity -- the moment they do not.

P_cr=π²EI/(KL)² σ_cr=π²E/(KL/r)²
(KL/r)_c=√(2π²E/σ_Y)

Assumptions

Takes

SymbolUnitMeaning
EPaStiffness in simple tension: stress divided by strain while the response is still straight.
I_xm^4Second moment of area about the horizontal centroidal axis; how the material is spread vertically.
I_ym^4Second moment of area about the vertical centroidal axis.
Am^2Cross-sectional area actually carrying the load.
LmLength of the member along its axis.
K_x1Effective-length factor for buckling about the stronger axis.
K_y1Effective-length factor for buckling about the weaker axis.
end_condition1How the two ends of the column are held.
sigma_YPaStress at which the material stops behaving elastically.

Gives

SymbolUnitMeaning
P_crNLoad at which an ideal straight column first goes sideways.
sigma_crPaAverage stress in a column at the moment it buckles.
K_eff1Factor converting real length into the length of an equivalent pin-ended column.
slenderness1Effective length divided by radius of gyration; how slender the column is.
slenderness_c1Slenderness at which yielding and buckling become equally likely.
governing_axis1Which axis actually controls the buckling capacity.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation, entirely closed form, for the critical load, critical stress and critical slenderness alike -- nothing here searches or iterates. Determining which of two differently braced axes actually governs is a direct comparison of two independently computed critical loads (or, equivalently, two slenderness-scaled second moments) rather than a shortcut based on the second moments alone, precisely because that shortcut is unsafe whenever the two axes are not equally braced.

Limitations

Reading the result

The single most consequential number on this screen for a real design decision is not the critical load itself but which of the two principal axes actually governs it, because getting that comparison wrong -- assuming the axis with the smaller second moment always governs, when in fact a lateral brace has made that axis's effective length much shorter than the other's -- overstates the column's true capacity, which is the dangerous direction to be wrong in. Below the critical slenderness, the ideal curve this module draws is shown as inapplicable rather than erased entirely, because the curve itself is still a mathematically valid answer to a question that has simply stopped being the physically relevant one for a column that short.

Warning. Below the critical slenderness the column yields before it buckles, so the ideal buckling load does not apply.

Implemented by kernel.buckling.effective_length_factor, kernel.buckling.critical_load, kernel.buckling.slenderness_ratio, kernel.buckling.critical_stress, kernel.buckling.critical_slenderness, kernel.buckling.euler_is_applicable, solve.buckling.governing_axis, ui.decisions.buckling_axis.

M47   Eccentrically Loaded Columns core

The one relation in the app that cannot be inverted in closed form. Finding the allowable load needs a bracketed root search.

σₘₐₓ=(P/A)[1+ec/r² sec ((L/(2r))√(P/(EA)))] δ=e[ sec ((L/(2r))√(P/(EA)))-1]

Basis

A column loaded even slightly off its own centroidal axis begins bending from the very first increment of load, rather than remaining perfectly straight until a sudden bifurcation as the ideal column does -- the eccentric moment and the resulting deflection amplify each other progressively as the axial load grows, and the peak combined stress from that direct load and its own self-amplifying bending grows without bound as the load approaches the same ideal critical load the previous module established, even though no sudden bifurcation occurs.

Derivation

Solving the beam-column differential equation for a pin-ended member carrying a constant eccentricity at both ends -- the same governing equation as the ideal column, now carrying a particular, nonzero boundary eccentricity rather than admitting only the trivial straight solution -- gives a deflected shape whose maximum, at mid-height, is proportional to a secant of an angle built from the load, the length and the column's own bending stiffness. The peak combined stress -- direct stress plus the bending stress from that amplified mid-height moment -- follows directly by substituting the resulting deflection back into the ordinary combined axial-and-bending stress relation, producing the single closed-form expression that is the whole content of this module: a family of curves, one for each value of the eccentricity ratio, all of them sharing the identical vertical asymptote at the same ideal critical load the previous module derived, because the secant's own argument reaches a quarter turn -- where the secant itself diverges -- at exactly that load, independent of how large or small the eccentricity is.

This is the one relation in the whole app that genuinely cannot be rearranged to solve for the load directly given a target stress: the load appears both outside the secant and inside its own argument, transcendentally, and no algebraic manipulation removes that. Finding the allowable load is therefore the one place in this entire application where a bracketed root search is unavoidable rather than a matter of numerical convenience, and the bracket is not incidental to the method, it is the method: the answer, if one exists at all, must lie strictly between zero and the ideal critical load, because the peak stress is a continuous, monotonically increasing function of the load across exactly that open interval and diverges at its upper end. A search started from an arbitrary initial guess without that bracket could step past the pole at the critical load entirely and return a spurious value from the mathematically valid but physically meaningless far side of the secant's own periodicity -- a number that would look exactly like a legitimate answer without being one.

σₘₐₓ=(P/A)[1+ec/r² sec ((L/(2r))√(P/(EA)))]
δ=e[ sec ((L/(2r))√(P/(EA)))-1]

Assumptions

Takes

SymbolUnitMeaning
PNForce applied along the member axis, or the single load in a standard case.
Am^2Cross-sectional area actually carrying the load.
e_eccmDistance from the centroid to the line of action of the load.
c_extrememDistance from the neutral axis to the farthest fibre.
r_gyrmRadius of gyration; the distance at which all the area could sit and give the same second moment.
LmLength of the member along its axis.
EPaStiffness in simple tension: stress divided by strain while the response is still straight.
sigma_allowPaHighest normal stress permitted in service.
K_eff1Factor converting real length into the length of an equivalent pin-ended column.

Gives

SymbolUnitMeaning
sigma_maxPaLargest normal stress present.
delta_midmSideways movement at the middle of a member.
P_allowNLargest load an eccentrically loaded column may carry at the allowable stress.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation for the stress and deflection at a given load; finding the allowable load for a given stress is the one genuinely iterative calculation in this chapter (and one of the very few anywhere in this app), solved by a bracketed root search confined strictly inside the open interval between zero and the ideal critical load, stopping just short of the critical load itself rather than including it, since the stress is unbounded exactly there rather than merely large. At zero eccentricity the result is returned as exactly the plain direct stress, computed without evaluating the secant at all -- avoiding the numerically hazardous combination of a vanishing eccentricity factor multiplying a term that diverges as the load approaches critical, a 0 x infinity indeterminate form that the short-circuit sidesteps entirely rather than resolving by a limit.

Limitations

Reading the result

The whole family of curves this module produces, one for each eccentricity ratio, meets the ideal Euler curve from the previous module in the specific limit of zero eccentricity, and every curve in the family shares that same column's own critical load as an asymptote regardless of how large or small the eccentricity is -- reading this module's curves alongside the ideal column's is the fastest way to see concretely how a real column, which always carries some imperfection, "softens" away from the sharp bifurcation the ideal, perfectly centred case predicts into the smooth, progressively worsening curve every real eccentrically loaded column actually follows.

Implemented by kernel.buckling.secant_argument, kernel.buckling.secant_stress, kernel.buckling.eccentric_deflection, solve.buckling.allowable_eccentric_load, solve.buckling.NoAdmissibleLoad.

M48   Inelastic Column Behaviour extended

Short columns yield before they buckle. The parabola is built to meet the ideal curve tangentially.

σ_cr=σ_Y[1-σ_Y (KL/r)²/(4π²E)] P=σ_c A/(1+a (L_e/r)²) P_t=π²E_t I/(KL)²

Basis

Below the critical slenderness where the ideal elastic column's predicted stress would exceed the material's own yield strength, a column no longer buckles elastically at all -- some or all of its cross-section has already yielded before the ideal critical load is reached, and its true capacity falls below the ideal elastic curve rather than following it. Several distinct, independently developed empirical and semi-empirical constructions describe that falling-away. They are built on different principles and only one of them -- the parabolic form -- is constructed to meet the ideal elastic curve tangentially at the boundary where the two regimes meet; the other two reach the same territory by blending two limiting failure modes, and by substituting a reduced stiffness into the ideal formula, respectively.

Derivation

The parabolic (Johnson) formula is constructed, not derived from first principles, by requiring a downward-curving parabola in stress against slenderness to meet the ideal Euler curve at the critical slenderness with both the same value and the same slope at that meeting point -- a tangency condition, not a coincidence, and one this module's own property checks confirm directly rather than merely assume: value and first derivative agreeing at the critical slenderness is the literal condition the parabola was built to satisfy, and a side effect of building it that way is that the parabola returns exactly half the yield stress at that same critical slenderness, a specific, checkable number rather than an approximate one. Below the critical slenderness the parabola predicts a reduced but nonzero stress, falling toward the yield stress itself as the column shortens toward zero slenderness, by construction rather than by any additional assumption.

The hyperbolic (Rankine-Gordon) form instead blends two limiting failure modes directly: a short, stocky column's actual failure by simple crushing at a stated crushing stress, and a slender column's failure by ideal elastic buckling, combined into one empirical hyperbola in slenderness that approaches the crushing load as the column shortens toward zero slenderness and approaches the ideal elastic buckling load as it lengthens, with an empirical constant fixing how quickly the transition between the two limiting behaviours occurs for a particular class of material and column.

The tangent-modulus form takes an entirely different route: rather than fitting an empirical curve to the two known limits, it uses the same ideal Euler formula unchanged in its algebraic form, but replaces the material's constant elastic modulus with the local slope of the material's own stress-strain curve at the stress level the column is actually carrying -- a modulus that itself falls once the material starts to yield, capturing the loss of stiffness directly from the material's own measured behaviour rather than through any separately fitted empirical curve.

σ_cr=σ_Y[1-σ_Y (KL/r)²/(4π²E)]
P=σ_c A/(1+a (L_e/r)²) P_t=π²E_tI/(KL)²

Assumptions

Takes

SymbolUnitMeaning
EPaStiffness in simple tension: stress divided by strain while the response is still straight.
E_tangentPaLocal slope of the stress-strain curve at a point past the straight part.
sigma_YPaStress at which the material stops behaving elastically.
slenderness1Effective length divided by radius of gyration; how slender the column is.
Am^2Cross-sectional area actually carrying the load.
sigma_crushPaCompressive strength used by the empirical short-column form.
rankine_a1Empirical constant fixing where the hyperbolic column form bends over.
I_xm^4Second moment of area about the horizontal centroidal axis; how the material is spread vertically.
LmLength of the member along its axis.
K_eff1Factor converting real length into the length of an equivalent pin-ended column.

Gives

SymbolUnitMeaning
sigma_cr_parabolicPaColumn strength from the parabolic form used below the critical slenderness.
P_hyperbolicNColumn capacity from the empirical form that blends crushing into buckling.
P_tangentNBuckling load found using the local slope of the stress-strain curve instead of the initial one.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct, closed-form evaluation for all three constructions; none of them iterates internally. The tangent-modulus form is implemented as the identical critical-load formula the ideal-column module uses, called with the tangent modulus supplied in place of the ordinary elastic modulus, rather than as a separately derived expression -- because algebraically it is exactly that same formula, evaluated with a different stiffness.

Limitations

Reading the result

A real column, having already begun to yield, cannot be stronger than a purely elastic prediction, and the parabolic form satisfies that by construction: it lies on or below the ideal elastic curve at every slenderness whatever the yield strength and stiffness, so a parabolic value above the ideal curve is an error rather than a legitimate result. The other two carry no such guarantee, because each depends on a number the reader supplies -- the hyperbolic form's empirical constant and the tangent modulus -- and a constant too small, or a tangent modulus not actually below the elastic one, will put either of them above the ideal curve. That is a signal to check the input, not a defect in the relation. The parabolic form's exact half-yield value at the critical slenderness is a convenient, checkable landmark for reading any of the three curves at a glance: a design point sitting well above that landmark is deep in the elastic-buckling regime the ideal column module already covers, and one sitting well below it is approaching outright crushing rather than buckling in any meaningful sense.

Implemented by kernel.buckling.parabolic_stress, kernel.buckling.hyperbolic_load, kernel.buckling.tangent_modulus_load.

M49   Beam-Columns extended

Axial load amplifies whatever bending is already there, without bound as the critical load is approached.

M_max=M_0 sec ((L/2)√(P/(EI))) amplification=1/(1-P/P_cr)

Basis

A beam-column is not simply a beam and a column analysed separately and added together: an axial load acting through whatever lateral deflection bending has already produced adds a further moment of its own, which increases the deflection further, which increases the moment further still -- a feedback loop that only settles into a finite equilibrium because real material stays elastic and the loop's own gain stays below one. Superposing a plain beam's bending result onto a plain column's axial result, as if the two actions were independent, misses that amplification entirely, and misses it in the unconservative direction.

Derivation

Solving the governing beam-column differential equation exactly, for a pin-ended member carrying equal end couples together with an axial load, gives the peak moment as the applied couple multiplied by a secant of an angle built from the load and the member's own bending stiffness -- the same mathematical form, and the same eventual singularity, as the eccentrically loaded column's secant relation elsewhere in this chapter, because it is the identical differential equation solved for a different boundary condition (an applied end moment here, rather than eccentricity there), and the shared singularity is proved to be the same event rather than merely observed to be: the secant's argument reaches a quarter turn, in both cases, exactly at the member's own ideal (Euler) critical load.

Alongside that exact secant result, this module carries the approximate amplification-factor form nearly every design office actually uses in practice: multiply the bending moment computed while ignoring the axial load entirely by a simple factor, one over one minus the ratio of the applied load to the critical load. The two are not offered as a choice between a "correct" and a "convenient, less-correct" method with one preferred; the whole point of carrying both is that the gap between them is itself the subject worth showing -- they agree closely, typically within a few per cent, over most of the load range an engineer would actually design into, and they diverge together, sharing the identical singularity, only as the load approaches critical. A reader who sees only the approximation has no way of knowing, from the approximation alone, how much that convenience is costing at any given load; a reader who sees both does.

An initial bow -- a member that starts out already slightly curved rather than perfectly straight, before any load is applied at all -- produces no moment on its own, since a bow with no axial load has nothing to amplify; but once axial load is applied, the load acting through that initial curvature produces a moment exactly the way an applied eccentricity does in the eccentric-column module, and the resulting additional deflection grows by the identical amplification factor. A perfectly straight member -- zero initial bow -- consequently produces zero bow-induced moment at every load right up to, but not including, the critical load itself: the idealisation the whole ideal-column module rests on, made explicit here as the special case in which this module's own bow-amplification mechanism has nothing to amplify.

M_max=M_0 sec ((L/2)√(P/(EI))) amplification=1/(1-P/P_cr)

Assumptions

Takes

SymbolUnitMeaning
PNForce applied along the member axis, or the single load in a standard case.
P_crNLoad at which an ideal straight column first goes sideways.
M_coupleN*mCouple applied directly to the beam at a point.
EPaStiffness in simple tension: stress divided by strain while the response is still straight.
I_xm^4Second moment of area about the horizontal centroidal axis; how the material is spread vertically.
LmLength of the member along its axis.
a_initialmInitial bow already present at mid-length before any load is applied.

Gives

SymbolUnitMeaning
amp_factor1How much axial load magnifies bending already present.
u_secantradThe angle whose secant amplifies the moment. It reaches a quarter turn exactly at the buckling load, which is why the moment grows without bound there.
M_maxN*mLargest internal bending moment anywhere along the beam.
delta_midmSideways movement at the middle of a member.
delta_extramHow much further the mid-point moves than it already sat, once the axial load acts on the bow that was there to begin with.
M_bowN*mThe bending the axial load creates by pushing along a member that is not quite straight. Zero for a perfectly straight one, which is why the ideal column is an idealisation.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

The exact case is a direct, closed-form evaluation of the secant relation, sharing its singularity-avoidance discipline with the eccentric-column module: the peak moment is reported as unbounded growth, not a large finite number, once the secant's argument would reach or exceed a quarter turn. The approximate amplification factor is likewise direct evaluation, capped the same way at the same shared critical load. Neither branch of this module iterates or searches; the only genuinely iterative calculation touching this material is the allowable-load search in the eccentric-column module immediately preceding it, which this module's own amplification factor delegates to directly rather than re-implementing.

Limitations

Reading the result

The comparison this module is built to display -- the exact secant result against the simpler amplification-factor approximation, on the identical loading -- is worth reading before trusting the approximation alone in any individual case, because the exact result is always the larger, and larger unconservatively so, of the two: the approximation understates the true peak moment throughout the range where the two differ at all. A perfectly straight member's bow-induced moment reading as exactly zero at every load below critical, never a small but nonzero number, is the correct behaviour of the idealisation this module and the ideal-column module both share, not an omission -- an idealised, perfectly straight member genuinely has nothing for the axial load to amplify until some imperfection, however small, is actually introduced.

Implemented by kernel.beamcolumn.amplification, kernel.beamcolumn.secant_argument, kernel.beamcolumn.max_moment, kernel.beamcolumn.midspan_deflection, kernel.beamcolumn.total_midspan_deflection, kernel.beamcolumn.moment_from_bow.

Combined Loading and Connections

M50   State of Stress under Combined Loading core

Axial force, two bending moments, shear and torque acting at once. The closing screen, and the whole course in one picture.

σ=N/A±M_z y/I_z±M_y z/I_y τ=VQ/(It)+Tρ/J (added as vectors, not magnitudes)

Basis

A real member rarely carries just one action: a shaft can carry an axial thrust, bending about two axes, a transverse shear force and a torque, all at the same time, and every one of those five actions contributes to the stress state at a chosen point on a chosen cross-section. This module adds nothing new to the mechanics already established in earlier chapters; it assembles their individual contributions at one point and hands the resulting combined state to the transformation and failure machinery this manual has already established -- which is why it is placed last: it is the whole subject, brought together rather than extended.

Derivation

The normal stress at a point is the direct stress from the axial force plus the bending stress each of the two moment components produces there, summed exactly the way the combined axial-and-bending module earlier in this manual already establishes for one bending direction, extended here to two. The shear stress at the same point has two physically distinct sources -- transverse shear, from whichever shear force acts on the section, and torsional shear, from any applied torque -- and combining the two correctly is the one place in this module where the mechanics is genuinely subtle rather than a straightforward sum of already-known pieces: transverse shear acts along the section in the direction of the applied shear force, while torsional shear acts circumferentially, around the section's own axis, and the angle between those two directions is not fixed. It is a full right angle only at the extreme fibre, where the transverse shear has in any case already fallen to zero, and the two directions are exactly parallel -- not perpendicular at all -- on the neutral axis, which is precisely where the transverse shear is largest. Combining the two shear stresses as though they were always perpendicular, by taking the hypotenuse of their two magnitudes, is therefore correct only at the one point where doing so costs nothing, and understates the true combined shear everywhere else, worst exactly where a shear stress check actually looks; the two must instead be resolved into components at the specific level being examined and added as the vectors they physically are. This app's own combined-loading module once did take that hypotenuse, on the strength of a comment asserting the two directions were always perpendicular -- a hypotenuse is never larger than the true vector sum, so the resulting error sat entirely in the unsafe, understating direction, and was largest at exactly the level, the neutral axis, that a shear check is most likely to examine.

Once the combined normal and shear stress at a point are known, that point is treated as a plane-stress state exactly like any other, handed directly to the same principal-stress and failure-criterion machinery established earlier in this manual -- there is no separate combined-loading version of either calculation, because a stress state assembled from five different actions is, once assembled, indistinguishable from a stress state described directly.

Finding the single worst point on the section is not answered by checking only the two obvious candidates a reader would think to try -- the extreme fibre, where bending peaks and transverse shear has vanished, and the neutral axis, where the reverse holds -- because the true worst point, where the combination of both actions is most severe, is usually somewhere between the two and depends on the section's own shape and on the relative size of every action acting at once. This module answers that by scanning the section directly rather than by solving for a stationary point analytically, for the same reason a beam's peak-moment search scans rather than solving: the combined-stress function is smooth between any width steps in the section but not across them, and a search would need to know where those steps are in any case, so scanning a candidate set built to include every point that could plausibly govern is both simpler and no less rigorous than an analytic search would be. Two of this module's own defects, both found the same way -- a candidate that should have been named explicitly but was instead left for a uniform grid to land on by chance -- illustrate exactly what "built to include every such point" has to mean in practice: on a section without symmetry about its own centroid (a tee section is the case that surfaced it), an evenly spaced grid running from one extreme fibre to the other does not, in general, land exactly on the neutral axis at all, and the scan's reported worst point came out visibly offset from where the neutral axis actually was -- with the value at that offset point correct to six figures, because the combined-stress function is nearly flat right at its own peak, and only the location wrong, at exactly the point the branching in this module asks a reader to consider explicitly. The neutral axis is consequently included in the candidate set directly, by name, rather than left to a grid to land on. A related defect in the same scan, found the same way, was probing a hair's breadth to either side of every width step without checking that the probe point had not stepped past the section's own extreme face altogether -- which evaluated cleanly to a finite, plausible-looking state a fraction of a hairsbreadth outside the material, and was every bit as wrong as a garden- variety off-by-one for being a small error rather than a large one.

σ=N/A±M_z y/I_z±M_y z/I_y
τ=VQ/(It)+Tρ/J (added as vectors, not magnitudes)

Assumptions

Takes

SymbolUnitMeaning
N_axialNInternal force acting along the member axis at the cut being examined.
V_yNShear force component in the first transverse direction.
M_y_momN*mBending moment component about the first bending axis.
M_z_momN*mBending moment component about the second bending axis.
T_torqueN*mTwisting moment about the member axis.
Am^2Cross-sectional area actually carrying the load.
I_ym^4Second moment of area about the vertical centroidal axis.
I_zm^4Second moment of area about the axis used as the bending axis in unsymmetric work.
J_polarm^4Polar second moment of a round section; sets both twist and shear stress.
Q_firstm^3First moment about the neutral axis of the area lying beyond the level being examined.
t_at_ymWidth of the section at the level where the shear stress is being taken.
y_fibremDistance from the neutral axis to the fibre whose stress is wanted.
z_fibremDistance from the second bending axis to the point whose stress is wanted.
rho_radmRadius of the particular point being examined.

Gives

SymbolUnitMeaning
sigma_xPaNormal stress on the face whose outward normal points along the first axis.
tau_xyPaShear stress on the first face acting along the second axis.
critical_point1Point on the section that proves to be worst once every action is combined.
sigma_1PaLargest of the principal stresses.
sigma_eq_distortionPaEquivalent stress under the distortion-energy criterion.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation of the normal and shear stress at any given point, and an exhaustive scan -- not a stationary-point search -- to find the worst point on the whole section, with the candidate set built explicitly to include the extreme fibres, the neutral axis by name, both sides of every width step (each probed a hair's breadth inside the material rather than outside it), and a dense regular grid across the rest of the depth. The two shear-stress contributions are combined by resolving them into components at the level actually being examined and summing the components, never by treating their magnitudes as though the two directions were fixed relative to each other.

Limitations

Reading the result

The two obvious candidate points -- the extreme fibre and the neutral axis -- are shown alongside the scanned worst point specifically because neither one, on its own, reliably governs: reading only the extreme fibre misses whatever shear is doing elsewhere on the section, reading only the neutral axis misses the bending stress entirely, and the actual worst point is routinely neither. Any single action applied on its own, with every other action at zero, must reduce this module's result exactly to that single action's own dedicated module elsewhere in this manual -- checked independently for each of the five actions this module can combine -- which is both the simplest sanity check available on this screen and the concrete demonstration that this closing module is genuinely the earlier chapters assembled, not a new and separate calculation.

Implemented by composition.combined.normal_stress_at, composition.combined.shear_stress_at, composition.combined.state_at, composition.combined.critical_point, kernel.shear.torsion_resultant, kernel.transform.principal_major, kernel.transform.principal_minor, kernel.failure.distortion_equivalent.

M51   Shaft Design under Bending and Torsion core

Reduce a combined action to an equivalent single action, size for both, and take the larger diameter.

M_e=(1/2)(M+√(M²+T²)) T_e=√(M²+T²) d=(16T_e/(πτ_allow))^(1/3)

Basis

A shaft carrying both a bending moment and a torque at the same station must be sized against both actions at once, and rather than checking the two separately against two different allowable stresses, the combined state at the shaft's own extreme fibre can be reduced to a single equivalent bending moment and a single equivalent torque, each of which, sized in the ordinary single-action way, gives a diameter that keeps the actual combined stress within whichever of the two allowable stresses -- normal or shear -- would otherwise be exceeded first.

Derivation

At the extreme fibre of a circular shaft under combined bending and torsion, the normal stress from bending and the shear stress from torsion together define a plane-stress state whose maximum principal stress and maximum shear stress can each be written out directly in terms of the applied moment and torque; recognising that those two expressions have exactly the same algebraic form as the moment a pure bending problem, or the torque a pure torsion problem, would need to produce that same peak stress gives the equivalent moment and equivalent torque directly, each built from the same combination of the applied moment and torque under a square root. Sizing the shaft's diameter separately against each equivalent action, using the same closed-form diameter relation the power-transmission module elsewhere in this app already establishes for a solid shaft under torque alone, and taking whichever of the two resulting diameters is larger, guarantees that the shaft satisfies both the normal- stress and the shear-stress allowable simultaneously -- the larger diameter is, by construction, the one that was closer to being the binding constraint, and stating which of the two actually governs is not an afterthought but the entire point of carrying out the comparison at all, since a different material (a different ratio between its normal and shear allowables) can flip which of the two equivalents is the binding one for the identical applied moment and torque.

Mₑ=(1/2)(M+√(M²+T²)) Tₑ=√(M²+T²)
d=(16T_e/(πτ_allow))^(1/3)

Assumptions

Takes

SymbolUnitMeaning
M_xN*mInternal bending moment at the cut.
T_torqueN*mTwisting moment about the member axis.
sigma_allowPaHighest normal stress permitted in service.
tau_allowPaHighest shear stress permitted in service.

Gives

SymbolUnitMeaning
M_equivN*mSingle bending moment that would be as severe as the actual bending and torque together.
T_equivN*mSingle torque that would be as severe as the actual bending and torque together.
d_reqmSmallest diameter that satisfies the governing allowable stress.
governing_criterion1Which allowable stress sets the required size.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation, entirely closed form: both equivalent actions and both trial diameters follow from a single square root and a single cube root each, with no iteration anywhere. Both trial diameters are computed and compared explicitly, and which one governs is reported as a stated conclusion rather than left for a reader to notice by comparing two numbers unaided.

Limitations

Reading the result

The detail worth reading off this screen is not merely the final required diameter but which of the two equivalent actions produced it, because that answer is not fixed by the geometry alone: with no torque at all, the two equivalents both collapse to the applied moment itself, one directly and the other unchanged, while with no moment at all the equivalent torque is the full applied torque and the equivalent moment is exactly half of it -- and a shaft's own material, through the ratio between its normal and shear allowable stresses, decides which of the two governs for any combination between those extremes, which is precisely why both trial diameters are shown rather than only the larger.

Implemented by kernel.torsion.equivalent_bending_moment, kernel.torsion.equivalent_torque, kernel.torsion.required_diameter_solid, ui.decisions.shaft_criterion.

M52   Riveted and Bolted Joints extended

Three ways to fail, and the joint is only as strong as the weakest. Naming the winner is the whole point.

P_s=n(π d²/4)τ P_b=n d t σ_b P_t=(p-d) t σ_t η= min(P_s,P_b,P_t)/(p t σ_t)

Basis

A riveted or bolted lap joint can fail three distinct ways -- the fasteners themselves can be sheared through, the plate can crush locally against the fasteners (bearing failure), or the plate can tear across the net section remaining between the holes -- and the joint as a whole carries no more load than whichever of the three failure loads is smallest. The number a designer actually needs is not three separate strengths but a single stated conclusion: which one of the three governs, because that is the specific detail a design change would have to address to make the joint stronger.

Derivation

Each of the three failure loads follows from a direct strength calculation for its own distinct failure mechanism: rivet shear is the total cross-sectional area of every fastener, on however many shear planes each one is cut on, multiplied by the material's allowable shear stress; bearing is the total projected contact area between the fasteners and the plate (each fastener's diameter times the plate thickness) multiplied by the allowable bearing stress; and tearing is the net width of plate actually remaining between adjacent holes -- the pitch less one hole diameter -- times the plate thickness and the allowable tensile stress, which is directly why the tearing strength falls to exactly zero as the pitch closes in on the hole diameter itself: at that limit there is, quite literally, no solid plate left between adjacent holes to carry any tension at all. The joint's overall strength is the smallest of the three, and its efficiency -- how much of the plate's own unbroken strength the joint actually achieves -- is that governing strength divided by what the same width of plate would carry with no holes in it at all, a ratio that can never exceed one by construction, since a joint made from a plate with holes cut into it cannot be stronger than the same plate before any holes were made.

Reducing three numbers to a single named conclusion is not a display convenience layered on top of the calculation; it is treated as part of the calculation's own output, because reading the wrong one of the three numbers as though it were the governing one over-predicts the joint's true strength -- and the everyday intuition that "the strength is roughly the smallest of these three" still leaves a reader to identify which is smallest and to reason about what changing it would do, which is precisely the step this module's own governing-mode output performs directly rather than leaving to inspection.

P_s=n(π d²/4)τ P_b=n d t σ_b
P_t=(p-d) t σ_t η= min(P_s,P_b,P_t)/(p t σ_t)

Assumptions

Takes

SymbolUnitMeaning
d_rivetmDiameter of the rivet or bolt.
t_platemThickness of the plate being joined.
pitchmCentre-to-centre spacing of fasteners along a row.
n_rivets1Number of fasteners in one pitch length, counting every row. A double-riveted joint has two, whatever the length of the seam.
tau_allowPaHighest shear stress permitted in service.
sigma_bearPaHighest bearing pressure permitted between a fastener and the plate.
sigma_tensPaHighest tensile stress permitted in the plate.
shear_planes1Number of surfaces across which a fastener is cut.

Gives

SymbolUnitMeaning
P_shearNStrength of one pitch length if the fasteners fail by being cut through.
P_bearingNStrength of one pitch length if the plate crushes against the fasteners.
P_tearingNStrength of one pitch length if the plate tears across the line of holes.
P_jointNStrength of one pitch length, being the smallest of the three failure modes. Multiply by the number of pitches for the whole seam.
eta_joint1Strength of one pitch length divided by the strength of the same length of unbroken plate. All four quantities are per pitch, so the ratio is the same for the whole seam.
failure_mode1Which of the competing failure modes limits the joint.

Choices you have to make. The app shows these rather than picking one:

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation, entirely closed form, for all three failure loads and the resulting governing strength and efficiency; nothing here iterates. The governing mode is determined by a direct three-way comparison, named explicitly as a conclusion rather than left as three numbers for a reader to compare unaided. A rule-of-thumb starting diameter for a rivet, given only the plate thickness, is also provided as a conventional first estimate, distinct from -- and not a substitute for -- the three strength checks the module actually verifies a chosen diameter against.

Limitations

Reading the result

The single conclusion this screen is built to deliver -- which of the three modes governs, and by how much the next-weakest mode exceeds it -- is more useful for design decisions than any of the three raw numbers alone, because it says directly what a change to the joint would need to target: a shear-governed joint gets stronger from a larger or an extra fastener, a bearing-governed one from a thicker plate or a larger fastener diameter, and a tearing-governed one from a wider pitch, and improving the wrong one of the three leaves the joint's true strength exactly where it was.

Implemented by kernel.joint.rivet_shear_strength, kernel.joint.bearing_strength, kernel.joint.tearing_strength, kernel.joint.solid_plate_strength, kernel.joint.governing_strength, kernel.joint.governing_mode, kernel.joint.efficiency, kernel.joint.unwin_rivet_diameter, ui.decisions.joint_failure_mode.

M53   Welded Joints extended

A fillet weld fails across its throat. Eccentric loading adds a torsional component that must be summed as a vector.

t_throat=0.707s P=0.707 s L_w τ_allow τ_res=|τ⃗_direct+τ⃗_torsional|

Basis

A fillet weld does not fail across the leg dimension a welder actually lays down; it fails across its throat, the shortest path through the weld metal connecting the two members, which for an equal-legged fillet is smaller than the leg by a fixed geometric factor. A weld loaded through the centroid of its own group carries only that direct shear across the throat, but a load applied off-centre from the weld group's own centroid additionally twists the group, adding a torsional shear component that must be combined with the direct one as the vector quantities they physically are, not simply added as magnitudes.

Derivation

The throat of an equal-legged fillet weld is the perpendicular distance from the weld's own root to the hypotenuse of the right-angled triangle its cross-section forms, which for two equal legs is the leg length divided by the square root of two -- the same geometric factor, inverted, that appears throughout this app wherever a forty-five-degree diagonal of a right isosceles triangle is involved. The strength of a run of fillet weld follows directly as that throat dimension times the weld's own effective length and the material's allowable shear stress.

Where a load is applied with some eccentricity from a weld group's own centroid, that eccentricity is statically equivalent to the same load acting through the centroid together with a twisting moment equal to the load times the eccentricity -- exactly the same equivalent-force-and-couple reasoning the combined-loading and eccentric-column modules elsewhere in this app use for an off-centre axial load. The direct shear this produces is uniform across the whole weld group, while the torsional shear this twisting moment produces at any point in the group varies with that point's own distance from the centroid and acts perpendicular to the line from the centroid to that point -- which means the two are perpendicular to each other only at specific points around the group, and in general must be resolved into components and added as vectors rather than combined by adding their magnitudes, which would overstate the true peak stress, sometimes by a wide margin, exactly the same class of error this app's own combined-loading module was once found to make in the opposite (unsafe) direction for a different pair of shear stresses. The polar moment governing how strongly the weld group resists twisting is the sum of the group's own second moments of area about two perpendicular axes through its centroid -- an ordinary polar second moment, following the identical perpendicular-axis relation the section-properties chapter establishes for any planar shape, applied here to the weld group's own layout rather than to a solid cross-section.

t_throat=0.707s P=0.707 s L_w τ_allow
τ_res=|τ⃗_direct+τ⃗_torsional|

Assumptions

Takes

SymbolUnitMeaning
s_legmLeg length of a fillet weld, measured along the joined faces.
L_weldmEffective length of weld run resisting the load.
tau_allowPaHighest shear stress permitted in service.
PNForce applied along the member axis, or the single load in a standard case.
e_eccmDistance from the centroid to the line of action of the load.
weld_group1Layout of the individual weld runs making up a group.

Gives

SymbolUnitMeaning
t_throatmShortest distance across a fillet weld, where it actually fails.
P_weldNForce a weld run may carry across its throat.
J_weldm^4Polar second moment of a weld group about its own centroid.
tau_weldPaPeak shear stress across the weld throat.

What must always be true here. Each of these is a test in the suite, not a remark:

Where it stops.

Solution method

Direct evaluation, entirely closed form. The direct and torsional shear components are resolved along a common pair of directions and combined by summing components before taking the resultant magnitude, never by adding the two magnitudes directly, for the same physical reason -- and following the same discipline -- as the combined-loading module's own transverse-and- torsional shear combination earlier in this manual.

Limitations

Reading the result

A weld group loaded exactly through its own centroid is the useful sanity check for this module, because the eccentricity term then vanishes identically and the result must reduce to plain, uniform direct shear across the throat -- any nonzero torsional contribution appearing at zero eccentricity signals an error in how the load's point of application was described, not a legitimate result. Where the eccentricity is genuine, the peak stress is not generally at the point closest to the load; it is at whichever point in the group has the largest combined direct-plus- torsional vector, which is usually, but not automatically, the point farthest from the group's own centroid.

Implemented by kernel.joint.fillet_throat, kernel.joint.fillet_strength, kernel.joint.weld_group_polar_moment, kernel.joint.eccentric_weld_stress.

Verification against independent sources

Every comparison below is a test that runs. The published value is what an independent, public-domain reference prints; the computed value is what this app produces from the same inputs. Where they disagree, the disagreement is recorded rather than removed.

These are the layer-5 checks described in the chapter on verification — the only layer independent of the primary references. The other four layers run against many more points than are listed here; this chapter covers the ones checked against an outside authority.

Buckling of Ideal Columns

Source: AFFDL-TR-69-42 (AD-759 199), Stress Analysis Manual.

QuantityPublishedComputedUnitVerdict
slenderness ratio of a pinned square column34.634.61agrees
slenderness ratio of a pinned round column48481agrees

Composite Section Properties

Source: AFFDL-TR-69-42 (AD-759 199), Stress Analysis Manual.

QuantityPublishedComputedUnitVerdict
radius of gyration of a square section0.1730.173inagrees
radius of gyration of a round section0.250.25inagrees

Flexure Formula and Section Design

Source: AFFDL-TR-69-42 (AD-759 199), Stress Analysis Manual.

QuantityPublishedComputedUnitVerdict
flexure stress at the extreme fibre60006000psiagrees

Plastic Section Modulus and Shape Factor

Source: AFFDL-TR-69-42 (AD-759 199), Stress Analysis Manual.

QuantityPublishedComputedUnitVerdict
moment at first yield of a rectangular bar3660036600in-lbagrees
plastic shape factor of a rectangle1.51.51agrees
fully plastic moment of a rectangular bar5490054900in-lbagrees

Power Transmission and Shaft Sizing

Source: AFFDL-TR-69-42 (AD-759 199), Stress Analysis Manual.

QuantityPublishedComputedUnitVerdict
torque delivered by 20 hp at 300 rpm42004200in-lbagrees
torque taken off by 8 hp at 300 rpm16801680in-lbagrees
torque taken off by 12 hp at 300 rpm25202520in-lbagrees

Propped and Fixed Beams

Source: AFFDL-TR-69-42 (AD-759 199), Stress Analysis Manual.

QuantityPublishedComputedUnitVerdict
fixed-end moment of a propped cantilever with an overhang-4375-4375in-lbagrees

Riveted and Bolted Joints

Source: AFFDL-TR-69-42 (AD-759 199), Stress Analysis Manual.

QuantityPublishedComputedUnitVerdict
bearing capacity of a four-rivet joint2000020000lbagrees

Rotating Discs, Rings and Cylinders

Source: NASA TM X-73305 / X-73306 / X-73307, Astronautic Structures Manual, Volumes I-III.

QuantityPublishedComputedUnitVerdict
rim speed of a disc spinning at sixteen thousand rpm25132.825132.8in/sagrees
radial stress at the centre of a spinning solid disc108310108310psiagrees
hoop stress at the centre of a spinning solid disc108310108310psiagrees

Shaft Design under Bending and Torsion

Source: AFFDL-TR-69-42 (AD-759 199), Stress Analysis Manual.

QuantityPublishedComputedUnitVerdict
shaft diameter under combined bending and torsion1.7261.726inagrees

Shear Flow and Fastener Spacing

Source: AFFDL-TR-69-42 (AD-759 199), Stress Analysis Manual.

QuantityPublishedComputedUnitVerdict
load carried by one web-to-flange rivet594594lbagrees

Strain Energy, Sudden and Impact Loading

Source: NASA TM X-73305 / X-73306 / X-73307, Astronautic Structures Manual, Volumes I-III.

QuantityPublishedComputedUnitVerdict
deflection of a spring under a weight released from rest88inagrees
deflection of a spring under a weight dropped twelve inches14.614.6inagrees

Thick Cylinders and Spheres

Source: AFFDL-TR-69-42 (AD-759 199), Stress Analysis Manual.

QuantityPublishedComputedUnitVerdict
maximum shear stress in a thick cylinder2250018000psidisputed (published value adjudicated at fault)

Thin-Walled Closed Tubes

Source: NASA TM X-73305 / X-73306 / X-73307, Astronautic Structures Manual, Volumes I-III.

QuantityPublishedComputedUnitVerdict
area enclosed by the mid-line of a rectangular tube16.2416.24in^2agrees
Bredt shear stress in a rectangular closed tube1539415394psiagrees
angle of twist of a rectangular closed tube0.1220.122radagrees
shear stress in a tapered closed tube at mid-length14141414psiagrees
shear stress in a tapered closed tube at the built-in end15911591psiagrees

Thin-Walled Open Sections in Torsion

Source: AFFDL-TR-69-42 (AD-759 199), Stress Analysis Manual.

QuantityPublishedComputedUnitVerdict
maximum shear stress in a thin open section86108610psiagrees
angle of twist of a thin open section0.860.86radagrees

Thin-Walled Pressure Vessels

Source: AFFDL-TR-69-42 (AD-759 199), Stress Analysis Manual.

QuantityPublishedComputedUnitVerdict
hoop stress in a thin cylinder1200012000psiagrees
longitudinal stress in a thin cylinder60006000psiagrees

Torsion of Circular Shafts

Sources: AFFDL-TR-69-42 (AD-759 199), Stress Analysis Manual; NASA TM X-73305 / X-73306 / X-73307, Astronautic Structures Manual, Volumes I-III.

QuantityPublishedComputedUnitVerdict
stiffness of a pair of round torsion bars312000312000in-lb/radagrees
shear stress in a tapered round shaft where the radius is one inch3819738197psiagrees

Torsion of Noncircular Prismatic Shafts

Source: NASA TM X-73305 / X-73306 / X-73307, Astronautic Structures Manual, Volumes I-III.

QuantityPublishedComputedUnitVerdict
twist coefficient beta for a rectangle at b/d = 20.2290.2291agrees
stress coefficient alpha for a rectangle at b/d = 20.2560.2461disputed (published value adjudicated at fault)
torsion constant of a 5 x 2.5 rectangle7.15617.8906in^4disputed (published value adjudicated at fault)
angle of twist of a 5 x 2.5 rectangular shaft0.11180.0447162raddisputed (published value adjudicated at fault)

Transverse Shear Stress

Source: AFFDL-TR-69-42 (AD-759 199), Stress Analysis Manual.

QuantityPublishedComputedUnitVerdict
first moment of area above the neutral axis0.50.125in^3disputed (published value adjudicated at fault)
maximum transverse shear stress30075psidisputed (published value adjudicated at fault)

What the tally means

Of the comparisons above, 32 agree exactly with the published value and 6 do not. A disagreement is not a defect in either direction until it has been adjudicated, and each one here has been, in writing, on grounds independent of this app's own implementation: a first moment of area that would have to be negative just above the point it was taken at, a rectangle's torsion constant printed one power of the side length short of the unit it is supposed to carry, a shear stress that used the wrong one of two nearly-equal radii in a denominator. Where the published source was found to be at fault, the test asserts that this app does not reproduce the published number, so that a later change which quietly matched it would fail.