pyflange.stats

This module contains tools for the probabilistic analysis of flanged connections. In particular, three categories of tools are provided:

  • Probability distributions for some flange properties
  • Samplers: random realization generators for flange properties

The provided probability distributions are:

  • gap_height_distribution

The samplers are just Python generator functions that yield random values. Samplers can be used in a loop or to generate random values via the python next function. The following general-purpose samplers are available:

  • sampler
  • norm_sampler
  • lognorm_sampler
  • fatigue_case_sampler

The following samplers are instead specific to IEC 61400-6:2020:

  • standard_gap_size_sampler
  • standard_PolynomialLFlangeSegment_sampler
  • standard_markov_matrix_sampler
  • standard_bolt_fatigue_curve_sampler

An example of how to use the above generator to perform a Montecarlo simulation, is given in this example.

The following references are used through this documentation:

  • [1] IEC 61400-6 AMD1 Background document
  • [2] IEC 61400-6:2020

fatigue_case_sampler(fseg_samp, markov_matrix_samp, fatigue_curve_samp, allowable_damage_samp, SMF=1.0)

Sampler that generates random fatigue cases.

Parameters:
  • fseg_samp (Generator) –

    A pyflange.flangesegments.FlangeSegment sampler.

  • markov_matrix_samp (Generator) –

    A pyflange.fatigue.MarkovMatrix sampler.

  • fatigue_curve_samp (Generator) –

    A pyflange.fatigue.BoltFatigueCurve sampler.

  • allowable_damage_samp (Generator) –

    A float sampler that generates random allowable damages.

  • SMF (float | Generator, default: 1.0 ) –

    Stress Multiplication Factor. If it is a sampler, a new SMF will be generated for every next fatigue case. If it is a float, it will be applied to every next fatigue case. If omitted, it defaults to 1.0.

Yields:
  • pyflange.fatigue.BoltFatigueAnalysis: A random BoltFatigueAnalysis object.

gap_height_distribution(flange_diameter, flange_flatness_tolerance, gap_length)

Evaluates the gap heigh probability distribution according to ref. [1].

Parameters:
  • flange_diameter (float) –

    The outer diameter of the flange, expressed in meters.

  • flange_flatness_tolerance (float) –

    The flatness tolerance, as defined in ref. [1], expressed in mm/mm (non-dimensional).

  • gap_length (float) –

    The length of the gap, espressed in meters and measured at the outer edge of the flange.

Returns:
  • scipy.stats.lognorm: A scipy log-normal variable representing the gap height stocastic variable.

Example

The following example, creates a gap distribution and the calculates the 95% quantile of the gap height

from pyflange.gap import gap_height_distribution

D = 7.50      # Flange diameter in meters
u = 0.0014    # Flatness tolerance (non-dimensional)
L = 1.22      # Gap length
gap_dist = gap_height_distribution(D, u, L)     # a lognorm distribution object

u95 = gap_dist.ppf(0.95)    # PPF is the inverse of CDF. See scipy.stats.lognorm documentation.

lognorm_sampler(mean, cv)

Sampler based on a Log-Normal distribution.

Parameters:
  • mean (float) –

    Mean value of the log-normal distribution.

  • cv (float) –

    Coefficient of variation of the log-normal distribution.

Returns:
  • A log-normal distribution sampler with given mean value and

  • coefficient of variation.

Example

The following example creates a Log-Normal distribution sampler and generates three realizations.

samp = lognorm_sampler(12.0, 0.25)  # log-normal sampler sampler with
                                    # mean value 12.0 and CoV = 0.25.

val1 = next(samp)   # A random value from the log-normal distribution
val2 = next(samp)   # Another random value from the log-normal distribution
val3 = next(samp)   # Yet another random value from the log-normal distribution

norm_sampler(mean, cv)

Sampler based on a Normal distribution.

Parameters:
  • mean (float) –

    Mean value of the normal distribution.

  • cv (float) –

    Coefficient of variation of the normal distribution.

Returns:
  • A normal distribution sampler with given mean value and

  • coefficient of variation.

Example

The following example creates a Normal distribution sampler and generates three realizations.

samp = norm_sampler(12.0, 0.25)   # normal sampler sampler with mean 12.0
                                  # and CoV = 0.25.

val1 = next(samp)   # A random value from the normal distribution
val2 = next(samp)   # Another random value from the normal distribution
val3 = next(samp)   # Yet another random value from the normal distribution

