Theory

Every relation this app uses, the assumptions behind it, where it stops being valid, and what it does at the edges. One entry per screen, in the order the app presents them.

Everything here is generated from the same specification file the app reads, so a relation shown here is the relation the app evaluates. Values are in newtons and millimetres throughout, which is the unit set the whole app works in.

Contents

Scope, and how to read this manual

This manual states, for every calculation the app performs, what relation is being evaluated, what it assumes, how it is solved, and where it stops being trustworthy. It is written to be consulted rather than read through: each module is self-contained, and nothing later depends on anything earlier except the conventions set out in the next two chapters.

It is not a textbook. It does not teach structural analysis from first principles, it does not work exercises, and it assumes a reader who has met the subject before and wants to know precisely what this particular program does. Where a derivation is given it is given to fix the assumptions, not to instruct.

Every module entry has the same shape, in the same order:

Basis names the principle the relation rests on. Derivation shows how the working relation follows from it, including the steps where a choice was made. Assumptions lists what must be true for the result to mean anything, each stated so that its failure is recognisable. Takes and Gives tabulate the symbols with their units and meanings. Choices you have to make appears where a relation has more than one branch and the app puts a control on the screen rather than picking for you; Cases this screen covers without asking appears where a branch is settled by the numbers already entered or by both sides being shown at once, and the chapter on choices below says how each of those is presented and how to see which case you are in. What must always be true here lists the invariants. Each one is a record in the specification that the test suite turns into a test of its own, so the test count moves when the canon moves. Every current invariant, trend and boundary has an executable checker; the former deferred registry is empty. Where it stops gives the limits and singular points. Solution method says how it is actually computed, closed form or otherwise. Limitations says what the answer does not cover. Reading the result is about interpretation, and is where the common mistakes are named.

The formulas, symbols, units, invariants, boundaries and guards are generated directly from the same specification file the app itself loads at launch. A relation printed here is therefore the relation the app evaluates — not a description of it that could fall out of step. There is one module where that does not hold, the frame effective length, and its entry says so in the place a reader would look. The prose sections are written by hand and checked against the code by a gate that requires each entry to name the functions it describes and verifies those functions exist.

Numbers on screen and numbers in a file are not written to the same precision, and comparing a reading against this manual requires knowing which is which. The screen shows four significant figures, because that is what the printed tables this app replaces carry and because a reader cannot act on more. An exported table carries seventeen — the shortest count that reproduces a double-precision number exactly — so a value taken out as a comma-separated file and read back into a spreadsheet or a script is bit for bit the value that was on the screen, not a rounded copy of it. Figures leave as an image or as true vector, in which strokes stay strokes and text stays text at any magnification. The plain-text copy that rides on the clipboard is the exception and is written at the screen's four figures, because a person reads it.

This document is delivered twice from one source: as these pages, and inside the app itself, where the same generated markup is parsed and drawn with the platform's own text views. The app embeds no web browser, which is a consequence of a rule it holds elsewhere — it makes no network request of any kind, and on this platform a sandboxed application cannot show even a purely local document in a web view without asking for permission to open outgoing connections. The document you are reading and the one in the Help menu are therefore the same document, generated once.

Notation, sign conventions and axes

Conventions are not facts, and most disagreements between two correct calculations are disagreements about convention. This chapter fixes the ones this app uses. Where a convention differs from another common choice, the difference is stated rather than assumed away.

Axes. A right-handed set with x to the right and y upward. Angles are measured anticlockwise from the positive x axis. Moments and rotations are positive anticlockwise, so a positive moment about the origin turns the positive x axis toward the positive y axis.

Direct stress. Tension is positive. This is the ordinary convention in mechanics of materials and the opposite of the one usual in soil mechanics and in some concrete design work; the retaining-wall module notes where it works compression-positive instead, because that is how base pressures are read.

Shear force and bending moment. A bending moment is positive when it causes sagging — compression in the top fibre, tension in the bottom. Shear is positive when the left-hand part of a cut tends to move up relative to the right-hand part. These two choices are related: with them, the moment is the integral of the shear, and the shear is the integral of the load, both without a sign correction. Choosing the other convention for either one breaks that.

Section properties. Second moments are taken about centroidal axes unless the symbol says otherwise. I_x bends about the x axis, so it governs bending in the vertical plane. A section modulus is second moment over extreme-fibre distance, and where the section is unsymmetric the app gives one for each face rather than one number that silently means the worse of them.

Member forces. Axial tension in a member is positive; a strut carries a negative axial force. Some published tables print magnitudes with the word "strut" or "tie" instead of a sign, and where a value in this project was taken from such a table the sign is this project's, not the source's.

Units. Newtons and millimetres throughout, which makes stresses come out in newtons per square millimetre — numerically identical to megapascals. Second moments are then in mm⁴, which produces large numbers; the app displays them in scientific notation rather than rounding them. Nothing in the app carries a unit system that switches, because a unit switch is a class of defect that testing finds late and users find first.

Solution methods used throughout

Most of the app is closed form: a relation with a known solution, evaluated directly. Where that is not possible, one of a small number of numerical methods is used, and they are described here once rather than in every module that depends on them.

Direct evaluation. The default. Nothing iterates, and the result carries the precision of the arithmetic rather than of a tolerance. Where an expression is ill-conditioned — a difference of two nearly equal large quantities — it is rewritten algebraically rather than evaluated as written. The high-precision verification layer exists partly to confirm that such rewrites still compute the quantity they claim to.

Bracketed root finding. Used where a relation is transcendental, such as the fixed-pinned column condition or an elastic restraint. A bracket is established from the physics — two values known to straddle the root, with a sign change guaranteed between them — and bisected. Bracketing from the physics rather than searching from a guess is what makes the result deterministic: the method cannot wander to a different root, because no other root lies inside the bracket.

Direct stiffness solution. Used for every framed structure. Element stiffnesses are formed in local axes, transformed to global axes, assembled into a system matrix, restrained, and solved by hand-written elimination rather than a general linear-algebra library. Discretisation contributes a modelling error — a coarse mesh answers a slightly different question exactly — but the elimination itself is not error-free: a slender member's axial and bending terms can differ by many orders of magnitude in the same matrix, and eliminating one against the other subtracts nearly equal numbers, which is real numerical error rather than a modelling one. The solver reports a condition measure alongside the result for exactly this reason, because both that cancellation and a structure nearly a mechanism produce it, and a reader cannot tell the two apart from the displacements alone.

Eigenvalue extraction. Used for buckling of a discretised model, and the name is the general term rather than this app's method: no eigensolver runs. The geometric stiffness is formed proportional to the current member forces, and the combined stiffness is factorised at a trial load factor and its negative pivots counted — Sylvester's law of inertia, which gives the number of buckling modes already passed without naming any of them. The smallest critical factor follows from bisecting on whether that count is still zero, needing nothing but the same factorisation the direct stiffness solution already performs. The result is a bifurcation load for a perfect structure, which is an upper bound that no real structure attains.

Numerical integration. Used where a distributed quantity must be accumulated along a member, and the rule is chosen case by case rather than once. In the energy methods the degree of the integrand is known before the integration starts — a straight virtual moment diagram against a parabolic real one is a cubic — and the rule chosen integrates that degree exactly, so what comes back carries no quadrature error at all; the square of a parabola is a quartic and gets a second rule for the same reason. The deflection-by-integration screen is the exception, and its own entry says so: its integrand has no fixed degree, and it is accumulated by the trapezium rule over four hundred equal steps, so the number it returns is a discretised value rather than an exact one.

Guard values. Functions signal an input outside their domain rather than raising, and the signal is chosen case by case rather than fixed to one value. A negative length or a negative area, which have no physical reading at all, get a not-a-number. A zero length in a stiffness relation, by contrast, is a real limit rather than an invalid state — a member shrunk to nothing is infinitely stiff — so the frame elements return signed infinity there, the same choice made wherever a genuine physical limit is being approached rather than a domain violated: a column loaded exactly at its critical load, a shaft delivering power at standstill. A modulus of zero behaves according to where it appears: as a multiplying factor it correctly gives zero stiffness, and where it would appear in a denominator instead the relation is guarded to not-a-number rather than returning the infinity that raw division would give, because a material with no stiffness at all is being treated as an invalid input there rather than a limit worth reporting. What every one of these has in common is deliberateness: the value returned is chosen for what it means, lets an invalid or limiting intermediate propagate visibly to the screen instead of stopping the whole calculation, and makes the edge case testable in the same way as an ordinary one.

Choices, and where each one lives

A relation with more than one branch is where a reader most easily walks away with a wrong answer and no way to know it. The specification records twenty-nine such branches across the forty-five screens, and each one carries a statement of how it is presented — which is checked by a gate rather than described here and left to drift. This chapter says what those presentations are, so that the two headings printed under each module entry can be read for what they mean.

Seventeen of the twenty-nine appear as a control of their own, in a panel headed Choices, each with the reason the options differ printed beside it — a control offering two names and no reason is a control the reader takes the first item from. Those seventeen are the ones listed under Choices you have to make in the entries below. An eighteenth is a control as well, but not one of its own: on the matrix screen the choice between a bar element and a frame element is made by picking a truss shape or a frame shape, so it is the shape picker every structural screen already carries. Because the lists below are grouped by whether a branch drives a field of its own, that one appears under the second heading; it is the single exception, and it is named here rather than left to be found.

Moving a control moves something the reader can see. On the state each screen opens on, thirteen of the seventeen move a number: choose a sphere instead of a cylinder and the hoop stress halves, choose a closed cell instead of an open section and the torsion constant rises by two orders of magnitude, choose sway instead of braced and the effective length crosses from below the storey height to above it. The other four move the relation printed beside the reading and not the reading itself, and in each case that is the point of the branch rather than a control that does nothing. Two are theorems: the unit-load method and Castigliano's theorem agree to the last digit on a linear elastic structure, and the four routes through a beam's own moment diagram are one integration written four ways. One is a property of the opening shape: a beam carried on ground is not held at a node, so putting a spring at that node changes nothing, and the relation beside the reaction says exactly that. And on the classical-methods screen the slope-deflection and force-method routes reach the same end moments, which is what the branch exists to demonstrate. A reading in this app is a number together with the relation that produced it, and a control that moves only the second half is still moving something the reader can check.

The remaining twelve are listed under Cases this screen covers without asking. One of the twelve is the element-type choice described above, which does have a control — the shape picker — and is under that heading only because it drives no field of its own. Silence is not the same as absence, so each of the other eleven is presented some other way, and there are three ways.

Five are decided by numbers the reader has already entered, and a control beside them could only be set to contradict them. The rosette a strain gauge is, is the three gauge angles and nothing else; whether a force system reduces to a single force, a couple, or nothing is what its two components and its moment already say; whether a section is bearing over its whole base or lifting is which side of the core the resultant sits on, and the resultant is the load and the moment already typed; whether a gravity wall's base is in full contact is fixed by the base width and the height. In every one of these the screen names the case in the relation printed beside the affected reading — the route that ran, the case that holds, the formula that produced the pressure — so the case appears on the screen rather than in a document the reader does not have. The fifth of them is a span load's direction in the matrix screen, where no shape this release offers puts a span load on a tilted member, so the two options are two names for the same load; the distinction is carried in the composition layer and will need a control the day a pitched member gains one.

Three are outputs rather than questions. Whether a structure is a mechanism, determinate or redundant is a property of what the reader drew, and a selector would let them assert that a collapsing frame is determinate and be shown a determinate answer; the counts and the solver's verdict are on the screen instead. Where the largest bending moment sits — at a stationary point or at a load — is found by searching for both, so a control could only switch one of the searches off. The number of half-waves a plate buckles into is the count that minimises the coefficient, found by search and printed as a row of its own, because two aspect ratios either side of a crossing buckle into different shapes with the same coefficient and only the printed count makes that visible.

Two are cases where one side of the branch is what ships, and the honest thing is to say which. The inelastic column shows both the tangent-modulus and the reduced-modulus loads side by side and always will: they bracket the real answer from below and above, the width of the bracket is the reading, and a control could only hide one end of it and leave a bound looking like an answer. The bending-stress screen evaluates only the principal-axis case, because it takes two second moments and no product of area, and it says so in the relation beside the neutral-axis angle. Each carries a written condition for when the exemption expires — a product of inertia becoming an input, or the two bracketing loads ceasing to be shown together — so the reason is a claim that can be tested later rather than a decision that outlives its own justification. The transformed section is no longer in this list: uncracked and cracked are now a visible choice, and the neutral axis, inertia and both stresses follow that choice together.

How the results were verified

Five independent kinds of check are used here, and they do not all reach the same distance. The layers are independent in a specific sense worth stating: each is capable of catching a class of error the others cannot, so a quantity that has passed all five stands on ground that a quantity passing only one does not. How far each layer actually reaches is stated with it below, because a layer's coverage is part of what its verdict means — and the two layers that catch the most are the two that reach least far.

Layer 1 — printed values. Worked examples and tables transcribed from reference works, at the precision those works print. Seventeen files of them, one per module reached. This layer catches a formula transcribed wrongly, or a quantity computed in the wrong units. It cannot catch a misreading of the source, because it is the reading of the source.

Layer 2 — high precision. The same relations recomputed at sixty digits of working precision using arbitrary-precision arithmetic and stored to twenty significant figures, by a program that does not import the app's code. Twenty-nine files, and the widest of the five layers. This layer catches conditioning problems and cancellation — the cases where an algebraically correct expression loses its significant digits. The generating scripts are forbidden from importing the package they check, for the obvious reason: a fixture produced by the program under test agrees with it forever and proves nothing.

Layer 3 — symbolic. Where the app uses a closed-form solution to an implicit relation, a symbolic algebra system verifies the closed form actually satisfies that relation. This catches an error no numerical comparison can: a plausible formula that is not the root of the equation it claims to solve. It is also the narrowest layer here: one module is covered, the principal second moments, whose pair of closed forms is proved to satisfy the characteristic equation and to leave the two tensor invariants and the vanishing product of area exact for arbitrary symbols. The other implicit relations in the app — the tangent condition, the elastic restraint, the secant formula — are bracketed and bisected rather than solved in closed form, so there is no closed form for this layer to check.

Layer 4 — properties. Invariants and monotonic trends checked over whole parameter ranges by generated inputs rather than at chosen points. Every claim in a module's "What must always be true here" is registered as one of these and all current records run. This layer catches errors that hide between the points a person would think to test.

Cross-language conformance. Not a sixth layer of physics, and it is listed here because it is what makes every layer above mean something on the device a reader actually holds. Two independent implementations exist — one in Python, which is where the five layers above run, and one in Swift, which is what ships. Nothing above would catch a relation that had been translated wrongly between them, and this project has twice found a module that existed on one side and simply not on the other, invisible to every fixture because a fixture nobody wrote compares nothing. So both sides are run over the same inputs and compared directly. As this manual was generated the comparison covered 542 kernel relations against the sixty-digit reference at a tolerance of five parts in a hundred thousand billion, 5245 screen readings across all forty-five screens, and 1898 guardrail quantities and display decisions; both sides load a specification with the same fingerprint, which is compared as part of the same run.

That last count is new, and its absence had been costing something specific. Until it existed nothing compared the two implementations' guardrails or their display decisions at all — the numbers agreed and the sentences beside them were unchecked. It found a disagreement on its first run, which turned out not to be a translation error but a quantity two ways of computing it can legitimately differ on near zero; it is now compared with a named absolute floor and with the decision itself compared exactly. The screen-reading count moved from 4373 to 5245 over the same period, and the increase is mostly capabilities that had been written, fixture-checked, and never wired to a screen: a spherical pressure vessel, a delta strain rosette, a closed thin-walled section, a per-member breakdown, a joint-by-joint equilibrium check.

Layer 5 — independent sources. Values published in the public-domain engineering literature, compared against the app's results. This is the only layer independent of the primary references, and therefore the only one that can catch a misreading of them. It is also the layer with the least coverage, and that is stated rather than left to be inferred: thirty-seven comparisons across ten of the forty-five modules. The remaining thirty-five have layers 1 to 4 and no outside check at all. The shortfall is not for want of looking — the five public-domain manuals used here were searched module by module, and for several subjects, the strain rosette and the assumed-shape buckling methods among them, they carry no worked example in any spelling. Where a module below carries no row in the verification chapter, that is what it means.

On the reliability of published sources. Layer 5 has repeatedly found the published value to be the one at fault. Of the closed-form worked examples examined in the aerospace structures literature used here, several print answers that do not follow from their own printed equations — in one case a deflection wrong by a factor of eighteen, in another a stated root that does not satisfy the stated equation, in another a table whose printed total disagrees with the sum of its own printed terms. Each disagreement is recorded and adjudicated in writing, with the reasoning, rather than resolved by adjusting the app until it matched. Where this manual states a limit or an anomaly, it is because something was found, not because the possibility was imagined.

Statics

Force Systems & Resultants

Resolve a single coplanar force into its resultant magnitude and direction, and find the perpendicular offset of its line of action from a reference point.

R=√(F_x^2+F_y^2), θ_R=atan2(F_y,F_x), M_O=xF_y-yF_x, d=(M_O)/(R)

Basis

A system of coplanar forces is statically equivalent to a single resultant force acting on a definite line, or — in one exceptional case — to a couple with no line of action at all. Equivalence here means something precise: the two systems produce the same vector sum and the same moment about every point in the plane. Both conditions are required, and the second is the one readers skip.

Derivation

Resolve each force into components along two perpendicular axes and add them independently. The resultant's components are the sums, and its magnitude and direction follow from them. This much is vector addition and carries no mechanics. The screen instantiates this for exactly one applied force: with a single term in the sum, the resultant's components are just F_x and F_y themselves, and the magnitude and direction the reader sees are that one force's own polar form.

The line of action is where the mechanics enters, and it is where a single force stops being trivial. Position is not carried by the components at all — a force moved parallel to itself has the same F_x and F_y and is not the same load. What position is recovered from is the moment sum. Taking moments about the origin and requiring the resultant to produce that same moment gives the perpendicular offset of its line from the origin: the one quantity in this module that genuinely depends on where the force is applied, not merely on what it is.

A system of two or more forces can reduce to a couple — a moment with no resultant and so no line of action anywhere — when the component sums vanish while the moment sum does not. That case cannot arise from a single force: if F_x and F_y are both zero the moment about any point is zero as well, so there is no configuration of one force that is a couple. The kernel carries a predicate for the general case, reduces_to_a_couple, precisely because dividing a moment by a resultant that is merely small rather than exactly zero gives a line of action racing to infinity instead of the finite couple that is actually there — but this screen never calls it, because the case it guards against does not arise here. What the screen does show at F_x = F_y = 0 is the kernel's own floor: an undefined direction and an infinite offset, reported directly rather than diagnosed.

R=√(F_x^2+F_y^2), θ_R=atan2(F_y,F_x)
M_O=xF_y-yF_x
d=(M_O)/(R)

Assumptions

TakesUnitMeaning
F_xNHorizontal component of an applied force.
F_yNVertical component of an applied force.
xmmHorizontal position, measured from whatever origin the screen names — the left-hand end of a member, or the point a force acts through.
ymmVertical position, measured from whatever origin the screen names — the centroidal axis when a stress is wanted, or the point a force acts through.
GivesUnitMeaning
R_resultantNMagnitude of the resultant of the force system.
theta_resultantradDirection of the resultant of the force system.
d_linemmPerpendicular distance from the chosen point to the resultant's line of action.
M_aboutN·mmMoment of the force system about the chosen point.

Cases this screen covers without asking. Both sides of each of these are handled by the code, so there is no control for them:

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; there is nothing to iterate, and the result carries the precision of the arithmetic rather than of a tolerance.

Two details in the implementation are worth knowing because each avoids a failure that looks like a correct answer. The direction is taken with a two-argument arctangent rather than as the arctangent of a ratio: a force pointing straight up has no ratio to take, and a force pointing down and left has the same ratio as one pointing up and right. The quadrant survives only if both components are passed separately.

The moment is accumulated as a cross product of position and force — x times F_y minus y times F_x — rather than as a magnitude times a perpendicular distance found by inspection. The two are equivalent, but the second requires the reader to have found the perpendicular distance already, and finding it is the part that goes wrong.

The offset divides that moment by the resultant unconditionally: no test for a vanishing resultant runs first, because this screen's one-force input can only reach a zero resultant exactly (F_x = F_y = 0 typed directly), never by the near-cancelling sum that makes an exact-zero test unsafe for a general system. At that exact input the arithmetic itself returns an infinite offset and an undefined direction, which is what a reader sees rather than a diagnosed couple.

Limitations

Reading the result

The most common misreading, carried over from a textbook chapter that covers several forces at once, is to expect a zero resultant here to mean a couple. It cannot: with one force entered, F_x = F_y = 0 is simply no force at all, and its moment about the origin is zero too — there is no configuration of a single force that produces a couple's non-zero moment with a vanishing resultant. That case belongs to systems of two or more forces, which is a reduction this screen does not perform; see the limitations above.

The next is to compare offsets computed about different origins. The line of action is a property of the system; the offset is a property of the line and the origin together. Two correct calculations of the same system will report different offsets if they took moments about different points, and neither is wrong.

The third is subtler and worth stating because it recurs throughout the subject. Static equivalence is a statement about what a system does to a body from outside. Replacing a distributed load by its resultant leaves every reaction unchanged and changes the bending moment everywhere under the load. That is not an approximation that improves with care — the two systems are exactly equivalent externally and exactly different internally. Use the resultant to find reactions; never use it to find what happens inside the member.

Implemented by component_x, component_y, resultant_magnitude, resultant_direction, moment_about_point, moment_from_arm, line_of_action_offset, couple_moment, reduces_to_a_couple.

Support Reactions

Solve the reactions at every support of a planar beam or frame for any combination of loads.

Σ F_x=0, Σ F_y=0, Σ M_O=0

Basis

For a planar rigid body the conditions of equilibrium are three: the force components in two independent directions sum to zero, and the moments about any one point sum to zero. This screen never needs all three. It restricts itself to a single-span beam carrying transverse load only, so there is no horizontal component anywhere in the model and the third equation — horizontal equilibrium — is trivially satisfied by having nothing in it to balance. What remains is vertical equilibrium and one moment equation, which is exactly enough to find the reactions of the two support arrangements this screen offers.

Derivation

The beam is one of two shapes. Simply supported, it carries a pin at each end and two unknown vertical reactions. Cantilevered, it is built in at the left and carries one unknown vertical reaction plus one unknown fixing moment — still two unknowns, arrived at differently. The load is one of two shapes too: a single point load at a stated position, or a uniformly distributed load over the whole span. Neither loading has a horizontal component, so neither support arrangement is ever asked to supply a horizontal reaction.

For the simply supported case, taking moments about the left support isolates the right reaction directly — the total moment the load exerts about that point, divided by the span — and vertical equilibrium then gives the left reaction as whatever is left of the total load. This is the same moment-then-force-sum sequence a reader performs by hand, chosen so the intermediate quantity shown is the one a reader would check first.

For the cantilever, nothing needs isolating: the single support carries the entire load, so the vertical reaction is just the load's total, and the fixing moment is that load's moment about the support — a restatement of the same two equilibrium equations rather than a different method.

A distributed load enters both equations as its resultant and centroid — the total value integrated over the span, acting through the span's midpoint — which is legitimate here for the same reason it is legitimate in the previous module: reactions are an external effect, and the resultant is externally equivalent to the distribution it replaces. The bending moment inside the span, on the beam-diagrams screen one step on from here, is not externally equivalent to it and must use the distribution itself.

two supports: R_(right)=(M_(about left))/(L), R_(left)=W_(total)-R_(right)
cantilever: R=W_(total), M_(fix)=M_(about support)

Assumptions

TakesUnitMeaning
LmmLength of the member along its own axis, support to support.
supports_type—The support arrangement — pinned both ends, fixed one end, propped cantilever, and so on.
load_type—The kind of load applied — point, uniform, linearly varying, or applied moment.
WNTotal load on the span, whether it arrives as one force or spread out.
ammDistance from the left-hand support to the point being described.
qN/mmDistributed load intensity — force per unit length along the member.
GivesUnitMeaning
R_vecNReaction forces and moments at every restrained degree of freedom.
status_det—Whether the structure is a mechanism, statically determinate, or statically indeterminate.

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, and the same two equations regardless of which support arrangement or load shape is selected: supports_type picks between the pin pair and the cantilever, load_type picks between the point load and the uniform load, and both are read once to build the beam before the reactions are found.

Because this idealisation never models a horizontal reaction, it always has exactly two unknowns — the two vertical reactions of a simply supported beam, or the vertical reaction and fixing moment of a cantilever — against exactly two equilibrium equations that apply to it. Two against two is determinate for every combination this screen's own inputs can build; there is no arrangement of supports_type, load_type, W, a and q that produces a mechanism or a redundancy, so the degree of static indeterminacy shown is the constant that arithmetic actually gives rather than a per-case count. An earlier version of this screen computed it as a conditional whose two branches both reduced to the same number, reporting one degree of indeterminacy this idealisation can never have; the count is now the constant it always was underneath that conditional, made explicit.

Questions this screen cannot ask — three or more supports, a frame rather than a single span, a genuine redundancy or mechanism — belong to the determinacy and matrix-solve screens, which model the horizontal direction and the arrangement of members that this one deliberately leaves out.

Limitations

Reading the result

The reported degree of indeterminacy is always zero here, and that is a fact about what this screen can build rather than a verdict about beams in general. A real structure with three or more supports, or one that is part of a rigid frame, can be a mechanism or redundant in ways this screen's two-unknown model cannot represent at all — that question belongs to the determinacy screen, which counts members, joints and reactions for the structure actually drawn rather than assuming the always-determinate case this one is built around.

Reactions in a determinate structure do not depend on the material or the section, and this screen is a fast way to see that directly: change the modulus and the reactions do not move, because they come from equilibrium alone.

A negative reaction is not an error. It means the support is pulling rather than pushing — holding the beam down — which a real pin or built-in end can do but a real roller cannot. When a reaction comes out negative for a support that was meant to be a roller, the model has outrun the support it describes, and the answer is correct for a support that can pull and wrong for the one on site.

Error. This structure is a mechanism, or so close to one that it cannot be solved. Add restraint or a member.

Implemented by reactions, total_load, moment_of_loads_about, udl_resultant, udl_centroid.

Determinacy & Stability

Classify the model as a mechanism, statically determinate, or indeterminate, and say by how much.

truss: m+r-2j, frame: 3m+r-3n-c

Basis

Counting compares how many unknown forces a structure has against how many independent equilibrium equations are available to find them. The difference is the degree of static indeterminacy: negative is a mechanism, zero is determinate by count, positive is the number of redundant restraints.

Derivation

For a pin-jointed plane truss each joint supplies two equilibrium equations and each member carries one unknown axial force, with the support reactions adding their own unknowns. Comparing the two totals gives the truss count. A perfect frame — determinate and just rigid — therefore needs a member count fixed by the number of joints alone.

For a rigid-jointed plane frame the accounting changes on both sides. Each member carries three internal force components rather than one, and each node supplies three equilibrium equations rather than two. Internal releases such as a hinge remove one equation apiece. The frame count follows.

Both counts share a limitation that no amount of arithmetic removes. They compare totals, and totals cannot see arrangement. A structure with the right number of members can still have them in the wrong places — a redundant panel here, a mechanism there — and the count returns zero, which is why this module reports the count and the solver's verdict side by side rather than either alone.

truss: m+r-2j
frame: 3m+r-3n-c
perfect truss: m=2j-3

Assumptions

TakesUnitMeaning
nodesmmNode coordinates of the model.
members—Which two nodes each member connects, and which section and material it uses.
supports—Which degrees of freedom are held, and any settlement imposed on them.
GivesUnitMeaning
status_det—Whether the structure is a mechanism, statically determinate, or statically indeterminate.
n_redundant—Degree of static indeterminacy — how many forces you would have to guess before statics could finish the job.
topology_ok—Whether the model is connected and restrained well enough to be solved at all.
mode_shape—The deflected shape the structure takes as it buckles.

Cases this screen covers without asking. Both sides of each of these are handled by the code, so there is no control for them:

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

Where it stops.

Solution method

Integer arithmetic, and deliberately reported as a number rather than a verdict. A count of zero is not a certificate: it means the equations balance the unknowns, not that the structure stands. The screen therefore shows the count next to the result of actually attempting the solution, so the two can disagree in front of the reader.

For the frame count no source in the public-domain literature this project uses prints the counting formula, so it is stated here as the equilibrium argument it is — three equations per node against three unknowns per member — rather than attributed.

Limitations

Reading the result

The classification vocabulary is worth stating exactly, because one of the works consulted while building this app contradicts its own figures on the point. Here a mechanism is deficient — too few members to be rigid, count negative. A redundant structure has more restraint than equilibrium requires, count positive. Determinate is the boundary, count zero.

Treat a zero count as permission to try statics, not as proof that statics will work. The count and the solver answer different questions, and this screen shows both because the interesting cases are the ones where they disagree. A count of zero with a solver that reports a mechanism means the members are in the wrong places. A count of zero with a solver that succeeds but reports poor conditioning means the arrangement is nearly wrong.

The degree of indeterminacy is worth reading as a cost as well as a property. It is the number of additional conditions that must come from compatibility rather than equilibrium — which is to say, the number of places where the answer starts depending on the stiffness of things rather than only on their arrangement. A determinate structure has reactions that a change of material cannot move; every redundancy is one more way the material can change the answer.

Implemented by determinacy_planar_truss, determinacy_planar_frame, perfect_truss_members, concurrency_measure.

Sections

Section Builder & Properties

Geometric properties of a rectangular, solid circular, or hollow circular section from its dimensions.

A=∫_A dA, I_x=∫_A y^2 dA, I_y=∫_A x^2 dA, J_(circle)=I_x+I_y

Basis

Every geometric property of a cross-section is a moment of its area about an axis: the zeroth moment is the area, the first locates the centroid, the second resists bending. Because these integrate over a region rather than over its material, Green's theorem converts each of them into a circuit of the boundary — and a boundary of straight edges integrates exactly, edge by edge. A polygon's properties are closed form, not approximations.

Derivation

Choose the two boundary functions so that the integrand collapses in turn to 1, to y squared, to x squared and to xy, and each area integral becomes a sum over the edges. Along a straight edge both coordinates are linear in the parameter, so each edge contributes a low-order polynomial that integrates in closed form. All four sums are weighted by the same cross term — the signed doubled area of the triangle the edge makes with the origin — and differ only in what it multiplies.

Those moments are about whatever origin the vertices were written in, so the last step shifts them to the section's own axes by subtracting the area times the square of the centroid offset. That is the parallel-axis rule run backwards: exact algebra performed in inexact arithmetic, and the only place in this module where precision is at stake.

Winding needs one decision, made here so no caller repeats it. The edge sum is signed — anticlockwise positive, clockwise negative — and the area takes its magnitude. The product of area is odd in the winding as well as in the coordinates, so its origin-form value is negated when the signed area is negative, while the centroid correction uses the magnitude. The consequence is that reversing the vertex order changes no reported number, which is a property test rather than a hope.

The rest is definitional: the section modulus is the second moment over the distance to a chosen fibre, so an unsymmetric section has two; the radius of gyration is the distance at which the whole area could sit and give the same second moment. The polar second moment of a circular annulus is the one relation here that is not a polygon sum.

A=½Σ(x_i y_(i+1)-x_(i+1) y_i), c_i=x_i y_(i+1)-x_(i+1) y_i
I_(x,O)=(1)/(12)Σ(y_i^2+y_i y_(i+1)+y_(i+1)^2)c_i
I_(xy,O)=(1)/(24)Σ(x_i y_(i+1)+2x_i y_i+2x_(i+1)y_(i+1)+x_(i+1)y_i)c_i
I_x=I_(x,O)-A y_c^2, I_(xy)=I_(xy,O)-A x_c y_c
Z=I/c, r=√(I/A), J=(π)/(32)(d-d_i)(d+d_i)(d^2+d_i^2)

Assumptions

TakesUnitMeaning
shape—Which supported parametric outline the calculation uses.
bmmWidth of a rectangular part of the cross-section, measured across the bending axis.
hmmHeight (depth) of a rectangular part of the cross-section, measured along the bending axis.
dmmOutside diameter of a circular section.
d_immInside diameter of a hollow circular section.
GivesUnitMeaning
Amm²Cross-sectional area — the amount of material you would see if you sliced the member straight across.
x_cmmHorizontal position of the centroid, measured from the origin you picked.
y_cmmVertical position of the centroid, measured from the origin you picked.
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
I_ymm⁴Second moment of area about the vertical centroidal axis.
I_xymm⁴Product of area — non-zero when the section is lopsided about its own axes, and the reason bending can push a beam sideways.
r_xmmRadius of gyration about the horizontal axis — the distance at which all the area could sit and give the same bending resistance.
r_ymmRadius of gyration about the vertical axis.
Z_tmm³Elastic section modulus for the top fibre — second moment of area divided by the distance to that fibre.
Z_bmm³Elastic section modulus for the bottom fibre.
Jmm⁴Torsion constant — the section's resistance to twisting, equal to the polar second moment only for circular shapes.

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, one pass over the edges per quantity. Nothing iterates and nothing is sampled.

The number worth carrying away concerns the centroidal shift. The kernel forms the second moment about the caller's origin and subtracts the area times the squared offset; for a section far from that origin the two terms are nearly equal and the answer is what survives. The relative error grows with the square of the offset over the section's own size, and it has been measured rather than assumed: on a 20 mm square the result is exact to 1.4e-16 at the origin, 1.5e-12 at an offset of 1e3, 1.2e-8 at 1e5 and 4.8e-3 at 1e6 — roughly two digits lost per decade of offset. A test asserts the loss is still there, so a rearrangement that quietly removed it would fail rather than pass. The remedy is to re-centre the polygon before calling, never to widen a tolerance.

The annulus is factored for the same reason in the other direction: a difference of fourth powers subtracts two nearly equal large numbers for any thin wall, while the factored form never constructs that difference.

Nothing raises. Fewer than three vertices, mismatched coordinate lists or a zero enclosed area return nan; a section modulus asked for a fibre on the neutral axis returns infinity, which is what the relation says and is also the signal that the input was not a section.

Limitations

Reading the result

Two section moduli are reported and the smaller governs. For a shape symmetric about the bending axis they are equal and readers stop looking; for a tee they are not, and quoting the larger overstates the moment the section can carry.

The centroid is reported in the frame the outline was entered in, so it moves when the outline moves. Every second moment beside it does not, being already about the section's own axes — which is why a computed second moment can be checked against a handbook and a computed centroid cannot. Before making that comparison, check which axis the handbook means by I_x: the two conventions differ by a swap, and a number alone cannot tell them apart.

A product of area of exactly zero is a claim about symmetry, not an artefact of rounding. It holds for every supported preset: the rectangle, solid circle and concentric tube are all symmetric about both displayed axes. A non-zero product belongs to the principal-axes screen, which accepts section properties directly.

Advisory. Every axis of this section is a principal axis, so the principal angle has no unique value.

Implemented by signed_area_polygon, area_polygon, centroid_x_polygon, centroid_y_polygon, inertia_x_polygon, inertia_y_polygon, inertia_xy_polygon, parallel_axis, section_modulus, radius_of_gyration, polar_moment_circular, torsion_constant_rectangle.

Principal Axes & Inertia Circle

