Thermal Stress Analysis (structures/thermal-structures/thermal-stress-analysis)
Use when the task is the thermal stress and strain of a constrained
aerospace structure: a member whose free expansion is blocked and
therefore develops sigma = E * alpha * dT, a bonded bimetallic strip
whose two layers bend under a temperature change, or a plate
constrained against in-plane expansion that may buckle thermally. The
logic module is pure Python standard library (no numpy, no FEA
software) and deterministic. Units are SI: E in Pa, alpha in 1/K, dT
in K, t and b in m, stresses in Pa, curvature in 1/m, force per unit
width in N/m.
Domain quick reference
Free thermal strain of an unrestrained member:
eps = alpha * dT
If the expansion is free, no stress develops. The stress appears
only when the structure restrains the expansion.
Fully constrained member (free expansion blocked in the load
direction):
sigma = E * alpha * dT
Cooling (negative dT) reverses the sign and puts the member in
tension instead of compression. The constraint can be geometric
(a member welded or bolted between rigid supports) or kinematic
(a thermal gradient in a redundant structure).
Bimetallic strip of two bonded layers with thicknesses t1, t2,
moduli E1, E2 and coefficients alpha1, alpha2 under a temperature
change dT. The layers must share the interface strain, so an equal
and opposite axial force per unit width P develops together with a
common curvature kappa:
kappa = (alpha2 - alpha1) * dT /
( (t1 + t2)/2 + 2*(E1*I1 + E2*I2)/(t1 + t2)
* (1/(E1*t1) + 1/(E2*t2)) )
P = 2 * kappa * (E1*I1 + E2*I2) / (t1 + t2)
with I_i = width * t_i^3 / 12 per unit width. The layer with the
higher coefficient ends up in compression on the concave side. For
equal thicknesses and equal moduli the result collapses to the
classic forms kappa = 1.5 * (alpha2 - alpha1) * dT / (t1 + t2) and
a layer stress of magnitude E * (alpha2 - alpha1) * dT / 8.
Thermal buckling of a plate constrained against in-plane expansion
(a long skin panel held between stiffeners): the temperature rise
generates the compression E * alpha * dT, and buckling occurs when
that stress reaches the plate critical stress, so
dT_cr = k * pi^2 / (12 * (1 - nu^2) * alpha) * (t / b)^2
with k the plate buckling coefficient (4.0 for a simply supported
long plate, 6.97 clamped). The critical temperature rise scales
with the square of the thickness-to-width ratio, exactly like the
elastic buckling stress it is derived from.
Worked anchors (verified by running scripts/thermal_stress_analysis_logic.py):
an aluminum member with E = 70 GPa, alpha = 23e-6 1/K and dT = 100 K
has a free strain of 2300 microstrain and, fully constrained, a
thermal stress of 161 MPa; against an allowable of 250 MPa the margin
of safety is 0.553. A bimetallic strip of steel (alpha = 11e-6 1/K)
and aluminum (alpha = 23e-6 1/K), each 1 mm thick with E = 70 GPa,
under dT = 100 K bends to kappa = 0.9 1/m with a layer stress of
10.5 MPa. Doubling the aluminum modulus to 140 GPa changes the
curvature to 0.8727 1/m and the layer stress to 15.27 MPa. A 2 mm
aluminum skin on 150 mm stiffener pitch with E = 70 GPa, alpha = 23e-6
1/K and nu = 0.33 buckles at a critical temperature rise of 28.54 K.
Workflow
- Decide what is being asked. A free member only needs the free
strain; a member with blocked expansion needs the constrained
stress; two bonded layers need the bimetallic balance; a
constrained panel under heating needs the thermal buckling check.
- For a constrained member, compute the free strain with
free_thermal_strain(alpha, dT) and the stress with
constrained_thermal_stress(E, alpha, dT). Run the complete margin
check with thermal_stress_check(E, alpha, dT, allowable_stress),
which returns the stress, the strain, the margin of safety and the
acceptable verdict. Apply the required factor of safety from the
certification basis before comparing against the allowable.
- For a bonded pair, call bimetallic_strip(E1, E2, alpha1, alpha2,
t1, t2, dT, width) and read off the curvature, the interface force
per unit width and the two layer stresses. Use the returned force
as the load input for a joint or bondline check.
- For a constrained plate under a temperature rise, compute the
critical temperature rise with thermal_buckling_critical_dT(E,
alpha, nu, t, b, coefficient) or run the full check with
thermal_buckling_check(E, alpha, nu, t, b, applied_dT,
coefficient), which returns the critical temperature rise, the
margin of safety and the stable verdict.
- Verify the sign convention: positive dT with blocked expansion is
compression; the layer with the higher coefficient sits on the
concave side of a heated bimetallic strip.
Pitfalls
- Routing spacecraft thermal control here: radiator sizing, thermal
balance and dissipation budgets of spacecraft subsystems belong to
the space-systems thermal-design leaf; thermal-stress-analysis
computes mechanical stress and strain from a temperature change in
a constrained structure.
- Routing column thermal effects here: buckling-analysis handles 1D
columns with Euler loads and slenderness; thermal-stress-analysis
never uses a slenderness ratio and the thermal buckling check
applies to a constrained flat plate only.
- Routing elastic plate buckling here: plate-buckling checks an
applied mechanical edge load against the critical stress;
thermal-stress-analysis derives the critical temperature rise from
the same formula but the load comes from blocked thermal expansion.
- Forgetting the constraint: an unrestrained member carries no
thermal stress no matter how large the temperature change; sigma =
E * alpha * dT applies only when the expansion is blocked.
- Applying the biaxial correction blindly: a plate fully restrained
in both in-plane directions develops E * alpha * dT / (1 - nu); the
thermal buckling check here assumes the long-panel case restrained
in one direction, which keeps the stress at E * alpha * dT. State
the restraint model before choosing the formula.
- Mixing units: E in GPa with t and b in mm silently corrupts the
stress and the critical temperature rise by factors of 1e9 or 1e6;
keep everything SI (Pa, m).
- Using a negative coefficient: alpha must be positive for the
thermal buckling check (the critical temperature rise divides by
alpha); real materials with negative expansion coefficients need a
dedicated treatment.
- Reading the bimetallic sign wrong: the layer with the higher
coefficient is compressed and sits on the concave side; the two
layer stresses are equal and opposite in magnitude when the
thicknesses are equal.
Behavior contract (gate 3)
The thermal stress logic is exercised by the gate 3 contract test:
scripts/test_thermal_stress_analysis.py against
scripts/thermal_stress_analysis_logic.py (stdlib unittest, offline).
It asserts the worked anchors above, the zero-stress case at dT = 0,
the linear scalings with E, alpha and dT, the equal-layer bimetallic
closed form and the unequal-modulus case, the (t/b)^2 scaling of the
critical temperature rise, the margin and verdict outputs, and the
ValueError cases for non-positive, non-finite or unknown inputs. Run:
python3 scripts/test_thermal_stress_analysis.py
Compliance
- FAR-25 is referenced, not reproduced: standards-map.yaml marks it
gated: false and reference-only: true; only the summary paraphrase
above is used, never standard text.
- compliance: STANDARDS-REF, gated: false.
1---2name: thermal-stress-analysis3description: Use when a structural member, bonded joint or skin panel is restrained against thermal expansion and must be assessed for thermal load in a stdlib-only environment without FEA software. Compute thermal stress and strain in aerospace structures from a constrained temperature change: free thermal strain alpha*dT, fully constrained thermal stress sigma = E*alpha*dT when free expansion is blocked, the bimetallic strip curvature and per-layer thermal stress balance, and the critical temperature rise for thermal buckling of a constrained plate, each with the margin of safety against the allowable stress. Units are SI. Trigger: thermal stress, thermal expansion, coefficient of thermal expansion, bimetallic strip, constrained expansion, thermal buckling.4license: Apache-2.05---67# Thermal Stress Analysis (structures/thermal-structures/thermal-stress-analysis)89Use when the task is the thermal stress and strain of a constrained10aerospace structure: a member whose free expansion is blocked and11therefore develops sigma = E * alpha * dT, a bonded bimetallic strip12whose two layers bend under a temperature change, or a plate13constrained against in-plane expansion that may buckle thermally. The14logic module is pure Python standard library (no numpy, no FEA15software) and deterministic. Units are SI: E in Pa, alpha in 1/K, dT16in K, t and b in m, stresses in Pa, curvature in 1/m, force per unit17width in N/m.1819## Domain quick reference2021- Free thermal strain of an unrestrained member:2223 eps = alpha * dT2425 If the expansion is free, no stress develops. The stress appears26 only when the structure restrains the expansion.2728- Fully constrained member (free expansion blocked in the load29 direction):3031 sigma = E * alpha * dT3233 Cooling (negative dT) reverses the sign and puts the member in34 tension instead of compression. The constraint can be geometric35 (a member welded or bolted between rigid supports) or kinematic36 (a thermal gradient in a redundant structure).3738- Bimetallic strip of two bonded layers with thicknesses t1, t2,39 moduli E1, E2 and coefficients alpha1, alpha2 under a temperature40 change dT. The layers must share the interface strain, so an equal41 and opposite axial force per unit width P develops together with a42 common curvature kappa:4344 kappa = (alpha2 - alpha1) * dT /45 ( (t1 + t2)/2 + 2*(E1*I1 + E2*I2)/(t1 + t2)46 * (1/(E1*t1) + 1/(E2*t2)) )47 P = 2 * kappa * (E1*I1 + E2*I2) / (t1 + t2)4849 with I_i = width * t_i^3 / 12 per unit width. The layer with the50 higher coefficient ends up in compression on the concave side. For51 equal thicknesses and equal moduli the result collapses to the52 classic forms kappa = 1.5 * (alpha2 - alpha1) * dT / (t1 + t2) and53 a layer stress of magnitude E * (alpha2 - alpha1) * dT / 8.5455- Thermal buckling of a plate constrained against in-plane expansion56 (a long skin panel held between stiffeners): the temperature rise57 generates the compression E * alpha * dT, and buckling occurs when58 that stress reaches the plate critical stress, so5960 dT_cr = k * pi^2 / (12 * (1 - nu^2) * alpha) * (t / b)^26162 with k the plate buckling coefficient (4.0 for a simply supported63 long plate, 6.97 clamped). The critical temperature rise scales64 with the square of the thickness-to-width ratio, exactly like the65 elastic buckling stress it is derived from.6667Worked anchors (verified by running scripts/thermal_stress_analysis_logic.py):68an aluminum member with E = 70 GPa, alpha = 23e-6 1/K and dT = 100 K69has a free strain of 2300 microstrain and, fully constrained, a70thermal stress of 161 MPa; against an allowable of 250 MPa the margin71of safety is 0.553. A bimetallic strip of steel (alpha = 11e-6 1/K)72and aluminum (alpha = 23e-6 1/K), each 1 mm thick with E = 70 GPa,73under dT = 100 K bends to kappa = 0.9 1/m with a layer stress of7410.5 MPa. Doubling the aluminum modulus to 140 GPa changes the75curvature to 0.8727 1/m and the layer stress to 15.27 MPa. A 2 mm76aluminum skin on 150 mm stiffener pitch with E = 70 GPa, alpha = 23e-6771/K and nu = 0.33 buckles at a critical temperature rise of 28.54 K.7879## Workflow80811. Decide what is being asked. A free member only needs the free82 strain; a member with blocked expansion needs the constrained83 stress; two bonded layers need the bimetallic balance; a84 constrained panel under heating needs the thermal buckling check.852. For a constrained member, compute the free strain with86 free_thermal_strain(alpha, dT) and the stress with87 constrained_thermal_stress(E, alpha, dT). Run the complete margin88 check with thermal_stress_check(E, alpha, dT, allowable_stress),89 which returns the stress, the strain, the margin of safety and the90 acceptable verdict. Apply the required factor of safety from the91 certification basis before comparing against the allowable.923. For a bonded pair, call bimetallic_strip(E1, E2, alpha1, alpha2,93 t1, t2, dT, width) and read off the curvature, the interface force94 per unit width and the two layer stresses. Use the returned force95 as the load input for a joint or bondline check.964. For a constrained plate under a temperature rise, compute the97 critical temperature rise with thermal_buckling_critical_dT(E,98 alpha, nu, t, b, coefficient) or run the full check with99 thermal_buckling_check(E, alpha, nu, t, b, applied_dT,100 coefficient), which returns the critical temperature rise, the101 margin of safety and the stable verdict.1025. Verify the sign convention: positive dT with blocked expansion is103 compression; the layer with the higher coefficient sits on the104 concave side of a heated bimetallic strip.105106## Pitfalls107108- Routing spacecraft thermal control here: radiator sizing, thermal109 balance and dissipation budgets of spacecraft subsystems belong to110 the space-systems thermal-design leaf; thermal-stress-analysis111 computes mechanical stress and strain from a temperature change in112 a constrained structure.113- Routing column thermal effects here: buckling-analysis handles 1D114 columns with Euler loads and slenderness; thermal-stress-analysis115 never uses a slenderness ratio and the thermal buckling check116 applies to a constrained flat plate only.117- Routing elastic plate buckling here: plate-buckling checks an118 applied mechanical edge load against the critical stress;119 thermal-stress-analysis derives the critical temperature rise from120 the same formula but the load comes from blocked thermal expansion.121- Forgetting the constraint: an unrestrained member carries no122 thermal stress no matter how large the temperature change; sigma =123 E * alpha * dT applies only when the expansion is blocked.124- Applying the biaxial correction blindly: a plate fully restrained125 in both in-plane directions develops E * alpha * dT / (1 - nu); the126 thermal buckling check here assumes the long-panel case restrained127 in one direction, which keeps the stress at E * alpha * dT. State128 the restraint model before choosing the formula.129- Mixing units: E in GPa with t and b in mm silently corrupts the130 stress and the critical temperature rise by factors of 1e9 or 1e6;131 keep everything SI (Pa, m).132- Using a negative coefficient: alpha must be positive for the133 thermal buckling check (the critical temperature rise divides by134 alpha); real materials with negative expansion coefficients need a135 dedicated treatment.136- Reading the bimetallic sign wrong: the layer with the higher137 coefficient is compressed and sits on the concave side; the two138 layer stresses are equal and opposite in magnitude when the139 thicknesses are equal.140141## Behavior contract (gate 3)142143The thermal stress logic is exercised by the gate 3 contract test:144scripts/test_thermal_stress_analysis.py against145scripts/thermal_stress_analysis_logic.py (stdlib unittest, offline).146It asserts the worked anchors above, the zero-stress case at dT = 0,147the linear scalings with E, alpha and dT, the equal-layer bimetallic148closed form and the unequal-modulus case, the (t/b)^2 scaling of the149critical temperature rise, the margin and verdict outputs, and the150ValueError cases for non-positive, non-finite or unknown inputs. Run:151152python3 scripts/test_thermal_stress_analysis.py153154## Compliance155156- FAR-25 is referenced, not reproduced: standards-map.yaml marks it157 gated: false and reference-only: true; only the summary paraphrase158 above is used, never standard text.159- compliance: STANDARDS-REF, gated: false.