Skip to content

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

T-flange segment: cross-section with the parameters a, b, s, t, R, Do and the shell force Z Z Z a b b a t t s Do R (outer radius) shell flange flange ← tower axis (inside) outside →
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
Governing failure mode: A
Ultimate shell forces A, B, D, E [kN]: [2121, 2950, 4843, 9790]

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")
Damage:       0.667
Fatigue life: 38 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.