The two axes about which the section bends without twisting sideways, and the circle that produces them.

I_(1,2)=(I_x+I_y)/(2)±√(((I_x-I_y)/(2))^2+I_(xy)^2), tan 2α_p=(-2I_(xy))/(I_x-I_y)

Basis

A second moment belongs to an axis, not to a section on its own. Rotate the reference axes and the three quantities describing the section transform as a symmetric second-rank tensor. There is one rotation at which the off-axis term vanishes, and the axes it produces are the principal ones: bend a member about a principal axis and it deflects in the plane of the applied moment; bend it about any other and it does not.

Derivation

Write the second moments about axes rotated anticlockwise by an angle. Both the axis values and the product of area become the same two ingredients in different combinations: a mean independent of the angle, and sinusoids in twice the angle whose amplitude is fixed by how lopsided the section is. Setting the transformed product of area to zero gives one condition with one solution per quarter turn.

Read as a locus, the transformed pair traces a circle as the angle sweeps: centre at the mean of the two axis values, radius the hypotenuse of half their difference and the product of area. The principal values are the two ends of a diameter, which is why the larger is never below either input and the smaller never above either. Zero radius means the circle has collapsed to a point and every axis of the section is principal.

Two quantities survive the rotation untouched, and both are checked. The trace is the one everyone knows. The determinant — the product of the axis values less the square of the product of area — matters more here: a sign error in the discriminant leaves the trace perfectly intact and moves the determinant, so a trace check alone would pass over exactly the mistake most easily made.

The angle is a two-argument arctangent of numerator and denominator separately, then halved. A ratio would discard the quadrant of the doubled angle, and halving a quadrant-less answer names whichever principal axis the ratio happened to land on. As written it always names the major axis: a section with its larger second moment about the vertical returns exactly a quarter turn rather than zero.

I_(1,2)=(I_x+I_y)/(2)± R, R=√(((I_x-I_y)/(2))^2+I_(xy)^2)
α_p=½atan2(2I_(xy), I_x-I_y)
I_(xy)(α)=-(I_x-I_y)/(2)sin 2α+I_(xy)cos 2α=0
I_1+I_2=I_x+I_y, I_1 I_2=I_x I_y-I_(xy)^2

Assumptions

TakesUnitMeaning
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
I_ymm⁴Second moment of area about the vertical centroidal axis.
I_xymm⁴Product of area — non-zero when the section is lopsided about its own axes, and the reason bending can push a beam sideways.
GivesUnitMeaning
I_1mm⁴Larger of the two principal second moments of area.
I_2mm⁴Smaller of the two principal second moments of area.
alpha_pradAngle from the reference axes to the principal axes of the section.

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. The circle radius is a hypotenuse, the principal values are its centre plus and minus that radius, and the angle is a two-argument arctangent halved.

The degenerate case is handled by a separate question rather than by a guard buried inside the angle. When the circle collapses to a point the angle has no meaning, and the arctangent of two zeros is zero — a number, and a misleading one. So the kernel offers a predicate asking whether the radius has fallen below a tolerance times the mean second moment. Scaling by the mean makes the test dimensionless, so the verdict does not change when the same section is measured in millimetres rather than metres; the app uses a relative threshold of 1e-9 and raises an advisory saying every axis is principal. A section with no area answers no rather than yes, having no axes to be indeterminate about.

The angle function itself still returns zero there. That is deliberate: a kernel reports what the relation gives and does not decide what the reader should be told, which is the decision layer's job and is made once for both front ends rather than twice.

Limitations

Reading the result

The commonest misreading is to assume the reported angle points at the stronger axis only when it is small. It always names the major axis. If the vertical axis value is the larger and the product of area is zero, the answer is exactly ninety degrees, not zero — the axes were already principal, and the major one is the vertical.

The second is to dismiss a small product of area. Its effect on the two principal values goes as the hypotenuse, so a product small against the difference of the axis values barely moves them. Its effect on the angle does not: when the two axis values are equal, the angle is exactly forty-five degrees for any non-zero product of area, however small. A nearly circular section therefore has principal axes that are strongly rotated and almost indistinguishable in value.

The check to run before trusting anything else is the trace: the two principal values must sum to the two inputs to the last few digits. If they do not, the inputs were not a consistent set about one origin.

Advisory. Every axis of this section is a principal axis, so the principal angle has no unique value.

Implemented by inertia_circle_radius, principal_inertia_major, principal_inertia_minor, principal_angle, principal_axes_are_indeterminate.

Shear Flow & Shear Centre

How shear travels around a thin-walled section, and the one point a load must pass through to avoid twist.

q_(flow)=(VQ)/(I_x), τ=(VQ)/(I_x t), e_(sc)=1/V∮ q_(flow) ρ ds

Basis

Transverse shear is carried because the bending stress changes along the beam. Cut a slice along a line parallel to the axis: the axial force on the piece beyond the cut differs between the slice's two faces, and the only thing that can balance that difference is shear on the cut itself. The working relation follows from that statement alone — no assumption about how shear strain is distributed is needed.

Derivation

On each face of a slice of length dx the axial force beyond the cut is the bending moment times the first moment of the area beyond it, over the second moment. The faces carry moments differing by dM, so the cut carries that difference; dividing by dx, and using the fact that the rate of change of moment is the shear force, gives the shear flow. Dividing again by the thickness at the cut gives the average shear stress.

That first moment is of the area lying beyond the cut, about the centroidal axis: the part of the section the shear has to drag along. It is largest at the centroidal axis and exactly zero at a free edge, where there is no area beyond to drag. The shear stress must therefore vanish at the extreme fibres, and a non-zero value there is an integration error rather than a result. For a rectangle it is a parabola in the level, so the stress is parabolic and peaks at mid-depth at exactly three halves of the average, whatever the proportions. Being independent of both dimensions makes that the cleanest single check on the whole derivation, so the kernel writes it out as its own relation and a test requires the two routes to agree.

The shear centre is the same integral asked a different question. In a channel the flange flow rises linearly from the tip, so each flange carries a resultant proportional to the square of the flange width; the two are equal, opposite and separated by the web depth, making a couple while the web carries the shear. A transverse load twists the member unless it acts at the offset where its own moment matches that couple — three flange widths squared over six flange widths plus the depth, a point behind the web and off the material altogether. Load a channel through its centroid and it twists; the point it does not twist about is not on the section.

q=(VQ)/(I_x), τ=(VQ)/(I_x t)
Q(y)=b/2((h^2)/(4)-y^2), τ_(max)=(3V)/(2A)
e_(sc)=(3b^2)/(6b+h), I_x=(t h^2(h+6b))/(12) (thin wall)
C_w=(h^2b^3t)/(12)·(3b+2h)/(6b+h)

Assumptions

TakesUnitMeaning
VNShear force at the section under consideration.
tmmWall thickness of a thin part — a flange, a web, a tube wall, a plate.
bmmWidth of a rectangular part of the cross-section, measured across the bending axis.
hmmHeight (depth) of a rectangular part of the cross-section, measured along the bending axis.
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
smmDistance measured along the wall of a thin-walled section, from a chosen starting edge.
GivesUnitMeaning
Qmm³First moment of the area lying beyond the cut, about the centroidal axis — the part of the section the shear has to drag along.
q_flowN/mmShear flow — force per unit length running along the wall of the section.
tauMPaShear stress at the point under consideration.
e_scmmShear centre offset — the distance from the centroid to the point a transverse load must pass through if the member is not to twist.
C_wmm⁶Warping constant — the section's resistance to the axial stretching that accompanies twist in an open thin-walled shape.

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 level is measured from the centroidal axis, and a level outside the section returns nan rather than a negative first moment, which would read as a shear stress of the wrong sign. The flow returns nan for a non-positive second moment; the stress form returns infinity where the thickness goes to zero, which is what the relation says and is also the signal that the outline narrows to a point.

The channel's second moment printed beside the shear centre is deliberately the thin-walled one, each flange contributing only its area times the square of its lever arm. The dropped term is 3.4e-4 of the total for a 60 by 200 by 8 channel and falls with the square of the wall thickness. The two expressions must be written to the same assumption, because the shear-centre closed form is exact against the thin-walled second moment and only nearly so against the composite one.

Built-up profiles are represented as vertical rectangular layers. Their first moments and local widths produce both one-sided stresses at a width step, while two-point Gaussian integration is exact because the flow is quadratic within each layer and returns the applied shear force.

Both the shear centre and the warping constant are verified against their definitions rather than another closed form — the first by integrating the flange flow and taking moments about the web centreline, the second by the sectorial integral about that shear centre. A closed form checked against itself is one nobody has checked.

Limitations

Reading the result

The peak shear stress in a rectangle is three halves of the average, not the average: a reader who divides the shear force by the area is a third low, and that is the most common error on this screen.

The peak shear and the peak bending stress are never at the same place: shear peaks on the centroidal axis where the bending stress is zero, bending peaks at the extreme fibres where the shear stress is zero. A section checked only at its extreme fibre has not been checked for shear at all.

The shear-centre offset is a distance with a convention, not a coordinate: measured from the web centreline, away from the flanges. For a channel it is always less than the flange width, and it moves toward the web as the web deepens — a channel that is nearly all web has its shear centre on the web, nothing being left to make a couple with. Watching that happen means changing the flange width or the web depth, and this screen offers neither; the relation is on the torsional-buckling screen's inputs instead, where the offset is entered rather than computed.

The flow is per unit length and decides fastener spacing in a built-up beam; the stress is per unit area at a point. The thickness at the cut is what separates them.

Advisory. The thin-walled torsion formulas lose accuracy for stocky elements like this one.
Advisory. Two idealisations of the same b, h and t are on this screen at once. Q, q_flow and tau are the solid rectangle's, worked from the area beyond the cut. e_sc and C_w are a thin-walled channel's, and a channel's shear centre lies outside the section entirely -- which is the whole reason the quantity is taught, and not a number the rectangle above has.

Implemented by first_moment_rectangle_above, shear_flow, shear_stress_vqit, shear_stress_rectangle_max, fastener_spacing, shear_centre_channel, inertia_channel, warping_constant_channel, SectionLayer, shear_flow_at, integrated_shear, transverse_shear_stress.

Plastic Section & Shape Factor

The equal-area axis, the fully plastic moment, and how much reserve the section has past first yield.

∫_(A_1)dA=∫_(A_2)dA, Z_p=Σ A_i y_i, M_p=σ_y Z_p, f=(Z_p)/(Z_t)

Basis

In the elastic range the bending stress varies linearly across the depth, so at first yield only the extreme fibre has reached the yield stress and everything inside it is still below capacity. Raise the moment and the yielded zone spreads inward from both faces. In the limit — a material that yields at a fixed stress and keeps going, in a section detailed well enough to get there — every fibre is at yield and the section can carry no more.

Derivation

At full plasticity the stress is the yield stress in tension over one part of the section and in compression over the other, with nothing in between. Axial equilibrium requires the two forces to cancel, and with one yield stress on both sides that means the two areas must be equal: the fully plastic neutral axis is the equal-area axis.

This is the point worth slowing down on. The elastic neutral axis passes through the centroid, where the first moments balance; the plastic one splits equal areas. Those are different conditions and in general different places, coinciding only when the section is symmetric about the bending axis — every rectangle, every circle, every rolled I-section — so the distinction is invisible in exactly the cases most people learn it on.

The moment is the couple made by the two forces: the yield stress times half the area times the distance between the half-centroids. As a section property that is the sum of the first moments of the two halves about the equal-area axis — the plastic modulus — and the plastic moment is the yield stress times it. For a rectangle each half has its centroid a quarter of the depth from the axis, so the plastic modulus is width times depth squared over four; against the elastic six the ratio is exactly three halves, for any proportions. A solid round gives diameter cubed over six, and sixteen over three pi, 1.6977.

That pair of numbers is the whole content of the shape factor: it measures how much material sits near the neutral axis, contributing little elastically and full duty once plastic. A round has the most and the largest factor, a rectangle less, an I-section least at roughly 1.15. At the end of that progression it turns exact — with all the area at the extreme fibres, elastic and plastic moduli are the same expression and the factor is one. That limit, not a quoted rolled-section number, is what the tests anchor on.

∫_(A_1)dA=∫_(A_2)dA, Z_p=Σ A_i y_i, M_p=σ_y Z_p
f=(Z_p)/(Z)
Z_p=(b d^2)/(4), Z=(b d^2)/(6), f=3/2 (rectangle)
Z_p=(d^3)/(6), Z=(π d^3)/(32), f=(16)/(3π)=1.6977 (solid round)

Assumptions

TakesUnitMeaning
shape—Which supported parametric outline the calculation uses.
bmmWidth of a rectangular part of the cross-section, measured across the bending axis.
hmmHeight (depth) of a rectangular part of the cross-section, measured along the bending axis.
dmmOutside diameter of a circular section.
sigma_yMPaYield stress — where the material stops springing back.
GivesUnitMeaning
x_nammDepth of the neutral axis below the compression face.
Z_pmm³Plastic section modulus — the first moment of the two equal areas about the equal-area axis.
f_shape—Shape factor — how much more moment the section carries once fully plastic than when it first yields.
M_pN·mmPlastic moment — the moment the section carries once every fibre has yielded.

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 for the rectangle and the solid round, which are the shapes the kernel carries. Four relations — plastic modulus, equal-area axis, shape factor, plastic moment — each guarded: a non-positive width or depth returns nan, and a shape factor asked for with no elastic modulus returns nan rather than an infinity that would read as an enormous reserve.

A general polygon's equal-area axis is not a formula but a root to be found, and that search is not in this version. The kernel deliberately carries no polygon form of it, and a test asserts no such function exists — so adding the name without the search behind it fails rather than quietly shipping. The canon's edge case of a section in two disconnected parts, whose equal-area axis can fall in the gap where no material is, is honoured by the screen declining rather than by a relation returning a plausible number.

The printed shape factors checked against — three halves for a rectangle, 1.7 for a solid round — come from a NASA structures manual, a public-domain United States Government work. The high-precision layer carries sixteen over three pi to twenty figures alongside, so nothing is lost to the printed value's two.

Limitations

Reading the result

The shape factor of a rectangle is exactly 1.5 for any width and any depth. If the screen shows anything else, the elastic modulus it was given was not that rectangle's — the fastest sanity check available here.

The plastic moment is a capacity of the section under an idealised material, not a design value: it says what the section could carry with every fibre at yield, not that the member will get there.

The equal-area axis is reported as a depth, and for a symmetric section it lands on the centroid — the case that hides its meaning. Carrying that habit to an unsymmetric section, and using the elastic centroid for a plastic calculation, is the standard error this quantity exists to prevent.

Across shapes the ordering is the useful part: whatever wastes the most material near the neutral axis elastically has the most left to give plastically. A round's 1.698 against a rectangle's 1.5 is that comparison, and an I-section's 1.15 or so is why the shape everyone actually uses gains least from being taken past first yield.

Implemented by plastic_modulus_rectangle, plastic_modulus_circle, shape_factor, plastic_moment, equal_area_axis_rectangle.

Stress & Strain

Axial Members

Stress, strain and stretch in a bar, including bars sharing a load and bars held against temperature change.

σ=P/A, ε=(σ)/(E), δ=(PL)/(AE), ε_(th)=α_T Δ T

Basis

A bar pulled along its own axis carries the load as a direct stress spread evenly over any section far enough from the ends. Strain follows from the stress by a linear law, and the extension is that strain accumulated over the length. Three relations, one quantity each; the rest of the module is what happens when two bars are put in series or in parallel with each other.

Derivation

Cut the bar and require the resultant of the stress on the cut face to equal the applied force. That gives the total, not the distribution. Taking the stress as uniform is an added assumption, and it is the one that fails first: uniformity comes from the bar being prismatic, the material homogeneous, and the cut being far from where the load was introduced.

A linear elastic material then gives the strain, and multiplying by the length gives the extension. Written out, the extension has each of the three quantities a designer can change appearing exactly once, which is why it is worth being its own relation rather than two calls.

Temperature enters as a strain a free bar simply takes up, carrying no stress for it. Stress appears only when the strain is prevented. Hold the bar so its total strain is zero and the elastic strain must cancel the thermal one exactly, so the stress is minus the modulus times the thermal strain. The minus sign is the whole content: a bar heated and prevented from growing goes into compression, not tension.

Two bars sharing a load divide it in one of two ways, decided only by how they are connected. In parallel the extensions are forced equal, so the forces divide in proportion to axial stiffness — area times modulus, not area and not strength. In series the force is common and the extensions add. The modular ratio, one modulus over another, is what lets a section of two materials be replaced by an equivalent area of a single one, and it is the same number that fixes the parallel split when the areas are equal.

σ = P/A, ε = (σ)/(E), δ = (PL)/(AE)
ε_(th) = α_T Δ T, σ_(restrained) = -E α_T Δ T
(P_1)/(P) = (A_1E_1)/(A_1E_1 + A_2E_2)
n = (E_1)/(E_2)

Assumptions

TakesUnitMeaning
PNAxial force in the member — positive in tension unless the screen says otherwise.
Amm²Cross-sectional area — the amount of material you would see if you sliced the member straight across.
LmmLength of the member along its own axis, support to support.
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
alpha_T1/KCoefficient of thermal expansion — fractional length change per degree.
DTKTemperature change from the state in which the member was stress-free.
GivesUnitMeaning
sigmaMPaDirect stress — force per unit area acting perpendicular to the cut.
eps—Direct strain — fractional change in length.
deltammDeflection — how far a point has moved from where it started.

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, one relation per function, nothing to iterate. The guards are the part worth knowing. Direct stress returns infinity at zero area rather than raising, because that is what the relation says and it is also the reason a section cannot narrow to nothing; a negative area returns not-a-number, since it was never a section. Extension returns not-a-number for a non-positive area or modulus, and the parallel split returns it when the two stiffnesses sum to zero.

The screen adds the free thermal strain to the elastic strain, and the free thermal extension to the elastic one, so the extension reported is what an unrestrained bar does when it is both loaded and heated. The restrained case is a separate relation because it answers a different question: not how far the bar moves, but what it costs to stop it.

Limitations

Reading the result

Stress and extension answer different questions and respond differently to the same change, which is why both are shown. Stress decides the material; extension decides the detailing — the clearance, the gap, the sag. Doubling the area halves both; doubling the length moves only the extension.

Two things go wrong more often than the rest. The first is the sign of the thermal case: a restrained bar that is heated goes into compression, because the stress opposes the strain that was prevented. The second is dividing a shared load by area. Two bars of equal area whose moduli differ by a factor of fifteen take fifteen sixteenths and one sixteenth of the load, not half each, and the ratio of the two answers is the modular ratio itself.

Units are newtons and millimetres throughout, so a modulus entered as 210 GPa is 210 000 in the numbers the relations see. A conversion applied twice is the quietest error in this subject: the answer is a thousand times out, which reads as a modelling mistake rather than an arithmetic one.

Implemented by axial_stress, axial_strain, elongation, thermal_strain, thermal_stress_restrained, modular_ratio, parallel_share.

Plane Stress & Mohr's Circle

Turn a state of stress to any angle you like, and read the principal values straight off the circle.

σ_(1,2)=(σ_x+σ_y)/(2)±√(((σ_x-σ_y)/(2))^2+τ_(xy)^2), tan 2θ_p=(2τ_(xy))/(σ_x-σ_y)

Basis

The state of stress at a point is one object, not a set of numbers attached to whichever axes happened to be drawn. Choose different axes and the components change, in a way fixed entirely by equilibrium of a wedge cut at the new angle. Traced out as the angle sweeps, the pair of components moves round a circle, and every result on this screen is a coordinate on that circle.

Derivation

Cut a wedge whose inclined face has its normal at an angle from the x axis. The three faces have areas in a fixed ratio, so resolving forces along and across the inclined face gives two equations with no material property in them at all. The direct stress on the plane is the mean of the two direct stresses, plus half their difference times the cosine of twice the angle, plus the shear times the sine of twice the angle; the shear on the same plane follows in the same form.

Square both and add. The angle disappears and what is left is the equation of a circle: centred on the direct-stress axis at the mean stress, with radius the hypotenuse of half the difference of the direct stresses and the shear. That one line of algebra is the whole construction. The principal stresses are the two ends of the horizontal diameter, mean plus and minus radius. The largest shear is the radius. The principal planes are where the vertical coordinate vanishes, which is where the tangent of twice the angle equals twice the shear over the difference of the direct stresses.

The factor of two causes the most trouble and is not an artefact. Angles on the circle are twice angles in the material, because every component returns to itself after a rotation of a hundred and eighty degrees rather than three hundred and sixty. Two checkable consequences follow. Planes at right angles in the material sit diametrically opposite on the circle, so their direct stresses sum to the constant diameter. And the plane of maximum shear is a quarter turn round the circle from the principal point — forty-five degrees in the material, always, for every state.

σ_θ = (σ_x+σ_y)/(2) + (σ_x-σ_y)/(2)cos 2θ + τ_(xy)sin 2θ
τ_θ = -(σ_x-σ_y)/(2)sin 2θ + τ_(xy)cos 2θ
(σ_θ - c)^2 + τ_θ^2 = R^2, c = (σ_x+σ_y)/(2), R = √(((σ_x-σ_y)/(2))^2 + τ_(xy)^2)
σ_(1,2) = c ± R, τ_(max) = R
θ_p = ½atan2(2τ_(xy), σ_x-σ_y)

Assumptions

TakesUnitMeaning
sigma_xMPaDirect stress in the horizontal direction.
sigma_y_stressMPaDirect stress in the vertical direction.
tau_xyMPaShear stress on the faces of the element you are looking at.
theta_cutradAngle of the plane you want the stress components on, measured from the reference axes.
GivesUnitMeaning
sigma_1MPaLargest principal stress — the biggest direct stress on any plane through the point, with no shear on that plane.
sigma_2MPaSecond principal stress.
tau_maxMPaLargest shear stress on any plane through the point.
theta_pradAngle from the reference axes to the planes on which the principal stresses act.
sigma_thetaMPaDirect stress on the plane you chose, pushing at right angles to it.
tau_thetaMPaShear stress on the plane you chose, sliding along it.

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. Two choices in the code each remove a failure a reader would otherwise meet. The radius is taken as a hypotenuse rather than the square root of a sum of squares, so it neither overflows nor loses accuracy when one component dwarfs the other. The principal angle is a halved two-argument arctangent, not the arctangent of a ratio: the ratio form divides by zero for pure shear — the state a reader is most likely to type — and discards the quadrant, so it cannot tell the major plane from the minor one.

Degeneracy is tested rather than divided through. When the circle collapses to a point every plane is principal and the angle means nothing. The test compares the radius against a tolerance times the mean stress, so it carries no unit and no scale, and answers yes for a state of nothing at all without dividing by a zero mean. A second guard, measured against the sixty-digit reference, fires when the two direct stresses agree to within a millionth of their size: the principal values stay accurate there and the direction does not, and a reader told only one number would trust both.

Limitations

Reading the result

The conventions decide whether the answer is the one you want, and this module fixes them once. Shear is positive when it acts on the positive-x face in the positive y direction; angles are anticlockwise from the x axis; and a plane at a given angle is the plane whose normal points that way, not the plane itself. That last one is the trap. Some finite-element output names the plane rather than its normal, and reading the principal angle the other way puts the answer a right angle out — where it still looks plausible, because a right angle out is the other principal plane, a real plane with a real stress on it.

Circle-drawing conventions plot shear downwards; this module returns numbers rather than a drawing, so the sign of the shear on a rotated plane is whatever the transformation gives.

Two checks cost nothing and catch most errors. The two principal stresses sum to the two entered direct stresses, on every state, and the maximum shear is exactly half their difference. If either fails the transformation is wrong, and no amount of checking the inputs will find it.

Advisory. This state is the same on every plane, so there is no unique principal direction.
Advisory. The two direct stresses are nearly equal, so the principal directions are poorly determined however carefully they are computed. The principal values themselves remain accurate.

Implemented by stress_circle_centre, stress_circle_radius, stress_transform_normal, stress_transform_shear, principal_stress_major, principal_stress_minor, principal_stress_angle, stress_state_is_hydrostatic.

Strain Rosette

Work back from three gauge readings to the full strain state, then to the stresses that caused it.

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

Basis

A strain gauge measures one number: the direct strain along its own axis. A plane strain state has three independent components. Three gauges pointing three different ways therefore give three equations in three unknowns, and a rosette is nothing more than that determined linear system. The closed forms below are that system already solved for the two standard layouts; the general route solves the same equations for every other independent set of angles.

Derivation

Strain transforms with the same shape as stress, with one difference that accounts for most of the errors made with rosettes: the shear term carries a half. The direct strain in a direction is the mean of the two direct strains, plus half their difference times the cosine of twice the angle, plus half the engineering shear strain times the sine of twice the angle. The engineering shear strain is the total change of a right angle; the tensor component is half of it. Every relation here takes and returns the engineering value, and the halving happens inside, once, where a test can see it.

For a rectangular rosette at zero, forty-five and ninety degrees the algebra collapses. The first gauge lies on the x axis and the third on the y axis, so each reading is a direct strain outright; at forty-five degrees the cosine term vanishes and the sine term is one, so the middle reading is the mean of the two direct strains plus half the shear, and the shear is twice that reading minus the other two. That factor of two is the whole difficulty of rosettes. For a delta rosette only the first gauge lands on an axis, and solving the remaining pair gives the forms below. Both standard layouts are written out separately, and the general inverse is checked independently, so a fixture can hit all three routes.

The principal strains come off the same circle as the principal stresses, with half the engineering shear in place of the shear stress. The principal direction is where the tangent of twice the angle is the engineering shear over the difference of the direct strains — with no half in it, because the halves in numerator and denominator cancel. That asymmetry is real: the magnitude relation carries the half, the angle relation does not, and tidying one to match the other breaks it. Finally, for an isotropic material the principal strain and principal stress directions coincide, so each principal stress follows from the pair of principal strains by the plane-stress law.

ε_θ = (ε_x+ε_y)/(2) + (ε_x-ε_y)/(2)cos 2θ + (γ)/(2)sin 2θ
rectangular: ε_x = ε_a, ε_y = ε_c, γ = 2ε_b - ε_a - ε_c
delta: ε_x = ε_a, ε_y = (2ε_b + 2ε_c - ε_a)/(3), γ = (2(ε_b-ε_c))/(√3)
ε_(1,2) = (ε_x+ε_y)/(2) ± √(((ε_x-ε_y)/(2))^2 + ((γ)/(2))^2)
σ_1 = (E(ε_1 + ν ε_2))/(1-ν^2)

Assumptions

TakesUnitMeaning
eps_a—Strain read by the first gauge of a rosette.
eps_b—Strain read by the second gauge of a rosette.
eps_c—Strain read by the third gauge of a rosette.
theta_aradDirection of the first rosette gauge, from the reference axis.
theta_bradDirection of the second rosette gauge.
theta_cradDirection of the third rosette gauge.
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
nu—Poisson's ratio — how much a material narrows sideways when you stretch it.
GivesUnitMeaning
eps_1—Largest principal strain.
eps_2—Smallest principal strain.
gamma—Shear strain — the change in angle between two lines that started perpendicular.
theta_pradAngle from the reference axes to the planes on which the principal stresses act.
sigma_1MPaLargest principal stress — the biggest direct stress on any plane through the point, with no shear on that plane.
sigma_2MPaSecond principal stress.

Cases this screen covers without asking. Both sides of each of these are handled by the code, so there is no control for them:

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 both standard layouts, with nothing to invert numerically: the inversion was done once, algebraically.

Which of the two runs is decided by the three gauge angles, and this is the part of the screen most recently repaired. The angles are read, the spacings between them are compared against the two layouts the kernel has closed forms for, and the matching reduction is used; the relation printed beside every reading names which one ran, "rectangular rosette" or "delta rosette". The comparison is made on the spacings rather than on the absolute angles — the second gauge forty-five degrees from the first and the third ninety, or sixty and a hundred and twenty — so a rosette glued on at a slant is still recognised as the rosette it is. A gauge is allowed a thousandth of a radian either way, about a twentieth of a degree, which is tighter than anyone can glue a gauge and looser than the rounding in a typed decimal. Three angles that match neither layout are the canon's third case. The three direction equations are inverted directly; no least-squares fit is needed because three independent readings determine exactly three strain components. The relation beside each result names this route "general rosette".

Until recently nothing read the angles at all. Every rosette was reduced with the rectangular closed form whatever the reader had typed, with the typed angles still on screen beside the answer, and both closed forms already in the kernel. The size of that is easy to state on the state the screen opens on: the same three readings of 3.0e-4, 1.5e-4 and −1.0e-4 reduce to a major principal strain of 3.062e-4 and an engineering shear strain of 1.000e-4 as a rectangular rosette, and to 3.500e-4 and 2.887e-4 as a delta one. A reader with a delta gauge was being shown a major principal strain an eighth below the truth, a shear strain about a third of it, and a principal direction of 0.122 radians against 0.333 — all of it silent, and none of it distinguishable from the right answer by anything on the screen.

The canon records the layout as an explicit branch and marks two gauges at the same angle as singular. A duplicate direction is the same equation written twice, so the inverse returns no result instead of inventing an underdetermined state. The branch has no picker, and should not have one: the rosette this is, is the three angles and nothing else, so a selector beside them could only be set to disagree with them, and a reader who typed a delta layout and then chose "rectangular" would be handed an answer belonging to neither. The angles are the control, and the relation beside each reading is how the screen reports which way it read them.

The test guarding the whole module is a round trip. A known strain state is pushed forward through the transformation at the three gauge angles to make readings, and the reduction is then asked to recover a state it was never given. That is the only construction which catches a factor of two shared by both directions — and the invariant that the direct strains sum to a constant does not catch it, because halving the shear leaves that sum untouched.

Limitations

Reading the result

Two conventions decide whether the answer is right, and they fail differently. The first is engineering against tensor shear strain. Halving the engineering value before it reaches the circle gives a circle of exactly half the correct radius: the principal strains come out too close together, the state looks milder than it is, and the sum of the direct strains is still correct, so the cheapest invariant is blind to it. Regenerating the middle gauge reading is what exposes it.

The second is the direction the principal angle names, which is the plane's normal, measured anticlockwise from the first gauge. The magnitudes do not depend on that choice; the angle does, and reading it the other way reflects the answer about the gauge axis.

Instruments report microstrain: 450 microstrain is 450 millionths here, and the bare number gives principal stresses a million times too large. And three equal readings mean equal biaxial strain with no shear, whatever the gauge directions were — a state with no principal direction at all, which the screen says rather than returning an arbitrary angle.

Read the relation beside each value to see which reduction ran. A rectangular or delta spacing uses its recognisable closed form; every other independent spacing is labelled as a general rosette. Duplicate directions return no result because the missing component cannot be inferred from the readings.

Advisory. This state is the same on every plane, so there is no unique principal direction.
Advisory. The two direct stresses are nearly equal, so the principal directions are poorly determined however carefully they are computed. The principal values themselves remain accurate.
Advisory. The three gauge angles are inverted directly. Duplicate or otherwise linearly dependent directions cannot determine all three strain components and return no result.

Implemented by rosette_strain_x, rosette_strain_y, rosette_shear_strain, delta_rosette_strain_x, delta_rosette_strain_y, delta_rosette_shear_strain, general_rosette_strain_x, general_rosette_strain_y, general_rosette_shear_strain, strain_transform_normal, principal_strain_major, principal_strain_minor, principal_strain_angle, stress_from_strain_plane_stress.

Elastic Constants

Give any two isotropic constants and get the other two, plus the plane stress and plane strain matrices.

G=(E)/(2(1+ν)), K_b=(E)/(3(1-2ν))

Basis

An isotropic linearly elastic solid has exactly two independent elastic constants. Every other modulus is an algebraic combination of any two of them. Isotropy does all the work here: the general linear elastic solid needs twenty-one constants, and the single requirement that no direction be distinguishable from any other collapses that to two.

Derivation

Start from the isotropic law: a direct stress along one axis produces a strain along it equal to the stress over the modulus, and a contraction across it equal to the lateral contraction ratio times that strain. Superposing three such states gives the three-dimensional law, and everything below is that law at one particular state.

For the bulk modulus, apply the same stress in all three directions. Each direction gets its own extension less two lateral contractions, so the volumetric strain is three times the stress times one minus twice the ratio, over the modulus. Dividing pressure by that gives the bulk modulus. At a ratio of exactly one half the volumetric strain is zero for any pressure at all: the material is incompressible and the bulk modulus unbounded — an edge of the elastic model, not a failure of arithmetic.

For the shear modulus, take pure shear, which is equal tension and compression on planes at forty-five degrees. Compute the direct strain along the tension direction from those two stresses and relate it to the change of the right angle: the result is the modulus over twice one plus the ratio. It is unbounded at a ratio of minus one, and the two poles bracket the admissible range in which both moduli stay positive.

Both inverses are written out as relations of their own rather than rearranged at the call site, so a round trip through any pair is a test rather than a comment. The plane-stress relation belongs here for the same reason: invert the two-dimensional law with no stress through the thickness and the factor of one over one minus the ratio squared appears. That factor is the lateral restraint, and it is why a plate held in its own plane is stiffer in this sense than a bar.

G = (E)/(2(1+ν)), K = (E)/(3(1-2ν))
ν = (E)/(2G) - 1, E = 2G(1+ν)
σ_(along) = (E(ε_(along) + ν ε_(across)))/(1-ν^2)
-1 < ν < ½

Assumptions

TakesUnitMeaning
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
nu—Poisson's ratio — how much a material narrows sideways when you stretch it.
GMPaShear modulus — how much shear stress it takes to produce a given angular distortion.
given_pair—Which two elastic constants you are supplying; the other two are worked out from them.
GivesUnitMeaning
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
nu—Poisson's ratio — how much a material narrows sideways when you stretch it.
GMPaShear modulus — how much shear stress it takes to produce a given angular distortion.
K_bulkMPaBulk modulus — how much all-round pressure it takes to produce a given volume change.

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. Both moduli return infinity where their denominator is exactly zero rather than raising, so a contraction ratio of one half puts an infinity symbol on the screen with the canon's own sentence beside it — an answer, not an error.

Conditioning is the real subject. One minus twice the contraction ratio is not an ill-conditioned formula; it is a subtraction performed on the input. At a ratio of 0.4999999 its condition number is about five million, so roughly seven digits are gone before any division happens, and no rewriting recovers them — unlike a cancellation inside a formula, where regrouping can. The exact difference was lost when the ratio became a double.

Two things follow from admitting that. The canon warns once one minus twice the ratio drops below a thousandth, saying the accuracy of the bulk modulus is set by how precisely the ratio is known and not by the arithmetic. And the tolerance for that case is derived rather than chosen: machine epsilon times the condition number, near a billionth, against a measured disagreement near thirty trillionths.

Limitations

Reading the result

The quickest sanity check is the ratio of the shear modulus to the tensile one. For ordinary metals the contraction ratio sits between about a quarter and about a third, which puts the shear modulus between roughly thirty-seven and forty per cent of the tensile modulus. A pair that puts it above one half implies a negative contraction ratio, and the input is far likelier to be wrong than the material to be auxetic.

