T-flange, deterministic analysis¶
This tutorial repeats the L-flange tutorial for a T-flange and highlights the differences. Read the L-flange tutorial first.
Download the full script: tflange.py
Differences with the L-flange¶
| L-flange | T-flange | |
|---|---|---|
| Class | PolynomialLFlangeSegment |
PolynomialTFlangeSegment |
| Bolts per segment | 1 | 2 (one on each side of the shell) |
central_angle |
2π / number of bolts | 2π / number of bolt pairs |
Zg |
Dead weight per bolt | Dead weight per bolt pair |
a |
Inner face of the flange to bolt axis | Edge of the flange to bolt axis |
tilt_angle |
Optional (default 0) | Required: IEC 61400-6 requires the flange taper to be always considered (ref. [2], G.2.4) |
| Governing failure mode for the model to be valid | B | A (ref. [2], eq. G.31) |
| Tensile bolt moment | Quadratic in Z | Cubic in Z (ref. [2], eq. G.61) |
| JSON case format and command line | Supported | Not yet supported |
1. Flange segment¶
from pyflange.bolts import StandardMetricBolt, ISOHexNut, standard_hole_diameter
from pyflange.flangesegments import PolynomialTFlangeSegment, Gap, shell_stiffness
from pyflange.stats import gap_height_distribution
D = 7500*mm # tower outer diameter
n_pairs = 200 # number of bolt pairs (one inside and one outside the shell)
s = 90*mm # shell thickness
gap_angle = 30*deg
gap_dist = gap_height_distribution(D, 0.0014, gap_angle * D/2)
fseg = PolynomialTFlangeSegment(
a = 62.5*mm, # flange edge to bolt axis
b = 111*mm, # bolt axis to shell center line
s = s,
t = 120*mm, # flange thickness
R = D/2, # shell outer radius
central_angle = 2*pi / n_pairs,
Zg = -105.8*kN, # dead weight per bolt pair (compression)
bolt = StandardMetricBolt("M48", "10.9", shank_length=150*mm,
shank_diameter_ratio="pitch", stud=True),
Fv = 928*kN, # preload of each bolt, before losses
Do = standard_hole_diameter("M48"),
washer = None,
nut = ISOHexNut("M48"),
gap = Gap(height = gap_dist.ppf(0.95), angle = gap_angle),
tilt_angle = 0.0, # required: no taper effect for this flange
k_shell = shell_stiffness(D/2, s, gap_angle))
The bolt force Fs and moment Ms returned by the model are those of
one bolt of the pair, for the shell force Z acting on the whole
segment.
tilt_angle = 0.0 is allowed only if the taper of the flange ensures that
the first contact point is directly below the tower wall (ref. [2],
6.7.5.3). Otherwise, use the worst-case inclination allowed by the
manufacturing specification.
2. Validity check¶
mode, Zu = fseg.failure_mode(fy_sh=355*MPa, fy_fl=355*MPa)
print(f"Governing failure mode: {mode}")
print(f"Ultimate shell forces A, B, D, E [kN]: {[round(Z/kN) for Z in Zu]}")
fseg.validate(fy_sh=355*MPa, fy_fl=355*MPa) # T-flanges: failure mode A must govern
For T-flanges the polynomial model requires bolt failure (mode A) to govern.
3. Bolt force and moment¶
Z = np.array([0, 250, 500, 1000]) * kN # shell force per bolt pair
for Zi, Fs, Ms in zip(Z, fseg.bolt_axial_force(Z), fseg.bolt_bending_moment(Z)):
print(f"Z = {Zi/kN:6.0f} kN Fs = {Fs/kN:6.1f} kN Ms = {Ms:6.0f} Nm")
Z = 0 kN Fs = 935.5 kN Ms = 4 Nm
Z = 250 kN Fs = 956.4 kN Ms = 49 Nm
Z = 500 kN Fs = 981.9 kN Ms = 112 Nm
Z = 1000 kN Fs = 1046.8 kN Ms = 284 Nm
4. Fatigue analysis¶
The fatigue analysis is the same as for the L-flange:
from pyflange.fatigue import MarkovMatrix, BoltFatigueAnalysis
mkvm = MarkovMatrix(
range = np.array([ 20, 40, 80, 120, 160, 200, 240, 300, 400, 500]) * 1e6, # N·m
mean = np.array([ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80]) * 1e6, # N·m
cycles = np.array([3e8, 1e8, 3e7, 8e6, 2e6, 5e5, 1.5e5, 4e4, 8e3, 1e3]),
duration = 25) # years
fatigue = BoltFatigueAnalysis(fseg, mkvm)
print(f"Damage: {fatigue.damage:.3f}")
print(f"Fatigue life: {fatigue.fatigue_life:.0f} years")
ED2¶
PolynomialTFlangeSegmentED2
has the same parameters and implements the ED2 gap stiffness (ref. [5],
9.7, change #2). The other ED2 changes concern L-flanges only.