The miner module#

Provide Miner damage accumulation rules for fatigue analysis.

The module implements helpers for choosing between Miner original, Miner elementary, and Miner-Haibach assumptions. The variants differ in how they extend the S-N curve below the endurance knee: horizontal for Miner original, unchanged finite-life slope for Miner elementary, and the Haibach slope 2 * k_1 - 1 for Miner-Haibach. The terminology follows Wächter et al. [Waechter-Miner] and Haibach [Haibach-Miner].

References

[Waechter-Miner]

M. Wächter, C. Müller, and A. Esderts, “Angewandter Festigkeitsnachweis nach FKM-Richtlinie”, Springer Fachmedien Wiesbaden, 2017.

[Haibach-Miner]
  1. Haibach, “Betriebsfestigkeit”, Springer-Verlag, 2006.

class pylife.strength.miner.MinerBase(pandas_obj)[source]#

Provide common operations for Gassner-Miner calculations.

MinerBase extends pylife.materiallaws.WoehlerCurve with operations that depend on a load collective shape, such as lifetime multiples and effective damage sums. Subclasses implement the selected Miner hypothesis.

Parameters:

pandas_obj (pandas.Series or pandas.DataFrame) – Pandas object containing Wöhler curve parameters.

See also

pylife.strength.miner.MinerElementary

Use the elementary Miner hypothesis.

pylife.strength.miner.MinerHaibach

Use the Miner-Haibach hypothesis.

effective_damage_sum(collective)[source]#

Calculate the effective damage sum for a load collective.

Parameters:

collective (pylife.stress.collective.LoadCollective) – Load collective with stress amplitudes and cycle counts.

Returns:

Effective damage sum, dimensionless. A value of 1.0 means failure in the unmodified Miner convention.

Return type:

float or pandas.Series

See also

pylife.strength.miner.effective_damage_sum

Calculate the value from a lifetime multiple.

finite_life_factor(N)[source]#

Calculate the finite-life factor for a collective cycle count.

Parameters:

N (float or array_like) – Total number of cycles in the load collective.

Returns:

Finite-life factor, dimensionless.

Return type:

float or numpy.ndarray

Notes

Following Wächter et al. [Waechter-MinerBase] the factor is

\[f_N = \left(\frac{N_D}{N}\right)^{1/k_1}.\]

References

[Waechter-MinerBase]

M. Wächter, C. Müller, and A. Esderts, “Angewandter Festigkeitsnachweis nach FKM-Richtlinie”, Springer Fachmedien Wiesbaden, 2017, p. 96.

gassner_cycles(collective)[source]#

Calculate the Gassner cycle count for a load collective.

Parameters:

collective (pylife.stress.collective.LoadCollective) – Load collective with stress amplitudes and cycle counts.

Returns:

Number of cycles on the Gassner line for the given collective.

Return type:

float or pandas.Series

Notes

The absolute load level matters because the maximum collective amplitude is used as the reference point on the Wöhler curve.

abstractmethod lifetime_multiple(collective)[source]#

Calculate the lifetime multiple for the selected Miner rule.

Parameters:

collective (pylife.stress.collective.LoadCollective) – Load collective with stress amplitudes and cycle counts.

Returns:

Lifetime multiple A, dimensionless and greater than 0.

Return type:

float

Notes

Subclasses implement the actual hypothesis. The value scales the life at the maximum collective amplitude to the life of the complete collective.

class pylife.strength.miner.MinerElementary(pandas_obj)[source]#

Apply the Miner elementary damage accumulation hypothesis.

Miner elementary extends the S-N curve below the knee point with the same slope as the finite-life branch, k_2 = k_1. The resulting collective shape factor is independent of the absolute load level, so a Gassner-shifted Wöhler curve can be constructed.

Parameters:

pandas_obj (pandas.Series or pandas.DataFrame) – Pandas object containing Wöhler curve parameters.

See also

pylife.materiallaws.WoehlerCurve.miner_elementary

Select k_2 = k_1 for direct damage calculation.

pylife.strength.miner.MinerHaibach

Use the Haibach slope below the knee.

gassner(collective)[source]#

Calculate the Gassner-shifted Wöhler curve for Miner elementary.

Parameters:

collective (pylife.stress.collective.LoadCollective) – Load collective with stress amplitudes and cycle counts.

Returns:

Fatigue accessor of the Gassner-shifted Wöhler curve. The knee cycle count ND is multiplied by the lifetime multiple of collective.

Return type:

pylife.strength.fatigue.Fatigue

lifetime_multiple(collective)[source]#

Calculate the Miner-elementary lifetime multiple.

Parameters:

collective (pylife.stress.collective.LoadCollective) – Load collective with stress amplitudes and cycle counts.

Returns:

Lifetime multiple A_ele, dimensionless and greater than 0.

Return type:

float

Notes

Following Wächter et al. [Waechter-MinerElementary], the Miner-elementary lifetime multiple is the reciprocal of the Haibach solidity value V computed with slope k_1:

\[A_{ele} = \frac{1}{V}.\]

References

[Waechter-MinerElementary]

M. Wächter, C. Müller, and A. Esderts, “Angewandter Festigkeitsnachweis nach FKM-Richtlinie”, Springer Fachmedien Wiesbaden, 2017.

class pylife.strength.miner.MinerHaibach(pandas_obj)[source]#

Apply the Miner-Haibach damage accumulation hypothesis.

Miner-Haibach extends the S-N curve below the knee point with the slope k_2 = 2 * k_1 - 1. Loads below SD therefore still contribute damage, but less strongly than loads above the knee.

Parameters:

pandas_obj (pandas.Series or pandas.DataFrame) – Pandas object containing Wöhler curve parameters.

Warning

Unlike Miner elementary, the lifetime multiple depends on the evaluated load level. Therefore this accessor does not provide a Gassner-shift method.

lifetime_multiple(collective)[source]#

Calculate the Miner-Haibach lifetime multiple.

Parameters:

collective (pylife.stress.collective.LoadCollective) – Load collective with stress amplitudes and cycle counts.

Returns:

Lifetime multiple A, dimensionless and greater than 0. The return value is numpy.inf if the maximum collective amplitude is below SD.

Return type:

float

Notes

With normalized amplitudes x_i = S_{a,i} / S_{a,max} and x_D = SD / S_{a,max}, Haibach damage accumulation [Haibach-MinerHaibach] uses

\[A = \frac{\sum_i n_i} {\sum_{x_i \ge x_D} n_i x_i^{k_1} + x_D^{1-k_1}\sum_{x_i < x_D} n_i x_i^{2k_1-1}}.\]

References

[Haibach-MinerHaibach]

E. Haibach, “Betriebsfestigkeit”, Springer-Verlag, 2006, p. 291.

pylife.strength.miner.effective_damage_sum(lifetime_multiple)[source]#

Calculate the FKM effective damage sum from a lifetime multiple.

Parameters:

lifetime_multiple (float) – Lifetime multiple A of a load collective, dimensionless.

Returns:

Effective damage sum, dimensionless. The value is limited to the interval [0.3, 1.0].

Return type:

float

Notes

The FKM effective damage sum is calculated as

\[D_m = \min\left(1, \max\left(0.3, \frac{2}{A^{1/4}}\right)\right).\]

A damage sum of 1.0 means failure in the unmodified Miner convention.