This module has an independent check worth naming, public domain and freely quotable. MIL-HDBK-5J prints, for a drawn aluminium alloy tube, a tensile modulus, a compressive modulus, a shear modulus and a contraction ratio, and prints elsewhere the relation tying them together. Feeding its own four numbers into its own relation reproduces the shear modulus to within 0.4 per cent and the contraction ratio to within 1.5 per cent — both inside the two significant figures the table carries, and both recorded as a disagreement so the size of the gap stays on the record. That row is the only one in this project's independent-source set which asks whether four measured numbers satisfy a physical relation, rather than whether a second source computed something correctly. If it turns red, look at the table before the code.

Warning. This material is close to incompressible, so the bulk modulus is the ratio of two numbers that nearly cancel. Its accuracy is limited by how precisely the contraction ratio is known, not by the arithmetic.

Implemented by shear_modulus, bulk_modulus, poisson_from_modulus_and_shear, modulus_from_shear_and_poisson, stress_from_strain_plane_stress.

Yield Criteria

Compare a stress state against four different pictures of failure, and see how close each says you are.

σ_(eq)^(vM)=√(½[(σ_1-σ_2)^2+(σ_2-σ_3)^2+(σ_3-σ_1)^2]), σ_(eq)^T=σ_1-σ_3

Basis

A yield criterion is a surface in principal stress space. It reduces three numbers to one yes-or-no, and how they are combined is a modelling choice, not a fact about the material. Two dominate for ductile metals: yield begins when the distortion energy reaches its value at yield in simple tension, or when the largest shear stress does. They agree exactly in tension and disagree by a fixed ratio in shear.

Derivation

Both rest on one experimental observation: a ductile metal does not yield under hydrostatic pressure. Squeeze it equally from every side and it gets smaller, not weaker. So a criterion must ignore the mean stress and depend only on the part of the state that distorts.

The maximum-shear criterion follows at once. The largest shear stress at a point is half the difference of the largest and smallest principal stress, which in simple tension at yield is half the yield stress. So the criterion is that the extreme principal stresses differ by the yield stress, and the code takes maximum minus minimum rather than assuming an ordering — which is what makes unsorted input safe.

The distortion-energy criterion splits the state into a mean part and a deviatoric part and takes the strain energy stored in the latter. That energy is proportional to the sum of the squared differences of the principal stresses, so setting it equal to its value in simple tension gives the square root of half that sum. Written entirely in differences, as the code writes it, hydrostatic invariance is exact: adding five hundred to all three changes the last bit, not the answer.

Where they disagree can be computed once and remembered. Pure shear has principal stresses of plus the shear, minus the shear, and zero: maximum shear gives twice the shear, distortion energy the square root of three times it. The ratio is exactly two over the square root of three, about 1.155, for every shear stress, and the two coincide only when two of the three principal stresses are equal — which covers every uniaxial and every equal-biaxial state and nothing else. Two further criteria cover materials that pair describes badly: one which parts rather than slides is governed by the largest principal stress in magnitude, and one with different strengths each way becomes a utilisation ratio.

σ_(eq)^(vM) = √(½[(σ_1-σ_2)^2 + (σ_2-σ_3)^2 + (σ_3-σ_1)^2])
σ_(eq)^T = σ_(max) - σ_(min)
pure shear: σ_(eq)^T = 2τ, σ_(eq)^(vM) = √3 τ, ratio = (2)/(√3)
(σ_1)/(σ_t) - (σ_3)/(σ_c) = 1 (different strengths each way)
n = (σ_y)/(|σ_(eq)|)

Assumptions

TakesUnitMeaning
sigma_1MPaLargest principal stress — the biggest direct stress on any plane through the point, with no shear on that plane.
sigma_2MPaSecond principal stress.
sigma_3MPaSmallest principal stress.
sigma_yMPaYield stress — where the material stops springing back.
sigma_ycMPaCompressive strength — how much the material takes in compression, which for stone, concrete and cast iron is several times what it takes in tension.
criterion—Which failure criterion is being applied.
GivesUnitMeaning
sigma_eqMPaEquivalent stress — the single number a failure criterion compares against the yield stress.
FoS—Factor of safety — how much bigger the resistance is than the demand.

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, with no iteration. The choice of criterion is an explicit branch the reader makes rather than a default the screen picks, and that is the decision this module turns on: four numbers that can differ by fifteen per cent, reported as one without saying which, hide exactly the thing worth seeing. The factor of safety returns infinity at zero demand — an unloaded member, not an error — and divides by the magnitude of the equivalent stress, so a compressive demand still gives a positive factor.

There is no independent second source here: the public-domain manuals this project searched print both criteria and never a worked number for either. What stands in its place is two ratios needing no arithmetic — exactly one in uniaxial tension, exactly two over the square root of three in pure shear — which beat any single printed case, since a constant error in either moves one.

Limitations

Reading the result

Which criterion is conservative has a definite answer: the maximum-shear one, everywhere. It never returns less than the distortion-energy measure for the same state, and returns up to about 15.5 per cent more. A design passing maximum shear passes distortion energy; the reverse does not follow. So the two are interchangeable only when the margin is wider than that gap, and the states where the gap is widest — a shaft in torsion, a bolt, a web panel — are the ones people size here. In pure shear they put yield at one half and at 0.577 of the yield stress, which for a solid shaft moves the diameter by five per cent, since the stress goes as its cube.

The equivalent stress is a comparison number, not a stress anywhere: nothing in the part is at that value, on any plane. Reading it as one is the commonest misuse, and it matters because uniform hydrostatic compression at five hundred megapascals gives exactly zero by both shear criteria — the correct answer, the whole content of the criterion, and it reads like a fault. The factor of safety, likewise, is against first yield at the point entered: not against collapse, not fracture, and not the load being larger than assumed.

Implemented by von_mises, tresca, maximum_normal, mohr_coulomb, factor_of_safety.

Thin-Walled Pressure Vessel

Hoop and axial stress in a pressurised cylinder or sphere, combined with any torque and end load.

σ_(hoop)=(pd)/(2t), σ_(long)=(pd)/(4t)+(P)/(π t(d+t)), τ=(2T)/(π d^2 t)

Basis

A shell thin enough that the stress may be taken as uniform through its wall carries internal pressure by membrane stress alone, with no bending anywhere. The membrane stresses follow from equilibrium of a cut piece and nothing else — no modulus, no contraction ratio, no compatibility condition. For the same geometry and pressure, these stresses are identical in steel and in rubber.

Derivation

Cut a length of cylinder along a plane through its axis and ask what holds the two halves together. The pressure acts on the projected area, diameter times length — projected, because the components at right angles to the cut cancel around the curve — and two wall sections resist it. That gives the hoop stress as pressure times diameter over twice the thickness.

Now cut across instead. The pressure acts on the end area, a full circle, and the wall resists over a thin annulus, giving the longitudinal stress as pressure times diameter over four times the thickness — exactly half the hoop stress. This is why a pressurised tube splits along its length rather than around it: the crack parallel to the axis is the one the larger stress pulls open. A sphere has no distinguished direction, so any cut through its centre repeats the transverse case and the membrane stress is the same in every direction — half the cylinder's hoop stress for the same diameter and wall, which is the entire argument for spherical or hemispherical ends.

Add a torque and the two membrane directions stop being principal directions. A closed circular tube carries torque as a shear flow uniform round the wall, so the state there is two direct stresses and a shear — exactly what the stress circle was built for, and the app feeds all three into the same principal relations the plane-stress screen uses. With no torque the shear is zero and the hoop and axial directions come back as the principal directions — the check before trusting the rest.

σ_(hoop) = (pd)/(2t), σ_(long) = (pd)/(4t), σ_(sphere) = (pd)/(4t)
τ = (2T)/(π d^2 t) (thin limit)
J = (π(d_o - d_i)(d_o + d_i)(d_o^2 + d_i^2))/(32), τ = (T r_o)/(J)
σ_(1,2) = (σ_(hoop)+σ_(long))/(2) ± √(((σ_(hoop)-σ_(long))/(2))^2 + τ^2)
d/t ≥ 20 for the membrane result to be trusted

Assumptions

TakesUnitMeaning
pMPaInternal pressure in a vessel.
dmmOutside diameter of a circular section.
tmmWall thickness of a thin part — a flange, a web, a tube wall, a plate.
TN·mmTorque carried by the member.
PNAxial force in the member — positive in tension unless the screen says otherwise.
vessel_shape—Which vessel this is: a cylinder, whose hoop stress is twice its axial one, or a sphere, whose two membrane stresses are equal and half the cylinder's hoop.
GivesUnitMeaning
sigma_hoopMPaHoop stress — the stress running around the circumference of a pressure vessel wall.
sigma_longMPaLongitudinal stress — the stress running along the axis of a pressure vessel.
tauMPaShear stress at the point under consideration.
sigma_1MPaLargest principal stress — the biggest direct stress on any plane through the point, with no shear on that plane.
sigma_2MPaSecond principal stress.
tau_maxMPaLargest shear stress on any plane through the point.

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, guarded on thickness: a non-positive wall returns not-a-number rather than raising.

The shear is where the code does something the displayed formula does not say. Rather than evaluating the thin-limit expression, the app builds the exact polar second moment of a circular annulus whose bore is the entered diameter and whose outside is that diameter plus two walls, and takes the shear at the outside radius. So the entered diameter is the bore, and the shear reported is the exact hollow-shaft value — right on a thick tube too, converging on the thin-limit formula as the wall goes to zero. That polar moment is computed in factored form rather than as a difference of fourth powers, which for any thin wall subtracts two nearly equal large numbers: at a wall of one part in a thousand the direct form loses about three digits.

The sphere is a control on the screen, and picking it changes the model rather than applying a factor. On a sphere both membrane stresses become the single membrane value, which is exactly the cylinder's longitudinal stress, so what the reader sees is the hoop stress halving while the longitudinal stress stays where it was — the entire argument for spherical heads, visible in two rows. On the state the screen opens on, a 1200 mm bore with an 8 mm wall at 1.5 MPa, the cylinder gives 112.5 MPa hoop and 56.25 MPa longitudinal, and the sphere gives 56.25 MPa in both directions. The principal stresses and the maximum shear follow, because all three are computed from whichever pair of membrane stresses the choice produced.

That the choice exists is recent, and the shape of the defect is worth recording because everything except the wiring was already in place. The canon had declared the branch since the specification was written and carries an invariant for each side of it — the cylinder's hoop is twice its longitudinal, the sphere's two membrane stresses are equal — and a public-domain second-source fixture covers the hemispherical head. None of it reached a screen: every vessel was answered as a cylinder, which for a sphere is twice the truth, in the direction that flatters the design, with nothing on screen to say a choice had been made.

The diameter-to-thickness ratio is still not among the outputs, so a reader who wants the number forms it from the two inputs. It is now computed behind the screen for one purpose: the advisory that fires below a ratio of about twenty, where the membrane result begins to understate the stress at the inner surface. That advisory could not fire at all until recently — the guard was looked up by the canon's own phrase for the ratio while the only caller handed over a dictionary keyed by symbol, so the two never met, and a vessel with a ratio of five sat silently under a guard watching for anything below twenty.

Limitations

Reading the result

Two identities are exact in the code and cost nothing to check. Hoop stress is exactly twice longitudinal stress for a closed cylinder. And a sphere of the same diameter and wall carries exactly half the cylinder's hoop stress, which the screen now shows directly: switch the shape and watch the hoop value fall onto the longitudinal one while that one does not move. Both are invariants in the canon and tests in the suite, so the screen is showing something that is checked rather than something that merely looks tidy.

Check which shape is selected before quoting either number. The two differ by a factor of two and both look entirely reasonable, and the relation printed beside each membrane stress names the one that produced it. A head of a different wall thickness from its shell is two evaluations rather than one, and the entry above says why that is still not the whole story.

Which diameter is entered matters more than it looks. The app takes the bore and builds the outside as the bore plus two walls, so entering an outside diameter instead raises every reported stress by roughly twice the thickness over the diameter — ten per cent at a ratio of twenty, negligible at two hundred — and nothing tells the app which arrived.

The independent public-domain check here can be named. A worked sample in the Air Force Flight Dynamics Laboratory's Stress Analysis Manual, AFFDL-TR-69-42, takes a cylinder with hemispherical heads and prints twelve thousand psi hoop, six thousand psi meridional, and ten thousand psi in the head; this app reproduces all three. The head line carries a lesson: its printed working divides by twice the cylinder wall, giving six thousand, while the printed answer of ten thousand needs the head's own thinner wall. Value right, working wrong — recorded as an agreement carrying a printing fault rather than forced into agree or dispute.

Advisory. Below a diameter to thickness ratio of about twenty the membrane result understates the stress at the inner surface.

Implemented by hoop_stress_cylinder, longitudinal_stress_cylinder, sphere_membrane_stress, diameter_to_thickness, polar_moment_circular, shear_stress, stress_circle_radius, principal_stress_major, principal_stress_minor.

Beams

Beam Diagrams

Axial force, shear, moment and torque along any planar beam, with every peak and zero located exactly.

(dV)/(dx)=-q(x), (dM)/(dx)=V(x), M(x)=M_0+∫_0^xV(ξ) dξ

Basis

Cut a beam anywhere and the piece you keep must still be in equilibrium. What holds it there is whatever the discarded piece was doing to it: an axial force, a shear force, a bending moment, a torque. A diagram is one of those plotted against position. Because the same argument applies at every cut the four are not independent — differentiating the equilibrium of a thin slice ties load, shear and moment together, and it is those two derivatives, not the cuts, that make the diagrams drawable rather than merely computable.

Derivation

Take a slice of length dx. Vertical equilibrium says the shear leaving differs from the shear entering by the load on the slice, so the derivative of shear is minus the load intensity. Moment equilibrium about one face says the derivative of moment is the shear, the load's own moment on the slice being second order. Integrating gives the two rules a reader draws with: the change in shear between two sections is the area under the load, and the change in moment is the area under the shear.

Discrete loads make those integrals awkward, and the Macaulay bracket removes the awkwardness. It is zero to the left of its station and an ordinary power to the right, so one expression covers the whole span: a beam with five loads has one moment function rather than six pieces matched at their joins, and integrating a bracket raises its power exactly as an ordinary term does.

The signs are a convention and nothing more. Here x runs from the left end, downward loads are positive, shear is the resultant of everything left of the cut taken positive upwards, and moment is sagging positive. Nothing measurable changes if all four are flipped; what changes is whether two numbers from two sources can be compared. Reference works do not all choose the same way, which is why the convention is stated on the screen rather than assumed.

One relation deserves stating on its own: why the shear's zero locates the largest moment. Since the derivative of moment is the shear, the moment is stationary exactly where the shear vanishes — but only where the shear is continuous. At a point load the shear jumps across zero without ever equalling it, the moment has a corner rather than a stationary point, and the peak sits at the load. A search for a stationary point there finds nothing; one that differentiates across the jump finds the jump. Both are treated as candidates.

(dV)/(dx)=-q(x), (dM)/(dx)=V(x)
⟨ x-a⟩^n=0 (x<a), ⟨ x-a⟩^n=(x-a)^n (x≥ a)
M(x)=Σ_i C_i ⟨ x-a_i⟩^(n_i)
M(x_2)-M(x_1)=∫_(x_1)^(x_2)V dx
Δ V=-W at a point load, Δ M=-M_0 at a couple

Assumptions

TakesUnitMeaning
LmmLength of the member along its own axis, support to support.
supports_type—The support arrangement — pinned both ends, fixed one end, propped cantilever, and so on.
load_type—The kind of load applied — point, uniform, linearly varying, or applied moment.
WNTotal load on the span, whether it arrives as one force or spread out.
qN/mmDistributed load intensity — force per unit length along the member.
ammDistance from the left-hand support to the point being described.
release—Which member ends are released so they carry no moment.
GivesUnitMeaning
diagram_NNAxial force along the member.
diagram_VNShear force along the member.
diagram_MN·mmBending moment along the member.
diagram_TN·mmTorque along the member.
M_maxN·mmLargest bending moment anywhere along the member.
x_contrammPositions along the member where the bending moment passes through zero.

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

Cases this screen covers without asking. Both sides of each of these are handled by the code, so there is no control for them:

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

Where it stops.

Solution method

The kernel answers one narrow question — what does this one load do at this one station — and decides nothing. The composition layer sums those contributions after finding the reactions, and returns not-a-number for two coincident supports, which is a mechanism and not a beam. Both one-sided values at a discontinuity come from the same code path: the left-hand value is evaluated at the next representable number below the station.

Extremes come from a candidate list, not from differentiation: the stations where a diagram can change character, the shear zeros, and both one-sided moments wherever they differ. Shear zeros are found by bisection, eighty halvings, segment by segment, with segments split at the interior sign change of any linearly varying load so the shear is monotone within each. Bisection rather than interpolation, because under a triangular load the shear is quadratic and the moment cubic: a linear crossing once put the largest moment a third of a span out of place.

The internal-release choice is a stable Gerber preset: fixed at the left, roller supported at the right, with a hinge at midspan. Moments of the right-hand loads about the hinge give the roller reaction; applying that reaction to the full member gives the same shear and moment diagrams and makes the hinge moment zero by construction. The fixed end is essential: adding a hinge to the pin-pin arrangement would create a mechanism, not another solvable diagram.

Contraflexure splits the segments at the shear zeros as well, and that is not an optimisation. Within one segment the moment can rise through zero and fall back, so a sign check at the two ends sees the same sign at both and reports nothing — which is what a beam with an overhang at each end does, and the first version returned an empty list for it. An empty list looks like an answer.

Limitations

Reading the result

Read the sign convention before the numbers. Sagging positive is a choice, not a fact about the beam, and a moment carried in from elsewhere has to be checked against it first.

Do not assume the largest moment sits where the shear crosses zero. On a beam carrying only point loads there is no shear zero anywhere: the shear steps across zero at the load, and that is where the peak is. Both the largest sagging and the largest hogging value are reported with their positions, and a beam with an overhang generally has both.

A zero of the moment at the end of the beam is the support condition, not a point of contraflexure. One independent check costs nothing: the change in moment between two sections equals the area under the shear diagram between them, which uses the shear rather than the loads, so the two disagree if either is wrong.

Advisory. This model ignores shear deformation, so a stubby member will read stiffer than it really is.

Implemented by macaulay, shear_from_point_load, moment_from_point_load, moment_from_applied_moment, shear_from_udl, moment_from_udl, shear_from_linear_load, moment_from_linear_load, moment_from_shear_area, axial_from_point_load, torque_from_point_torque, reactions, shear_at, moment_at, shear_jump_at, shear_zeros, contraflexure, moment_extremes, largest_sagging, largest_hogging, internal_hinge_beam.

Bending Stress

Direct stress from bending, about one axis or two, with the neutral axis found for you.

σ=(M y)/(I_x), σ=(M_x y)/(I_x)-(M_y z)/(I_y), tanβ=(I_x)/(I_y)tanα_p

Basis

Plane sections remain plane. If a cross-section stays flat as the beam bends, the axial strain of a fibre is proportional to its distance from the one surface that does not change length, and for a linear elastic material the stress follows. Two integrals over the section then fix everything: requiring no net axial force places the neutral axis at the centroid, and requiring the internal moment to match the applied one fixes the constant of proportionality. Every restriction on the flexure formula is a restriction on one of those two sentences.

Derivation

Bend a straight beam to a radius. A fibre at distance y from the unstrained surface stretches by y over that radius, so its stress is the modulus times that. The axial resultant is the first moment of area about the surface, scaled; setting it to zero forces the first moment to vanish, and the only axis about which it does is the one through the centroid. The internal moment is the second moment of area, scaled the same way. Eliminating the radius between the two gives the stress relation and the curvature relation at once — the expression this screen prints as a stress is the one the deflection screens integrate. Folding the distance to the extreme fibre into the section property gives the section modulus, which is what a section table lists; its inverse, the moment of resistance, is the relation the whole of elastic beam design is written in.

Bending about two axes superposes term by term, for one specific reason: both terms are linear in position measured in the same neutral plane. It holds only once the axes really are principal, that is, once the product of area vanishes. Applied about axes that are not, it drops the coupling term and understates the stress.

The neutral axis is where the trouble is. For an inclined moment the neutral axis is not perpendicular to the moment vector: it rotates further than the moment does, toward the weak axis, by a factor equal to the ratio of the two second moments, and the two coincide only when those are equal. What follows surprises people the first time — the section bends out of the plane it is loaded in, and the peak stress sits at the point furthest from the actual neutral axis, which is not in general the extreme fibre of the reference axes. Reporting the extreme fibre instead is the standard way to understate a stress and feel confident doing it.

(σ)/(y)=(M)/(I_x)=E/R
Z=(I_x)/(c), σ=M/Z, M_R=σ Z
κ=1/R=(M)/(EI_x)
tanβ=(I_x)/(I_y)tanα

Assumptions

TakesUnitMeaning
M_xN·mmBending moment about the horizontal axis.
M_yN·mmBending moment about the vertical axis.
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
I_ymm⁴Second moment of area about the vertical centroidal axis.
c_tmmDistance from the centroid to the top fibre of the section.
c_bmmDistance from the centroid to the bottom fibre of the section.
c_zmmDistance from the centroid to the extreme fibre in the second cross-section direction — the one the sideways moment bends about.
GivesUnitMeaning
sigma_maxMPaLargest direct stress anywhere in the section.
sigma_minMPaSmallest direct stress anywhere in the section, negative where the section is in compression.
beta_naradAngle from the reference axes to the neutral axis under the applied moment — the line across the section where the bending stress is zero.
kappa1/mmCurvature — how sharply the member is bending, one over the radius of the bent shape.

Cases this screen covers without asking. Both sides of each of these are handled by the code, so there is no control for them:

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, with the degenerate cases decided rather than left to the arithmetic. Dividing by the second moment of area returns not-a-number for a section with no bending stiffness; dividing by the section modulus returns infinity for a vanishing modulus, which is a section with nothing at its extreme fibre — a real answer rather than a failure. The neutral-axis angle is taken with a two-argument arctangent of the two products rather than as a ratio of tangents, so a moment acting along one axis is a value rather than a division by zero, and the quadrant survives.

Distance is measured upwards from the neutral axis and tension is positive everywhere in this package, so a sagging moment puts the fibres above the axis into compression and they come back negative. The screen therefore reports the bottom-fibre stress as the maximum and the top-fibre stress as the minimum: a pairing correct for a sagging moment, and the wrong thing to read as largest-and-smallest in magnitude. The curvature output uses the same relation with the reader's global modulus, and is the identical quantity the deflection screens integrate rather than a second one.

The biaxial relation is what the screen evaluates, and the extreme is found by scanning rather than by assumption. Three fibre distances are taken — c_t above the neutral axis, c_b below it, and c_z to either side — and the superposed relation is evaluated at all four corners they define. The largest of the four is reported as sigma_max and the smallest as sigma_min. Scanning matters because which corner governs depends on the signs of both moments: reverse M_y and the governing corner moves to the diagonally opposite one, so a rule of thumb picked on one sign is wrong on the other. Four evaluations cost nothing and cannot be got wrong by a sign.

The size of what that fixes is worth stating, because this screen used to report the strong-axis answer under the biaxial formula. On the opening section — a 150 by 300 joist, I_x = 3.375e8 mm⁴, I_y = 8.4375e7 mm⁴, c_t = c_b = 150 mm, c_z = 75 mm — a moment of 4.5e7 N·mm about the horizontal axis alone gives ±20.0 MPa. Adding an equal moment about the vertical axis gives ±60.0 MPa, and doubling that moment gives ±100.0 MPa, while the neutral axis swings from zero through 1.326 to 1.446 radians. Reporting 20.0 MPa in all three states is a five-fold understatement at the third of them, in the unsafe direction, and with nothing on the screen to say so. The distance the second term needs — c_z — is now an input, which is what the fix consisted of.

Degeneracy is decided rather than left to the arithmetic. A non-positive second moment about either axis makes the corner relation return not-a-number, and the largest of a list containing one is whichever value happened to be first. So if any corner is not a number both stresses are reported as dashes, with the canon's own boundary sentence printed beside them: an input that is not a section has no peak stress, and saying so is the honest answer rather than returning a number picked by list order.

Limitations

Reading the result

The two stress outputs are a ranking rather than a pair of positions: sigma_max is the algebraically largest of the four corners and sigma_min the smallest. That is not the same as largest and smallest in magnitude — under a hogging moment on a symmetric section sigma_min is the larger number to a designer, because it is the compressive one. Read the sign first, then the size. Which corner each value came from is not printed, and for a section with unequal fibre distances that is worth working out before quoting either.

For a section not symmetric about the bending axis the two distances to the extreme fibres differ, and so do the two section moduli. Which governs depends on the sign of the moment, so a member whose moment reverses along the span has to be checked at both faces and at both signs. Checking the larger modulus only is a mistake that survives every arithmetic check.

The neutral-axis angle is worth a look even when it seems irrelevant. A tall thin section under a moment a few degrees off its strong axis develops a neutral axis tens of degrees away, and a stress much larger than the strong-axis calculation suggests. Entering a small M_y on the opening section and watching beta_na swing while the stresses climb is the demonstration; the two move together, and the stress moves faster than the angle looks like it should.

The canon declares a choice between bending about a principal axis and bending about one that is not, and this screen offers no control for it. That is not the screen resolving the choice quietly: only the first case ships, and the screen says which case it is in on the row it governs — the relation printed beside beta_na reads "neutral_axis_angle, reference axes taken as principal". The input set is what fixes it, since a screen that takes no product of inertia has been handed principal axes by construction. A reader whose section is lopsided finds its principal values on the principal-axes screen first and enters those.

Implemented by flexure_stress, flexure_stress_from_modulus, moment_of_resistance, curvature, flexure_stress_biaxial, neutral_axis_angle, section_modulus.

Transverse Shear Stress

How shear stress varies through the depth, and how far apart the fasteners of a built-up beam can go.

τ=(VQ)/(I_x t), q_(flow)=(VQ)/(I_x), s_f=(q_(allow))/(q_(flow))

Basis

Where the bending moment varies along a beam, the direct stresses on the two faces of a thin slice are unequal, so the part of the slice beyond any level carries a net longitudinal force it cannot balance by itself. It is held by shear running along the cut that separates it from the rest, and by the complementary property of shear stress the longitudinal and transverse values at a point are equal. So the transverse shear stress in a beam is deduced from the variation of the bending stress, never measured independently of it.

Derivation

Isolate the part of a slice of length dx lying beyond a chosen level. The direct force on its left face is the moment times the first moment of that area about the neutral axis, divided by the second moment; on the right face the moment is larger by dM. The difference has nowhere to go but the cut at the base of the piece, so the force per unit length along that cut is the shear force times the first moment over the second moment. That is the shear flow, and it is what the fasteners or the glue line of a built-up beam have to carry. Dividing it by the width of the cut gives the stress.

Two consequences fall out of the shape of the first moment. At the extreme fibres the isolated area is nothing, so the first moment is zero and the shear stress vanishes top and bottom — which it must, since a free surface can carry no complementary shear. The first moment is largest at the neutral axis, so that is where the stress peaks; for a rectangle the distribution is a parabola and the peak is exactly three halves of the average, independent of the proportions.

The division by the width is where the honesty of the formula lives. The result is not the shear stress at a point; it is the stress averaged across the width of the cut, and the derivation says nothing about how it varies across that width. For a narrow web the distinction never matters. For a wide flange it does: the true distribution across a wide rectangle rises toward the sides, and the average understates them by a margin that grows as the width approaches the depth — which is why the formula is trusted in webs and treated with suspicion in flanges. At a step change in width the first moment is the same on both sides and the width is not, so the stress jumps by the ratio of the two widths; both values are real.

q_(flow)=(VQ)/(I_x), τ=(VQ)/(I_x t)
Q=∫_(A^*) y dA
τ_(max)=(3V)/(2A) (rectangle)
s_f=(q_(allow))/(q_(flow))

Assumptions

TakesUnitMeaning
VNShear force at the section under consideration.
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
Qmm³First moment of the area lying beyond the cut, about the centroidal axis — the part of the section the shear has to drag along.
tmmWall thickness of a thin part — a flange, a web, a tube wall, a plate.
q_allowNLoad one fastener can carry.
GivesUnitMeaning
tauMPaShear stress at the point under consideration.
tau_maxMPaLargest shear stress on any plane through the point.
q_flowN/mmShear flow — force per unit length running along the wall of the section.
s_fastmmSpacing between fasteners along a built-up member.

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

Where it stops.

Solution method

One division, guarded at both degeneracies. A section with no second moment returns not-a-number; a cut of zero width returns infinity, which is what the formula says and is also why a section narrowing to a point is not a section. A fastener spacing computed from a vanishing flow returns infinity too: a joint carrying nothing needs no fasteners, and that is an answer rather than an error.

The rectangle's peak is computed from its own relation — three halves of the mean shear stress over the gross area — rather than by evaluating the general formula at the neutral axis. Two routes to one number, agreeing only if both the first moment and the general formula are right.

The scalar screen can still accept a first moment directly. The composition layer also accepts a vertical stack of centred rectangular parts, derives its centroid, second moment, first moment and one-sided local width, and integrates the resulting shear flow exactly through the depth. At a width step the same flow is divided by the two real local widths, exposing both stress values.

Limitations

Reading the result

The fastener spacing is the number most often misused, and always the same way. The shear flow varies along the span because the shear force does, so a spacing worked out where the shear is smallest is the loosest on the member and the wrong place to work from. On a simply supported beam under uniform load the flow is largest at the supports and zero at midspan; a spacing taken at midspan is unbounded and means nothing. It is also a maximum from shear flow alone, and says nothing about edge distance or bearing on the fastener.

The general stress and the rectangle's peak answer different questions: the first is the stress at the cut described by the first moment and width entered, the second is the peak of a rectangle. On an I-section neither is usually what is wanted, and the shear divided by the web area is closer to the truth than either.

Last, resist comparing a shear stress with a bending stress and concluding that shear does not matter. In a long shallow beam it usually does not. In a short deep one, in a thin-webbed member, and at every glued or bolted interface, it governs.

Implemented by first_moment_rectangle_above, shear_stress_vqit, shear_stress_rectangle_max, shear_flow, fastener_spacing, SectionLayer, first_moment_above, width_at, transverse_shear_stress, integrated_shear.

Transformed Section

Two materials sharing one section: swap one for an equivalent area of the other and bend it as usual.

n=(E_1)/(E_2), y_u=(bh(h/2)+(n-1)A_s d_(eff))/(bh+(n-1)A_s), (b x_c^2)/(2)=nA_s(d_(eff)-x_c), σ_2=n(My)/(I_x)

Basis

Two materials bonded into one section bend as one section, so the strain diagram is continuous across the interface; it is the stress diagram that steps. Since stress is stiffness times strain, a strip of the stiffer material carries a fixed multiple of what an equal strip of the other would carry at the same level. Widening every strip of one material by that multiple gives a section made entirely of the other with the same force and moment at every level. Ordinary bending theory then applies, and the stress in the material swapped out is recovered by undoing the swap.

Derivation

At a given level the strain is fixed by the curvature alone, whatever material happens to be there. The force on a strip is stiffness times strain times width times height. Replacing one material's stiffness with the other's while multiplying the width by the ratio of the two leaves the product of stiffness and width unchanged, so every strip force and moment is unchanged — and therefore so are the neutral axis, the curvature and the total moment.

Width only. Changing a vertical dimension would change the lever arm as well as the stiffness, and the equivalent section would no longer stand for the same beam. This is the one step whose wrong answer looks entirely reasonable. Recovering the stress is the other thing easily forgotten: the equivalent section reports what the substitute material would carry, and the material really there carries the ratio times as much. Skipping it reports a steel stress under timber's name, and the two differ by a factor of twenty or thirty.

The cracked case changes the problem rather than the arithmetic. Concrete in the tension zone is taken to carry nothing, so the active area now depends on where the neutral axis is, and the axis is no longer the centroid of anything known in advance. Equating the first moment of the rectangular compression block to that of the transformed reinforcement, both about the unknown axis, gives a quadratic in the depth whose positive root is the answer. The second moment follows from that depth, and the internal lever arm is the effective depth less one third of it, the compression resultant sitting at the centroid of a triangular stress block.

Before cracking the whole rectangle remains active. The transformed area is the base rectangle plus the additional area (n minus one) times the reinforcement area, because the physical reinforcement has already displaced the same area of the base material. First moments of those two parts give the uncracked neutral axis; the rectangle's centroidal second moment, both parallel-axis terms and the additional reinforcement term give the uncracked second moment. This branch uses the full section depth h, which the cracked branch deliberately does not.

n=(E_(replaced))/(E_(kept)), b_(eq)=n b
A_(tr)=bh+(n-1)A_s, x_(na)=(bh(h/2)+(n-1)A_s d_(eff))/(A_(tr)) (uncracked)
(b x_(na)^2)/(2)=n A_s (d_(eff)-x_(na))
I_x=(b x_(na)^3)/(3)+n A_s (d_(eff)-x_(na))^2
z=d_(eff)-(x_(na))/(3)
σ_(replaced)=n (M y)/(I_x)

Assumptions

TakesUnitMeaning
E_1MPaYoung's modulus of the first material in a two-material member.
E_2MPaYoung's modulus of the second material in a two-material member.
bmmWidth of a rectangular part of the cross-section, measured across the bending axis.
hmmHeight (depth) of a rectangular part of the cross-section, measured along the bending axis.
A_smm²Area of steel reinforcement in the tension zone.
d_effmmEffective depth — from the compression face to the centre of the tension reinforcement.
MN·mmBending moment at the section under consideration.
section_state—Whether the whole transformed section remains active or the tensile material has cracked and is omitted.
GivesUnitMeaning
n_ratio—Modular ratio — one material's stiffness divided by the other's, used to swap one for an equivalent area of the other.
x_nammDepth of the neutral axis below the compression face.
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
sigma_keptMPaDirect stress in the material the section is written in, at its furthest fibre from the neutral axis.
sigma_replacedMPaDirect stress in the material that was swapped out for an equivalent area — recovered by undoing the swap, so it is the stress that material really carries.

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, with the quadratic's positive root written directly. A non-positive width, reinforcement area, effective depth or modular ratio returns not-a-number: a section with no reinforcement has nothing holding the tension and must not be handed a cracked solution. The second moment is computed from the neutral-axis depth the same routine returned, so the two cannot disagree about where the axis is. The uncracked and cracked branches are a visible choice rather than an automatic one, because near the cracking moment they give substantially different depths and no arithmetic test decides between them.

The two stress outputs are deliberately not named as a maximum and a minimum. They are stresses in two different materials, not the two extremes of one stress field. Under the borrowed names the screen once showed a maximum of about minus four megapascals beside a minimum of about plus ninety-six — which reads as a bug and is really a mislabel, since on every other screen those symbols mean the top and bottom fibre of one material. Here one is the compressive stress in the material the section is written in; the other is the stress in the material swapped out, already multiplied back by the modular ratio.

Limitations

Reading the result

The two stresses live in two different materials, so comparing them with each other means nothing. Compare each with its own material's limit. A comfortable steel stress and an uncomfortable concrete stress are entirely consistent with one another and with the same moment.

Get the direction of the modular ratio right, and check it rather than trusting it. It is the stiffness of the material being replaced over the stiffness of the material the equivalent section is written in — so replacing steel by an equivalent area of concrete gives a number around fifteen, not around one fifteenth. Inverting it moves the neutral axis the wrong way, and the check is the trend rather than the value: raising the ratio must pull the axis toward the stiffer material, and adding reinforcement area must push it down.