sampler(random_variable)

Generic distribution-based sampler.

Parameters:
  • random_variable (rv_continuous) –

    Any SciPy continuous random variable.

Yields:
  • A generator that, at every next call returns a random realization

  • of the passed random variable.

Example

The following example creates a Normal distribution sampler and generates three realizations.

from scipy.stats import norm
ndist = norm(12.0, 2.0) # normal distribution with mean value 12 and standard deviation 2.

samp = sampler(ndist)   # sampler based on the ndist distribution

val1 = next(samp)       # A random value from ndist distribution
val2 = next(samp)       # Another random value from ndist distribution
val3 = next(samp)       # Yet another random value from ndist distribution

standard_PolynomialLFlangeSegment_sampler(a, b, s, t, R, central_angle, Zg, bolt, Do, washer, nut, preload_sampler, ppl_sampler, dft_sampler, gap_sampler, tilt_sampler=lognorm_sampler(0.1 * deg, 0.5), E=210000000000.0, G=80770000000.0, s_ratio=1.0, r=0.01, k_shell='interp', settlement_factor=1.0)

A sampler that yields random pyflange PolynomialLFlangeSegment objects.

Parameters:
  • a (float) –

    Distance between inner face of the flange and center of the bolt hole.

  • b (float) –

    Distance between center of the bolt hole and center-line of the shell.

  • s (float) –

    Shell thickness.

  • t (float) –

    Flange thickness.

  • R (float) –

    Shell outer curvature radius.

  • central_angle (float) –

    Angle subtended by the flange segment.

  • Zg (float) –

    Load applied to the flange segment shell at rest (normally dead weight of tower + RNA, divided by the number of bolts). Negative if compression.

  • bolt (Bolt) –

    Bolt object representing the flange segment bolt.

  • Do (float) –

    Bolt hole diameter.

  • washer (Washer) –

    Bolt washer.

  • nut (Nut) –

    Bolt nut.

  • preload_sampler (Generator) –

    Random preload sampler.

  • ppl_sampler (Generator) –

    Percentage of pretension losses sampler.

  • dft_sampler (Generator) –

    Dry film thickness sampler.

  • gap_sampler (Generator) –

    Gap object random sampler.

  • tilt_sampler (Generator, default: lognorm_sampler(0.1 * deg, 0.5) ) –

    Random tilt angle sampler. Defaults to lognorm_sampler(0.1*deg, 0.50).

  • E (float, default: 210000000000.0 ) –

    Young modulus of the flange. Defaults to 210e9.

  • G (float, default: 80770000000.0 ) –

    Shear modulus of the flange. Defaults to 80.77e9.

  • s_ratio (float, default: 1.0 ) –

    Ratio of bottom shell thickness over s. Defaults to 1.0.

  • r (float, default: 0.01 ) –

    Rounding between flange and shell. Defaults to 0.01.

  • k_shell (str | float | None, default: 'interp' ) –

    Custom shell stiffness. If 'interp' (default), stiffness is interpolated. If a number, it's used as the stiffness. If None, a simplified formula is used.

  • settlement_factor (float, default: 1.0 ) –

    Factor reducing the amount of bolt settlement, to be taken as 1.0 for torque tightening and 1.0 for tension tightening. If omitted, it defaults to 1.0.

Yields:
  • pyflange.flangesegments.PolynomialLFlangeSegment: A random L-Flange segment object.

Example

The following example creates a L-Flange segment sampler and generates three random flange segments.

from math import pi
from metrum.units import mm, um, kN

import pyflange.stats as stats
from pyflange.bolts import StandardMetricBolt, RoundNut
N_BOLTS = 156