The lever arm is worth a glance as a sanity check: for a normally proportioned reinforced section it lands between about eighty and ninety per cent of the effective depth, and a value well outside that usually means the reinforcement area or the effective depth went in wrong.

Advisory. These are teaching curves from the research literature, not a design code check. No national or regional standard is applied anywhere in this app.

Implemented by modular_ratio, transformed_width, uncracked_transformed_area, uncracked_transformed_neutral_axis, uncracked_transformed_inertia, stress_in_replaced_material, cracked_neutral_axis, cracked_lever_arm, flexure_stress, SectionLayer, elastic_neutral_axis, strain_at, stress_at, axial_resultant.

Combined Axial + Bending

Stack a direct force onto bending, find every corner stress, and see whether any of the section lifts.

σ=P/A±(M_x)/(Z_t)±(M_y)/(Z_b), e≤(Z_t)/(A) ⇒ σ_(min)≥ 0

Basis

Direct stress and bending stress are both linear in the applied actions and both act on the same fibres in the same direction, so they add. That is the whole principle. Its practical form comes from the equivalence rule of statics: a force applied at an eccentricity is statically equivalent to the same force at the centroid together with a couple equal to force times eccentricity — the same resultant and the same moment about every point — and it is that second form the relation evaluates.

Derivation

Superposing the uniform stress from the force and the linear stress from each moment gives a distribution that is still linear across the section. Evaluating it at a corner is a matter of choosing the sign of each bending term, which is why one expression with two sign flags serves all four corners.

Eccentricity changes only the slope of that line and where it crosses zero. Push the load far enough from the centroid and the zero moves inside the section, and part of it goes into tension. For a bolted joint or a solid steel member that is unremarkable. For a footing on soil, for masonry, for any interface that cannot pull, it is not: the material simply leaves, and the formula has quietly returned a negative stress where there is no longer anything to carry it. That number looks plausible and means nothing.

The core answers the resulting question — how far out the load may sit before any part of the section goes into tension. Setting the stress at the far face to zero equates the direct term with the bending term, and the force cancels: the limit is the section modulus divided by the area, a property of the section alone that does not move when the load changes. For a rectangle that is one sixth of the depth, the middle-third rule; for a solid circle it is one eighth of the diameter, a different fraction entirely. With eccentricity in both directions the two limits are not checked separately, because the core of a rectangle is a rhombus: the two eccentricities trade against each other and their fractions of the respective limits must sum to no more than one. Checking them one at a time passes loads that lift a corner.

σ=P/A±(M_x)/(Z_x)±(M_y)/(Z_y), M=Pe
e_(core)=Z/A
rectangle: e≤d/6, solid circle: e≤d/8
(|e_x|)/(c_x)+(|e_y|)/(c_y)≤ 1

Assumptions

TakesUnitMeaning
PNAxial force in the member — positive in tension unless the screen says otherwise.
M_xN·mmBending moment about the horizontal axis.
M_yN·mmBending moment about the vertical axis.
Amm²Cross-sectional area — the amount of material you would see if you sliced the member straight across.
Z_tmm³Elastic section modulus for the top fibre — second moment of area divided by the distance to that fibre.
Z_bmm³Elastic section modulus for the bottom fibre.
GivesUnitMeaning
sigma_maxMPaLargest direct stress anywhere in the section.
sigma_minMPaSmallest direct stress anywhere in the section, negative where the section is in compression.
coremmThe outline inside which the load must land if no part of the section is to go into tension.
e_resmmEccentricity of the resultant force where it crosses the base.

Cases this screen covers without asking. Both sides of each of these are handled by the code, so there is no control for them:

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, with one deliberate omission that has to be stated. The combined stress relation carries no sign convention of its own. It adds force over area to two bending terms, and whatever sign the caller gave the force comes back in the answer: enter a compressive load as negative and compression comes out negative. This is written down because a claimed convention the function does not enforce would be worse than no claim at all.

The core shown is the section modulus over the area on the entered face — a property of the section alone, not a verdict on the case entered. The verdict is beside it. The kernel's rhombus check, stays_in_contact, trades the two eccentricities against the two core limits the way the derivation above describes, and the screen now calls it: the relation printed beside core reads either that the resultant is inside it and the whole section bears, or that it is outside it and sigma_min is material that cannot pull. This screen carries a section modulus about one axis only, so the second eccentricity is passed as zero rather than inventing a core half-width the screen does not have, and the rhombus test reduces to the single comparison the two rows on screen already show. A separate advisory appears once the resultant is outside the core, saying which distribution is being shown and for what kind of section it is wrong: a base, a masonry joint, an unreinforced footing.

Both of those are recent, and what they replace is worth recording. The canon's branch between whole-section contact and partial lifting reached nothing: the screen printed the eccentricity and the core beside each other and left the comparison to the reader. The advisory that did point at this screen was the retaining wall's, which says that the reduced-contact distribution is being used — and on this screen that sentence is false, because the linear distribution is what is shown and always was. A guard asserting a behaviour the screen does not have is worse than none, so the two were separated: the wall keeps its own, and this screen has one that describes what it actually does.

The rectangle's one-sixth form is provided separately in the kernel because it is the version a reader checks by eye, and because the rectangle is the section the rule is always quoted for, but it is not called here — core is core_limit's general section-modulus form regardless of the section shape entered. The reported resultant eccentricity is the moment divided by the force — where the resultant of the entered actions crosses the section — and it returns not-a-number for a vanishing force, whose moment cannot fix a distance at all; it is computed from M_x alone, and the eccentricity entry offered beside it is not read back into anything below, which the screen says in an advisory of its own rather than leaving a field that quietly does nothing.

The screen carries one section modulus per face rather than one per axis, so a biaxial case is evaluated with the same modulus for both moment terms. Where the two axes genuinely differ, evaluate one axis at a time and superpose by hand.

Limitations

Reading the result

Find the tensile face before anything else, and to do that you have to know which sign convention the numbers were entered in. This relation carries none of its own: it adds force over area to the bending terms and gives back whatever sign the force was given. Under this manual's convention, tension positive, a compressive load is entered negative and the tensile face is whichever of the two stresses is positive — on the opening state that is sigma_max at +4.44 MPa, against sigma_min at −17.78 MPa, which is compression. Enter the same case compression-positive, as the printed tables in this subject do, and the two swap roles. On a section that cannot pull, a stress on the tensile side is not a small tension to be shrugged at: it is the signal that the linear model no longer applies at this load position, and that every number on the screen came from a relation whose assumption has failed.

One caution about the sentence the screen prints beside the core. It names sigma_min as the material that cannot pull, which is right when the load has been entered compression-positive and wrong when it has been entered the way this app's own opening state enters it. Read the signs rather than the row name.

The comparison that answers the practical question is between the resultant eccentricity and the core limit, not between the two stresses, and the screen now makes it for you: the words beside the core say which side of it the resultant is on. Inside the core the whole section bears; outside it, part lifts. That single comparison is what a bearing check comes down to, and it does not depend on the size of the load at all — which is why moving the load is a far more effective remedy than shrinking it. The screen opens with the resultant outside the core, so the sentence a reader most needs to recognise is the one they meet first.

The middle third is a rule for a rectangle, and it gets applied to circles, I-sections and annular bases where section modulus over area is a quite different fraction of the depth. Compute the limit from the section rather than recalling the fraction.

Advisory. The resultant sits outside the core, so one face of this section is in tension. What is shown is the linear distribution that follows — right for a section that can carry tension, and wrong for one that cannot: a base, a masonry joint, an unreinforced footing.

Implemented by combined_stress, core_limit, rectangle_core_half_width, stays_in_contact, moment_arm.

Deflection — Standard Cases

Slope and deflection for the standard span, support and load combinations, superposed as you like.

δ_(max)=c (W L^3)/(EI_x), c=(δ_(max)EI_x)/(WL^3) from the closed-form solution

Basis

The moment-curvature relation, integrated twice with the support conditions imposed, gives a closed expression for the deflected shape of any beam whose moment function is known. For the recurring span, support and load combinations that integration has been done once and for all, and the result collapses into a single coefficient multiplying load times span cubed over bending stiffness. Because the underlying relation is linear the cases superpose: a beam under several loads deflects by the sum of the deflections they cause separately.

Derivation

Every case here is that double integration carried out and then reduced. A simply supported span carrying a total load spread uniformly gives five three-hundred-and-eighty-fourths. The same total load concentrated at midspan gives one forty-eighth — eight fifths as much, which says that concentrating a load costs sixty per cent more deflection than spreading it. Building in both ends under uniform load gives exactly one fifth of the simply supported value, the strongest single argument for continuity in a floor; with a central point load it is a quarter rather than a fifth. A cantilever loaded at its tip is one third, sixteen times the simply supported central case, which is the comparison that explains why cantilevers are deep. Every coefficient is written for the total load on the span, not for an intensity: mixing the two is a factor equal to the span, and it is the most frequent transcription error in this subject.

Two cases are not simple fractions. Under an off-centre point load the maximum does not sit under the load: it sits at the root of a cubic, at the extreme a distance of the span over the square root of three from the far support, which is under a tenth of the span from midspan however far out the load goes. The deflection under the load is a different and smaller number, and the two coincide for a central load — which is precisely why they get confused.

The propped cantilever under uniform load is the other, and this app's closed form for it is a kernel relation checked against fixtures rather than a case this screen offers — see the limitations below for what the screen's own two selectors can and cannot reach. Its maximum is commonly quoted with a denominator of one hundred and eighty-five, and that is a rounding: the maximum sits at a root of a cubic, about 0.4215 of the span from the prop, and the closed form evaluates the deflected shape there instead of carrying the rounded constant. A constant was carried at first, guessed from a plausible closed form, and came out three times too small — caught immediately by the printed coefficient it was checked against.

EI_x(d^2v)/(dx^2)=M(x), δ=c (WL^3)/(EI_x)
c=(5)/(384) (simple, uniform), (1)/(48) (simple, central), (1)/(384) (fixed, uniform), 1/3 (cantilever tip)
x_(max)=√((L^2-b^2)/(3)), δ_(max)=(W b (L^2-b^2)^(3/2))/(9√3 EI_x L)
8u^3-9u^2+1=0, u=(1+√(33))/(16) (propped cantilever)

Assumptions

TakesUnitMeaning
LmmLength of the member along its own axis, support to support.
supports_type—The support arrangement — pinned both ends, fixed one end, propped cantilever, and so on.
load_type—The kind of load applied — point, uniform, linearly varying, or applied moment.
WNTotal load on the span, whether it arrives as one force or spread out.
ammDistance from the left-hand support to the point being described.
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
hmmHeight (depth) of a rectangular part of the cross-section, measured along the bending axis.
GivesUnitMeaning
delta_maxmmLargest deflection anywhere along the member.
delta_posmmPosition along the member where the largest deflection occurs.
theta_rotradRotation of the cross-section, the slope of the bent member at that point.
deltammDeflection — how far a point has moved from where it started.

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, one function per case, each guarded so that a zero span, a section with no stiffness, or a load positioned off the beam returns not-a-number rather than a number. This screen reads two selectors — support arrangement and load kind — and a position. Three support arrangements are offered, simply supported, cantilever and built in at both ends, each with a uniform load or a point load, which is six combinations; the position then places the point load along the span, so the simply supported point-load case is the general off-centre one and not only the midspan special case.

The position is read, and that is recent. It used to be drawn and ignored: a reader could walk the load from 500 to 5500 mm and watch the deflection stay at 1.2698 mm, the midspan value, throughout. The four relations that answer the general case were already in the kernel and verified to sixty digits, reachable from nothing but their own tests. On the opening span with the load 2000 mm from the left support the screen now reports a maximum of 1.0923 mm at 2734 mm from that support, a deflection under the load itself of 1.0033 mm, and an end rotation of 6.271e-4 radians — three different numbers where there used to be one, and the distinction between the first two is most of what the case is for. Put the load back at midspan and all three collapse to the central values, 1.2698 mm and 6.349e-4 radians, which is the check worth making on any screen whose general case has a special case inside it.

The end slope follows both selectors as well. It used to be the simply supported uniform value unconditionally, so five of the six combinations reported a slope belonging to a different beam — a wrong number wearing the right units, which no invariant catches. For the built-in-both-ends case it is reported as an exact zero with the support named as the reason rather than as a relation, because that is what it is.

The propped cantilever remains out of reach from here. Its closed form is carried in the kernel for the same reason every case here is — no rounded coefficient appears anywhere in the code, propped cantilever included, whose maximum is computed from the exact root and the shape evaluated there rather than the commonly quoted rounding — but there is no fourth support state to select it.

Downward loads are positive and downward deflection is positive here — the opposite of the beam kernel, where displacement is measured with the coordinate axis and is negative under gravity. A reader asking how far it sags wants a positive number, and every reference table in the subject is written that way; the composition layer negates when handing these into a coordinate system.

The coefficients are computed rather than listed. A printed table gives the coefficient to four figures for a handful of cases; transcribing those numbers would copy protected expression and limit the app to that handful. Instead each case carries its own closed form and the coefficient is recovered from the computed deflection, so the printed column becomes a fixture that checks this code rather than content the app carries.

Limitations

Reading the result

The number is elastic and instantaneous. A timber or concrete member under sustained load ends up at some multiple of it, and no coefficient here knows about time.

Deflection is far more sensitive to span than to anything else on offer: the cube of the span for a fixed total load, the fourth power for a fixed intensity. Doubling the span multiplies the deflection by eight or by sixteen; doubling the second moment of area only halves it. That asymmetry is why a serviceability problem is nearly always solved by depth and hardly ever by material.

The screen now takes a depth, and the only thing it does is decide whether ignoring shear deformation was reasonable. Below a span-to-depth ratio of about ten an advisory appears saying that a stubby member reads stiffer here than it really is. It is deliberately an advisory and not a limit: deflection limits are code values, and this app applies none. The opening state is a 300 deep joist on a six-metre span, a ratio of twenty, so the advisory is quiet until the span is shortened below three metres — which is what a guardrail that means something looks like.

The position of the maximum is not the position of the load, and the screen shows both so that the difference is visible rather than assumed. On a simply supported span with the load 2000 mm along a six-metre span the largest deflection sits at 2734 mm, three quarters of the way from the load toward midspan: the maximum drifts toward the middle and stays within about a tenth of the span of it however far out the load goes, while the deflection under the load itself is a different and smaller number. The two coincide only for a central load, which is exactly why they are confused. On a cantilever the maximum is always at the free end, because a cantilever has zero deflection only at its root and there is no interior stationary point to look for; the position row there does not follow the load, and that is the answer rather than a fault.

Advisory. This model ignores shear deformation, so a stubby member will read stiffer than it really is.
Advisory. A beam's deflection is fixed by E and I_x, so the depth h is not read into delta, delta_max or theta_rot. It is on the screen because slenderness is what decides whether ignoring shear deformation is safe, and that is a judgement rather than a term in the formula.

Implemented by simply_supported_udl, simply_supported_udl_slope, simply_supported_central_point, simply_supported_central_point_slope, simply_supported_point_at, simply_supported_point_slope, simply_supported_point_max, simply_supported_point_max_position, simply_supported_end_moment, cantilever_udl, cantilever_point_at, cantilever_point_at_tip, cantilever_tip_slope_udl, cantilever_tip_slope_point, fixed_both_ends_udl, fixed_both_ends_central_point, propped_cantilever_udl, propped_cantilever_max_position, coefficient, span_over_depth.

Deflection — Integration

Integrate the moment twice for the whole deflected shape, with discontinuous loads handled cleanly.

EI_x(d^2v)/(dx^2)=M(x), M(x)=Σ_i C_i ⟨ x-a_i⟩^(n_i)

Basis

The same moment-curvature relation as the standard cases, but integrated for the beam in front of you instead of for a case somebody catalogued. Bending stiffness times the second derivative of the deflection equals the bending moment at that station. The moment function comes from the beam's own loads and reactions; integrating once gives the slope, twice gives the shape, and the two constants of integration are fixed by the support conditions. Every method in the family — plain double integration, singularity functions, moment-area, conjugate beam — is that one relation with different bookkeeping.

Derivation

The exact curvature of a curve is its second derivative divided by a factor involving the slope. For a beam whose slope stays small compared with one that factor is one to within a fraction of a per cent, and the relation linearises. That linearisation, not the material law, is what limits this method to small deflections.

Integrating once gives the slope plus a constant; twice gives the deflection plus that constant times position plus a second constant. The constants are not decoration — they carry all of the support information. A simply supported beam has zero deflection at both ends; a cantilever has zero deflection and zero slope at the root. For any statically determinate beam exactly two conditions are available and they fix the two constants uniquely.

Discontinuous loading is what makes plain double integration painful and what the bracket notation removes. Written piecewise, a beam with five loads has six segments and ten constants matched pairwise at the joins. Written with brackets that vanish to the left of their station it has one moment function and two constants — the matching happens by itself, because both the bracket and its integral are zero at the join. An internal hinge is the one thing it does not absorb: it breaks slope continuity while leaving deflection continuous, so the beam needs a third condition — the moment there is zero — imposed rather than inferred.

Moment-area and conjugate beam are the same integration in different clothes, and are easier by hand: the first reads the change of slope between two points as the area of the moment-over-stiffness diagram between them, the second loads a fictitious beam with that diagram and reads its shear and moment as the real beam's slope and deflection.

EI_x(d^2v)/(dx^2)=M(x)
EI_x(dv)/(dx)=∫ M dx+C_1, EI_x v=∫∫ M dx dx+C_1 x+C_2
∫⟨ x-a⟩^ndx=(⟨ x-a⟩^(n+1))/(n+1)
M(x)=Σ_i C_i ⟨ x-a_i⟩^(n_i)
θ_B-θ_A=∫_A^B(M)/(EI_x) dx

Assumptions

TakesUnitMeaning
LmmLength of the member along its own axis, support to support.
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
load_type—The kind of load applied — point, uniform, linearly varying, or applied moment.
WNTotal load on the span, whether it arrives as one force or spread out.
ammDistance from the left-hand support to the point being described.
method—Which of the module's solution routes is being used.
hmmHeight (depth) of a rectangular part of the cross-section, measured along the bending axis.
GivesUnitMeaning
deltammDeflection — how far a point has moved from where it started.
theta_rotradRotation of the cross-section, the slope of the bent member at that point.
delta_maxmmLargest deflection anywhere along the member.
delta_posmmPosition along the member where the largest deflection occurs.

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

It is worth being exact about which part of this is analytic and which is not, because the two are easy to assume the wrong way round.

The moment function and both integrations are analytic. Load ends, point loads, couples and supports define the segment boundaries. Within each segment the moment is reconstructed as its exact cubic polynomial, then integrated in closed form once for slope and twice for deflection. Adding extra segment boundaries therefore changes no value. The two rigid-line constants are solved from either the two simple-support deflections or the fixed-end deflection and rotation.

For the stable Gerber preset the moment is first required to be zero at the hinge. The two sides then receive separate rotation constants while sharing one deflection there; slope may jump and deflection may not. Closed-form uniform-load and tip-load cases independently reproduce the analytic curve.

The uniform load is this screen's own W, divided by the span. It used to be read from an intensity symbol the screen offers no field for, left over in the opening state, while the W the reader could see did nothing at all under a uniform load. Both screens now take the total load on the span, which is what every coefficient in this subject is written for.

The route selector moves what is printed, not what is computed, and that is the canon's own reason for the branch: all four routes give the same answer, and seeing which one is running is the point. The relation printed beside every reading names both halves — the route the reader asked for and the operation that carried it out, so choosing moment-area gives "moment_at as moment-area, integrated twice". Singularity functions are a way of writing the moment function that goes into the integral, and moment-area and the conjugate beam are two ways of writing the double integral of moment over stiffness, so naming the route beside the operation is a description rather than a claim about a second algorithm. Before this, the picker moved and nothing on the screen changed at all, which for whoever chose any of the last three was a silence that read as agreement.

The end rotation is negated on its way out. The integration runs with upward positive, so a downward load leaves a negative rotation at the left end here and a positive one on the closed-form screen: the same beam, the same symbol, the same units, opposite signs, and a reader comparing the two routes with no way to tell which was the error. The sign is fixed here rather than left for the reader to reconcile.

Limitations

Reading the result

The rotation reported is the slope at the left-hand end, not the largest slope on the beam. On a simply supported span those are the same thing; on anything else they are not.

The position input does double duty here, and that catches people. It places the point load when a point load is selected, and it also selects the station at which the deflection is reported. On a uniformly loaded beam it does only the second job, so a reader who moves it expecting the load to move will see the deflection change for a reason they have not identified.

The check to make first is against the standard-cases screen, and it is now worth making as the two screens open. Both take the total load on the span, both take the same span, stiffness and position, and both offer a uniform load and a point load, so the same numbers describe the same beam. Opened as they come they agree to about one part in a hundred thousand on the largest deflection and on the end rotation. Compare the rows that answer the same question: this screen's largest deflection against that screen's largest deflection. The row labelled as the deflection is a station reading here and the case's own answer there, so under a uniform load with the position anywhere but midspan those two rows differ for a reason that has nothing to do with either screen being wrong — 0.689 mm here at the 2000 mm station against 0.794 mm there at the crown.

That was not true until recently, and the way it failed is worth knowing because this manual invited the comparison throughout. This screen read its uniform load from an intensity symbol it has no field for while ignoring the load the reader could see, so the two screens opened 4.50 times apart — 0.794 mm against 3.571 mm — and the ratio was exactly intensity times span over total load. They were describing different beams, not disagreeing about one.

Once the beams do match, the agreement is real evidence: the two share no relation, one integrating a moment diagram and the other evaluating a closed coefficient. Finally, a deflected shape that looks right is no evidence that the moment diagram was right: integration smooths, and two integrations turn a sizeable local error in the moment into a barely visible one in the shape.

Advisory. This model ignores shear deformation, so a stubby member will read stiffer than it really is.
Advisory. A beam's deflection is fixed by E and I_x, so the depth h is not read into delta, delta_max or theta_rot. It is on the screen because slenderness is what decides whether ignoring shear deformation is safe, and that is a judgement rather than a term in the formula.

Implemented by macaulay, moment_at, moment_from_point_load, moment_from_udl, moment_from_linear_load, stations, curvature, coefficient, integrate_deflection, DeflectionSegment, DeflectionSolution.

Energy Methods

Get the movement of one chosen point by putting a unit load there, or by differentiating the strain energy.

δ=Σ(N n L)/(AE), δ=∫_0^L(M m)/(EI_x) dx, δ=(∂ U)/(∂ P)

Basis

The principle of virtual work. A structure in equilibrium, given any small displacement field compatible with its supports, does the same external work through that field as the internal forces do through the corresponding internal deformations. Read one way it produces equilibrium equations. Read the other way — with a virtual force system doing work through the real deformations — it produces displacements, one at a time, at whatever point and direction you choose. That is the unit-load method, and it is the only routine way to get the movement of one chosen point out of forces already known.

Derivation

Put a single unit force on the structure at the point and in the direction whose movement is wanted, and nothing else. Solve for the internal forces that unit load alone causes. Now let the structure undergo the real deformations, the ones the real loads produce. The external virtual work is one times the displacement sought; the internal virtual work is the sum over the members of each member's virtual force times its real deformation — extension over stiffness for an axial member, the integral of the product of the two moment diagrams over bending stiffness for a bent one. Equating the two gives the displacement directly.

The virtual system is not the real one, and that is the entire power of the method. The virtual forces need satisfy equilibrium with the unit load and nothing else; the real deformations need satisfy compatibility and nothing else; neither has to know anything about the other. Two consequences follow. On an indeterminate structure the virtual system may be taken from any released determinate form of it and the answer is unchanged, because the redundants do no virtual work on a compatible real structure. And a unit load bearing no relation to the actual loading still answers a question about the actual loading, because the pairing is an identity rather than a physical superposition.

Castigliano is the second route: the displacement under a load is the derivative of the stored strain energy with respect to that load, and the load need not already be there — a dummy, differenced about zero, does the job. The two routes share nothing but the solver, so when they agree they agree for reasons that do not overlap.

δ=Σ(N n L)/(AE), δ=∫_0^L(M m)/(EI_x) dx, δ=(∂ U)/(∂ P)
U=Σ(N^2L)/(2AE)+∫(M^2)/(2EI_x) dx, W=½Pδ
∫_0^L a b dx=L/6(a_1 b_1+4 a_m b_m+a_2 b_2)
(∂ U)/(∂ P)=(U(P+h)-U(P-h))/(2h) (exact when U is quadratic)
f_(AB)=f_(BA) (reciprocal theorem)

Assumptions

TakesUnitMeaning
nodesmmNode coordinates of the model.
members—Which two nodes each member connects, and which section and material it uses.
loadsNNode loads and member loads making up the load case.
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
Amm²Cross-sectional area — the amount of material you would see if you sliced the member straight across.
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
dof—The single degree of freedom the answer is asked about — one node and one direction, which is exactly what a unit load picks out.
method—Which of the module's solution routes is being used.
GivesUnitMeaning
deltammDeflection — how far a point has moved from where it started.
theta_rotradRotation of the cross-section, the slope of the bent member at that point.
U_energyN·mmStrain energy — the work stored in the material as it deforms, and the same number as the work the loads did putting it there.

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 virtual model is built from the real one with the same nodes, members, supports and releases and a single unit nodal load. A virtual system differing anywhere else would not be a virtual system for that structure.

Both integrals are closed form. The virtual system carries no span loads, so its moment diagram along a member is a straight line; a real member under a uniform load has a parabolic one; their product is a cubic, and Simpson's rule integrates cubics exactly — so the displacement needs no stations, no step size and no convergence check. The square of a parabola, which the strain energy needs, is a quartic, and Simpson does not integrate quartics exactly. Hence two rules rather than one: using Simpson for both looks right, is wrong by a fixed fraction of the uniformly loaded part, and cannot be caught by loosening a tolerance.

Castigliano's step size is chosen backwards from the usual rule. Because the energy is quadratic a central difference has no truncation error at all, so a larger dummy load is more accurate rather than less, until it swamps the real loads and the base structure's own contribution is lost in the subtraction. In the same spirit, a cancelling sum is returned as exactly zero when it falls below a bound derived from the term count and the machine precision.

Limitations

Reading the result

The sign means one thing: motion along the unit load. Reverse the unit load and the sign reverses without the magnitude changing. Because the unit load fixes the point and the direction together, the same node returns a different answer for each direction, and a reader who does not choose deliberately will read a sideways movement as a downward one.

Read the agreement rather than any one number. This screen opens on a frame, not a truss, and offers a route the truss screen does not: the unit-load sum shown by default, or Castigliano's theorem — the energy derivative — in its place, picked by the same control that names the route in the row beside delta. The check is to switch the route and watch delta stay where it was, because the two routes share almost no algebra. The stiffness solution is computed alongside both but is not among this screen's outputs — the truss-displacement screen is the one that shows it as u_vec beside the sum — so on this screen the comparison is between the two energy routes rather than against the solver. Agreement is the result and not a formality.

Both of those routes are pickers on the screen rather than assumptions in the code, and so is the direction. The canon declares three branches here — which node, which direction, which route — and each of the last two is drawn as a control whose effect is visible: changing the direction changes delta by orders of magnitude on a loaded beam, and changing the route changes the relation printed beside delta from "unit load at node n, along y" to "Castigliano at node n, along y" while the number stays put. A reading on this screen is a number and the relation that produced it, and the route control moves the second half of it. That the number does not move is the theorem, not a broken control: for a linear elastic structure the two routes agree to the last digit, and a screen that exists to show them agreeing has to be able to show it.

Under the results there is now a member-by-member table, and it is the method written out. For a truss shape it carries one row per member — real force, virtual force, extension, the term, the member's stored energy — and the fourth column sums to the delta above it, which is what the unit-load method is. A reader who sees only the total cannot tell whether two members carry all of the movement or whether the one they were worried about contributes nothing. This screen opens on a frame, where there are no rows to give: a frame member carries bending as well, so its share is an integral along the member rather than one number, and the table says exactly that instead of showing a blank panel. Choose a truss shape and the rows appear. The routine behind those rows had been written, tested at sixty digits and ported to Swift, and until recently was called by nothing at all — which for a reader is the same as not existing.

One caution about checking this against published worked calculations, even good ones. The unit-load result was verified against a worked elastic deflection in a public-domain NASA structures manual, and the printed value differs by about a seventh of a per cent from the closed-form value computed from that same manual's own printed stiffness and section properties — more than its printed precision can absorb. This project locked the disagreement rather than choosing a side: the test asserts that the app does not reproduce the printed number, so anyone later tuning the code toward it will be told.

Implemented by member_extension, virtual_work_term, strain_energy_axial, strain_energy_from_extension, external_work, product_integral_linear, product_integral_simpson, square_integral_parabola, sagitta_uniform, parabolic_mid_ordinate, castigliano_derivative, flexibility_coefficient, reciprocal_residual, unit_load_case, displacement, castigliano, strain_energy, member_terms, reciprocity, natural_step, stiffness_displacement, work_of_loads, energy_from_extensions.

Trusses & Frames

Truss — Joints & Coefficients

Member forces in a statically determinate truss, by joints and by tension coefficients.

Σ F_x=0, Σ F_y=0 at each joint; t_(ij)=(N_(ij))/(L_(ij)), Σ t_(ij)(x_j-x_i)+F_x=0

Basis

A pin-jointed frame carries load in the lines of its members and nowhere else. Every joint is then a particle in equilibrium under the member forces meeting there and whatever load is applied at it: two scalar equations in the plane, three in space. Count those against the unknowns — one axial force per member plus the reaction components — and a determinate truss has exactly as many equations as things to find. Every method below is a different order of eliminating them, not a different mechanics.

Derivation

The method of joints takes one joint at a time. Find a joint with at most two unknown member forces, write its two equations, solve; those forces are known at the next joint and the sweep continues. The whole method is a sequencing problem rather than an algebraic one, which is why a reader doing it by hand spends most of the effort deciding where to start.

For hand checking, the method of sections cuts through the truss instead of walking around it. The part on either side of the cut is a rigid body under three equilibrium equations, so a cut through three members that are not all concurrent settles all three at once, without touching anything else. Choosing the moment centre is what makes it fast: take moments about the point where two of the cut members meet and the third stands alone. Two consequences are worth carrying as independent checks. In a parallel-flange girder a chord force is the bending moment at the node opposite it divided by the depth — the truss carries moment as a couple in its chords. And a diagonal takes the panel shear through its vertical component, so its force is the shear over the sine of its inclination. Both are one line and both bound a full solution.

Tension coefficients are the third route and the one that scales. Define t = N / L for each member. The component of that member's force along any axis is then t times the coordinate difference along that axis — no angle and no square root, and the same expression whether the frame is plane or spatial. Each joint contributes equations linear in the coefficients, and the forces come back at the end by multiplying each coefficient by its own length. The intermediate looks like a needless step in two dimensions and stops being one in three.

The shipped headless routes are the joints sweep and tension coefficients. The section formulas remain useful independent checks, but the user-defined cut belonged to the cancelled drawing surface and is not offered as an executable route.

Σ F_x = 0, Σ F_y = 0 at each joint
t_(ij)=(N_(ij))/(L_(ij)), Σ_j t_(ij) (x_j-x_i)+F_(x,i)=0
N_(chord)=M/h, N_(diag)=(V)/(sinθ)
m+r-2j=0 (determinate by count)

Assumptions

TakesUnitMeaning
nodesmmNode coordinates of the model.
members—Which two nodes each member connects, and which section and material it uses.
supports—Which degrees of freedom are held, and any settlement imposed on them.
loadsNNode loads and member loads making up the load case.
method—Which of the module's solution routes is being used.
GivesUnitMeaning
N_forcesNAxial force in each member of the truss, tension positive.
zero_members—Members carrying no force under this load case.
R_vecNReaction forces and moments at every restrained degree of freedom.

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

One solve stands behind the two routes the selector offers, and the routes differ in what they report rather than in how the truss was resolved. Choosing the joints method gives the largest member force from the joints sweep. Choosing tension coefficients gives the largest coefficient — force divided by member length, a different quantity in different units, which is the whole reason the route is worth showing separately. The method-of-sections formulas remain in the theory as checks, but no selector promises a user-defined cut. Read the unit column with care on the coefficient route: the row is labelled for a force, because the specification declares it as one, and the number under it is a force per unit length. The screen carries a notice of its own saying that the three routes share one solve.

The sweep keeps the order in which the joints fell, because finding that order is half of doing the method by hand, but the order is held in the solution rather than reported: the results table shows the largest member force, the count of zero-force members and the largest reaction, and nothing that names a joint.

Under the results there is now a joint-by-joint table, and it answers a different question from any of them. Each row is one joint with the two sums that ought to vanish there, the loads and reactions and member forces acting on it added up along each axis. Every row reads zero when the truss has been solved correctly, so the table is the check the method has to pass rather than a second answer to it: the results table can say what the largest member force is, and it cannot say whether the sweep that produced it actually closed. "The routine returned" and "the truss balances" are different claims, and only the second is worth anything to a reader. The routine behind the rows had been written and fixture-checked and called by nothing at all.

Each pass scans for a joint with at most two unknown members. With one unknown the equation is taken along whichever axis carries the larger direction cosine, so a member nearly perpendicular to one axis is never divided by a cosine on its way to zero. With two unknowns the two by two system is solved through its normal equations, because this package's solver takes symmetric matrices; the cost is nothing, since two members at a joint are nearly parallel only when the truss is nearly a mechanism, which the determinacy count has already had its say about.

An indeterminate truss is refused outright rather than solved in part: a sweep on a redundant frame stalls partway, and reporting what it found first would be answering a different problem. A complex truss, where no joint ever has as few as two unknowns, comes back with a named stall rather than a number.

Zero-force members are found afterwards by comparing each force against the largest force in the truss rather than against zero, so the verdict carries no unit and does not change when the model is re-entered in different ones.

Limitations

Reading the result

A zero-force member is not a useless member. It carries nothing under this load case, will carry something under the next, and may be the only thing holding a long compression chord to its length. Removing it because a screen called it zero is the classic misreading, and it is why the count of them is reported rather than a list of members to delete.

The second misreading treats the determinacy count as a certificate. It compares totals and cannot see arrangement or geometry, so a truss can count as determinate and still be a mechanism; the count and the solver's verdict are shown together for that reason.

Read the joint table as zeros, not as small numbers. The residuals are the difference of terms of the order of the applied loads, so on a truss loaded in tens of kilonewtons a residual of a few thousandths of a newton is round-off and a residual of one newton is not. A row that is not small compared with the loads means the sweep closed on something that does not balance, and every force above it should be treated as unproven.

The reported member force is the largest by magnitude and keeps its sign. Check it against the chord and diagonal one-liners above: a chord force that is not roughly the moment over the depth means the geometry or the load was entered differently from the way it was pictured.

Error. This structure is a mechanism, or so close to one that it cannot be solved. Add restraint or a member.

Implemented by member_length_2d, member_length_3d, direction_cosine, tension_coefficient, force_from_coefficient, component_from_coefficient, is_tie, joint_residual, two_members_meet_alone, chord_force_from_moment, diagonal_force_from_shear, parallel_girder_depth_ratio, joints_sweep, joint_residuals, zero_force_members, tension_coefficients, determinacy_planar_truss.

Force Diagram

Construct reciprocal member-force vectors and a closed equilibrium polygon at every resolvable joint.

Σ F_j= 0, l_(ab)=s |N_(ab)|

Basis

Two figures are reciprocal when every line of one is parallel to a line of the other, and every closed polygon of one corresponds to a point of the other. For a loaded truss the space diagram and the force diagram are such a pair: each member appears once in each, the two lines are parallel, and the length in the force diagram is the member force at whatever scale the drawing was set to. A joint being in equilibrium and a polygon closing are the same statement.

Derivation

Start from the joint. Its member forces and its applied load sum to zero, so laid head to tail they form a closed polygon. Each member's force vector is its magnitude times its own unit vector, which is exactly the tension coefficient times the coordinate difference along the member: N times (dx, dy) over L is t times (dx, dy). So the force polygon around a joint is that joint's members, each drawn parallel to itself and stretched by its own coefficient.

That is the whole reciprocity, and it says what the tension coefficient is for. It is not an intermediate on the way to a force; it is the scale factor between a member's line in the space diagram and the same member's line in the force diagram. Two members with the same coefficient draw to lengths in the same ratio as their real lengths. Doubling every load doubles every coefficient, so the force diagram grows uniformly and no direction in it changes — the shape of the force diagram belongs to the geometry alone, and the load only sets its size.

Building the diagram economically is the other half of the classical construction. Label the spaces between the external forces and between the members rather than the members themselves, so each member is named by the pair of spaces it separates; the force diagram then has one point per space, and each member's line is the segment between its two points. Every member is drawn once even though it belongs to two joints, which is what makes the whole diagram smaller than the sum of its polygons.

The construction inherits the sequencing constraint of the method of joints, because it is that method drawn rather than written: each new polygon can be closed only if it has at most two unknown directions left. A truss with no such starting joint has no drawing order, and the construction stops at a nameable joint rather than producing a wrong figure.

N_(ij)=N_(ij) e_(ij)=t_(ij) (x_j-x_i, y_j-y_i)
\|ab\| ∝ |N_(ab)|
Σ_(at a joint) N + P = 0 ⇔ the polygon closes
t_(ij)=(N_(ij))/(L_(ij))=(length in the force diagram)/(length in the space diagram)

Assumptions

TakesUnitMeaning
nodesmmNode coordinates of the model.
members—Which two nodes each member connects, and which section and material it uses.
loadsNNode loads and member loads making up the load case.
GivesUnitMeaning
force_diagramN/mmThe largest tension coefficient (force over member length) among the truss members, the same quantity the drawing colours by.
N_forcesNAxial force in each member of the truss, tension positive.

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

Where it stops.

Solution method

The composition layer constructs one scaled force vector per member and one head-to-tail equilibrium polygon per joint. It first requires a valid joints sweep, so a complex truss reports the same named stall rather than receiving a partial diagram. Every member-vector length is the analytic member-force magnitude times the requested drawing scale, and every joint polygon includes its applied load and reaction vectors before its member vectors.

The coefficients come from the solved axial forces rather than from a drawing, so the numbers on this screen carry the precision of the solution and not the precision of a construction. That is the right way round: a graphical answer's accuracy is set by the sharpness of the pencil, and there is no reason to inherit that when the same relations can be evaluated.

Limitations

Reading the result

The commonest error is a scale error, and it is silent. A force diagram is two scales at once, and a line measured with the length scale instead of the force scale gives a plausible number in the wrong units. On this screen that error is impossible because nothing is measured, which is also the reason the screen cannot teach the discipline of keeping the two apart.

The second is expecting the diagram to change shape when the load changes size. It does not: scale every load by the same factor and the whole diagram scales with it. If the shape does change, the load pattern changed, not its magnitude — and that distinction is the fastest way to check that a model was edited the way it was meant to be.

Implemented by tension_coefficient, component_from_coefficient, force_from_coefficient, direction_cosine, member_length_2d, tension_coefficients, joint_residuals, joints_sweep, force_diagram, ForceDiagram, ForceEdge, JointPolygon, is_tie.

Truss Displacements

How far a chosen joint moves, from the member forces you already have.

δ=Σ_i (N_i n_i L_i)/(A_i E_i)

Basis

The principle of virtual work says that for any force system in equilibrium and any displacement field that is compatible with the supports, the external work of the first through the second equals the internal work of the first through the second. The two systems need have nothing to do with each other, and that freedom is the whole method: choose the force system to be a single unit load at the point and in the direction you want an answer for, and the equation reads off the displacement there.

Derivation

Put a unit force at the chosen joint, in the chosen direction, and nothing else on the structure. Call the resulting member forces n; they are in equilibrium with that unit load by construction. Take the real structure's extensions, e = N L / (A E), as the compatible displacement field. Virtual work then reads: one times the displacement equals the sum over members of n times e. So the displacement is the sum of N n L / (A E). No differential equation is solved and no calculus appears — the result rests on equilibrium and compatibility alone, which is why it works on a truss of any shape rather than on the handful of spans that have printed formulas.

The shape of the term says which members matter. It is a product, so a member contributes only if it works in both systems: one carrying nothing in either adds exactly nothing however slender it is, and the members that dominate are those loaded hard in both, not those that happen to be long.

The second route is energy. Strain energy is a quadratic form in the applied loads, and its derivative with respect to a load at a point is the displacement of that point along that load. The load need not already be there: adding a dummy load of plus and minus h and differencing about zero gives the same answer. And because the energy is quadratic, a central difference has no truncation error at all — its error term involves the third derivative, and a quadratic has none. The derivative is exact to round-off, not accurate to a step size.

The third route reads the movement straight off the solved displacement vector. Three routes, one number, sharing only the geometry.

δ=Σ_i (N_i n_i L_i)/(A_i E_i)
e_i=(N_i L_i)/(A_i E_i)
U=Σ_i (N_i^2L_i)/(2A_iE_i)=Σ_i ½ N_i e_i=Σ_j ½ P_jδ_j
δ=(∂ U)/(∂ P) ≈ (U(+h)-U(-h))/(2h) (exact for a quadratic)

Assumptions

TakesUnitMeaning
members—Which two nodes each member connects, and which section and material it uses.
N_forcesNAxial force in each member of the truss, tension positive.
Amm²Cross-sectional area — the amount of material you would see if you sliced the member straight across.
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
LmmLength of the member along its own axis, support to support.
dof—The single degree of freedom the answer is asked about — one node and one direction, which is exactly what a unit load picks out.
GivesUnitMeaning
deltammDeflection — how far a point has moved from where it started.
u_vecmmDisplacements of every free degree of freedom in the model.
U_energyN·mmStrain energy — the work stored in the material as it deforms, and the same number as the work the loads did putting it there.
W_extN·mmWork done by the applied loads as they are put on gradually, which is half what their full value times the movement would suggest.

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 unit-load case is the real model with its loads replaced by a single unit force, solved by the same routine. There is no guard on that second solve: it differs from the first only in its right-hand side, and whether a solve succeeds depends on the supports and the stiffness matrix, so it succeeds exactly when the real one did.

The terms are summed and compared against a noise floor, which is a bound rather than a tolerance somebody picked. Summing a list has a rounding error no larger than the count times the machine epsilon times the sum of the magnitudes, and each term here is a product or quotient of five numbers, so anything smaller than that bound is made entirely of round-off and is returned as exactly zero. The interesting cases are the cancelling ones: a movement that is zero by symmetry is a cancellation of terms very much larger, and printed raw it reads as a tiny answer rather than as no answer.

A direction a support holds is answered zero and labelled held. A continuous beam is held vertically at every node it has, and a reader who opens a deflection screen on one and sees zeros everywhere is looking at a correct answer.

The sum is the method: real force times virtual force times extension, added across every member. That breakdown is now under the results, one row per member — real force, virtual force, extension, the term, the member's stored energy — and the fourth column sums to the displacement above it. The rows are where a reader sees that two members carry all of the movement, or that the one they were worried about contributes nothing at all, neither of which a single number can say. On the shape this screen opens on there are seventeen of them.

The direction is a control rather than an assumption. The same joint gives a different answer along each axis, often by orders of magnitude, and the table's own heading names the node and the direction the rows were computed for, so a table read out of context still says what question it answered.

Limitations

Reading the result

Read the sign against the unit load, not against the page. Reversing the unit load reverses the sign without changing the size, so a negative number means the joint moved opposite to the direction asked about and nothing more.

This module is one of the few here with an independent second source, and the cross-check is worth knowing about because of how it failed. A public-domain US Air Force structures manual prints a worked truss with a table of the individual member terms and their total. The terms are right and reproduce here to their printed three figures. The total is not: the listed terms sum to 10.44 thousandths of an inch, and the total beneath them reads 9.44. The project stores the items and the total as separate fixture rows for that reason — a fixture comparing only totals would have condemned this code, and one comparing only items would have found nothing at all.

The two routes agreeing is the result, not a formality. delta, the unit-load sum, and u_vec, the stiffness solution, have almost no algebra in common, so when they land on the same number the model has been checked, and when they do not the disagreement points at the assembly rather than at the sum. A third route exists in the kernel -- Castigliano's theorem, the energy derivative -- but it is the energy-methods screen that offers it as a switchable second way to compute delta; this screen always takes the unit-load sum.

Implemented by member_extension, virtual_work_term, strain_energy_axial, strain_energy_from_extension, external_work, product_integral_linear, displacement, stiffness_displacement, unit_load_case, member_terms, energy_from_extensions, work_of_loads, held_direction, axial_ordinates.

Model Canvas

Choose a structural family and set its parameters; the nodes, members, supports and loads follow from the shape.

topology: e↦(n_i,n_j,section,material)

Basis

To a matrix method a structure is a graph carrying numbers: node coordinates, members each naming two of those nodes with a material and a section, which directions are held at which nodes, and loads. Every later result derives from that description and from nothing else, so it has to be well formed before there is any point asking what the structure does. This module is where it is made and where it is checked.

Derivation

Well formed means three things at once. Every member names two distinct nodes that exist. No two nodes share coordinates, because a member of zero length has infinite stiffness and there is nothing useful to do with that afterwards. And the count of directions the structure can move in follows from the node count and the model type alone -- three per node for a frame, two for a bar model -- less the directions the supports hold.

The screen's name says canvas and there is no drawing surface behind it. The app offers ten parametric families instead: a continuous beam of N spans, a simply supported beam cut into segments, a beam bedded on the ground, a pin-ended column, a portal frame, and five plane trusses -- three-bar, Pratt, Howe, Warren and cantilever. A reader picks a shape and gives it three or four numbers; the nodes, members, supports and loads follow from the shape. A structure outside those ten is not expressible, and the app names the ten rather than implying it takes anything.

Generation disposes of part of the well-formedness question outright. A builder writes member indices it has just created, so a dangling reference cannot arise. Every length a family declares is meant to carry a positive lower bound in its own parameter -- five hundred millimetres for a span, three hundred for a height -- but that bound is a declared default range, not an enforced one: the field that reads it is a free-form number entry with no clamp of its own, and the builder does not re-check the number it is handed against the range that suggested it. A span of zero is accepted and produces exactly the coincident nodes the paragraph above says cannot arise. What does run is a separate, coarser check -- literally zero or negative, not below the suggested minimum -- shown as an orange caption beside the family picker; it does not block construction, and a reader can still see a report built from the degenerate model beneath it. The report itself is not dangerous: the free-degree-of-freedom arithmetic below still runs, and a solve attempted on a coincident-node model is caught downstream as a mechanism rather than returned as a plausible number -- but the rejection this derivation describes as happening "at the moment of typing" does not, in fact, happen there.

What is left to report is the free degree-of-freedom count, and the interesting thing is what it cannot see. It is arithmetic on holds, not on stiffness. A released member end does not lower it: the release is condensed into that member's element matrix, and the node's rotation survives as a degree of freedom held by whatever else reaches the node. A spring does not lower it either -- a sprung direction is free and merely carries a diagonal term. The count describes the model; it does not judge it.

n_(dof) = 3 n_(nodes) - n_(held) (frame), n_(dof) = 2 n_(nodes) - n_(held) (bar model)
e ↦ (n_i, n_j, E, A, I_x)
L_e = √((x_j-x_i)^2 + (y_j-y_i)^2) > 0
n_(nodes) ≤ 40, n_(members) ≤ 80

Assumptions

TakesUnitMeaning
nodesmmNode coordinates of the model.
members—Which two nodes each member connects, and which section and material it uses.
supports—Which degrees of freedom are held, and any settlement imposed on them.
loadsNNode loads and member loads making up the load case.
GivesUnitMeaning
topology_ok—Whether the model is connected and restrained well enough to be solved at all.
n_dof—Number of degrees of freedom in the model.

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

Where it stops.

Solution method

Each family declares its own parameters with a range, and a count is clamped inside the range that family declares rather than a shared one. Not pedantry: every family happened to reuse the same panel-count parameter, so a family declaring a different range would have been quietly clamped to somebody else's, and the node and member caps were left unreachable because the shared range already sat inside them.

The caps are forty nodes and eighty members, and a model that would exceed them is refused outright -- not solved coarsely, not silently reduced to fit. A model reduced to fit answers a question nobody asked, and the reader cannot tell it was substituted. The refusal reaches the interface as a column of dashes labelled "too large", deliberately not the same label as "not yet": one is a limit the app declares, the other is work that has not been done. The caps also bound the solver, whose factorisation is dense and hand-written so that it transliterates into the Apple implementation; at forty nodes that costs nothing.

Limitations

Reading the result

Read this as a report on the description, not a verdict on the structure. It answers two questions -- does this shape exist, and how many directions is it free to move in -- and the second is not a stability measure. A free count above zero is normal; a free count of zero is a legitimate structure, since a span built in at both ends has no free node at all. Whether the thing stands up is the solver's answer, reached by a different mechanism.

The trap is the direction the count moves in. Adding a node without adding a member raises the free count and makes the structure worse: the new node can move and nothing resists it. A rising number here is not progress. And the refusal message is about the caps, not the physics -- a panel count the app declines is one above forty nodes, not a truss that cannot stand.

Implemented by build, refusal, parameters_for, opening_for, member_length, evaluate_structure.

Linear Solve & Results

Assemble, restrain, solve and recover: displacements, reactions, member end forces and every diagram.

Ku=f, K_e^(frame)= [ (EA)/(L) ] [ (12EI_x)/(L^3) (6EI_x)/(L^2) ] [ (6EI_x)/(L^2) (4EI_x)/(L) ] R=Ku-f

Basis

Equilibrium is written at every degree of freedom, and every member's end forces are written as a linear function of that member's end displacements. That substitution -- force expressed through displacement -- turns the structural problem into one square system whose size is the number of degrees of freedom. It is also why indeterminacy stops mattering: the equations count directions the structure can move in, not redundant restraints, so a beam with one redundant and a beam with nine cost the same.

Derivation

In its own directions a bar element has one number, EA/L. A frame element has five: EA/L along the member, 12EI/L cubed and 6EI/L squared tying transverse movement to itself and to rotation, and 4EI/L and 2EI/L for rotation at the near and far ends. The direction cosine and sine come from the node coordinates and the length, and the element in global directions is the triple product of the transformation with the local matrix. Assembly adds each element into the rows and columns its own degrees of freedom occupy; a spring at a support adds one diagonal term, having only one end free to move.

A load applied along a member is not a nodal load. Uniform, concentrated and triangular each become the equivalent nodal forces that would hold the member's ends if they were built in, added to the right-hand side; the end shears follow from statics on that pair rather than from a second published coefficient per shape. The half that is easy to forget is the second: the same vector is subtracted again when that member's end forces are recovered. Omit it and the moment diagram is exactly right at every node and wrong everywhere between -- a straight line where the parabola belongs, and on a uniformly loaded simple span the peak moment disappears altogether, both end moments being zero with nothing left in between. The give-away is precisely that the nodes are right.

A release is a hinge in one member at one end, and it belongs to the member rather than the node: three bars meeting at a point with one of them pinned is an ordinary detail no node-level flag can describe. A released member gets the propped entries -- 3EI/L cubed, 3EI/L squared, 3EI/L, a quarter of the transverse stiffness and three quarters of the rotational -- with a zero row and column at the released rotation, so whatever else meets the node sets it. Its fixed-end moments carry over exactly rather than being looked up: releasing an end applies the opposite of its moment there, and half arrives at the other end.

A support on a sloping plane is held perpendicular to the plane and free along it, and neither is a global direction. Rather than invent a support type, that node's own axes are turned: matrix and load vector are pre- and post-multiplied by a rotation that is the identity except at this node's two translational directions, the system is solved in the turned axes, and the displacements and reactions are turned back before being shown. Held directions are moved to the right-hand side rather than struck out, which is what makes a prescribed settlement produce reactions in an indeterminate structure and none in a determinate one.

Three of the four paragraphs above describe the assembly rather than this screen, and the difference matters to a reader trying to reproduce them. A structural screen's inputs are the chosen shape's — a span count, a span, an intensity, a modulus, a section — and none of the ten shapes on offer declares a release, a sloping support, a settlement, or a span load that is anything but uniform. So the release entries, the rotated axes and the point and triangular fixed-end moments are carried, fixture-checked and reachable through the library, and are not reachable from this screen. The two choices the canon declares here — bar against frame element, and span load perpendicular against vertical — are in the same position: every shape offered is built as one or the other, and the controls beside them do not move it.

Ku=f, R=Ku-f
K_e^g=G^(T)K_eG, c=(x_j-x_i)/(L), s=(y_j-y_i)/(L)
K'=R_θ^(T)KR_θ, f'=R_θ^(T)f
s_e=K_eGu_e-f_e^( 0)
(3EI_x)/(L^3), (3EI_x)/(L^2), (3EI_x)/(L) in place of (12EI_x)/(L^3), (6EI_x)/(L^2), (4EI_x)/(L)

Assumptions

TakesUnitMeaning
nodesmmNode coordinates of the model.
members—Which two nodes each member connects, and which section and material it uses.
supports—Which degrees of freedom are held, and any settlement imposed on them.
loadsNNode loads and member loads making up the load case.
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
Amm²Cross-sectional area — the amount of material you would see if you sliced the member straight across.
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
release—Which member ends are released so they carry no moment.
qN/mmDistributed load intensity — force per unit length along the member.
theta_sradSlope of a support's held direction, measured anticlockwise from horizontal. Zero is an ordinary support; anything else is a roller on a ramp.
GivesUnitMeaning
u_vecmmDisplacements of every free degree of freedom in the model.
R_vecNReaction forces and moments at every restrained degree of freedom.
diagram_NNAxial force along the member.
diagram_VNShear force along the member.
diagram_MN·mmBending moment along the member.
K_gN/mmGlobal stiffness matrix — the assembled relation between every displacement and every force in the model.
cond—Condition number of the solved matrix — how much the answer can move for a small change in the input.

Cases this screen covers without asking. Both sides of each of these are handled by the code, so there is no control for them:

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

Where it stops.

Solution method

The system is factorised by hand into a unit lower triangle and a diagonal -- the indefinite factorisation, because a model with a released end or an unheld direction is not positive definite and that state must be survived and described rather than crashed on. A zero pivot is left as zero rather than nudged, so the solve returns not-a-numbers and a status of mechanism instead of displacements of order ten to the fifteenth that look exactly like results.

Two numbers travel with every answer: the smallest pivot over the largest, and its reciprocal as a condition estimate -- a lower bound, never larger than the truth. Above ten to the tenth the status becomes ill-conditioned. That is a status and not an error because nothing failed: the equations were solved, and what has gone is the meaning of the small digits. Two situations produce it. A slender member puts EA/L many orders of magnitude above 12EI/L cubed in the same matrix, so the elimination subtracts nearly equal numbers and the bending digits are lost long before anything looks wrong. A structure a hair away from being a mechanism has one pivot that nearly cancels, so the ratio explodes although no pivot is exactly zero. Both transitions are gradual, which is why a number saying how far along one you are beats a verdict.

A model with every degree of freedom held is legitimate -- a span built in at both ends is exactly that -- and returns reactions and end forces, not only a status. A reaction is a cancelling sum of two large and nearly equal terms, so a true zero returns as whatever is left over; anything under a derived round-off floor is set to exactly zero, being no force rather than a small one.

Limitations

Reading the result

The reactions vector answers one question -- what force does a held direction carry -- and a support on a spring holds nothing. That direction is free, so the vector has no reaction there, only the residue of a cancelling sum: read alone it says a beam on springs carries nothing, in a convincing five times ten to the minus eight rather than an obvious blank. What holds a node is asked separately, as the reaction where the direction is held and the spring rate times the movement, opposite in sign, where it is sprung.

If the moment runs straight between the nodes of a member carrying a distributed load, the equivalent nodal forces were put on and never taken back off, and the diagnostic is that the node values are exactly right. Signs are fixed throughout, tension and sagging positive, and the displacement reported keeps its sign, because a magnitude and a signed value must never share a symbol between screens.

Ill-conditioned does not mean wrong. It means the small numbers here have lost their significant digits, and the remedy is almost never a looser tolerance. It is the model: a member orders of magnitude too slender for the frame it is in, or a structure so nearly a mechanism that it would be better fixed than solved.

Advisory. This model ignores shear deformation, so a stubby member will read stiffer than it really is.
Warning. Axial and bending stiffness in this model differ by so much that the displacements have lost accuracy. Check member proportions before trusting the small numbers.
Error. This structure is a mechanism, or so close to one that it cannot be solved. Add restraint or a member.

Implemented by local_stiffness, rotation, global_stiffness, element_load, assemble, solve, member_end_forces, axial_force, holding_force, largest_holding_force, axial_stiffness, translation_stiffness, coupling_stiffness, rotation_stiffness_near, rotation_stiffness_far, translation_stiffness_released, coupling_stiffness_released, rotation_stiffness_released, fixed_end_moment_udl, fixed_end_moment_point_near, fixed_end_moment_point_far, fixed_end_moment_linear_near, fixed_end_moment_linear_far, cosine, sine, factorise, smallest_pivot_ratio, condition_estimate, residual_norm.

Elastic Supports & Foundation

Supports that give, and beams bedded on soil that pushes back in proportion to how far it settles.

K_e=K_e^0+(k_fL)/(420) [ 156 22L 54 -13L ] [ 22L 4L^2 13L -3L^2 ] [ 54 13L 156 -22L ] [ -13L -3L^2 -22L 4L^2 ] β_f=⁴√((k_f)/(4EI_x))

Basis

Two different things answer to the description "a support that gives", and keeping them apart is most of this module. A spring at a node resists one point moving: one rate, one entry, one direction. The ground under a beam resists every point of the member moving, in proportion to how far that particular point settles -- a distributed restraint, and therefore a matrix rather than a number. Both rest on the same premise, that the restraint is elastic and proportional to displacement, and they enter the assembled system in completely different places.

Derivation

A spring to ground connects a node to a point that does not move, so only one of its ends is a degree of freedom: a single term on that direction's diagonal and nothing off it. A held direction ignores its spring, because something that cannot move cannot stretch one. Two limits make it a support at all: as the rate grows without bound the result converges on the rigidly supported case, and as it falls to zero, on the unsupported one.

The ground is the bedded-beam model: pressure under the beam proportional to the settlement at that point, with a modulus in force per unit length of beam per unit settlement. Substituting it into the bending relation gives a fourth-order equation in which the ground term appears undifferentiated, and it is that equation, not a support condition, that governs.

Two routes follow. The element route integrates the restraint over each member using the same cubic shape functions the beam element itself uses, giving a consistent matrix added to the member's own entries. Sharing those shape functions is what makes the two compatible -- and what makes the same matrix inapplicable to a released member, whose shape functions are not those cubics. The combination is refused rather than silently dropped: a released member with a foundation returns a full matrix of not-a-number, which propagates to every screen built on it as a dash with a named reason, the same treatment this layer gives every other combination it cannot model. No shipping family produces the pair, so a reader building from the offered shapes will not meet it, but a canvas that let the two be drawn together would need to show the refusal rather than a number. Where it does apply, the foundation touches the four bending degrees of freedom and none of the axial ones: the ground resists the beam settling into it, not sliding along it.

The closed-form route answers a different beam -- an infinite one under a single concentrated load -- and answers it exactly. Everything is written in one decay parameter, the fourth root of the bedding modulus over four times the bending stiffness. Under the load the deflection is the load times that parameter over twice the bedding modulus, and the moment is the load over four times it: one-line values no transcription slip inside the bracketed factor can reproduce, which is why they are the anchor. The moment's sign is derived from the second derivative of the deflection rather than copied, because printed forms take the load as a magnitude and the deflection as positive downwards, flipping it twice.

The fourth root is the first surprise: sixteen times the bedding modulus only doubles the decay parameter and only halves the length over which the beam spreads its load, so soil stiffness is a weak lever on everything. The two zeros are the second. The moment first changes sign at a quarter pi over the decay parameter, and the beam first lifts off at three quarters pi over it -- three times as far -- so it is hogging over two thirds of the length it is still pressing down on, which is why a raft needs top steel. Neither distance depends on the load.

EI_x (d^4y)/(dx^4) + k_f y = q, β_f=⁴√((k_f)/(4EI_x))
K_e=K_e^0+(k_fL)/(420) [ 156 22L 54 -13L ] [ 22L 4L^2 13L -3L^2 ] [ 54 13L 156 -22L ] [ -13L -3L^2 -22L 4L^2 ]
y(x)=(Pβ_f)/(2k_f)e^(-β_f x)(cosβ_f x+sinβ_f x), M(x)=(P)/(4β_f)e^(-β_f x)(sinβ_f x-cosβ_f x)
x_(M=0)=(π)/(4β_f), x_(lift)=(3π)/(4β_f)=3 x_(M=0)
R_(spring)=-k u

Assumptions

TakesUnitMeaning
nodesmmNode coordinates of the model.
members—Which two nodes each member connects, and which section and material it uses.
loadsNNode loads and member loads making up the load case.
k_springN/mmStiffness of a discrete spring support — force per unit movement, or moment per unit rotation.
k_foundMPaFoundation modulus — force per unit length of beam per unit settlement.
LmmLength of the member along its own axis, support to support.
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
support_kind—How the structure is held: rigidly, on springs, or by the ground under it.
GivesUnitMeaning
u_vecmmDisplacements of every free degree of freedom in the model.
deltammDeflection — how far a point has moved from where it started.
R_vecNReaction forces and moments at every restrained degree of freedom.
beta_f1/mmFoundation decay parameter — the reciprocal of the length over which a disturbance dies away.
diagram_MN·mmBending moment along the member.
M_xN·mmBending moment about the horizontal axis.
x_liftmmDistance from the load at which a beam on soil first lifts clear of the ground.

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 element route needs nothing beyond the extra matrix. The closed form is not solved but sampled: every quantity in it is a closed expression, so the stations are places to look and never places the accuracy depends on, which is what makes it legitimate to draw both routes on the same axes and mean something by the gap.

It is offered only where it answers the same question. The test is the decay parameter times the length, which is how long the beam is in its own units: a metre of rail and a metre of raft are not the same length to the ground under them. The threshold is pi rather than a rounder number, because that is where the closed form's own first deflection zero sits -- a beam that has not lifted off even once cannot be pretending to be infinite. Below it the values are named as absent rather than approximated, and where nothing is bedded there is no decay parameter at all: absent rather than infinite, since "there is no ground" and "the ground is infinitely soft" are different answers and only one is a number.

The same quantity drives an advisory in the other direction. Above a decay parameter times length of six the two ends of the beam no longer interact, and the screen says so: the semi-infinite solution is what is being used, and it is used to avoid the overflow that the full finite-length form runs into once the exponentials grow. The screen opens above that threshold, at about 12.4, so the notice is showing from the first moment — shorten the span to a third and it goes quiet. Until recently it could not appear at all: the guard was looked up by the canon's phrase for the quantity while the only caller handed over a dictionary keyed by symbol, so nothing ever compared the two.

The check the whole route rests on is that the soil must be carrying the entire load. It is the two translational rows of the foundation matrix times the solved displacements, member by member, from the same consistent matrix the solve used -- not a rule laid over the answer afterwards, which would agree with the beam it was reading and disagree with the beam that was solved. That number is wrong if the element count was too coarse, if the foundation entries went to the wrong degrees of freedom, or if the ends are still taking some of the load: three things at once, and no element count can fudge it.

Limitations

Reading the result

Read the total ground force against the total applied load first. If they differ, nothing else on the screen is worth reading -- and because that one number is wrong for three separate reasons, it is also the most informative thing there.

Element count matters here and nowhere else on a beam. On a beam in the air the element is exact for a uniformly loaded member, so cutting a span finer adds places to ask about and never adds accuracy. On a bedded beam the exact shape is not a cubic, the consistent foundation matrix is an approximation, and refining the cut genuinely does move the answer. A reader who learned on the first case will assume the second behaves the same way.

Choosing supports on springs while looking at the bedded shape changes nothing, and that is not a fault: that shape has no vertical hold to convert into a spring, the soil being what holds it up. The spring reaction, where there is one, is not in the reactions vector -- a sprung direction is free.

Two results reliably surprise people. How soon the hogging starts: less than a quarter of a characteristic length from the load, the moment has already changed sign. And which way the moment moves: a softer bed gives larger moments, not smaller, because it spreads the load over a longer stretch of beam, and a longer spread is a longer lever arm.

Advisory. This beam is long enough on this soil that the two ends no longer interact; the semi-infinite solution is being used to avoid overflow.

Implemented by spring_stiffness, holding_force, largest_holding_force, on_springs, decay_parameter, relative_stiffness, infinite_beam_deflection, infinite_beam_slope, infinite_beam_moment, infinite_beam_shear, first_moment_zero, first_deflection_zero, foundation_reaction, foundation_translation_near, foundation_translation_far, foundation_coupling_near, foundation_coupling_far, foundation_rotation_near, foundation_rotation_far, member_ground_force, ground_reaction, applied_load, closed_form_profile, contact_length, hogging_begins.

Classical Methods

Slope-deflection and the force method, stepped out, and checked line by line against the matrix answer.

M_(AB)=(2EI_x)/(L)(2θ_A+θ_B-(3Δ)/(L))+M^F_(AB), f_(ij)X_j+Δ_(i0)=0

Basis

An indeterminate structure has more unknown forces than equilibrium can decide, and the equations that make up the difference are always compatibility statements: assertions about how the structure still fits together after it has deformed. There are two ways to supply them and they are duals. Take the displacements as unknown and write equilibrium in terms of them -- slope- deflection. Take the redundant forces as unknown and write compatibility in terms of them -- the force method. Both are here because a reader who can only get an answer one way has no means of telling a right answer from a plausible one.

Derivation

Slope-deflection writes the end moments of a prismatic member built into its joints as a linear function of the two end rotations and of the relative transverse movement of the ends. Three terms do the work. The near rotation appears twice, because it both bends the member and returns as a carry-over; the far rotation appears once, which is that carry-over; and the sway term subtracts the rigid-body rotation of the chord, so the rotations are measured from the member's own line rather than from the ground. The fixed-end moment is added last, being what the member would carry if its ends did not move at all.

Where those numbers come from is what makes this a check rather than a repetition. The end rotations are the ones the solver already found -- a rotation is the same number in either frame and needs no transformation, while the transverse movement is not and is resolved into the member's own directions. The fixed-end moments are not re-derived from the load shape: they are the equivalent nodal loads the assembly already forms, negated, because those are what the load puts on the structure and a fixed-end moment is what the structure puts on the member. Deriving them twice would be a second place to be wrong.

So slope-deflection cannot catch a wrong displacement; it uses the same ones. What it catches is a wrong recovery -- a sign flipped in the rotation transform, a fixed-end moment added where it should have been subtracted. A narrow check, but a real one, taken as a relative gap against the largest moment in the structure so that a member carrying nothing cannot dominate the number.

The force method goes the other way and shares almost nothing with the solver. Remove enough restraints to leave a structure statics can handle -- the primary structure. Under the real load alone each released point moves some distance; under a unit force at one released point, every released point moves some distance. Superposition then requires the redundants to put each released point back exactly where its support holds it, which is one linear system whose matrix is made of those unit-load displacements. Every coefficient in it is a displacement of the released structure, so the method introduces no new mechanics -- only the same question asked once per redundant.

That is what catches the errors the first check cannot. It never forms the whole structure's stiffness matrix; it solves a different structure several times and arrives at the same reactions, so a wrong stiffness entry survives the first check and not the second. It carries an internal check too: the matrix of unit-load displacements is symmetric by the reciprocal theorem, a statement about the released structure rather than about the arithmetic that follows.

M_(AB)=(2EI_x)/(L)(2θ_A+θ_B-(3Δ)/(L))+M^F_(AB)
Σ_j f_(ij)X_j+Δ_(i0)=0
f_(ij)=f_(ji)
R=R_0+Σ_i X_i R_i^((1))

Assumptions

TakesUnitMeaning
nodesmmNode coordinates of the model.
members—Which two nodes each member connects, and which section and material it uses.
loadsNNode loads and member loads making up the load case.
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
method—Which of the module's solution routes is being used.
release_choice—Which set of redundants the force method releases — the answer must not depend on it.
GivesUnitMeaning
M_xN·mmBending moment about the horizontal axis.
u_vecmmDisplacements of every free degree of freedom in the model.
R_vecNReaction forces and moments at every restrained degree of freedom.
n_redundant—Degree of static indeterminacy — how many forces you would have to guess before statics could finish the job.

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

Slope-deflection is one scalar evaluation per member end, taken from the solved displacements. It returns nothing rather than a number that looks like one in two cases: a hinged end carries no moment, and a member bedded on the ground has no end moment the relation can give, the ground carrying part of what the relation attributes to the joints. The second is the dangerous one, wrong by a couple of per cent rather than by a factor and so small enough to read as round-off. It was caught only because agreement between the two routes is required to nine decades -- a tolerance loose enough to feel comfortable would have shipped a classical relation quietly answering a different beam.

The force method builds the primary structure by removing vertical holds only. A support that also stops the beam sliding sideways keeps doing that, because releasing it would make the structure a mechanism in a direction the load never asks about, and the resulting singularity would have nothing to do with the redundants being chosen badly. The unit-load matrix is built one column at a time and transposed on the way out, a unit load being applied at one place and read at many: one solve per redundant rather than one per pair.

The singularity test is the elimination itself rather than a pivot ratio taken beforehand -- an earlier pre-check never fired, because a singular matrix makes that ratio zero rather than not-a-number, and the real detection was the finiteness check underneath it.

Three release choices are offered, and the third is a trap on purpose: it releases every vertical hold there is, leaving the beam floating and the matrix singular. It is offered rather than prevented because releasing too much is the mistake this method invites, and a declared boundary a reader cannot reach is only a sentence in a manual.

Limitations

Reading the result

The content of this screen is the agreement, not either number alone. Flipping the route swaps both readings to the other method and neither moves. If they do disagree, look at the recovery rather than the solve: slope-deflection reads the same displacements the matrix route produced, so a disagreement is downstream of them.

A dash here always carries its reason, and the reasons are not interchangeable. "No member here carries a moment to report" means every member is released or bedded. "Releasing those leaves a mechanism" means the third release choice was taken. "Nothing to release: already determinate" means the beam has no redundant to find.

The thing most often got wrong about the force method is that the answer might depend on which redundants were released. It does not. Two readers releasing different supports on the same beam get the same beam, and if they do not, one of them released into a mechanism.

The thing most often got wrong about the moments is the role of stiffness. Scaling every member's stiffness together leaves every moment exactly where it was and divides every displacement by the same factor: in a structure of uniform stiffness the moments depend on the ratios between members, not on their size. That is why a redundant frame can be analysed before its sections are chosen -- and why "the moments moved when I changed the modulus" means something else moved with it.