fseg_samp = standard_PolynomialLFlangeSegment_sampler (
        a = 150*mm,        # distance between inner face of the flange and center of the bolt hole
        b = 122*mm,        # distance between center of the bolt hole and center-line of the shell
        s =  54*mm,        # shell thickness
        t = 172*mm,        # flange thickness
        R = 4000*mm,       # shell outer curvature radius
        central_angle = 2*pi / N_BOLTS,  # angle subtended by the flange segment

        Zg = -18044*kN / N_BOLTS,      # load applied to the flange segment shell at rest

        # Bolt object representing the flange segment bolt
        bolt = StandardMetricBolt("M80", "10.9", shank_length=160*mm,
                shank_diameter_ratio=76.1/80, stud=True),

        Do = 86*mm,               # Bolt hole diameter
        washer = None,            # Bolt washer
        nut = RoundNut("M80"),    # Bolt nut

        # bolt preload random sampler and preload losses parameters
        preload_sampler = stats.norm_sampler(2932.24*kN, 0.03), 
        ppl_sampler = stats.norm_sampler(0.03, 1/3),
        dft_sampler = stats.norm_sampler(250*um, 0.12),

        # gap object random sampler
        gap_sampler = stats.standard_gap_sampler(
                    flange_diameter = 8000*mm,
                    flange_flatness_tolerance = 0.0014,   # 1.4 mm/m
                    gap_angle_sampler = stats.lognorm_sampler(100*deg, 1.0),
                    gap_shape_factor_sampler = stats.norm_sampler(1.0, 0.15)
                ),

        s_ratio = 1.0,              # Ratio of bottom shell thickness over s.
        settlement_factor = 0.50    # Settlement reduction for tension tightening.
    )

fseg1 = next(fseg_samp)     # A random L-Flange segment object
fseg2 = next(fseg_samp)     # Another random L-Flange segment object
fseg3 = next(fseg_samp)     # Yet another random L-Flange segment object

standard_bolt_fatigue_curve_sampler(bolt_nominal_diameter, mean_stress_factor=1.0, stress_factor_CoV=0.1, DS_ref_mean=62 * MPa)

Sampler that generates random bolt SN curves, according to ref. [2].

Parameters:
  • bolt_nominal_diameter (float) –

    The nominal diameter of the bolt.

  • mean_stress_factor (float, default: 1.0 ) –

    The mean value of the fatigue class coefficinet, assumed normally-distributed. Defaults to 1.

  • range_CoV (float) –

    The coefficient of variation of the fatigue class, assumed normally distributed. It defaults to 0.10.

Yields:
  • pyflange.fatigue.BoltFatigueCurve: A random bolt fatigue curve object.

standard_gap_sampler(flange_diameter, flange_flatness_tolerance, gap_angle_sampler=lognorm_sampler(100 * deg, 1.0), gap_shape_factor_sampler=norm_sampler(1.0, 0.15), gap_height_cap=2.0)

Sampler that generates random flange gaps according to ref. [1].

Parameters:
  • flange_diameter (float) –

    The diameter of the flange.

  • flange_flatness_tolerance (float) –

    The flatness tolerance in mm/mm.

  • gap_angle_sampler (Generator, default: lognorm_sampler(100 * deg, 1.0) ) –

    A sampler for the gap angle. Defaults to a log-normal sampler with mean 0.1 deg and CoV = 1.0.

  • gap_shape_factor_sampler (Generator, default: norm_sampler(1.0, 0.15) ) –

    A sampler for the gap shape factor. Defaults to a normal sampler with mean 1.0 and CoV = 0.15.

  • gap_height_cap (float, default: 2.0 ) –

    The generated gap height will be capped at gap_height_cap * p95, where p95 is the 95th percentile of the gap height distribution. If omitted, it defaults to 2.0.

Yields:
  • tuple

    A tuple containing: - gap_angle (float): Random gap angle. - gap_height (float): Random gap height.

Example

The following example creates a standard gap-size sampler and generate three realizations.

# Gap size sampler for 7.5 m falnge with flatness tolerance 1.4 mm/m
samp = standard_gap_size_sampler(7.5, 0.0014)

ga1, gh1 = next(samp)  # A random gap-anlge, gap-height pair
ga2, gh2 = next(samp)  # Another random gap-anlge, gap-height pair
ga3, gh3 = next(samp)  # Yet another random gap-anlge, gap-height pair

standard_markov_matrix_sampler(markov_matrix, mean_range_coeff=1.0, range_CoV=0.12)

Sampler that generates a random markov matrix according to ref [2].

Parameters:
  • markov_matrix (MarkovMatrix) –

    The deterministic design Markov matrix.

  • mean_range_coeff (float, default: 1.0 ) –

    The mean coefficient of each load range, assumed log-normally-distributed with mean value contained in the passed markov_matrix parameters. Defaults to 1.0.

  • range_CoV (float, default: 0.12 ) –

    The coefficient of variation of each load range, assumed log-normally-distributed with mean value contained in the passed markov_matrix parameters. Defaults to 0.12.

Yields:
  • pyflange.fatigue.MarkovMatrix: A random Markov matrix.