Implemented by slope_deflection_moment, slope_deflection_moments, matrix_moments, fixed_end_moments, largest_moment_gap, released_model, flexibility, gaps, redundants, reactions_by_force_method, determinacy_planar_frame, solve.

Torsion

Circular Shafts

Shear stress, twist and transmitted power in a round shaft, including stepped and doubly fixed ones.

τ=(T d)/(2J), φ=(TL)/(GJ), T=(power)/(ω)

Basis

A shaft of circular section twisted about its axis deforms so that plane sections stay plane and radii stay straight. That is not an approximation but a consequence of symmetry: every diameter is an axis of symmetry and the section looks the same after any rotation about the axis, so there is no direction in which the section could warp without breaking a symmetry the loading has. Once plane sections stay plane the strain distribution is fixed by geometry alone, and the material law is applied afterwards.

Derivation

Two sections a distance L apart rotate relative to each other through an angle phi. A line on the surface at radius r is sheared through r phi / L, so the shear strain — and with a linear material the shear stress — is proportional to the radius: zero on the axis, largest at the outside.

Integrating the moment of that stress over the section gives the torque. Writing the stress as G r phi / L and taking moments gives T equal to G phi / L times the integral of r squared over the area, which is the polar second moment J. Rearranged, the two working relations fall out together: the twist is T L / G J and the stress at any radius is T r / J.

For a circular section, and only for one, that J is both the polar second moment of the area and the torsion constant of the section. Every other outline warps, and there the polar second moment is not the torsion constant; using it overstates the stiffness badly. That is a different problem with different relations, and it is why there is a second torsion module rather than a correction factor here.

Two compositions follow directly. Segments in series carry the same torque and their twists add, so a stepped shaft is a sum. A shaft built in at both ends is two paths in parallel: the twist at the loaded section is common, so the torque divides in proportion to the torsional stiffness G J / L of each side — not in proportion to length and not to diameter, which is the guess a reader makes first. Finally, a rotating shaft's torque is what it delivers divided by how fast it turns.

τ=(T r)/(J), τ_(max)=(T d)/(2J)
φ=(T L)/(G J), k=(GJ)/(L)
J=(π(d^4-d_i^4))/(32)
(T_1)/(T)=(k_1)/(k_1+k_2) (both ends held)
T=(P)/(ω), ω=(2π n)/(60)

Assumptions

TakesUnitMeaning
TN·mmTorque carried by the member.
dmmOutside diameter of a circular section.
d_immInside diameter of a hollow circular section.
LmmLength of the member along its own axis, support to support.
GMPaShear modulus — how much shear stress it takes to produce a given angular distortion.
powerWPower transmitted through a rotating shaft.
omegarad/sRotational speed of a shaft, in radians per second.
GivesUnitMeaning
tau_maxMPaLargest shear stress on any plane through the point.
phiradAngle of twist between the two ends of a shaft.
Jmm⁴Torsion constant — the section's resistance to twisting, equal to the polar second moment only for circular shapes.
diagram_TN·mmTorque along the member.

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 one piece of care is in the torsion constant, which is evaluated factored — pi over 32, times the difference of the diameters, times their sum, times the sum of their squares — rather than as the difference of their fourth powers. This is not cosmetic. For any thin wall the fourth powers are two nearly equal large numbers, and subtracting them throws digits away: at a wall of one part in a thousand, three go, and the measured error of the naive form was of the order of two hundred units in the last place. The factored form never makes that difference, and the difference of the diameters is itself exact because the two are within a factor of two of each other.

The screen takes the torque directly, or computes it from power and speed when both are entered, in which case the entered torque is ignored and the row says so. The kernel relation power divided by speed genuinely is infinite at standstill -- any torque at all delivers no power there, which is a correct answer and not an error -- but this screen never reaches it: the switch to power-and-speed mode requires speed to be non-zero as well as power, so a shaft entered as turning at zero speed falls back to the directly entered torque rather than reporting an infinite one. That is a deliberate boundary of this screen rather than an oversight -- it declares a nan boundary and no inf one, on the view that a shaft has no route to an infinite stress worth explaining to a reader -- and the practical effect is that switching a shaft already in power-and-speed mode down to zero speed does not flag the torque shown as stale, since nothing in the row's own wording changes.

A bore reaching the outside diameter is refused, since the torsion constant and the stiffness both go to zero there. Short of that, the canon carries an advisory for a thin wall: the answer is genuinely sensitive to the two diameters, so a change in the last digit of the bore moves the result by a few hundred times as much. It is right for the numbers entered — enter them precisely.

Limitations

Reading the result

The stress is proportional to the radius, so the material near the axis is carrying almost nothing. Boring out the middle third of a shaft removes about eleven per cent of its area and about one per cent of its torsion constant, which is the entire argument for hollow shafting and is checkable in one line.

The twist is in radians. It is also proportional to length, so comparing the twist of two shafts is meaningless unless they are the same length — compare the twist per unit length, or compare the stiffness G J / L, which is the quantity that actually decides how a torque divides between two paths.

The misreading worth naming is treating the built-in-at-both-ends case as an even split. It is a split in proportion to G J / L on each side, so a stiff short length in parallel with a soft long one takes nearly all of the torque, and the far end may see very little of what was applied.

Advisory. The wall is thin enough that the torsion constant is sensitive to the diameters themselves: a change in the last digit of the bore moves the answer by a few hundred times as much. The result is right for the numbers entered; enter them precisely.
Warning. At this torque the linear elastic model implies a surface shear strain past anything a structural metal stays elastic through, so the stress and the twist angle below are both outside the range the relations were derived for. The bar would have yielded long before reaching them. Reduce the torque, or read these numbers as the elastic extrapolation they are rather than as a prediction.

Implemented by shear_stress, twist_angle, torsional_stiffness, torque_from_power, power_from_torque, speed_from_revolutions, parallel_share, polar_moment_circular.

Non-Circular & Thin-Walled Torsion

Rectangles, open thin sections and closed cells — three very different ways of resisting twist.

J=Σ(b t^3)/(3) (open), q_(flow)=(T)/(2A_m), φ=(TL)/(4A_m^2G)∮(ds)/(t) (closed)

Basis

Only a circular section is free of warping. Twist any other outline and its plane sections do not stay plane: the section warps out of itself, and the constant in the torque-twist relation is no longer the polar second moment of the area. It is a separate property, the torsion constant, and for a thin open section it is smaller than the polar second moment by orders of magnitude. That is why this module exists rather than a shape factor in the circular one.

Derivation

Three outlines, and the important thing is that they are three mechanisms rather than three coefficients.

A solid rectangle resists twist by shear circulating within the section. The classical solution is a series, and the app evaluates it in a closed form that carries its own checks: as the rectangle gets thin it tends to b t cubed over three, and at square it gives 0.14083 t to the fourth against the published 0.1406, high by about a sixth of a per cent. A table of coefficients against b over t has no such anchors — every entry must be trusted separately, and reading the wrong row is invisible.

A thin open section — an angle, a channel, a rolled I, a slit tube — is a set of narrow strips, each carrying torque as shear reversing across its own thickness. The constants add, so J is the sum of b t cubed over three. Thickness enters as a cube, so halving a wall costs seven eighths of the stiffness, and the peak stress, going as T t over J, is in the thickest element rather than the widest.

A closed thin cell works differently: torque runs as a shear flow round the wall. Equilibrium of a strip of wall between two cuts requires the flow — stress times thickness — to be the same at both, so it is constant all the way round however the thickness varies. The moment of that flow about any interior point makes the torque twice the flow times the area enclosed by the wall mid-line. Stress is flow over local thickness, so it is largest where the wall is thinnest. Equating the work done by the torque to the energy stored round the circuit gives the second relation, a torsion constant of four times the enclosed area squared times the thickness, over the developed length.

Put the last two side by side. A closed cell's torsion constant divided by that of the same wall slit open is twelve times the enclosed area squared, over the developed length squared and the thickness squared. For a circular tube of mid-line radius r that is exactly three times r over t, squared. A tube whose wall is a fiftieth of its radius is seven and a half thousand times stiffer closed than slit — same material, same weight, one saw cut down its length.

J=b t^3[1/3-0.21 t/b(1-(t^4)/(12 b^4))] (solid rectangle, b≥ t)
J=Σ_i (b_i t_i^3)/(3), τ_(max)=(T t_(max))/(J) (thin open)
q=(T)/(2A_m), τ=q/t (closed cell)
J=(4A_m^2t)/(s), φ=(TL)/(4A_m^2G)∮(ds)/(t)
(J_(closed))/(J_(slit))=(12A_m^2)/(s^2t^2)=3(r/t)^2 for a circular tube

Assumptions

TakesUnitMeaning
TN·mmTorque carried by the member.
bmmWidth of a rectangular part of the cross-section, measured across the bending axis.
tmmWall thickness of a thin part — a flange, a web, a tube wall, a plate.
A_mmm²Area enclosed by the mid-line of a closed thin-walled section.
LmmLength of the member along its own axis, support to support.
GMPaShear modulus — how much shear stress it takes to produce a given angular distortion.
shape—Which supported parametric outline the calculation uses.
GivesUnitMeaning
Jmm⁴Torsion constant — the section's resistance to twisting, equal to the polar second moment only for circular shapes.
tau_maxMPaLargest shear stress on any plane through the point.
phiradAngle of twist between the two ends of a shaft.
q_flowN/mmShear flow — force per unit length running along the wall of the section.

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

One control selects the mechanism, not a coefficient, and it now offers all three outlines the canon declares: solid rectangle, thin open section, closed cell. Each has its own relation. The solid rectangle takes the series solution in closed form; the thin open section takes the narrow-strip limit, width times thickness cubed over three, which is the relation a reader meets first and the one the series tends to; the closed cell takes the two Bredt relations. The name of whichever ran is printed beside every value, which is how a reader can tell the three apart at a glance rather than by remembering what they selected.

Two defects met here, and both are worth recording because they compound. The control was bound to a symbol this screen does not carry, so it never moved off its first position and the screen answered every section as a solid rectangle. Underneath that, the dispatch compared the selection against a single threshold — one or more meant closed — while the canon declares three options, so the middle one, "thin open section", would have been handed the closed cell's answer. On the state the screen opens on, a 200 by 10 wall enclosing 7854 square millimetres, the thin open section's torsion constant is 66 667 mm⁴ and the closed cell's is 6 168 532 mm⁴: ninety-two times larger, with the twist angle ninety-two times smaller and the peak shear stress smaller by a factor of twenty-four. Repairing the binding without repairing the comparison would have delivered that error to the reader instead of hiding it from them.

The standalone thin-strip function is also what the open-to-closed ratio is built from, and that ratio is worth evaluating once for its own sake: for a circular tube it is three times the radius-over-thickness ratio, squared.

On the closed branch the enclosed area is its own input field and the developed length of the wall is taken as twice the entered width. The two are therefore not derived from one drawn outline, and it is possible to enter an area and a width that no single section has. That is a limitation of this screen rather than of the relations, which take area, perimeter and thickness independently.

The canon carries an advisory when the width-to-thickness ratio of the thinnest element falls below about five. The thin-wall relations lose accuracy there and the screen says so rather than extrapolating in silence.

Limitations

Reading the result

The largest silent error available in this whole subject is reading the wrong branch. The same outline with the same wall gives two answers that can differ by three orders of magnitude, and both of them look entirely reasonable printed on a screen. Check which mechanism produced the number before reading it: the relation's name is printed beside every value and says which of the three ran, and the shear-flow row is a second signal, since only the closed cell has one.

The two peak-stress rules are opposites and are easy to swap. In a closed section the flow is constant, so the stress peaks in the thinnest wall. In an open section the stress goes as the local thickness over the torsion constant, so it peaks in the thickest element. A reader who has met only one of these will look in exactly the wrong place on the other.

The last thing worth internalising is what closing a section buys. Doubling the enclosed area quadruples the torsion constant; doubling the wall only doubles it. Torsional stiffness is bought with enclosed area far more cheaply than with material, which is why every torsionally loaded structure that can be a box is one.

Advisory. The thin-walled torsion formulas lose accuracy for stocky elements like this one.
Warning. At this torque the linear elastic model implies a surface shear strain past anything a structural metal stays elastic through, so the stress and the twist angle below are both outside the range the relations were derived for. The bar would have yielded long before reaching them. Reduce the torque, or read these numbers as the elastic extrapolation they are rather than as a prediction.

Implemented by torsion_constant_thin_open, torsion_constant_rectangle, shear_stress_thin_open, shear_flow_closed, shear_stress_closed, torsion_constant_closed, open_to_closed_ratio, twist_angle.

Combined Bending + Torsion

A shaft that bends and twists at once: principal stresses, and the pure moment that would match them.

M_e=½(M+√(M^2+T^2)), T_e=√(M^2+T^2)

Basis

A shaft that bends and twists at once has, at its outermost fibre, a direct stress from the bending and a shear stress from the torque acting on the same element of material. The element is in plane stress with one direct component and one shear component, which is the simplest non-trivial stress state there is. Its principal stresses and its maximum shear follow from the stress circle, and the two equivalent moments are those two answers rewritten as the pure loadings that would produce them.

Derivation

For a solid round shaft the section modulus in bending is the second moment over the outer radius, and the polar section modulus in torsion is the polar second moment over the same radius. Because the polar second moment of a circle is twice the diametral one, the polar section modulus is exactly twice the bending one. So the direct stress is M over Z and the shear stress is T over 2Z, with the same Z in both — which is what makes the algebra below collapse so neatly.

The stress circle for a state with one direct stress and one shear has its centre at half the direct stress and a radius equal to the root of the square of that half plus the square of the shear. The principal stresses are the centre plus and minus the radius; the maximum shear stress is the radius itself.

Now ask what pure bending moment would give the same largest principal stress. Substituting the two shaft stresses into the circle and collecting the common 1 over 2Z gives a largest principal stress of one over 2Z times M plus the root of M squared plus T squared. Setting that equal to an equivalent moment over Z gives the equivalent moment as half of M plus the root of M squared plus T squared. Ask what pure torque would give the same maximum shear stress, and the same substitution gives the equivalent torque as the root of M squared plus T squared.

Those two are not two estimates of one quantity. They are the maximum principal stress theory and the maximum shear stress theory, written as moments for this one section shape. Which of them governs depends on the material, and neither is a refinement of the other. A NASA structures handbook prints both theories in their general stress form; putting the bending and torsion stresses of a round shaft into them is what produces these two expressions, so they are the theories rather than two additional formulas to remember.

σ=(32M)/(π d^3), τ=(16T)/(π d^3)
σ_(1,2)=(σ)/(2)±√(((σ)/(2))^2+τ^2)
τ_(max)=√(((σ)/(2))^2+τ^2)
M_e=½(M+√(M^2+T^2)), T_e=√(M^2+T^2)
σ_1=(M_e)/(Z), τ_(max)=(T_e)/(2Z), Z=(π d^3)/(32)

Assumptions

TakesUnitMeaning
MN·mmBending moment at the section under consideration.
TN·mmTorque carried by the member.
dmmOutside diameter of a circular section.
GivesUnitMeaning
sigma_1MPaLargest principal stress — the biggest direct stress on any plane through the point, with no shear on that plane.
sigma_2MPaSecond principal stress.
tau_maxMPaLargest shear stress on any plane through the point.
M_eN·mmEquivalent bending moment — the pure bending that would produce the same peak stress as the combined bending and torsion.
T_eN·mmEquivalent torque — the pure torsion that would produce the same peak shear as the combined bending and torsion.

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, with one deliberate piece of reuse. The screen builds the polar second moment with the same factored routine the round-shaft screen uses, forms the bending section modulus from it rather than from a second expression in the diameter, and hands the resulting direct and shear stresses to the same stress circle functions the plane-stress screen uses. The equivalents come from the same torsion kernel that the plain torsion screen calls.

That matters more than it sounds. This screen is the circular torsion screen and the plane stress screen asked a different question, and writing a second implementation of either would create a second place for them to disagree — which in this project is the shape of failure that has recurred most often. Every number here is produced by a function some other screen also depends on.

Limitations

Reading the result

The result that surprises everyone is that the equivalent torque does not vanish when the applied torque does. With no torque at all, the equivalent torque equals the applied bending moment — and it should, because a shaft in pure bending carries a maximum shear stress of half its direct stress, on planes at forty-five degrees. The equivalent torque is answering the shear question, and pure bending has a shear answer.

The second is the sign structure. As soon as any torque acts, the two principal stresses have opposite signs: one tensile, one compressive, whatever the bending does. A check that looks only at the larger of them underestimates the demand, and the amount by which it does grows as the torque approaches the bending.

The last is what to do with the two equivalents. They are not to be averaged and the larger is not automatically the answer. They belong to two different failure theories, and the app reports both rather than choosing, because choosing is a material question this app deliberately does not answer — no design code is applied anywhere in it.

Implemented by equivalent_moment, equivalent_torque, shear_stress, polar_moment_circular, flexure_stress_from_modulus, principal_stress_major, principal_stress_minor, stress_circle_radius, stress_circle_centre.

Stability

Euler Column & Effective Length

The load at which an ideal column stops being straight, for any of the classical end conditions.

EI_x(d^2y)/(dx^2)+Py=0 ⇒ P_(cr)=(π^2EI_x)/((K_(eff)L)^2), y=Asin((nπ x)/(L))

Basis

A straight elastic column under axial compression is in equilibrium at every load. At certain loads it is also in equilibrium in a slightly bent shape, and the smallest of those loads is the critical one. This is a bifurcation, not a strength: nothing in the material is exceeded, nothing breaks, and the column simply acquires a second equilibrium configuration adjacent to the first. What the theory hands back is the load at which that happens and the shape it happens in — never the size of the deflection, which the small-deflection theory leaves undetermined.

Derivation

Write moment equilibrium on the column as it has moved rather than as drawn. At a section displaced sideways by y, the axial load has a lever arm y about it, so the internal bending moment must equal P y. With the elastic curvature relation this is a linear equation with constant coefficients whose solutions are sines and cosines of x times the square root of P over EI.

Requiring the deflection to vanish at both pinned ends kills the cosine and forces the sine's argument to be a whole number of half-waves over the length. That single condition produces everything: the load is n squared times pi squared EI over L squared, the shape is a half sine for the first mode, and the amplitude never appears — it cancels, which is exactly what a bifurcation load should do.

Other end conditions change the boundary conditions and not the differential equation, so every other case is the pinned case with the length replaced by an effective length: the distance between the points of contraflexure, where the moment on the buckled shape passes through zero. Both ends built in puts those points at the quarter points, so the middle half behaves as a pin-ended column and the factor is exactly one half. Built in at one end and free at the other is a half-wave stretched over twice the length, so the factor is exactly two and the critical load is one sixteenth of the fixed-fixed value at the same length.

Two cases are not round numbers. Built in at one end and pinned at the other leaves a condition that reduces to the tangent of an argument equalling the argument itself; its smallest positive root is 4.4934094579, so the factor is pi over that — 0.699156, not the 0.7 quoted everywhere. The rounding is about a quarter of a per cent in the critical load, and it is on the safe side: 0.7 is larger than the true factor, and a larger effective length predicts a lower load. An end held by a rotational spring gives a second transcendental condition whose smallest root runs from pi at no restraint to 4.4934 at full fixity, a load coefficient climbing from 9.87 to 20.19 as the spring stiffens.

The remaining two cases are the ones a drawing cannot distinguish. Both ends built in with the top free to translate has a factor of exactly one against one half for the same end conditions braced: four times the critical load. Built in and pinned free to sway is exactly two against 0.699 braced: eight times. Whether the frame can sway is not a property of the column, and the column does not know it.

EI(d^2y)/(dx^2)+Py=0
P_(cr)=(n^2π^2EI)/((K L)^2), y=Asin(nπ x)/(L)
λ=(KL)/(r), σ_(cr)=(π^2E)/(λ^2)
tan x = x, x_1=4.4934094579, K=(π)/(x_1)=0.699156
tan x = (c x)/(c+x^2), c=(β L)/(EI)

Assumptions

TakesUnitMeaning
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
LmmLength of the member along its own axis, support to support.
supports_type—The support arrangement — pinned both ends, fixed one end, propped cantilever, and so on.
Amm²Cross-sectional area — the amount of material you would see if you sliced the member straight across.
mode_n—Which buckling mode is being shown, counting up from the lowest.
GivesUnitMeaning
P_crNCritical load — the axial force at which the member stops being straight and bows out.
sigma_crMPaCritical stress — the average stress in the member at the moment it buckles.
K_eff—Effective length factor — the fraction of the real length that behaves like a pin-ended column.
lambda_s—Slenderness ratio — effective length divided by radius of gyration.
mode_shape—The deflected shape the structure takes as it buckles.

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 for the six named end conditions. The two transcendental cases are bisected rather than typed in, so the number in the code is derived from the equation it solves. The tangent condition is bracketed between pi and three halves of pi, where the tangent climbs from zero to infinity and crosses the line exactly once. The elastic-restraint root is bracketed between pi and 4.4934 — the pinned answer at one end of the interval, the fully fixed answer at the other — so a sign change is guaranteed for any positive restraint, and the nearest pole of the tangent, at 4.712, lies outside. Both facts are properties of the bracket rather than of the input, which is why the search can be written without a convergence test that might not converge.

The restraint condition itself has no guard on the tangent's poles, and that is a decision rather than an omission: the cosine of a double is never exactly zero near a pole — the cosine of pi over two evaluates to 6e-17 — so a test for an exact zero would never fire and the pole would never be landed on. The protection belongs at the bracket, and that is where it is.

The kernel does not raise. A column of no effective length returns an unbounded critical load, which is the right answer: braced at close enough centres, buckling stops being what limits the column and squashing takes over. A negative length or a negative stiffness returns nothing rather than a plausible number.

Limitations

Reading the result

Read the effective length, not the length. The slenderness printed here is built from K times L, and nothing in the number itself says which was used — a fixed-ended column and a pin-ended one of the same length differ by a factor of two in slenderness and four in critical load. Using the real length is the most common mistake in this subject and it is invisible in the answer.

The second thing to notice is what is absent from the relation: the material's strength. A slender column of mild steel and one of high-strength steel, same section and same length, buckle at the same load. Buying a stronger grade of steel to fix a slender column buys nothing at all. That is the single most surprising fact in the subject and the reason the strength curve on the next screen exists.

Finally, read the sway branch before reading the number. Two of the options here share their end conditions with two others and differ only in whether the frame can translate. A drawing of the column is identical in each pair, and the loads differ by four and by eight.

Implemented by euler_load, euler_load_mode, euler_stress, slenderness, effective_factor_pinned_pinned, effective_factor_fixed_fixed, effective_factor_fixed_pinned, effective_factor_fixed_free, effective_factor_fixed_fixed_sway, effective_factor_fixed_pinned_sway, tangent_equals_argument_root, elastic_restraint_condition, elastic_restraint_root, radius_of_gyration, critical_load_from_stress.

Column Strength Curve

Critical stress against slenderness, from squash load to Euler hyperbola, with the transition marked.

σ_(cr)=(π^2E)/(λ_s^2), σ_(cr)=σ_y-(σ_r(σ_y-σ_r))/(π^2E)λ_s^2, λ_c=π√((E)/(σ_y-σ_r))

Basis

Two accounts of column failure each cover part of the range and neither covers the middle. A stocky column squashes: it reaches its yield stress and goes no further. A slender one buckles elastically at a stress far below yield. In between, part of the section has already yielded before the column becomes unstable, and neither account applies. The strength curve is the single curve that carries a column from one regime to the other with the transition marked.

Derivation

Plot the elastic critical stress — pi squared E over slenderness squared — against slenderness. It is a hyperbola, and as the slenderness goes to zero it goes to infinity, which is nonsense: no column carries more than the load that squashes it. So the curve has to be capped at the yield stress.

A horizontal cap meeting a hyperbola is also wrong, and for a physical reason rather than an aesthetic one. Rolling and welding leave residual stresses in a section: parts of it are already in compression before any load is applied. Those fibres reach yield at an applied stress well below the nominal yield, and once they have yielded they contribute no stiffness. The section therefore loses bending stiffness gradually as the load rises, and a column in the middle slenderness range falls below both the yield cap and the elastic hyperbola.

The classical account replaces the corner with a parabola. The general Bleich form writes the maximum compressive residual stress sigma_r explicitly. It starts at yield and intersects Euler at the proportional limit sigma_y minus sigma_r. The transition slenderness is therefore pi times the square root of E over that proportional-limit stress, and the parabola subtracts sigma_r times that same stress times slenderness squared over pi squared E.

The familiar CRC compromise sets sigma_r to one half of sigma_y. That choice reduces the general relation to Eq. (1.140), makes the transition stress one half of yield, and makes the two branches tangent as well as coincident there. The screen opens on that published compromise but leaves sigma_r visible, so the reader can see which assumption makes the curve move.

The join is worth checking rather than trusting. At the transition the elastic branch gives half the yield stress; substituting the transition slenderness into the parabola gives the yield stress minus half of it, which is the same number. The two branches also share a slope there, and the parabola has zero slope at the origin, so the composite curve leaves the yield line smoothly and rejoins the hyperbola smoothly. That is what makes it one curve rather than two curves drawn end to end.

The transition moves in a direction that surprises people. Raising the yield stress lowers the transition slenderness, because the elastic curve is unchanged and the level it has to fall to is higher. A stronger material therefore helps a stocky column, helps a middling one less, and does nothing whatever for a slender one.

σ_(cr)=(π^2E)/(λ^2) (λ>λ_c)
σ_(cr)=σ_y-(σ_r(σ_y-σ_r))/(π^2E)λ^2 (λ≤λ_c)
λ_c=π√((E)/(σ_y-σ_r)), σ_(cr)(λ_c)=σ_y-σ_r
σ_r=½σ_y ⇒ σ_(cr)=σ_y-(σ_y^2)/(4π^2E)λ^2
P_(cr)=σ_(cr)A

Assumptions

TakesUnitMeaning
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
sigma_yMPaYield stress — where the material stops springing back.
lambda_s—Slenderness ratio — effective length divided by radius of gyration.
sigma_rMPaResidual stress — stress locked into the section by rolling or welding, before any load is applied.
GivesUnitMeaning
sigma_crMPaCritical stress — the average stress in the member at the moment it buckles.
lambda_c—Transition slenderness — where the elastic and inelastic column curves meet.
P_crNCritical load — the axial force at which the member stops being straight and bows out.

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 on both branches, with the transition computed first and used as the switch. At or below the transition slenderness the parabola runs; above it the elastic relation runs. Which branch produced the number is reported alongside it, because the two are different physical accounts — one is about yielding with residual stress, the other about elastic instability — and a single stress gives no hint which one is speaking. The predicate that decides is exposed on its own so the interface can ask rather than recompute the transition and compare, which is how the label and the value are kept from disagreeing.

A zero or negative yield stress makes the transition undefined, and the whole curve is then absent rather than partly evaluated.

Limitations

Reading the result

Read which branch is in force before reading the number. The two say different things about what would have to change to make the column stronger. On the elastic branch the answer depends on E and on the slenderness and on nothing else, so the fixes are geometric: a shorter effective length, a fatter section, a brace. On the parabolic branch the yield stress is doing most of the work and a stronger grade helps.

The transition slenderness itself is the most useful number on the screen and the one most often skipped. It is the boundary between two different design conversations, and where a column sits relative to it determines which levers exist.

The commonest misreading is to treat the curve as a capacity. It is a critical stress for an idealised member — straight, centrally loaded, with an assumed residual pattern — and a real column of the same slenderness will be below it.

Advisory. These are teaching curves from the research literature, not a design code check. No national or regional standard is applied anywhere in this app.

Implemented by transition_slenderness, parabolic_strength, strength_curve, governs_elastically, euler_stress, critical_load_from_stress.

Imperfect Columns

A column that was never quite straight: how the bow grows, and how a test plot gives up the critical load.

δ=(e_0)/(1-P/P_E), σ_(max)=P/A(1+(e_0 c_t)/(r_x^2) (1)/(1-P/P_E)), (δ)/(P)=(δ)/(P_E)+(e_0)/(P_E)

Basis

No column is straight. A column that starts with a bow deflects from the first increment of load applied, and there is no sudden event anywhere on its load-deflection curve — the bifurcation of the ideal column has been replaced by a continuous growth. The critical load does not thereby stop being meaningful. It stops being a load the column reaches and becomes the load its deflection is measured against, which is a more useful thing for it to be.

Derivation

Let the unloaded shape be a half sine of amplitude equal to the initial bow. The same equilibrium argument applies, with one change: the lever arm of the axial load at a section is now the total displacement, initial plus additional, so the governing equation carries the initial shape as a forcing term.

Because that forcing term is itself a half sine — the shape of the buckling mode — the algebra collapses. Assume the additional deflection is a half sine too and match coefficients: the additional deflection is the initial bow times the load ratio over one minus the load ratio, and the total midspan deflection is the initial bow divided by one minus the load ratio.

That factor, one over one minus P over the Euler load, is the whole of this family of screens. It is one at no load, two at half the critical load, and unbounded at it. An initial crookedness, an eccentricity and a transverse load are all magnified by it, and none of them needs a version of its own.

The peak stress follows by adding the axial stress to the bending stress at the extreme fibre. The bending moment at midspan is the load times the total deflection; dividing the resulting fibre stress by the axial stress and using the fact that the second moment is the area times the radius of gyration squared leaves a bracket containing the amplification multiplied by a single dimensionless group: the initial bow times the distance to the extreme fibre, over the radius of gyration squared. That group is the imperfection ratio, and it is the one number that says how much a given crookedness costs a given section. A deep section tolerates far more bow than a slender one, and the ratio is why.

One consequence is worth deriving because it turns the relation into a measurement. Rearranging the deflection relation for the additional deflection gives that deflection divided by the load as a straight line in the deflection itself, with slope one over the critical load and intercept the initial bow over the critical load. Plotting a test that way recovers the critical load from readings taken nowhere near it, and recovers the initial bow as a by-product.

EI(d^2y)/(dx^2)+P(y+y_0)=0, y_0=e_0sin(π x)/(L)
δ=(e_0)/(1-P/P_E), amp=(1)/(1-P/P_E)
σ_(max)=P/A[1+(e_0c)/(r^2)·(1)/(1-P/P_E)]
(δ_a)/(P)=(δ_a)/(P_E)+(e_0)/(P_E)

Assumptions

TakesUnitMeaning
e_0mmInitial bow — how far the member is already out of straight before any load is applied.
LmmLength of the member along its own axis, support to support.
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
Amm²Cross-sectional area — the amount of material you would see if you sliced the member straight across.
PNAxial force in the member — positive in tension unless the screen says otherwise.
c_tmmDistance from the centroid to the top fibre of the section.
r_xmmRadius of gyration about the horizontal axis — the distance at which all the area could sit and give the same bending resistance.
GivesUnitMeaning
deltammDeflection — how far a point has moved from where it started.
sigma_maxMPaLargest direct stress anywhere in the section.
P_crNCritical load — the axial force at which the member stops being straight and bows out.
amp—Amplification factor — how much the axial force magnifies a deflection that bending alone would have caused.

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, and the whole screen is one factor evaluated three times. The amplification returns an unbounded value exactly at the critical load and nothing at all beyond it — past the critical load the small-deflection theory this comes from has nothing to say, and a negative number would look like an answer. That is the reason for refusing rather than returning: the expression stays perfectly finite and quietly changes sign, so an unguarded evaluation above the critical load reports a deflection pointing the wrong way with no indication anything is wrong.

The peak stress is computed by evaluating the amplification first and testing it before it is used, so a divergent factor propagates as a divergent stress rather than as an arithmetic accident inside a larger expression.

Limitations

Reading the result

Doubling the initial bow doubles the deflection at every load level and leaves the critical load exactly where it was. That separation is the point of the screen: imperfection changes the response, not the stability boundary. A reader who expects a bigger bow to lower the critical load has confused the load the column fails at with the load the column is measured against.

The deflection is always larger than the initial bow, for any load above zero. There is no threshold to cross and no event to watch for, which is the whole difference between this screen and the ideal column next door.

The trap in the test relation is the subtraction. The straight line whose slope gives the critical load is plotted with the deflection measured from the initial bow, not from the straight axis. The deflection reported here is the total, initial bow included. Feeding the total into the plot shifts the intercept and distorts the slope, and the resulting critical load looks entirely plausible.

Warning. Above nine tenths of the critical load the series form of the amplification is no longer accurate; the exact form is being used and the answer is very sensitive to the axial force.

Implemented by amplification, deflection_initial_crookedness, perry_robertson_stress, euler_load.

Eccentric Columns

A load that misses the centroid, and the load you can allow once a stress limit is set.

δ=e(sec(L/2√((P)/(EI_x)))-1), σ_(max)=P/A[1+(e c_t)/(r_x^2)sec((L)/(2r_x)√((P)/(AE)))]

Basis

A load applied a distance from the centroid is a load and a moment, both present from the instant the load is applied. Like the crooked column there is no bifurcation, but unlike the crooked column the answer is not an approximation: the governing equation with a constant end moment has a closed solution, and the secant formula is that solution rather than an estimate of it.

Derivation

The equilibrium equation on the deflected shape now carries a constant term — the end moment, load times eccentricity — on the right. Its solution is the same sines and cosines plus a particular constant, and imposing zero deflection at both ends produces a midspan deflection equal to the eccentricity times the secant of half the argument, less one.

Adding the axial stress to the extreme-fibre bending stress and using the second moment as the area times the radius of gyration squared gives the working relation: the average stress multiplied by one plus the eccentricity ratio times a secant. The eccentricity ratio here is the same dimensionless group as on the crooked-column screen — eccentricity times the distance to the extreme fibre over the radius of gyration squared — which is why the two screens can be read against each other at all.

The argument of the secant is half the length over the radius of gyration, times the square root of the average stress over the modulus. It is worth separating out, because it reaches a right angle at exactly the Euler load and at no other load. That is not a coincidence to be checked numerically; it is the statement that the secant formula contains the perfect column as a limit rather than resembling it. The perfect column is the case where the eccentricity is zero: the bracket collapses to one, the stress is the average stress, and the deflection is zero at every load below critical — an ideal column, recovered from the eccentric solution rather than assumed separately.

The secant formula and the amplification factor are different objects and part company where it matters. Expanding the secant in its argument and expanding the amplification in the load ratio, the leading corrections differ by a factor of pi squared over eight — about twenty-three per cent — and the gap widens as the pole is approached. The amplification is a one-mode magnifier applied to a deflection already present; the secant is the exact answer to a specific load case. Both are offered because a reader ought to see the difference rather than be told about it.

EI(d^2y)/(dx^2)+Py=-Pe
u=(L)/(2r)√((P)/(EA))=L/2√((P)/(EI))
δ=e(sec u-1)
σ_(max)=P/A[1+(ec)/(r^2)sec u]
u→(π)/(2)⇔ P→(π^2EI)/(L^2)

Assumptions

TakesUnitMeaning
emmEccentricity — how far the load sits from the centroid.
c_tmmDistance from the centroid to the top fibre of the section.
r_xmmRadius of gyration about the horizontal axis — the distance at which all the area could sit and give the same bending resistance.
LmmLength of the member along its own axis, support to support.
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
Amm²Cross-sectional area — the amount of material you would see if you sliced the member straight across.
sigma_allowMPaAllowable stress you have chosen to design to.
GivesUnitMeaning
PNAxial force in the member — positive in tension unless the screen says otherwise.
deltammDeflection — how far a point has moved from where it started.
sigma_maxMPaLargest direct stress anywhere in the section.
P_crNCritical load — the axial force at which the member stops being straight and bows out.

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

Where it stops.

Solution method

The screen inverts the relation rather than evaluating it. The reader supplies an allowable stress and the screen answers how much load the column can carry, which is the question the secant formula is actually asked. It cannot be inverted in closed form, so it is bisected: two hundred halvings on the interval from zero to the Euler load, keeping the half in which the peak stress is finite and no greater than the allowable.

The bracket is the guard. Any load at or past the pole makes the peak stress unbounded, which the test treats as too high, so the search moves away from the pole and never straddles it. The secant itself returns an unbounded value as soon as its argument reaches a right angle, before the cosine is ever taken — for the same reason this package refuses to test a cosine against zero anywhere: the cosine of a double is never exactly zero at the pole, so such a test never fires.

Beside the exact peak stress the screen reports the secant deflection itself, at the load the search converges to: the same eccentricity-times-secant-minus-one above, not the amplification estimate. It is measured from the column's original straight axis, so it is zero at zero load — the amplification form, by contrast, is measured from the load's line of action and equals the eccentricity there. The two remain the different objects described above; this screen evaluates only one of them, and evaluates it exactly rather than through the one-mode approximation.

The independent public-domain reference library contains exactly one worked example that reaches this relation without going through a chart, and it is instructive. The manual sizes a cylinder by the secant formula and declares equilibrium by printing one number against itself. Recomputed exactly, the two sides differ by three quarters of a per cent: a slide-rule equals sign, and a trial diameter that balances the equation only to about one part in a hundred. The project stores that row as disputed with a tolerance tight enough that the test asserts the core does not match the printed value, which holds the gap open rather than papering over it.

Limitations

Reading the result

The load returned is not proportional to anything. Doubling the allowable stress does not double the load, and near the Euler load raising the allowable stress barely moves the answer at all, because the secant is running away faster than the limit is rising. That flattening is the useful part of the curve to look at: it says the column is eccentricity-governed and no amount of material strength will help.

The second misreading is to treat the average stress as the stress. The peak stress reported here can be several times the load over the area, and it is the peak that the allowable is compared against. A reader who checks the load over the area against the allowable will conclude the column is comfortable when it is not.

Finally, remember what the secant argument is. When it approaches a right angle, the column is approaching its Euler load, and nothing about the eccentricity changes that boundary — the eccentricity decides how quickly the stress gets there, not where there is.

Warning. Above nine tenths of the critical load the series form of the amplification is no longer accurate; the exact form is being used and the answer is very sensitive to the axial force.
Error. The secant expression has a pole at the Euler load. No solution exists at or above it.

Implemented by secant_stress, secant_argument, euler_load, deflection_initial_crookedness, amplification.

Inelastic Buckling

Buckling once the material has left its straight line, with both classical answers and the gap between them.

P_t=(π^2E_t I_x)/((K_(eff)L)^2), P_r=(π^2E_r I_x)/((K_(eff)L)^2), E_r=(4EE_t)/((√E+√(E_t))^2)

Basis

Above the proportional limit the material's stiffness is no longer the elastic modulus. Buckling still happens when the section can no longer generate enough bending resistance to restore the column, but which stiffness that resistance is built from depends on what the individual fibres do as the column starts to bend — and there are two defensible answers, which is why this screen shows two loads.

Derivation

Tangent modulus. Suppose the axial load continues to rise, just enough, as the column begins to bend, so that no fibre anywhere in the section ever unloads. Every fibre then stays on the tangent of the stress-strain curve, the section's bending stiffness is the tangent modulus times the second moment, and the critical load is the Euler relation with the tangent modulus substituted for the elastic one.

Reduced, or double, modulus. Suppose instead the load is held constant as the column bends. Then the fibres on the convex side must unload — and unloading is elastic, following the full modulus, not the tangent. The section now has two different moduli across its depth, and the neutral axis has to shift to keep the net axial force unchanged. Working that out for a rectangular section leaves an equivalent modulus of four times the product of the two moduli over the square of the sum of their square roots. It lies between the tangent modulus and the elastic one, and it is always above the tangent modulus, so the reduced-modulus load is always the larger of the two.

Both collapse correctly when the material is still elastic. Setting the tangent modulus equal to the elastic one makes the reduced modulus four E squared over four E, which is E exactly, and both loads become the Euler load. That is a one-line anchor: the pair is one theory covering two regimes, not two theories.

The interesting part is the paradox. The reduced-modulus derivation is plainly the more careful of the two — it accounts for unloading, which physically happens — yet experiments sit close to the tangent value, the one the cruder argument gives. The resolution is that the two answer different questions. The tangent load is the load at which the straight configuration first stops being the only one available: a column can begin to bend there, under a load that continues to rise infinitesimally. The reduced load is what a column could reach if it stayed perfectly straight all the way up to it, and nothing stays perfectly straight. So the truth lies between the two, nearer the lower, and the lower is the design value — not because it is conservative, but because it is the load past which the straight column is no longer unique, which is the only definition of a critical load a real member can be held to.

One asymmetry follows from the derivations and is worth carrying: the reduced modulus depends on the shape of the section, because the neutral-axis shift does. The tangent modulus does not. Changing the section shape moves one bound and leaves the other exactly where it was.

P_t=(π^2E_tI)/((KL)^2)
E_r=(4EE_t)/((√E+√(E_t))^2)
P_r=(π^2E_rI)/((KL)^2), P_t≤ P_r
E_t=E ⇒ E_r=E ⇒ P_t=P_r=P_E

Assumptions

TakesUnitMeaning
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
E_tMPaTangent modulus — the local slope of the stress-strain curve once the material has left the straight part.
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
LmmLength of the member along its own axis, support to support.
K_eff—Effective length factor — the fraction of the real length that behaves like a pin-ended column.
Amm²Cross-sectional area — the amount of material you would see if you sliced the member straight across.
sigma_yMPaYield stress — where the material stops springing back.
GivesUnitMeaning
P_tNTangent-modulus load — the critical load computed with the tangent modulus in place of the elastic one.
P_rNReduced-modulus load — the critical load allowing for elastic unloading on the convex side.
sigma_crMPaCritical stress — the average stress in the member at the moment it buckles.
E_rMPaReduced modulus — the effective stiffness of a section where one side is unloading elastically while the other keeps yielding.

Cases this screen covers without asking. Both sides of each of these are handled by the code, so there is no control for them:

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 as the screen runs it. Both loads are the Euler relation with a different modulus, so the whole effective-length discussion carries over unchanged and this screen takes the factor as an input rather than repeating the branch.

The tangent modulus is entered rather than derived, and that is a deliberate choice about where to put a difficulty. In a complete treatment the tangent modulus depends on the stress, which depends on the load, which depends on the tangent modulus — a fixed-point problem that need not converge at all on a stress-strain curve with a flat plateau, where the tangent is zero over a range of strain and the iteration has nowhere to settle. Rather than run a loop that can fail silently, the screen asks for the tangent modulus and reports what follows from it, leaving the dependence visible and the reader's to close.

The reduced modulus refuses a non-positive modulus of either kind rather than taking the square root of a negative number.

Limitations

Reading the result

Read the pair, not either number. Two loads that bound the answer from known directions say more than one number that happens to be closer, because the width between them is the honest statement of how well the question is answered at that stress. When the two coincide, the material is still elastic and the screen is telling you so.

Then use the lower one. That is not caution, it is the definition: the tangent-modulus load is where the straight column stops being the only equilibrium available, and a column that has left the straight configuration does not return to it.

The second source available for checking this module is thinner than for the rest of the family, and that is worth knowing. The public-domain reference library prints the reduced-modulus expression word for word but carries no worked example for it, and the only tangent-modulus example there has to be read off a chart. So this module's independent check confirms the algebra and not a number.

Warning. The critical stress here is above the yield stress entered on this same screen, so the column reaches yield over its whole section before either buckling load can be developed. Both loads below are the theory's answer for a column that stays elastic to the end, and this one does not: what it carries is the squash load, the area times the yield stress.

Implemented by tangent_modulus_load, reduced_modulus, reduced_modulus_load, euler_load.

Approximate Methods

Critical loads for columns the closed forms cannot reach, by assumed shape, by residual, or by grid.

P_(cr)=(∫_0^LEI_x((d^2y)/(dx^2))^2dx)/(∫_0^L((dy)/(dx))^2dx), ∫_0^LQ(y) g_i(x) dx=0

Basis

The closed forms answer a prismatic column with a named end condition. Change the section along the length, add an intermediate brace, let the axial force vary from one end to the other, and there is no formula — but there is still an answer, and there are ways to get close to it whose direction of error is known in advance. That last clause is what makes the methods worth having: an approximation whose sign is known is a bound, and two bounds from opposite sides are a bracket.

Derivation

At the critical load the column is in neutral equilibrium: the strain energy stored by bending into a slightly deflected shape exactly equals the work the axial load does as the ends draw together. The bending energy is the integral of EI times the square of the curvature; the end shortening is half the integral of the square of the slope, so the work is the load times that. Equating and solving for the load gives the Rayleigh quotient — bending integral over slope integral — and any shape satisfying the geometric boundary conditions may be substituted into it.

Every such answer is at or above the true load, without exception. Assuming a shape imposes a constraint the real column does not have, and a more constrained structure is stiffer. The method therefore has one direction of error, it is the unconservative direction, and its best estimate is the smallest number it can be made to produce.

Two shapes make the case. Take the parabola that is zero at both ends: its second derivative is a constant, so the bending integral is four EI L; its slope is linear, so the slope integral is L cubed over three; the quotient is twelve EI over L squared. Against the Euler load that is exactly twelve over pi squared — 21.6 per cent high — from a shape that looks like an excellent guess at a half sine. The lesson is the size of the error, not its existence. The quotient is built from the second derivative, and a parabola's is a constant where the true one is a sine. Visual closeness is not numerical closeness. Take the half sine instead and the quotient gives the Euler load exactly, because it is the true buckled shape and assuming the right shape adds no constraint at all — the calibration point of the whole method.

Galerkin's method looks like a different technique: it makes the residual of the differential equation orthogonal to the assumed shape rather than balancing energies. For a self-adjoint problem — and this one is — it produces exactly the same number from the same shape. Two methods that look different and are not is worth seeing once.

Finite differences err the other way. Replacing the second derivative by a central difference on a grid of n intervals turns the problem into a tridiagonal eigenvalue problem whose lowest root is known in closed form: four EI n squared times the square of the sine of pi over 2n, over L squared. Since the sine of a positive argument is less than the argument, that is always below the Euler load, and it climbs toward it as the grid is refined, at second order in the spacing. A difference quotient is softer than the derivative it stands for, and a softer column buckles sooner. Two intervals already lands within nineteen per cent.

P_(cr)=(∫_0^LEI((d^2y)/(dx^2))^2dx)/(∫_0^L((dy)/(dx))^2dx)
y=x(L-x) ⇒ P=(12EI)/(L^2)=(12)/(π^2)P_E
y=sin(π x)/(L) ⇒ P=(π^2EI)/(L^2)=P_E
P_n=(4EIn^2)/(L^2)sin^2(π)/(2n) ↗ P_E
bracket=(P_(upper)-P_(lower))/(P_(lower))

Assumptions

TakesUnitMeaning
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
LmmLength of the member along its own axis, support to support.
shape_fn—The deflected shape you assume before an energy method can give an answer.
n_grid—Number of intervals the member is divided into for a finite-difference solution.
method—Which of the module's solution routes is being used.
GivesUnitMeaning
P_crNCritical load — the axial force at which the member stops being straight and bows out.
bracket—How far apart two approximations that err in opposite directions leave the answer, as a fraction.

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 screen evaluates the quotient from the integrals, not from the closed form. Both integrals are written out for the chosen shape and divided; the closed forms — twelve EI over L squared and pi squared EI over L squared — are then the check on the quotient rather than the thing being run. A relation that appears only in its own test is a relation nobody is using.

The finite-difference value is the exact lowest eigenvalue of the difference operator, evaluated directly. Nothing is assembled and nothing is factorised: the eigenvalues of a uniform tridiagonal operator on a pinned interval are known, so the grid result is a formula in the interval count rather than the output of a solver whose own error would then have to be argued about.

A grid of fewer than two intervals has no unknown between the pinned ends, and therefore no eigenvalue at all. It is refused rather than answered with the value at the boundary.

The bracket width is reported as a fraction of the lower bound, so it reads as a percentage and shrinks as the grid is refined or the shape improved.

Limitations

Reading the result

Read the bracket, not the value. A single approximate load carries no statement about which side of the truth it is on, and on this subject the side is the whole question: an unconservative buckling load says a column is safe when it is not.

Then read the label. The number is reported with the method and the shape that produced it, and that label is the answer's accuracy — the same screen, the same column, the same code, produces twelve EI over L squared or pi squared EI over L squared depending on nothing but the shape assumed.

The parabola's 21.6 per cent is the lesson worth carrying away. Sketch the parabola and the half sine on the same axes and they are hard to tell apart. The error of an assumed shape is invisible in a drawing of it, and only the quotient knows.

Advisory. An assumed-shape method can only overestimate a critical load. Treat this as an upper bound.

Implemented by rayleigh_quotient, assumed_parabola_load, assumed_sine_load, finite_difference_load, bracket_width.

Buckling of the Model

The load factor at which the drawn truss or frame goes unstable, and the shape it goes unstable in.

(K+λ K_g)u=0, det(K+λ K_g)=0

Basis

A first-order analysis writes equilibrium on the structure as drawn. A second-order one writes it on the structure as it has moved, and the difference is a stiffness term that depends on the axial force already in each member. That geometric stiffness is negative in compression: compression softens the structure. When it has softened it enough that the total stiffness stops being positive definite, the structure buckles. It is the same event the Euler formula describes, arrived at from the opposite direction, and on a column the two agree.

Derivation

For a beam element with the usual cubic shape functions, the second-order work of the axial force is that force times the integral of the products of the shape functions' first derivatives. Those integrals evaluate in closed form and assemble into a four-by-four matrix in the bending freedoms. One of its entries is worth pausing on: the coupling between a sideways movement at one end and a rotation is a pure force with no length in it at all, which is the one entry of that matrix a dimensional check will not catch. Each entry in this package is therefore named for the integral it is rather than for its position, and the high-precision fixture integrates those products numerically rather than copying the coefficients — because a sign error in one entry of a symmetric matrix is invisible to every solve whose assembly happens to be right, and that has already happened once in this package's foundation matrix.

Tension does the opposite of compression: a stay in tension stiffens what it braces, which is why a guy rope works at all.

Scaling the whole load case by a factor scales every axial force, and therefore the geometric stiffness, by that same factor. So the buckling condition is that the determinant of the elastic stiffness plus the factor times the geometric stiffness vanishes — a generalised eigenvalue problem whose smallest positive root is the multiple of the drawn load case at which the structure goes unstable.

The discretisation error has a known sign and a known rate. A cubic element is stiffer than the member it stands for, so the computed factor is too high and falls toward the exact value as the model is cut finer, at fourth order in the element size. One element on a pinned column gives twelve EI over L squared exactly — the same twelve over pi squared the assumed-parabola route gives, and for exactly the same reason, since a cubic with those end conditions is an assumed shape -- 21.6% high against pi squared. The error falls as the fourth power of the element count from there: four elements are still only three figures, eight reach four, and it takes about sixteen to reach five.

(K+λK_g)u=0, det(K+λK_g)=0
K_g=N∫_0^L(dN_i)/(dx)(dN_j)/(dx) dx
k_(g,11)=(36N)/(30L), k_(g,12)=(3N)/(30), k_(g,22)=(4NL)/(30), k_(g,24)=-(NL)/(30)
u_2≈(u_1)/(1-1/λ_(cr))

Assumptions

TakesUnitMeaning
nodesmmNode coordinates of the model.
members—Which two nodes each member connects, and which section and material it uses.
supports—Which degrees of freedom are held, and any settlement imposed on them.
loadsNNode loads and member loads making up the load case.
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
Amm²Cross-sectional area — the amount of material you would see if you sliced the member straight across.
mode_n—Which buckling mode is being shown, counting up from the lowest.
GivesUnitMeaning
lambda_cr—Load factor at buckling — multiply the reference load case by this to reach the critical load.
mode_shape—The deflected shape the structure takes as it buckles.
K_geoN/mmGeometric stiffness matrix — the extra stiffness, positive or negative, that axial force adds.
P_crNCritical load — the axial force at which the member stops being straight and bows out.

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

Where it stops.

Solution method

The critical factor is found by counting negative pivots, not by an eigensolver. Sylvester's law of inertia says the signs on the diagonal of a symmetric factorisation are invariant, so the number of negative pivots in the factorisation of the combined stiffness at a given factor is the number of buckling modes already below that factor — without finding any of them. The smallest critical factor is then a bisection on the question "is that count still zero", and the count is monotone in the factor, so the search cannot land on the second mode while the first is still below it, which is precisely the failure a shifted power iteration is prone to. It needs nothing the linear solver does not already have, and higher modes cost nothing extra: the nth critical factor is where the count first reaches n, and a power iteration would have had to deflate every mode below it.

The bracket is found by doubling from a factor of one until the count reaches the mode wanted, giving up at a ceiling. A structure already past its buckling load at the load as written is bracketed on zero to one instead and returns a factor below one — a real answer, and the honest one. A structure in which nothing is in compression returns an unbounded factor: it does not buckle at any load, and saying so is the answer rather than a very large number.

The mode shape is recovered by inverse iteration a shade below the critical factor, where the combined stiffness is nearly singular and a solve against almost any right-hand side comes back overwhelmingly made of the near-null eigenvector. Iterating refines it and normalising after each pass stops it overflowing. The start vector is all ones rather than random, because a reproducible answer is worth more here than a statistically safer start: an unlucky start converges just as surely, only slower, and a mode shape that changed between runs would be unusable in a figure. The result is returned with its largest component equal to one — an eigenvector has no size of its own, and printing a length for it would be printing an arbitrary number.

Limitations

Reading the result

The answer is a multiple of the load case, not a load. Doubling every load in the model halves the factor and changes nothing physical, which is the check that says you have read it correctly.

Then read the mode. "It buckles at 6.48 times this load" says nothing about where, and where is what a reader needs in order to brace it — which is why the screen reports which node moves most in the mode alongside the factor. A brace placed at a node of the mode does nothing at all; a brace placed at the antinode can raise the factor several times over.

A factor below one is not an error message. It means the structure as drawn is already past its buckling load, and the screen reports it rather than refusing, because a refusal at exactly the interesting case is the least useful response available.

Warning. Axial and bending stiffness in this model differ by so much that the displacements have lost accuracy. Check member proportions before trusting the small numbers.

Implemented by buckling_factor, negative_pivots, axial_state, mode_shape, loudest_node, geometric_translation, geometric_coupling, geometric_rotation_near, geometric_rotation_far, amplified_displacement, factorise, assemble, member_length, axial_force.

Beam-Columns

Bending and compression together, where the axial force magnifies the deflection that bending caused.

δ=(δ_0)/(1-P/P_(cr)), M_(max)=(M_0)/(1-P/P_(cr)), (P)/(P_(cr))+(M)/(M_p(1-P/P_(cr)))≤ 1

Basis

A member carrying both an axial load and a transverse one is not a beam plus a column, and adding their answers is wrong. The axial force acts on the deflection the transverse load has already caused, producing extra moment, which produces extra deflection, which produces extra moment. The two effects multiply rather than add. That is the whole subject in one sentence, and it is why these relations are a separate account rather than a correction applied to the beam screens.

Derivation

The governing equation is the column equation with the transverse load's own bending moment on the right: the homogeneous part is the column, the particular part is the beam, and the solution is neither. Everything that follows is written in one parameter, half the length times the square root of the axial load over EI. That parameter reaches a right angle at exactly the pin-ended Euler load, which is how these forms contain the buckling load rather than needing it supplied separately.

For a uniformly distributed load, the maximum moment is the plain beam value multiplied by twice the secant of the parameter less one, over the parameter squared. The maximum deflection is the plain beam value multiplied by twelve over five times the fourth power of the parameter, applied to twice the secant less the parameter squared less two. For a central point load the two factors are the tangent of the parameter over the parameter, and three times the tangent less the parameter, over its cube.

All four are exactly one at zero axial load. That is not obvious from any of the four expressions — each is a ratio of quantities that both vanish there — and it is the check that says the exact form reduces to the plain beam rather than merely approximating it.

Expanded about that point the four separate immediately, and the order surprises most readers. The uniform moment factor goes as one plus five twelfths of the parameter squared; the point-load moment factor as one plus a third of it. So the uniform case magnifies more, not less, at every load: at nine tenths of the critical load the uniform moment factor is 10.28 against the point load's 8.31. The reason is that these are ratios to a first-order answer, and a point load's first-order moment diagram is already peaked where the buckling mode is, so there is proportionally less for the axial force to add. A load spread along the span starts further from the mode shape and has further to be pulled toward it.

The familiar amplifier, one over one minus the load ratio, is the one-term version of all four, and how close it stays depends on which of the four is meant. Against the uniform deflection factor it is within a third of a per cent all the way to nine tenths of the critical load; against the uniform moment factor it is 1.5 per cent low at half and 2.8 per cent low at nine tenths; against the point-load deflection factor about 1.3 per cent high at nine tenths; and against the point-load moment factor it is 4.7 per cent high already at a quarter of the critical load and 20.4 per cent high at nine tenths. Only for the deflection factors is it a one-per-cent approximation, and for a central point load it is not an approximation of the moment at all beyond the lowest loads. What it is good for is making an interaction relation writable: the axial utilisation plus the moment utilisation with the moment amplified, checked against one. That expression reduces to pure compression when the moment vanishes and to pure bending when the axial force does, which is the property that makes it one criterion rather than two glued together.

EI(d^2y)/(dx^2)+Py=M_0(x), u=L/2√((P)/(EI))
(M_(max))/(M_0)=(2(sec u-1))/(u^2), (δ_(max))/(δ_0)=(12(2sec u-u^2-2))/(5u^4)
(M_(max))/(M_0)=(tan u)/(u), (δ_(max))/(δ_0)=(3(tan u-u))/(u^3)
(P)/(P_(cr))+(M)/(M_p(1-P/P_(cr)))≤ 1

Assumptions

TakesUnitMeaning
PNAxial force in the member — positive in tension unless the screen says otherwise.
qN/mmDistributed load intensity — force per unit length along the member.
LmmLength of the member along its own axis, support to support.
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
M_pN·mmPlastic moment — the moment the section carries once every fibre has yielded.
GivesUnitMeaning
P_crNCritical load — the axial force at which the member stops being straight and bows out.
delta_maxmmLargest deflection anywhere along the member.
M_maxN·mmLargest bending moment anywhere along the member.
amp—Amplification factor — how much the axial force magnifies a deflection that bending alone would have caused.
FoS—Factor of safety — how much bigger the resistance is than the demand.
util—Utilisation — how much of the capacity the axial force and the bending together have already used, where one means the limit has been reached.

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

Where it stops.

Solution method

The screen runs the exact trigonometric factors, not the amplifier, and the series expansions in the code are there for the opposite reason from the usual one: they fix conditioning near zero load, not accuracy near the critical load.

The reason is cancellation. The secant of a small argument, less one, is the difference of two numbers that both approach one; dividing that difference by the argument squared throws away every digit that survived. At an argument of 0.01 the uniform moment factor written directly has already lost most of its precision, so below a threshold it is evaluated as its series instead — one plus five twelfths of the argument squared. The uniform deflection factor switches at a larger threshold for a stronger reason still: its bracket is a difference of three terms each approaching two, divided by the fourth power of the argument, and at 0.01 the direct form has lost eight digits. Each switch happens where the two forms already agree to more places than a double can hold.

There is no test of the cosine against zero anywhere in these factors, and that is deliberate rather than an omission. An argument at or beyond a right angle returns an unbounded value before any cosine is taken, and past that point a double's cosine is never exactly zero — the cosine of a right angle evaluates to 6e-17. A guard on the pole would be dead code that reads like caution, and this package has already deleted one.

The exact deflection factor is also what caught the incremental second-order solver being wrong. A trace that took the tangent at the start of each step converged beautifully: every halving of the step size halved the remaining change. It converged to a value nine per cent below the closed form for the same column. It looked convergent because it was convergent — a forward step never enforces equilibrium at the state it arrives in, so refining it approaches the path of a structure that is not this one. Only a closed form could say so.

Limitations

Reading the result

The moment factor and the deflection factor are not the same number, and under a uniform load the moment one is the larger at every axial load — one plus five twelfths of the parameter squared against one plus sixty-one one-hundred-and- fiftieths of it, which is 10.28 against 10.03 at nine tenths of the critical load. The two are close, and the closeness is the point worth carrying: the deflection is magnified almost as hard as the moment, so a member sized on the amplified moment has had nothing done for its deflection, which was already magnified by nearly the same factor and started from a serviceability limit rather than a strength one.

The factor of safety reported here is the plastic moment against the amplified moment, so it already contains the axial effect once. Applying an amplification to it again — a habit that comes from treating the axial and bending checks as separate — double-counts and produces a number with no meaning.

The deepest misreading is the additive one. A member at half its critical axial load carries twice the moment a first-order analysis predicts, not the first-order moment plus a small correction. At three quarters of the critical load it is four times. That is why this is not a screen you visit after the beam screen; it is a different calculation with a different answer.

Warning. Above nine tenths of the critical load the series form of the amplification is no longer accurate; the exact form is being used and the answer is very sensitive to the axial force.
Advisory. These are teaching curves from the research literature, not a design code check. No national or regional standard is applied anywhere in this app.

Implemented by beam_column_parameter, moment_factor_uniform, moment_factor_central_point, deflection_factor_uniform, deflection_factor_central_point, amplification, euler_load, simply_supported_udl, factor_of_safety.

Frame Effective Length

The effective length factor for a column inside a frame, from the published closed form that stands in for reading the alignment chart.

K_(eff)=(3G_AG_B+1.4(G_A+G_B)+0.64)/(3G_AG_B+2(G_A+G_B)+1.28) braced, K_(eff)=√((1.6G_AG_B+4(G_A+G_B)+7.5)/(G_A+G_B+7.5)) sway

Basis

A column standing alone has a named end condition. A column inside a frame has neither a pin nor a fixed end: its ends are held by whatever beams happen to frame into them, and the restraint is a continuous quantity rather than one of six values. The measure of it is the stiffness of the columns meeting at a joint against the stiffness of the beams holding them — zero when the beams are infinitely stiff, which is a built-in end, and unbounded when there are no beams at all, which is a pin. Every real joint is somewhere between, and the alignment charts exist because nobody can guess where.

Derivation

The exact condition is a determinant assembled from the stability functions of the column and of the beams restraining it, and it is transcendental in the effective length factor. It is the relation the alignment charts were plotted from, and finding a value from it means searching for a root.

What the app evaluates is the published closed-form fit to those same charts: one rational expression for the braced case and one square root of a rational expression for the sway case, both written in the two joint restraints. The substitution was deliberate and it was made after a failure. The first version here was the transcendental relation, written out, and its corners came out wrong — both ends built in gave one where the chart says one half. A relation whose corners can be checked in a single line is worth more than a more exact one that cannot be, and these corners are exact rather than approximate:

Braced with zero restraint at both ends, the expression is 0.64 over 1.28, which is one half exactly — both ends built in. Braced with unbounded restraint, the leading terms dominate and the ratio goes to one — both ends pinned. Nothing in between leaves the interval from one half to one, which is precisely the range the braced case is confined to.

Swaying with zero restraint gives the square root of 7.5 over 7.5, which is one exactly — twice the braced value from the same drawing. Swaying with unbounded restraint grows without limit, because a column pinned top and bottom in a frame that can sway is a mechanism, and a mechanism has no finite effective length.

That factor of two at the corner, and considerably more elsewhere, is why the sway condition is a branch the reader must answer rather than a default this layer picks. A braced column with a restraint of one at both ends has a factor of 0.778; the same column in a frame free to sway has 1.342. Nothing in a drawing of the column distinguishes the two, and the critical loads differ by a factor of three.

G=(Σ(EI/L)_(columns))/(Σ(EI/L)_(beams))
K_(braced)=(3G_AG_B+1.4(G_A+G_B)+0.64)/(3G_AG_B+2(G_A+G_B)+1.28)
K_(sway)=√((1.6G_AG_B+4(G_A+G_B)+7.5)/(G_A+G_B+7.5))
G_A=G_B=0: K=0.5 braced, 1.0 sway; G→∞: K=1.0 braced, ∞ sway

Assumptions

TakesUnitMeaning
G_A—Stiffness ratio at the top end of a frame column — column stiffness over beam stiffness at that joint.
G_B—Stiffness ratio at the bottom end of a frame column.
sway—Whether the frame is free to lean sideways or is braced against it.
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
LmmLength of the member along its own axis, support to support.
GivesUnitMeaning
K_eff—Effective length factor — the fraction of the real length that behaves like a pin-ended column.
P_crNCritical load — the axial force at which the member stops being straight and bows out.
L_effmmEffective length of the column — the length of the pin-ended column that would buckle at the same 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 both ways, selected by the sway branch, with the fit reproducing the chart to about two per cent across its whole range.

That two per cent is stated here and nowhere the reader can see it. The relation printed beside the factor names the closed form that produced it, which is honest as far as it goes, and the equation displayed at the head of the screen is the transcendental one the charts were plotted from — which the app does not evaluate. This is the one place in the manual where the general rule stated in the opening chapter, that a relation printed here is the relation the app evaluates, does not hold: the two expressions actually evaluated are the ones printed under this entry, and the equation above them is the exact condition they are fitted to. Read the pair together, and treat the factor as carrying two per cent whatever the screen shows.

The infinite case is short-circuited rather than approached. A restraint that is unbounded — no beams at all — returns one braced and infinity swaying directly, so the pinned corner is a stated value rather than the limit of an expression dividing one large number by another. The restraint measure itself returns infinity when the beam stiffness is zero, which makes the same statement at the input rather than in the middle of the calculation. Negative restraint returns nothing.

The critical load then follows from the Euler relation with this factor, and the screen also reports the effective length itself, since that is the quantity a slenderness is built from and it is the one readers most often build from the wrong length.

Choosing the fit over the transcendental also removed a numerical problem rather than solving it. The stability functions in the exact relation are indeterminate at zero axial force and need a series expansion below some threshold; the closed form never evaluates them, so the threshold never has to be chosen.

Limitations

Reading the result

Read the sway branch first, then the number. This is the single most consequential silent choice in the whole stability family: the same two joint restraints give a factor of one half braced and one swaying, and the critical load differs by four. No drawing of the column shows which applies, and the column itself does not know.

Then read the factor against the named end conditions and be surprised in the right direction. A joint that looks thoroughly rigid on a drawing — a welded connection to a beam of similar size — has a restraint near one, and a restraint of one at both ends gives 0.778 braced. That is nearer the pinned answer than the built-in one. The built-in factor of one half requires beams infinitely stiffer than the column, which no real frame provides.

The effective length reported beside the factor is the number to carry forward. A slenderness built from the storey height rather than from the effective length is the most common way this screen's answer is thrown away immediately after it is obtained.

Warning. Above nine tenths of the critical load the series form of the amplification is no longer accurate; the exact form is being used and the answer is very sensitive to the axial force.
Advisory. This factor comes from the published closed form for the alignment chart, not from solving the chart's own transcendental equation. On the braced side the two agree to about one and a half per cent across the usual range of restraint -- 0.834 against 0.831 for the state this screen opens on. The closed form is used because its corners are exact where a hand-written transcendental's were not: perfectly rigid beams at both ends give one half exactly, perfectly flexible ones give one. Substituting this factor back into the chart equation therefore leaves a small residual, and that residual is the approximation, not an error.

Implemented by braced_frame_factor, sway_frame_factor, frame_effective_factor, joint_restraint, euler_load.

Torsional & Lateral Buckling

Members that fail by twisting rather than bowing, and beams that trip sideways out of their own plane.

P_φ=(1)/(r_0^2)(GJ+(π^2EC_w)/(L^2)), M_(cr)=(π)/(L)√(EI_yGJ)√(1+(π^2EC_w)/(GJL^2))

Basis

Every column in the Euler account fails by bowing in a plane. Two other things can happen first, and a bending analysis is blind to both. A column can stay straight and twist — only open thin sections do this, because only they are weak in torsion, and a cruciform or a thin angle can fail this way well below its Euler load. And a beam bending about its strong axis can trip sideways and twist at the same time, which is why a deep unrestrained joist is not as strong as its section modulus says. Both are governed by the same two stiffnesses, and the ratio between them decides which one is doing the work.

Derivation

Twisting resistance comes in two parts that behave in opposite ways with length. Uniform torsion contributes a stiffness that does not care how long the member is; warping restraint contributes one that vanishes as the square of the length. Dividing their sum by the square of the polar radius about the shear centre gives the load at which twisting becomes possible.

The consequence has no analogue in the Euler account. As a member gets longer the torsional load falls only while warping is doing the work, then stops at the uniform-torsion value and stays there, while the Euler load keeps falling. So torsional buckling governs short members and flexural buckling long ones, and there is a crossing — which is why the screen shows all three loads at once rather than reporting the smallest.

The polar radius is taken about the shear centre, carrying a parallel-axis term in the offset, because a section twists about its shear centre and not its centroid. For a doubly symmetric section the two coincide and this is the ordinary polar radius; for a channel it is not, and using the centroidal one overstates the torsional load. That is the commonest error in the subject and it is unconservative.

When the two centres coincide, the twisting and bending modes are independent and the critical load is simply the smallest of them. When they do not, the modes couple. Twist by an angle about the shear centre and the centroid, sitting an offset away, moves sideways by the offset times the angle — at right angles to the offset. That sentence is the whole coupling, and it says which flexural mode is involved: the one bending in that direction, built from the second moment about the axis the offset is measured along. For a channel that is the strong axis, not the weak one.

The coupled load is the smaller root of a quadratic whose leading coefficient is one minus the square of the offset over the polar radius. It is always at or below the smaller of the two uncoupled loads: coupling never helps. With the shear centre at the centroid the leading coefficient is exactly one, the quadratic factorises, and the answer is exactly the smaller of the two — so the singly symmetric case contains the doubly symmetric one rather than merely resembling it.

The beam's critical moment is the same two stiffnesses in a different arrangement: a classic narrow-rectangle factor multiplied by a warping factor that is exactly one when the warping constant vanishes. Note which second moment appears — the weak-axis one. A beam trips because it is weak sideways, and making it deeper, which raises the strong-axis second moment, does not help at all.

r_0^2=r_x^2+r_y^2+x_0^2
P_φ=(1)/(r_0^2)(GJ+(π^2EC_w)/(L^2))
(1-((x_0)/(r_0))^2)P^2-(P_x+P_φ)P+P_xP_φ=0
M_(cr)=(π)/(L)√(EI_yGJ)√(1+(π^2EC_w)/(GJL^2))
warping share=(π^2EC_w)/(GJL^2+π^2EC_w)

Assumptions

TakesUnitMeaning
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
GMPaShear modulus — how much shear stress it takes to produce a given angular distortion.
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
I_ymm⁴Second moment of area about the vertical centroidal axis.
Jmm⁴Torsion constant — the section's resistance to twisting, equal to the polar second moment only for circular shapes.
C_wmm⁶Warping constant — the section's resistance to the axial stretching that accompanies twist in an open thin-walled shape.
r_xmmRadius of gyration about the horizontal axis — the distance at which all the area could sit and give the same bending resistance.
r_ymmRadius of gyration about the vertical axis.
LmmLength of the member along its own axis, support to support.
e_scmmShear centre offset — the distance from the centroid to the point a transverse load must pass through if the member is not to twist.
GivesUnitMeaning
r_0mmPolar radius of gyration about the shear centre, which is what couples twisting to bending.
P_phiNTorsional buckling load — the axial force at which the member fails by twisting rather than bowing.
M_crN·mmCritical moment — the bending moment at which a beam buckles sideways and twists.
P_crNCritical load — the axial force at which the member stops being straight and bows out.
mode_shape—The deflected shape the structure takes as it buckles.

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, with three refusals that are statements rather than guards. A shear centre at or beyond the polar radius makes the coupled quadratic's leading coefficient vanish and leaves no positive root; such a section does not exist, and the kernel returns nothing rather than the negative root, which would print as a plausible load. The exactly doubly symmetric case is short-circuited to the smaller of the two uncoupled loads rather than left to a quadratic whose discriminant would be a difference of nearly equal numbers. A section with no torsion constant has no lateral-torsional moment to report at all, because the warping factor divides by that stiffness — the answer is absent rather than unbounded.

The screen also reports the warping share, which runs from one for a short member to nothing for a long one. It is the number that says whether shortening the member will help, because only the warping part responds to length.

One thing here was wrong once, and how it was found is worth recording. The twisting mode was paired with the weak-axis flexural load rather than the one belonging to the offset direction. Every other quantity on the screen — polar radius, torsional load, critical moment, warping share — stayed exactly correct, and only the coupled load moved, by eighteen per cent. Nothing inside the project could see it. What found it was a worked example in a public-domain NASA structures manual, and the adjudication was not "the manual is NASA" but a re-derivation of the axial energy term from the displacement field, independent of both parties. That same manual prints two arithmetic errors of its own on the page in question: an independent source is independent, not infallible.

Limitations

Reading the result

Read all three loads at this length, then change the length and watch the order change. The crossing is the point of the screen: a short open column is limited by twisting and a long one by bowing, and a screen reporting only the smallest would hide the fact that which mechanism governs is a design variable.

Check which centre the polar radius belongs to. It is reported here about the shear centre, and a value taken about the centroid is larger, which makes the torsional load larger — wrong in the unsafe direction, and indistinguishable from a correct answer once it is on the page.

For the beam, the strong-axis second moment does not appear anywhere in the critical moment. That is not an omission. A beam trips because it is weak sideways, and a reader who deepens a section to fix a lateral-torsional problem has changed the number that does not matter and left the one that does.

Implemented by polar_radius, torsional_load, torsional_flexural_load, lateral_torsional_moment, warping_share, euler_load.

Plate Buckling

Buckling of a plate panel, with the coefficient minimised over half-waves and the number shown.

σ_(cr)=(k π^2E)/(12(1-ν^2))((t)/(b_p))^2, k=min_(m∈N)((m b_p)/(a_p)+(a_p)/(m b_p))^2

Basis

A plate compressed in its own plane buckles out of plane, and unlike a column it does not collapse when it does. It is supported along its edges, so a buckled plate keeps carrying: the strips beside the supported edges stay effective and the middle sheds load to them. The critical stress is the start of a redistribution, not the end of the plate — which is why this module reports an effective width alongside a critical stress, and why the two together are the answer rather than either alone.

Derivation

The plate equation under uniform edge compression admits a shape that is sinusoidal along the loaded direction with some number of half-waves, multiplied by a function of the transverse coordinate fixed by the unloaded edges. For a plate simply supported on all four edges that transverse function is a single half sine, and the coefficient works out to the square of a quantity plus its own reciprocal, the quantity being the half-wave count times the width over the length.

A sum of a thing and its reciprocal has a minimum of two, so the coefficient has a minimum of four, reached whenever the length equals the half-wave count times the width. A plate therefore buckles into square panels whatever its length — the one fact about plate buckling everybody remembers — and it explains why the coefficient stops depending on length once the plate is long: the plate simply takes another half-wave.

The critical stress follows from the plate's flexural rigidity, and two things about it are worth stating separately. The dimension that appears is the width, not the length, which is why a long plate is no weaker than a square one. And it appears squared, along with the thickness, so a small change in thickness moves the answer a great deal.

Changing the unloaded edges changes the transverse function and therefore the coefficient. With both unloaded edges built in, the transverse function must vanish with zero slope at each, and this app uses a two-term energy shape whose terms are one minus a cosine of two and of four transverse half-periods; the coefficient is the smaller root of the resulting two-by-two problem. With one unloaded edge free, the plate tips about its supported edge rather than bulging between two of them, the transverse function is linear, and the twisting term in the strain energy — which integrates away in the other two cases — survives and produces the whole of a second term depending on Poisson's ratio and nothing else. At 0.3 that term is 0.4256: the long-plate value, reached by derivation and therefore carrying a value at every aspect ratio rather than at one.

k=((mb)/(a)+(a)/(mb))^2, k_(min)=4 at a=mb
σ_(cr)=(kπ^2E)/(12(1-ν^2))(t/b)^2
k_(free)=(b/a)^2+(6(1-ν))/(π^2)
b_(eff)=bmin(1,√((σ_(cr))/(σ_y)))

Assumptions

TakesUnitMeaning
a_platemmLength of the plate in the direction of the applied compression.
b_platemmWidth of the plate between its supported edges.
tmmWall thickness of a thin part — a flange, a web, a tube wall, a plate.
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
nu—Poisson's ratio — how much a material narrows sideways when you stretch it.
edge_cond—How the plate's unloaded edges are held — simply supported, fixed, or free.
sigma_yMPaYield stress — where the material stops springing back.
GivesUnitMeaning
k_plate—Plate buckling coefficient — the number that carries all the effect of edge conditions and proportions.
sigma_crMPaCritical stress — the average stress in the member at the moment it buckles.
m_wave—Number of half-waves the plate buckles into along its loaded direction.
b_effmmEffective width — the strip of a buckled plate that is still carrying its share of the load.

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

Cases this screen covers without asking. Both sides of each of these are handled by the code, so there is no control for them:

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

Where it stops.

Solution method

The half-wave count is chosen by evaluating the coefficient for every count up to forty and keeping the smallest, not by rounding the aspect ratio. That is not fastidiousness: at an aspect ratio equal to the square root of a count times the next one, two neighbouring counts give exactly the same coefficient, and rounding picks the wrong one on one side of the crossing. The built-in case is minimised the same way and gives a different count for the same plate — its optimum ratio is about 1.52 rather than 1, so a built-in plate buckles into panels half again as long as its width. The free-edge case has no count to minimise over: a plate with a free edge tips in one bulge however long it is, so a count of one is the answer rather than a default.

The long-plate limits are checked against a public-domain table of buckling coefficients for infinitely long plates published as a NACA technical note, a work of the United States Government, read from a high-resolution render of the page rather than the scan's text layer — the optical recognition there turns one printed figure into punctuation.

The simply supported value agrees exactly at four. The built-in value is where this module states its own error rather than hiding it. The obvious one-term shape gives 7.2855 against a published 6.98: 4.4 per cent high, and high is the dangerous direction, because too large a coefficient predicts too large a critical stress, so a screen running it would call a panel safe that is not. An assumed shape can only err this way, since it adds constraint the real plate does not have. A second term costs one quadratic and buys most of the gap — 7.2855, 7.0522, 7.0026, 6.9863 — so the app returns 7.0522, one per cent high rather than four and a half, with the remainder written down. Transcribing the published constant instead was rejected: it is worth nothing at any other aspect ratio and cannot be checked against anything. What can be checked is where the minimum sits, and this shape puts it at 0.6605 against a published minimising ratio of 0.66. The shape is right; only the energy it costs is slightly overstated. The free-edge gap runs the other way — 0.4256 to two figures is the printed 0.43, so there the rounding is the source's.

The effective width is the width scaled by the square root of the critical stress over the yield stress, capped at the full width, because a plate that has not buckled is entirely effective. The cap is what makes that width equal the full width exactly at the critical stress rather than approximately.

Limitations

Reading the result

Read the half-wave count, not just the coefficient. Two aspect ratios either side of a crossing buckle into visibly different shapes with the same coefficient, and the coefficient alone conceals that entirely. The coefficient is the lower envelope of a family of curves and is not differentiable where two counts tie; dragging the aspect ratio across such a point changes the shape the plate goes into while the number barely moves.

Read the edge condition before anything else. It carries the coefficient from about 0.43 to about 7 — a factor of sixteen, wider than any other input on this screen moves it — and it is a judgement about how the panel is attached rather than a measurement of anything.

Finally: a plate that has reached its critical stress has not failed. The effective width says how much of it is still working, and that is the number to carry into a strength calculation. Carrying the full width forward past the critical stress credits the panel with material that has already stopped taking load.

Advisory. These are teaching curves from the research literature, not a design code check. No national or regional standard is applied anywhere in this app.
Warning. The buckling stress here is above the yield stress entered on this same screen, so the plate reaches yield first and buckles inelastically if at all. The elastic critical stress is still the right number for what it is, but it is not the stress this plate fails at, and the effective width beside it is computed from it rather than from yield.

Implemented by plate_coefficient, plate_half_waves, plate_coefficient_fixed, plate_half_waves_fixed, plate_coefficient_free_edge, plate_critical_stress, effective_width.

Non-linear & Walls

Second-Order Analysis

Equilibrium written on the deformed structure, traced load step by load step.

(K+K_g(N))Δu=Δf, p_y(x)=-N(d^2v)/(dx^2)

Basis

A first-order analysis writes equilibrium on the structure as it was drawn. A second-order analysis writes it on the structure as it has moved. The difference is that the axial force already in a member, acting through that member's own curvature, produces an extra transverse loading. Assembled over the element it is a matrix that adds to the elastic stiffness and is proportional to the axial force in it: negative for a strut, so compression softens the structure, and positive for a tie, which is why a guy rope stiffens what it braces.

Derivation

Take a beam element with the usual cubic shape functions and write the work done by the axial force as the member shortens along its own bowed length. The second variation of that work is the geometric stiffness, the axial force through the integrated products of the shape function derivatives. Its translation term is thirty six N over thirty L; its rotation terms are four N L over thirty and minus N L over thirty, opposite in sign and a factor of four apart; and its coupling between a sideways movement and a rotation is N over ten, with no length in it at all — the one entry a dimensional check cannot catch.

Equilibrium then reads elastic plus geometric stiffness, acting on the displacements, equal to the loads. The geometric part is proportional to the axial force and the axial force to the load, so scaling the load case scales it by the same factor. The structure stops being stable when the sum stops being positive definite, and that factor is the critical load factor — the same event the closed-form buckling analysis describes, reached from a different direction. One counts pivots, the other is a formula in the length, and the two agree.

Now the honest part. The geometric stiffness is a linearisation: it keeps the axial force and drops everything of higher order in the displacement, so it is a first correction, right in the limit of small load and increasingly wrong as the critical load is approached. The amplification shows why in one expression — the correction is not a fixed percentage but a pole. At a critical factor of five it is twenty five per cent; at two, a hundred; at one and a tenth, a factor of eleven; at one, unbounded. Long before that the neglected terms have stopped being small. The critical factor stays useful; the displacements near it do not.

(K+K_g(N))u=f, p_y=-N (d^2v)/(dx^2)
K_g: (36N)/(30L), (N)/(10), (4NL)/(30), -(NL)/(30)
det(K+λK_g)=0 ⇒ λ_(cr)
u ≈ (u_1)/(1-1/λ)
u=(π)/(2)√((P)/(P_(cr))), (v)/(v_1)=(3(tan u-u))/(u^3)

Assumptions

TakesUnitMeaning
nodesmmNode coordinates of the model.
members—Which two nodes each member connects, and which section and material it uses.
loadsNNode loads and member loads making up the load case.
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
Amm²Cross-sectional area — the amount of material you would see if you sliced the member straight across.
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
n_steps—Number of load increments used to trace the path.
GivesUnitMeaning
u_vecmmDisplacements of every free degree of freedom in the model.
diagram_MN·mmBending moment along the member.
lambda_cr—Load factor at buckling — multiply the reference load case by this to reach the critical load.
K_geoN/mmGeometric stiffness matrix — the extra stiffness, positive or negative, that axial force adds.
deltammDeflection — how far a point has moved from where it started.

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

Three routes, offered together because they do not agree and the disagreement is the content.

The trace applies the load case in equal shares and solves each share to a fixed point: solve, recompute each member's axial force from the state that produced, re-solve with that, until the two agree to a relative twelve figures. The final state therefore satisfies equilibrium on the geometry it has actually reached, which is what a second-order answer has to mean. It is deliberately not an incremental forward step. The first version was one, and it converged beautifully to the wrong number — every halving of the step halved the remaining change, and the limit sat nine per cent below the exact closed form for the same column. A forward step never enforces equilibrium where it arrives, so refining it approaches the path of a structure that is not this one.

The second route divides the first-order displacement by one minus the reciprocal of the critical factor, exactly when the structure deflects into its own buckling mode and approximately otherwise. The third is the exact beam-column factor for a pinned column pushed sideways at its middle; it exists for that one shape and nothing else, and it is the only thing on the screen able to adjudicate the other two. Below a parameter of one hundredth it is taken from its series, the tangent minus its argument being a cancellation of two numbers that agree to five figures there.

The critical factor comes from counting negative pivots rather than from an eigensolver: by the invariance of the signs of a factorisation, the negative diagonal entries at a trial factor count the modes already below it, so the first critical factor is a bisection on whether that count is still zero. It cannot converge to the wrong mode, which a shifted iteration can, and where nothing is in compression it is infinite rather than very large.

The trace stops at the limit point and says how many increments completed, instead of passing off the last converged step as the peak. The displacement it watches is the one that changes between the two solutions, not the largest — a heavily loaded column shortens far more than it sways, and axial shortening is not a second-order effect at all.

Limitations

Reading the result

The critical factor multiplies the load case as written: a factor of six means this structure buckles at six times the loads in front of you. It is not a strength. It is an elastic bifurcation factor for a perfect member, and both yielding and initial crookedness lower the load a real one carries — often by a great deal, at intermediate slenderness.

Read the gap between the trace and the amplification as information. They meet where the structure deflects into its own buckling mode and separate where it does not, and averaging them would destroy the only thing having both is for.

And do not read a smoothly converged trace as a validated one. Convergence in step size proves the steps are fine enough. It proves nothing about the formulation, which is how the nine per cent above went unnoticed.

Warning. Axial and bending stiffness in this model differ by so much that the displacements have lost accuracy. Check member proportions before trusting the small numbers.

Implemented by geometric_translation, geometric_coupling, geometric_rotation_near, geometric_rotation_far, amplified_displacement, axial_state, negative_pivots, buckling_factor, trace, amplified, mode_shape, loudest_node, deflection_factor_central_point.

Plastic Collapse

Hinges forming one by one until the structure turns into a mechanism, and the load factor that does it.

M_p=σ_y Z_p, Σ M_(p,i) θ_i=λΣ W_j δ_j

Basis

A ductile section does not fail when it first yields. It goes on rotating at a nearly constant moment — its plastic moment, the yield stress times the plastic section modulus — while the structure sheds moment onto whatever is still elastic. Collapse arrives only when enough hinges have formed for the structure to move as a linkage. A complete mechanism takes one more hinge than the degree of static indeterminacy, which is why a determinate structure has no reserve at all and a redundant one has exactly as much as its redundancy buys.

Derivation

Two theorems settle the subject. The kinematic, or upper bound, theorem says any mechanism you can imagine gives a load factor at or above the true one: equate the internal work of the hinges to the external work of the loads and solve. The static, or lower bound, theorem says any moment field in equilibrium and nowhere exceeding the plastic moment gives a factor at or below it. The collapse load is the single value satisfying both.

Write the upper bound for a beam span. Give the mechanism a unit deflection at a sagging hinge a distance a from the start of a span of length L. The two halves rotate through one over a and one over L minus a, and the sagging hinge turns through their sum. Each restrained end — a support holding the rotation, or a neighbouring span doing it — adds a hogging hinge turning through its own end rotation. A uniform load rides a triangle of unit height and does half the total load on the span in work. The factor is the ratio of the two.

Minimising that ratio over the hinge position is the theorem in use rather than quoted. For a propped span it gives two over L minus a, squared, equal to one over a squared, so a is root two minus one, times L: 0.4142 L. Substituting back gives six plus four root two plastic moments over the span squared — 11.657, not a rounded table value. Putting the hinge at mid-span is a perfectly good mechanism and gives twelve: three per cent high, and high is the direction that matters. The other two classical cases fall out the same way, at eight simply supported and sixteen built in at both ends, the factor of two between them being the entire argument for plastic design.

M_p=σ_y Z_p
λ=(Σ_i M_(p,i) θ_i)/(Σ_j W_j δ_j)
θ_(start)=1/a, θ_(end)=(1)/(L-a)
a=(√2-1)L, w_c=((6+4√2)M_p)/(L^2)
w_cL^2/M_p = 8, 6+4√2, 16; n_(hinge)=r+1

Assumptions

TakesUnitMeaning
nodesmmNode coordinates of the model.
members—Which two nodes each member connects, and which section and material it uses.
loadsNNode loads and member loads making up the load case.
M_pN·mmPlastic moment — the moment the section carries once every fibre has yielded.
EMPaYoung's modulus — how much stress it takes to produce a given stretch.
I_xmm⁴Second moment of area about the horizontal centroidal axis — how the material is spread away from that axis, which is what resists bending about it.
GivesUnitMeaning
lambda_coll—Collapse load factor — multiply the load case by this and the structure turns into a mechanism.
hinge_seq—The order in which plastic hinges form as the load is raised.
mechanism—The pattern of hinges and rigid links the structure collapses into.
diagram_MN·mmBending moment along the member.
lambda_closed—Collapse load factor from the published closed form for this span's end conditions.
lambda_yield—Load factor at first yield — multiply the load case by this and the first section reaches its plastic moment.
n_hinge—How many hinges a complete mechanism needs: one more than the degree of indeterminacy.

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

This is the part to be clear about, because it decides what the answer means. The app searches over hinge position within a mechanism class it has fixed; it does not enumerate mechanisms. The class is the beam mechanism: one sagging hinge in one span, plus a hogging hinge at each end of that span which is restrained, whether by a support holding the rotation or by continuity with a neighbour. For each span between vertically held nodes the sagging hinge is swept over four thousand positions and the smallest factor kept; the weakest span governs and is named. The factor is flat near its minimum, so it comes out considerably more accurate than the position that produced it.

Everything outside that class is refused with a reason rather than answered wrongly. A frame is refused: its mechanisms are combinations — beam, sway, and the joint mechanisms made by adding them — and a beam search would confidently report one the structure would never reach. A span with no load along it has no mechanism of its own, and a beam with no load anywhere has no factor at all.

What that means is exactly what the upper-bound theorem says. The number is an upper bound on the true collapse load, and equal to it only when the governing mechanism lies inside the class searched. For a continuous beam under uniform loads it does. Introduce anything else and the answer stays an upper bound and becomes too high — never too low, which is the uncomfortable direction.

The branch makes that concrete rather than describing it: the minimising position, and a hinge at mid-span. Both are mechanisms, both are upper bounds, both are answers, and only the first is the collapse load. Beside the search sit the closed form for this span's end conditions — the same relationship by algebra rather than by minimising, so a slip in the virtual-work bookkeeping would move one and leave the other alone — the first-yield factor, and the two hinge counts.

Limitations

Reading the result

Read the two hinge counts against each other. The mechanism found reports its own number of hinges, and beside it sits the number a complete mechanism would need, one more than the degree of indeterminacy. When they disagree the collapse is partial — one span goes while the rest of the beam is still standing — and that is the commonest case in the subject, not an anomaly.

Read the ratio of the collapse factor to the first-yield factor as the reserve, and notice where it vanishes. A simply supported span under a central point load collapses at first yield: determinate, one hinge is already a mechanism, nothing in reserve. Plastic design buys its margin from redundancy, not from the material.

Two cautions. When two sections reach their plastic moment together the hinge order is ambiguous, and a warning appears below a relative gap of one part in a thousand between the two largest section moments. It is a notice about hand solutions rather than about this one: the collapse load here is minimised over mechanisms rather than traced hinge by hinge, so the answer does not depend on which of the two tied sections is called first, and the smaller factor is the one shown. A reader working the same beam by hand has a choice to make at that point and this screen does not. The screen opens on a shape where the warning is showing, because equal spans put two interior supports at the same moment exactly. And an upper bound is not a safe number: the method produces an overestimate of capacity by default, and the only protection is minimising over mechanisms rather than trusting the first one that looked plausible.

Warning. Two sections reach their plastic moment together, so the hinge order is ambiguous. This screen does not depend on it: the collapse load is minimised over mechanisms rather than traced hinge by hinge, and the smaller factor is the one shown. A hand solution that traces an order has a choice to make here.

Implemented by plastic_hinge_count, load_factor_to_first_hinge, mechanism_load_factor, collapse_load_simple_point, collapse_load_simple_udl, collapse_load_fixed_udl, collapse_load_propped_udl, hinge_position_propped_udl, spans, span_load, mechanism_factor, span_factor, collapse_factor, hinges_in_span, closed_form_factor, point_load_factor, yield_factor, hinges_needed.

Gravity Retaining Wall

What pushes on a gravity wall, and the three ways it can let go: tipping, sliding, or crushing its base.

K_a=(1-sinφ_s)/(1+sinφ_s), P_a=½ K_aγ_s H^2, p_(base)=P/B(1±(6e)/(B))

Basis

A gravity wall holds back soil with nothing but its own weight, and it can lose in three unrelated ways: tipping about its toe, which is a moment problem; sliding along its base, a friction problem; crushing the ground under its toe, a pressure problem. The three share no equation and do not fail together. A wall can be comfortably safe against two of them and short on the third, so a screen reporting one number would report the wrong one two thirds of the time.

Derivation

Fill at depth carries a vertical stress equal to the unit weight times the depth. Let the wall yield away by a small amount and the soil reaches limiting equilibrium, where the horizontal stress is the smallest the friction envelope permits — the active state, a fixed fraction of the vertical stress set by the friction angle alone. Push the wall into the soil and it is the largest permitted, the passive state, and the two fractions are exact reciprocals.

Integrating that pressure over the retained height gives a thrust proportional to the height squared, acting a third of the height above the base. Water is the same integral with a coefficient of one; a surcharge presses uniformly over the whole height and so acts at half of it — a longer lever on a smaller force. The wall is a rectangular block whose weight acts at mid-base, so its moment about the toe resists tipping while the thrust's causes it.

The base pressure follows from treating the base as a section in bending. The resultant crosses it at an eccentricity from the middle which — because the wall's weight acts at mid-base — is the overturning moment over the vertical load; direct plus bending stress, with a section modulus of the base width squared over six, gives the familiar load over width times one plus or minus six times the eccentricity over the width.

That expression goes negative once the eccentricity passes a sixth of the base, and negative pressure under a footing is soil pulling the wall down. Past it, part of the base has lifted and the pressure is a triangle over what is still in contact — a width three times the distance from resultant to toe, with a peak twice the average. How the linear formula fails there is why the switch is a visible branch and not a hidden guard: it does not blow up, it quietly returns a smaller peak than the truth. At three tenths of the base it gives 373 where the triangle gives 444 — nineteen per cent low, in the unconservative direction.

K_a=(1-sinφ)/(1+sinφ), K_p=(1+sinφ)/(1-sinφ)=(1)/(K_a)
P_a=½ K_aγ H^2 at H/3, P_q=K_a q H at H/2
e=M/N, p=N/B(1±(6e)/(B)) (e≤B/6)
b=3(B/2-e), p_(max)=(2N)/(b) (e>B/6)
FoS_(ot)=(W B/2)/(M_(ot)), FoS_(sl)=(μ N)/(P)

Assumptions

TakesUnitMeaning
gamma_soilN/mm³Unit weight of the retained soil.
phi_soilradAngle of internal friction of the retained soil.
H_wallmmHeight of retained material against the wall.
B_wallmmWidth of the wall base.
mu_base—Coefficient of friction between the wall base and the ground.
gamma_wallN/mm³Unit weight of the wall itself, which is the only thing holding it in place.
retained—What is behind the wall: drained soil, which has a friction angle to help, or water, which has none.
q_surMPaSurcharge — a load spread over the ground behind the wall, which adds a uniform pressure on top of the triangular one.
GivesUnitMeaning
K_a—Active earth pressure coefficient — the fraction of vertical soil pressure that pushes sideways as the wall yields away.
K_p—Passive earth pressure coefficient — the sideways resistance mobilised as the wall pushes into the soil.
FoS_ot—Factor of safety against the wall tipping over about its toe.
FoS_sl—Factor of safety against the wall sliding along its base.
p_base_maxMPaLargest bearing pressure under the wall base.
p_base_minMPaSmallest bearing pressure under the wall base, zero once the base lifts.
e_resmmEccentricity of the resultant force where it crosses the base.

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

Cases this screen covers without asking. Both sides of each of these are handled by the code, so there is no control for them:

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. The only decision is which base-pressure distribution is in force, and the app makes it by comparing the eccentricity against a sixth of the base, then saying in the results which one it used and over what contact width. Once the base has lifted, the heel pressure is reported as exactly zero with the reason attached rather than as the negative number the linear formula gives. A warning appears beside the results at the same threshold, saying that the resultant has left the middle third and that the reduced-contact distribution is what is being shown — a sentence that is true of this screen and, until recently, was also pointed at the combined-load screen, where it was not: that screen shows the linear distribution and always did. The two were separated rather than reworded, because one sentence cannot describe two screens that do different things. Two infinities are answers rather than failures: a wall with nothing pushing on it is unboundedly safe against both tipping and sliding, and that is what is shown.

The two earth-pressure coefficients are written out as separate expressions rather than one as the reciprocal of the other, so that a property test asserting their product is one to fourteen digits is a check rather than a tautology.

A friction angle at or beyond a quarter turn returns nan, because the passive expression divides by one minus its sine; negative unit weights, heights and coefficients return nan; a zero vertical load or a zero base width makes the eccentricity nan rather than an infinity that would propagate silently into a pressure.

Limitations

Reading the result

Read all three results rather than the smallest: which one governs changes with the geometry, and widening the base moves all three at different rates.

The most instructive edit is switching the retained material from drained soil to water. On the wall the screen opens with, the coefficient goes from a third to one and everything moves at once: the sliding factor falls from 2.6 to 0.87, the tipping factor from 5.1 to 1.7, and the resultant leaves the middle third so the heel lifts clear. Nothing about the wall has changed. That is the argument for drainage, in one edit, and it is why the choice is a visible branch.

The base pressures are per unit length of wall, not totals, and the eccentricity sits next to the middle-third limit on purpose — so the resultant can be watched approaching the edge rather than discovered there.

A note on printed answers. A worked example in one of the works consulted while building this app prints a peak base pressure of 17.93 where its own printed inputs give 17.92. The cause is traceable: it rounds the base's section modulus from 1.0417 to 1.04 and carries that through the rest of its arithmetic. The fixture stores the recomputed value and takes its tolerance from the figures printed — attributing a difference is worth more than widening a threshold until it disappears.

Warning. The resultant has left the middle third, so part of the base has lifted. The reduced-contact distribution is being used.
Advisory. These are teaching curves from the research literature, not a design code check. No national or regional standard is applied anywhere in this app.

Implemented by active_coefficient, passive_coefficient, active_thrust, liquid_thrust, thrust_lever, overturning_factor, sliding_factor, resultant_eccentricity, middle_third_limit, base_pressure_max, base_pressure_min, contact_width, base_pressure_lifted.

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.

Axial Members

QuantityPublishedComputedUnitVerdict
extension of the removed bar per pound of redundant force3.33e-63.33333e-06in/lbfdisputed

Beam Diagrams

Source: NASA TM X-73305, Astronautic Structures Manual.

QuantityPublishedComputedUnitVerdict
M at x=1 in200200in*lbfagrees
M at x=5 in10001000in*lbfagrees
M at x=10 in20002000in*lbfagrees
M at x=13 in14001400in*lbfagrees

Bending Stress

Source: NASA TM X-73305, Astronautic Structures Manual.

QuantityPublishedComputedUnitVerdict
Mc/I at x=1 in4.84.8ksiagrees
Mc/I at x=5 in24.024ksiagrees
Mc/I at x=10 in48.048ksiagrees
Mc/I at x=13 in33.633.6ksiagrees

Circular Shafts

QuantityPublishedComputedUnitVerdict
peak shear stress at the thin end32603259.49psidisputed
torque from 20 hp at 300 rpm42004201.69in*lbfdisputed
torque from 8 hp at 300 rpm16801680.68in*lbfdisputed
torque from 12 hp at 300 rpm25202521.01in*lbfdisputed

Combined Bending + Torsion

QuantityPublishedComputedUnitVerdict
peak shear stress from the equivalent torque1215012152psidisputed

Eccentric Columns

Source: AFFDL-TR-69-42, Stress Analysis Manual.

QuantityPublishedComputedUnitVerdict
peak stress from the secant formula1095011032.5psidisputed

Elastic Constants

Source: MIL-HDBK-5J, Metallic Materials and Elements.

QuantityPublishedComputedUnitVerdict
shear modulus from E_bar and mu40003.98496e+06ksidisputed
Poisson's ratio from E_bar and G0.330.325—disputed

Energy Methods

Source: NASA TM X-73305, Astronautic Structures Manual.

QuantityPublishedComputedUnitVerdict
m at x=1 in0.50.5in*lbfagrees
m at x=5 in2.52.5in*lbfagrees
m at x=10 in5.05in*lbfagrees
m at x=13 in3.53.5in*lbfagrees
elastic centre deflection0.61040.609524indisputed

Euler Column & Effective Length

QuantityPublishedComputedUnitVerdict
coefficient of constraint C for a column fixed at the base and free at the top0.250.25—agrees
coefficient of constraint C for a column pinned at both ends1.001—agrees
coefficient of constraint C for a column fixed at one end and pinned at the other2.052.05—agrees
coefficient of constraint C for a column fixed at both ends4.004—agrees

Force Systems & Resultants

QuantityPublishedComputedUnitVerdict
horizontal component of the 700 lb pulley force495494.975lbfdisputed
vertical component of the 700 lb pulley force495494.975lbfdisputed
moment of the horizontal-plane shear about the pulley58105808in*lbfdisputed
moment of the vertical-plane shear about the pulley50305028in*lbfdisputed
resultant of the two plane moments76857684.86in*lbfdisputed

Linear Solve & Results

QuantityPublishedComputedUnitVerdict
area under the simply supported moment diagram4580045800in^2*lbfagrees
vertical reaction at each base500500lbfagrees
horizontal reaction at each base242242lbfagrees
bending moment at each base795808.824in*lbfdisputed

Non-Circular & Thin-Walled Torsion

QuantityPublishedComputedUnitVerdict
peak shear stress in the open section86108617.59psidisputed (printed working at fault)
angle of twist of the open section0.860.861759raddisputed (printed working at fault)
shear flow round the closed cell13.113.1062lbf/indisputed
peak shear stress at the thinnest wall210209.699psidisputed

Plane Stress & Mohr's Circle

QuantityPublishedComputedUnitVerdict
radius of Mohr's circle for the shaft's stress state1215012152psidisputed

Plastic Collapse

Source: AFFDL-TR-69-42, Stress Analysis Manual.

QuantityPublishedComputedUnitVerdict
yield moment F_y I / c3660036630in*lbfdisputed
fully plastic moment K M_y5490054900in*lbfagrees
central load at collapse M_fp / 1054905490lbfagrees

Plastic Section & Shape Factor

QuantityPublishedComputedUnitVerdict
shape factor of a rectangle1.51.5—agrees
shape factor of a solid circle1.701.69765—disputed

Plate Buckling

Source: NACA TN 3781, Handbook of Structural Stability.

QuantityPublishedComputedUnitVerdict
k_c, SS on all edges4.04—agrees
k_c, C on all edges6.987.05215—disputed
k_c, SS three edges, F on x=b0.430.42555—disputed

Section Builder & Properties

QuantityPublishedComputedUnitVerdict
second moment of a 1 in. square about its centroid0.08330.0833333in^4disputed
second moment of a 2 x 1 in. bar about its strong axis0.6660.666667in^4disputed
radius of gyration of a 2 x 1/2 in. bar about its weak axis0.1440.144338indisputed

Support Reactions

QuantityPublishedComputedUnitVerdict
reaction at the pinned support16671666.67lbfdisputed
reaction at the roller13331333.33lbfdisputed

Thin-Walled Pressure Vessel

Source: AFFDL-TR-69-42, Stress Analysis Manual.

QuantityPublishedComputedUnitVerdict
hoop stress in the cylinder1200012000psiagrees
meridional stress in the cylinder60006000psiagrees
membrane stress in the hemispherical head1000010000psiagrees (printed working at fault)

Torsional & Lateral Buckling

Source: NASA TM X-73306, Astronautic Structures Manual.

QuantityPublishedComputedUnitVerdict
I_054.7554.8266in^4disputed
r_0^215.6515.6647in^2disputed
P_x647691647693lbfdisputed
P_y174000174157lbfdisputed
P_phi8920089206.4lbfdisputed
1-(x_0/r_0)^20.550.520733—disputed
P_cr8272783312.2lbfdisputed

Transverse Shear Stress

QuantityPublishedComputedUnitVerdict
first moment of the half-section about the neutral axis0.50.125in^3disputed
shear flow at the neutral axis30075.03lbf/indisputed
peak shear stress at the neutral axis30075psidisputed

Truss Displacements

Source: AFFDL-TR-69-42, Stress Analysis Manual.

QuantityPublishedComputedUnitVerdict
P u L/AE for member AB3.503.51e-3 inagrees
P u L/AE for member BD2.822.827151e-3 indisputed
P u L/AE for member BE2.122.120361e-3 indisputed
P u L/AE for member DE2.0021e-3 inagrees
sum of P u L/AE over the six members9.4410.44751e-3 indisputed

Truss — Joints & Coefficients

QuantityPublishedComputedUnitVerdict
force in member AB-1925-1924.5lbfdisputed
force in member AG962962.25lbfdisputed
force in member BG19251924.5lbfdisputed
force in member BC-1925-1924.5lbfdisputed
force in member CG382384.9lbfdisputed
force in member GF17341732.05lbfdisputed
force in member CF-382-384.9lbfdisputed
force in member CD-1541-1539.6lbfdisputed
force in member DF15411539.6lbfdisputed
force in member DE-1541-1539.6lbfdisputed
force in member EF770769.8lbfdisputed

What the tally means

Of the comparisons above, 28 agree exactly with the published value and 54 do not. A disagreement is not a defect in either direction until it has been adjudicated, and each one here has been. Several resolved against the published source: a manual whose printed answer does not follow from its own printed equation, a table whose total disagrees with the sum of its own entries, a working that divides by the wrong wall thickness and still reaches the right answer. Where the 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.